root / branches / v10 / libraries / libRemoteServices / src / org / gvsig / remoteClient / gml / v2 / GMLFeaturesIterator_v2.java @ 10876
History | View | Annotate | Download (15.3 KB)
1 |
package org.gvsig.remoteClient.gml.v2; |
---|---|
2 |
|
3 |
import java.io.IOException; |
4 |
import java.util.ArrayList; |
5 |
import java.util.LinkedHashMap; |
6 |
import java.util.Map; |
7 |
|
8 |
import org.gvsig.remoteClient.gml.GMLTags; |
9 |
import org.gvsig.remoteClient.gml.IGMLFeaturesIterator; |
10 |
import org.gvsig.remoteClient.gml.exceptions.BaseException; |
11 |
import org.gvsig.remoteClient.gml.exceptions.GMLException; |
12 |
import org.gvsig.remoteClient.gml.exceptions.GMLFileReadException; |
13 |
import org.gvsig.remoteClient.gml.exceptions.GMLParserException; |
14 |
import org.gvsig.remoteClient.gml.factories.IGeometriesFactory; |
15 |
import org.gvsig.remoteClient.gml.factories.XMLElementsFactory; |
16 |
import org.gvsig.remoteClient.gml.schemas.XMLElement; |
17 |
import org.gvsig.remoteClient.gml.schemas.XMLSchemaParser; |
18 |
import org.gvsig.remoteClient.gml.types.GMLGeometries; |
19 |
import org.gvsig.remoteClient.gml.types.IXMLType; |
20 |
import org.gvsig.remoteClient.gml.types.XMLComplexType; |
21 |
import org.gvsig.remoteClient.gml.types.XMLSimpleType; |
22 |
import org.gvsig.remoteClient.gml.utils.GMLUtilsParser; |
23 |
import org.gvsig.remoteClient.gml.warnings.GMLWarningInfo; |
24 |
import org.gvsig.remoteClient.gml.warnings.GMLWarningWrongNamespace; |
25 |
import org.kxml2.io.KXmlParser; |
26 |
import org.xmlpull.v1.XmlPullParserException; |
27 |
|
28 |
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
|
29 |
*
|
30 |
* Copyright (C) 2004 IVER T.I. and Generalitat Valenciana.
|
31 |
*
|
32 |
* This program is free software; you can redistribute it and/or
|
33 |
* modify it under the terms of the GNU General Public License
|
34 |
* as published by the Free Software Foundation; either version 2
|
35 |
* of the License, or (at your option) any later version.
|
36 |
*
|
37 |
* This program is distributed in the hope that it will be useful,
|
38 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
39 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
40 |
* GNU General Public License for more details.
|
41 |
*
|
42 |
* You should have received a copy of the GNU General Public License
|
43 |
* along with this program; if not, write to the Free Software
|
44 |
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,USA.
|
45 |
*
|
46 |
* For more information, contact:
|
47 |
*
|
48 |
* Generalitat Valenciana
|
49 |
* Conselleria d'Infraestructures i Transport
|
50 |
* Av. Blasco Ib??ez, 50
|
51 |
* 46010 VALENCIA
|
52 |
* SPAIN
|
53 |
*
|
54 |
* +34 963862235
|
55 |
* gvsig@gva.es
|
56 |
* www.gvsig.gva.es
|
57 |
*
|
58 |
* or
|
59 |
*
|
60 |
* IVER T.I. S.A
|
61 |
* Salamanca 50
|
62 |
* 46005 Valencia
|
63 |
* Spain
|
64 |
*
|
65 |
* +34 963163400
|
66 |
* dac@iver.es
|
67 |
*/
|
68 |
/* CVS MESSAGES:
|
69 |
*
|
70 |
* $Id: GMLFeaturesIterator_v2.java 10876 2007-03-23 10:42:30Z jorpiell $
|
71 |
* $Log$
|
72 |
* Revision 1.1.2.6 2007-03-23 10:42:30 jorpiell
|
73 |
* A?adido soporte para elementos anidadas con el mismo nombre que el elemento padre
|
74 |
*
|
75 |
* Revision 1.1.2.5 2007/01/25 16:12:59 jorpiell
|
76 |
* Se han sustituido las clases por las que hay en el nuevo driver de GML.
|
77 |
*
|
78 |
* Revision 1.9 2007/01/15 13:11:17 csanchez
|
79 |
* Sistema de Warnings y Excepciones adaptado a BasicException
|
80 |
*
|
81 |
* Revision 1.8 2006/12/29 18:05:20 jorpiell
|
82 |
* Se tienen en cuenta los simpleTypes y los choices, adem?s de los atributos multiples
|
83 |
*
|
84 |
* Revision 1.6 2006/12/22 11:25:44 csanchez
|
85 |
* Nuevo parser GML 2.x para gml's sin esquema
|
86 |
*
|
87 |
* Revision 1.5 2006/11/06 12:14:38 jorpiell
|
88 |
* Cuando geottols no es capaz de parsear el gML se cargaba la capa con el "aspa roja". Ahora esto ya no ocurre, porque si geotools no es capaz de parsear el gML la geometr?a se descarta
|
89 |
*
|
90 |
* Revision 1.4 2006/10/10 12:52:28 jorpiell
|
91 |
* Soporte para features complejas.
|
92 |
*
|
93 |
* Revision 1.3 2006/10/02 08:33:49 jorpiell
|
94 |
* Cambios del 10 copiados al head
|
95 |
*
|
96 |
* Revision 1.1.2.2 2006/09/25 11:35:15 jorpiell
|
97 |
* Se tienen en cuanta tablas a distintos niveles. En caso de anidamiento se cogen los resultados de la primera tabla que aparezca.
|
98 |
*
|
99 |
* Revision 1.1.2.1 2006/09/19 12:23:15 jorpiell
|
100 |
* Ya no se depende de geotools
|
101 |
*
|
102 |
* Revision 1.2 2006/09/18 12:08:55 jorpiell
|
103 |
* Se han hecho algunas modificaciones que necesitaba el WFS
|
104 |
*
|
105 |
* Revision 1.1 2006/08/10 12:00:49 jorpiell
|
106 |
* Primer commit del driver de Gml
|
107 |
*
|
108 |
*
|
109 |
*/
|
110 |
/**
|
111 |
* @author Jorge Piera Llodr? (piera_jor@gva.es)
|
112 |
* @author Carlos S?nchez Peri??n (sanchez_carper@gva.es)
|
113 |
*/
|
114 |
public class GMLFeaturesIterator_v2 extends IGMLFeaturesIterator { |
115 |
public GMLWarningInfo warnings = null; |
116 |
private boolean goNextTag= true; |
117 |
|
118 |
public GMLFeaturesIterator_v2(XMLSchemaParser parser, IGeometriesFactory factory) {
|
119 |
super(parser, factory);
|
120 |
//It creates the warnings structure
|
121 |
warnings = new GMLWarningInfo();
|
122 |
} |
123 |
|
124 |
/**
|
125 |
* hasNext()
|
126 |
* @return boolean
|
127 |
* -true: if has more features to parse
|
128 |
* -false: in other case.
|
129 |
**/
|
130 |
public boolean hasNext() throws GMLException { |
131 |
try {
|
132 |
if ((getParser().getName().compareTo(getFeatureRoot()) == 0) && |
133 |
(getParser().getEventType() == KXmlParser.START_TAG)){ |
134 |
return true; |
135 |
} |
136 |
} catch (XmlPullParserException e) {
|
137 |
//Captured KXML parsing Exception
|
138 |
throw new GMLException(new GMLParserException(e)); |
139 |
} |
140 |
return false; |
141 |
} |
142 |
|
143 |
/**
|
144 |
* It implements the iterator function to parse one feature
|
145 |
* @return object (feature)
|
146 |
**/
|
147 |
public Object next() throws GMLException{ |
148 |
boolean endFeature = false; |
149 |
Object feature = null; |
150 |
int currentTag;
|
151 |
|
152 |
try {
|
153 |
// It returns what kind of tag is
|
154 |
currentTag = getParser().getEventType(); |
155 |
while (!endFeature){
|
156 |
switch(currentTag){
|
157 |
case KXmlParser.START_TAG:
|
158 |
// It gets the name of the feature <FeatureMember>
|
159 |
feature = parseFeature(getParser().getName()); |
160 |
break;
|
161 |
case KXmlParser.END_TAG:
|
162 |
//It compares with the name of tag captured before
|
163 |
//If is equal then is the end of the fature </FeatureMember>
|
164 |
if (getParser().getName().compareTo(getFeatureRoot()) == 0){ |
165 |
endFeature = true;
|
166 |
currentTag = getParser().nextTag(); |
167 |
} |
168 |
break;
|
169 |
case KXmlParser.TEXT:
|
170 |
//Text Tags are ignored
|
171 |
break;
|
172 |
} |
173 |
if (!endFeature){
|
174 |
if (getParser().getName().compareTo(getFeatureRoot()) != 0){ |
175 |
currentTag = getParser().next(); |
176 |
} |
177 |
else
|
178 |
{ |
179 |
endFeature=true;
|
180 |
currentTag = getParser().nextTag(); |
181 |
} |
182 |
} |
183 |
} |
184 |
}catch (XmlPullParserException e) {
|
185 |
//Captured KXML parsing Exception
|
186 |
throw new GMLException(new GMLParserException(e)); |
187 |
} catch (IOException e) { |
188 |
// TODO Auto-generated catch block
|
189 |
throw new GMLException(new GMLFileReadException(e)); |
190 |
} catch (BaseException e) {
|
191 |
throw new GMLException(e); |
192 |
} |
193 |
return feature;
|
194 |
} |
195 |
|
196 |
/**
|
197 |
* parseFeature(Element):
|
198 |
* Parse an specific feature by its name, if this feature isn't declared in the schema
|
199 |
* or it doesn't exist, function tries to parse it without schema.
|
200 |
*
|
201 |
* @param String elementName
|
202 |
**/
|
203 |
private Object parseFeature(String elementName) throws BaseException{ |
204 |
int currentTag;
|
205 |
boolean end = false; |
206 |
LinkedHashMap values = new LinkedHashMap(); |
207 |
Object geometry = null; |
208 |
Object feature = null; |
209 |
XMLElement entity = null;
|
210 |
|
211 |
try{
|
212 |
currentTag = getParser().next(); |
213 |
String entityTag = getParser().getName();
|
214 |
while (!end){
|
215 |
switch(currentTag){
|
216 |
case KXmlParser.START_TAG:
|
217 |
entity = XMLElementsFactory.getElement(getParser().getName()); |
218 |
if (entity != null){ |
219 |
geometry = parseComplexFeature(entity,values,geometry); |
220 |
//When the feature is parsed, it's time to create it
|
221 |
if (geometry != null){ |
222 |
feature = getFactory().createSimpleFeature(entity.getName(),entity.getEntityType(),values,geometry); |
223 |
} |
224 |
end = true;
|
225 |
} |
226 |
//if the element doesn't exist, it tries to parse it without schema.
|
227 |
else{
|
228 |
geometry = parseComplexFeatureNoSchema(entityTag,values); |
229 |
//The feature is created without schema
|
230 |
if (geometry != null){ |
231 |
feature = getFactory().createSimpleFeature("GMLFeature",null,values,geometry); |
232 |
} |
233 |
end = true;
|
234 |
} |
235 |
break;
|
236 |
case KXmlParser.END_TAG:
|
237 |
if ((getParser().getName().compareTo(elementName) == 0)){ |
238 |
end = true;
|
239 |
} |
240 |
break;
|
241 |
case KXmlParser.TEXT:
|
242 |
break;
|
243 |
} |
244 |
if (!end){
|
245 |
currentTag = getParser().next(); |
246 |
} |
247 |
} |
248 |
}catch (XmlPullParserException e) {
|
249 |
//Captured KXML parsing Exception
|
250 |
throw new GMLParserException(e); |
251 |
} catch (IOException e) { |
252 |
// TODO Auto-generated catch block
|
253 |
throw new GMLFileReadException(e); |
254 |
} |
255 |
return feature;
|
256 |
} |
257 |
|
258 |
/**
|
259 |
* parseComplexFeature(entity,parameters,values):
|
260 |
* Parses a complex type
|
261 |
*
|
262 |
* @param complexTypeName
|
263 |
* @param params
|
264 |
* @param values
|
265 |
* @return geometry
|
266 |
* @throws GMLException
|
267 |
*/
|
268 |
private Object parseComplexFeature(XMLElement entity,Map values, Object geometry) throws BaseException{ |
269 |
int currentTag = KXmlParser.START_TAG;
|
270 |
boolean end = false; |
271 |
|
272 |
XMLComplexType entityType = (XMLComplexType)entity.getEntityType(); |
273 |
try{
|
274 |
if(goNextTag)
|
275 |
currentTag = getParser().nextTag(); |
276 |
while (!end){
|
277 |
switch(currentTag){
|
278 |
case KXmlParser.START_TAG:
|
279 |
if (getParser().getName().compareTo(GMLTags.GML_BOUNDEDBY)==0){ |
280 |
GMLUtilsParser.parseBoundedBy(getParser()); |
281 |
}else{
|
282 |
String attName = getParser().getName();
|
283 |
//The atributte get the entity Type (SIMPLE, COMPLEX or GEOMETRY)
|
284 |
XMLElement attribute = entityType.getAttribute(attName); |
285 |
//It compares the tag with the GML Standard
|
286 |
GMLGeometries gmlGeometry = new GMLGeometries(attName);
|
287 |
if ((attribute != null)||(gmlGeometry.isGML()==true)){ |
288 |
if ((gmlGeometry.isGML()==true)||(attribute.getEntityType() != null)){ |
289 |
/************
|
290 |
* <SIMPLE> *
|
291 |
************/
|
292 |
if ((gmlGeometry.isGML()==false)&&(attribute.getEntityType().getType() == IXMLType.SIMPLE)){ |
293 |
if (attribute.isMultiple()){
|
294 |
ArrayList multiple = null; |
295 |
if (values.get(attribute.getName()) == null){ |
296 |
multiple = new ArrayList(); |
297 |
}else{
|
298 |
multiple = (ArrayList)values.get(attribute.getName());
|
299 |
} |
300 |
getParser().next(); |
301 |
multiple.add(((XMLSimpleType)attribute.getEntityType()).getJavaType(getParser().getText())); |
302 |
values.put(attName,multiple); |
303 |
}else{
|
304 |
getParser().next(); |
305 |
values.put(attName,((XMLSimpleType)attribute.getEntityType()).getJavaType(getParser().getText())); |
306 |
} |
307 |
//Jump the end tag
|
308 |
getParser().next(); |
309 |
} |
310 |
/**************
|
311 |
* <GEOMETRY> *
|
312 |
**************/
|
313 |
else if ((gmlGeometry.isGML()==true)||(attribute.getEntityType().getType() == IXMLType.GML_GEOMETRY)){ |
314 |
//if is GML geometry we try to parse it
|
315 |
if (gmlGeometry.isGeometryGML()==true){ |
316 |
geometry = GMLUtilsParser.parseGeometry(getParser(),attName,getFactory()); |
317 |
} |
318 |
else{
|
319 |
if (gmlGeometry.isFeatureGML()==false){ |
320 |
//If isn't a known GML geometry, then is a geometry specified in the schema
|
321 |
//we know that this is special tag of geometry and the real geometry is after it
|
322 |
currentTag = getParser().next(); |
323 |
geometry = GMLUtilsParser.parseGeometry(getParser(),attName,getFactory()); |
324 |
} |
325 |
//Else, it does nothing
|
326 |
} |
327 |
} |
328 |
/****************
|
329 |
* <COMPLEX> *
|
330 |
****************/
|
331 |
else if ((gmlGeometry.isGML()==false)&&(attribute.getEntityType().getType() == IXMLType.COMPLEX)){ |
332 |
if (attribute.isMultiple()){
|
333 |
ArrayList multiple = null; |
334 |
if (values.get(attName) == null){ |
335 |
multiple = new ArrayList(); |
336 |
}else{
|
337 |
multiple = (ArrayList)values.get(attribute.getName());
|
338 |
} |
339 |
LinkedHashMap myValues = new LinkedHashMap(); |
340 |
geometry=parseComplexFeature(attribute,myValues,geometry); |
341 |
multiple.add(myValues); |
342 |
values.put(attName,multiple); |
343 |
}else{
|
344 |
LinkedHashMap myValues = new LinkedHashMap(); |
345 |
geometry=parseComplexFeature(attribute,myValues,geometry); |
346 |
values.put(attName,myValues); |
347 |
} |
348 |
} |
349 |
} |
350 |
} |
351 |
} |
352 |
break;
|
353 |
case KXmlParser.END_TAG:
|
354 |
if ((getParser().getName().compareTo(entity.getName()) == 0)){ |
355 |
end = true;
|
356 |
} |
357 |
break;
|
358 |
case KXmlParser.TEXT:
|
359 |
break;
|
360 |
} |
361 |
if ((!end)&&(goNextTag==true)){ |
362 |
currentTag = getParser().next(); |
363 |
} |
364 |
else{
|
365 |
goNextTag = true;
|
366 |
} |
367 |
} |
368 |
}catch (XmlPullParserException e) {
|
369 |
//Captured KXML parsing Exception
|
370 |
throw new GMLParserException(e); |
371 |
} catch (IOException e) { |
372 |
// TODO Auto-generated catch block
|
373 |
throw new GMLFileReadException(e); |
374 |
} |
375 |
return geometry;
|
376 |
} |
377 |
|
378 |
/**
|
379 |
* Parses a Complex type without Schema
|
380 |
* @param params
|
381 |
* @param values
|
382 |
* @return
|
383 |
* The geom
|
384 |
* @throws GMLException
|
385 |
*/
|
386 |
private Object parseComplexFeatureNoSchema(String entityTag,Map values) throws BaseException{ |
387 |
int currentTag;
|
388 |
boolean end = false; |
389 |
Object geometry = null; |
390 |
|
391 |
try{
|
392 |
currentTag = getParser().nextTag(); |
393 |
while (!end){
|
394 |
switch(currentTag){
|
395 |
case KXmlParser.START_TAG:
|
396 |
if (getParser().getName().compareTo(GMLTags.GML_BOUNDEDBY)==0){ |
397 |
GMLUtilsParser.parseBoundedBy(getParser()); |
398 |
}else{
|
399 |
String namespace = getParser().getNameSpace();
|
400 |
String tagName = getParser().getName();
|
401 |
GMLGeometries gmlGeometry = new GMLGeometries(tagName);
|
402 |
//If the tag hasn't namesapce it's local, maybe is an object declaration (or table component)
|
403 |
|
404 |
/**************
|
405 |
* <GEOMETRY> *
|
406 |
**************/
|
407 |
if ((namespace.compareTo("gml") == 0)||(gmlGeometry.isGML())){ |
408 |
//if is GML geometry we try to parse it
|
409 |
if (gmlGeometry.isGeometryGML()==true){ |
410 |
geometry = GMLUtilsParser.parseGeometry(getParser(),tagName,getFactory()); |
411 |
} |
412 |
else{
|
413 |
if (gmlGeometry.isFeatureGML()==false){ |
414 |
warnings.setElement(new GMLWarningWrongNamespace("gml")); |
415 |
//MAYBE IT HAD SCHEMA AND IS A GEOM DECLARED THERE, WE CAN TAKE IT LIKE THE IDENTIFIER OF THE GEOM
|
416 |
} |
417 |
//Else it do nothing
|
418 |
} |
419 |
} |
420 |
/**********
|
421 |
* <DATA> *
|
422 |
**********/
|
423 |
else{
|
424 |
//If another namespace it should be tables data
|
425 |
//it checks that it isn't geometry hide in other namespace
|
426 |
if (gmlGeometry.isGML()==false){ |
427 |
currentTag = getParser().next(); |
428 |
String nextTagName = getParser().getName();
|
429 |
gmlGeometry = new GMLGeometries(nextTagName);
|
430 |
/****************
|
431 |
* <SIMPLE> *
|
432 |
****************/
|
433 |
if (currentTag==KXmlParser.TEXT){
|
434 |
//it gets the value of the param,
|
435 |
//it doesn't know what type is, it takes string to default.
|
436 |
String texto = getParser().getText();
|
437 |
values.put(tagName,texto); |
438 |
|
439 |
} |
440 |
/****************
|
441 |
* <COMPLEX> *
|
442 |
****************/
|
443 |
else
|
444 |
{ |
445 |
goNextTag = false;
|
446 |
LinkedHashMap myValues = new LinkedHashMap(); |
447 |
parseComplexFeatureNoSchema("COMPLEX FEATURE",myValues);
|
448 |
values.put(tagName,myValues); |
449 |
} |
450 |
} |
451 |
} |
452 |
} |
453 |
break;
|
454 |
case KXmlParser.END_TAG:
|
455 |
if ((getParser().getName().compareTo(entityTag) == 0)||(getParser().getName().compareTo(getFeatureRoot()) == 0)){ |
456 |
end = true;
|
457 |
} |
458 |
break;
|
459 |
case KXmlParser.TEXT:
|
460 |
break;
|
461 |
} |
462 |
if ((!end)&&(goNextTag==true)){ |
463 |
currentTag = getParser().next(); |
464 |
} |
465 |
else{
|
466 |
goNextTag = true;
|
467 |
} |
468 |
} |
469 |
}catch (XmlPullParserException e) {
|
470 |
//Captured KXML parsing Exception
|
471 |
throw new GMLParserException(e); |
472 |
} catch (IOException e) { |
473 |
// TODO Auto-generated catch block
|
474 |
throw new GMLFileReadException(e); |
475 |
} |
476 |
return geometry;
|
477 |
} |
478 |
|
479 |
} |