View Javadoc
1   /*
2    * Copyright (c) 2012-2013, Dienst Landelijk Gebied - Ministerie van Economische Zaken
3    *
4    * Gepubliceerd onder de BSD 2-clause licentie,
5    * zie https://github.com/MinELenI/CBSviewer/blob/master/LICENSE.md voor de volledige licentie.
6    */
7   package nl.mineleni.cbsviewer.util;
8   
9   import java.io.File;
10  import java.net.URL;
11  import java.util.Collections;
12  import java.util.List;
13  
14  import javax.xml.bind.JAXBContext;
15  import javax.xml.bind.JAXBElement;
16  import javax.xml.bind.JAXBException;
17  import javax.xml.bind.Unmarshaller;
18  
19  import nl.mineleni.cbsviewer.util.xml.LayerDescriptor;
20  import nl.mineleni.cbsviewer.util.xml.LayersList;
21  
22  import org.slf4j.Logger;
23  import org.slf4j.LoggerFactory;
24  
25  import flexjson.JSONSerializer;
26  import flexjson.transformer.AbstractTransformer;
27  
28  /**
29   * AvailableLayersBean maakt de beschikbare kaarten bekend in de applicatie op
30   * basis van het xml configuratie bestand {@code AvailableLayers.xml}.
31   *
32   * @author mprins
33   * @since 1.6
34   *
35   * @composed 1 - 1..* LayerDescriptor
36   * @depend - layersList - LayersList
37   */
38  public class AvailableLayersBean {
39  
40  	/** The Constant LOGGER. */
41  	private static final Logger LOGGER = LoggerFactory
42  	        .getLogger(AvailableLayersBean.class);
43  
44  	/**
45  	 * lijst met beschikbare layers.
46  	 */
47  	private List<LayerDescriptor> layers = null;
48  
49  	/**
50  	 * default constructor.
51  	 */
52  	public AvailableLayersBean() {
53  		try {
54  			final JAXBContext jc = JAXBContext
55  			        .newInstance("nl.mineleni.cbsviewer.util.xml");
56  			final Unmarshaller u = jc.createUnmarshaller();
57  			final URL r = this.getClass().getClassLoader()
58  			        .getResource("AvailableLayers.xml");
59  			if (r != null) {
60  				final File f = new File(r.getFile());
61  				@SuppressWarnings("unchecked")
62  				final JAXBElement<LayersList> element = (JAXBElement<LayersList>) u
63  				        .unmarshal(f);
64  				final LayersList layerslist = element.getValue();
65  				this.layers = layerslist.getLayerdescriptor();
66  			} else {
67  				throw new JAXBException(
68  				        "Bestand 'AvailableLayers.xml' niet gevonden");
69  			}
70  		} catch (final JAXBException e) {
71  			LOGGER.error(
72  			        "Er is een fout opgetreden bij het inlezen van de layers.",
73  			        e);
74  		}
75  	}
76  
77  	/**
78  	 * accessor voor de lijst met layers.
79  	 *
80  	 * @return geeft de lijst van LayerDescriptors voor de applicatie
81  	 */
82  	public List<LayerDescriptor> getLayers() {
83  		return Collections.unmodifiableList(this.layers);
84  	}
85  
86  	/**
87  	 * Geeft de kaarten als javascript variabele.
88  	 *
89  	 * @return layers als json object
90  	 * @see #asJSON(boolean)
91  	 */
92  	public String asJSON() {
93  		return this.asJSON(true);
94  	}
95  
96  	/**
97  	 * Geeft de kaarten als json object ({@code asVar == false}) of javascript
98  	 * variabele, ingepakt in een CDATA sectie. Het object is een array met
99  	 * LayerDescriptors. Null waarden worden niet geserialiseerd, hierdoor zijn
100 	 * objecten niet round-trip serialiseerbaar (dus equals() niet bruikbaar).
101 	 *
102 	 * @param asVar
103 	 *            {@code true} als er een javascript variabele moet worden
104 	 *            gegeven.
105 	 * @return layers als json
106 	 *
107 	 * @see #asJSON()
108 	 */
109 	public String asJSON(final boolean asVar) {
110 		final JSONSerializer serializer = new JSONSerializer();
111 		final String json = serializer.transform(new AbstractTransformer() {
112 			@Override
113 			public Boolean isInline() {
114 				return true;
115 			}
116 
117 			@Override
118 			public void transform(final Object object) {
119 				// null objecten niet serializeren.
120 				return;
121 			}
122 		}, void.class).exclude("class", "aliases", "attributes")
123 		        .prettyPrint(LOGGER.isDebugEnabled()).serialize(this.layers);
124 		if (asVar) {
125 			return "\n/* <![CDATA[ */ var _layers=" + json + ";/* ]]> */";
126 		}
127 		return json;
128 	}
129 
130 	/**
131 	 * geeft de eerste layerdescriptor met de gevraagde id.
132 	 *
133 	 * @param id
134 	 *            de ID van de laag
135 	 * @return the layer by id
136 	 * @see LayerDescriptor#getId()
137 	 */
138 	public LayerDescriptor getLayerByID(final String id) {
139 		for (final LayerDescriptor desc : this.layers) {
140 			if (desc.getId().equalsIgnoreCase(id)) {
141 				return desc;
142 			}
143 		}
144 		return null;
145 	}
146 
147 	/**
148 	 * geeft de eerste layerdescriptor met de gevraagde naam.
149 	 *
150 	 * @param queryLyrName
151 	 *            de naam van de wms laag
152 	 * @param lyrUrl
153 	 *            de url van de wms
154 	 *
155 	 * @return the layer by name and url
156 	 * @see LayerDescriptor#getLayers()
157 	 */
158 	public LayerDescriptor getLayerByLayers(final String queryLyrName,
159 	        final String lyrUrl) {
160 		for (final LayerDescriptor desc : this.layers) {
161 			if ((desc.getLayers().replaceAll("\\s", ""))
162 			        .equalsIgnoreCase(queryLyrName.replaceAll("\\s", ""))) {
163 				if (desc.getUrl().equalsIgnoreCase(lyrUrl)) {
164 					LOGGER.debug("Gevonden layer-id is: " + desc.getId());
165 					return desc;
166 				}
167 			}
168 		}
169 		return null;
170 	}
171 
172 	/**
173 	 * geeft de eerste layerdescriptor met de gevraagde naam, url en styles.
174 	 *
175 	 * @param queryLyrName
176 	 *            de naam van de wms laag
177 	 * @param lyrUrl
178 	 *            de url van de wms
179 	 * @param styles
180 	 *            wms styles
181 	 *
182 	 * @return the layer by name and url
183 	 * @see LayerDescriptor#getLayers()
184 	 */
185 	public LayerDescriptor getLayerByLayers(final String queryLyrName,
186 	        final String lyrUrl, final String styles) {
187 		for (final LayerDescriptor desc : this.layers) {
188 			if ((desc.getLayers().replaceAll("\\s", ""))
189 			        .equalsIgnoreCase(queryLyrName.replaceAll("\\s", ""))) {
190 				if (desc.getUrl().equalsIgnoreCase(lyrUrl)) {
191 					if (desc.getStyles().replaceAll("\\s", "")
192 					        .equalsIgnoreCase(styles)) {
193 						LOGGER.debug("Gevonden layer-id is: " + desc.getId());
194 						return desc;
195 					}
196 				}
197 			}
198 		}
199 		return null;
200 	}
201 
202 	/**
203 	 * geeft de eerste layerdescriptor met de gevraagde naam.
204 	 *
205 	 * @param name
206 	 *            de naam van de laag
207 	 * @return the layer by name
208 	 * @see LayerDescriptor#getName()
209 	 */
210 	public LayerDescriptor getLayerByName(final String name) {
211 		for (final LayerDescriptor desc : this.layers) {
212 			if (desc.getName().equalsIgnoreCase(name)) {
213 				LOGGER.debug("Gevonden layer-id is: " + desc.getId());
214 				return desc;
215 			}
216 		}
217 		return null;
218 	}
219 }