Revision 53 branches/v1_9_0/libGPE-GML/src/org/gvsig/gpe/gml/parser/v2/geometries/GeometryBinding.java
GeometryBinding.java | ||
---|---|---|
1 | 1 |
package org.gvsig.gpe.gml.parser.v2.geometries; |
2 | 2 |
|
3 | 3 |
import java.io.IOException; |
4 |
import java.util.HashMap; |
|
4 | 5 |
import java.util.Map; |
5 | 6 |
|
6 | 7 |
import javax.xml.namespace.QName; |
7 | 8 |
|
8 | 9 |
import org.gvsig.gpe.gml.parser.GPEDefaultGmlParser; |
10 |
import org.gvsig.gpe.gml.parser.profiles.IBindingProfile; |
|
9 | 11 |
import org.gvsig.gpe.gml.utils.GMLProjectionFactory; |
10 | 12 |
import org.gvsig.gpe.gml.utils.GMLTags; |
11 | 13 |
import org.gvsig.gpe.gml.utils.GMLUtilsParser; |
12 | 14 |
import org.gvsig.gpe.parser.IGPEErrorHandler; |
15 |
import org.gvsig.gpe.xml.stream.EventType; |
|
13 | 16 |
import org.gvsig.gpe.xml.stream.IXmlStreamReader; |
14 | 17 |
import org.gvsig.gpe.xml.stream.XmlStreamException; |
15 | 18 |
import org.gvsig.gpe.xml.utils.CompareUtils; |
... | ... | |
110 | 113 |
* @throws IOException |
111 | 114 |
*/ |
112 | 115 |
public Object parse(IXmlStreamReader parser,GPEDefaultGmlParser handler) throws XmlStreamException, IOException { |
113 |
int currentTag; |
|
114 |
Object geometry = null; |
|
115 | 116 |
|
116 |
QName tag = parser.getName(); |
|
117 |
currentTag = parser.getEventType(); |
|
118 |
|
|
119 |
|
|
120 |
switch(currentTag){ |
|
121 |
case IXmlStreamReader.START_ELEMENT: |
|
122 |
geometry = parseTag(parser, handler, tag); |
|
123 |
break; |
|
124 |
} |
|
125 |
return geometry; |
|
117 |
parser.require(EventType.START_ELEMENT, null, null); |
|
118 |
|
|
119 |
Object geometry = parseTag(parser, handler); |
|
120 |
|
|
121 |
//////parser.require(EventType.END_ELEMENT, null, null); |
|
122 |
return geometry; |
|
126 | 123 |
} |
127 | 124 |
|
128 | 125 |
/** |
... | ... | |
134 | 131 |
* @throws XmlStreamException |
135 | 132 |
* @throws IOException |
136 | 133 |
*/ |
137 |
protected Object parseTag(IXmlStreamReader parser,GPEDefaultGmlParser handler, QName tag) throws XmlStreamException, IOException{ |
|
138 |
Object geometry = null; |
|
139 |
//PROPERTIES |
|
140 |
if (CompareUtils.compareWithNamespace(tag,GMLTags.GML_GEOMETRYPROPERTY)){ |
|
141 |
geometry = handler.getProfile().getGeometryPropertyTypeBinding(). |
|
142 |
parse(parser, handler); |
|
143 |
}else if (CompareUtils.compareWithNamespace(tag,GMLTags.GML_POINTPROPERTY)){ |
|
144 |
geometry = handler.getProfile().getPointPropertyTypeBinding(). |
|
145 |
parse(parser, handler); |
|
146 |
}else if (CompareUtils.compareWithNamespace(tag,GMLTags.GML_LINESTRINGPROPERTY)){ |
|
147 |
geometry = handler.getProfile().getLineStringPropertyTypeBinding(). |
|
148 |
parse(parser, handler); |
|
149 |
}else if (CompareUtils.compareWithNamespace(tag,GMLTags.GML_POLYGONPROPERTY)){ |
|
150 |
geometry = handler.getProfile().getPolygonPropertyTypeBinding(). |
|
151 |
parse(parser, handler); |
|
152 |
}else if (CompareUtils.compareWithNamespace(tag,GMLTags.GML_MULTIPOINTPROPERTY)){ |
|
153 |
geometry = handler.getProfile().getMultiPointPropertyTypeBinding(). |
|
154 |
parse(parser, handler); |
|
155 |
}else if (CompareUtils.compareWithNamespace(tag,GMLTags.GML_MULTILINESTRINGPROPERTY)){ |
|
156 |
geometry = handler.getProfile().getMultiLineStringPropertyTypeBinding(). |
|
157 |
parse(parser, handler); |
|
158 |
}else if (CompareUtils.compareWithNamespace(tag,GMLTags.GML_MULTIPOLYGONPROPERTY)){ |
|
159 |
geometry = handler.getProfile().getMultiPolygonPropertyTypeBinding(). |
|
160 |
parse(parser, handler); |
|
161 |
}else if (CompareUtils.compareWithNamespace(tag,GMLTags.GML_MULTIGEOMETRYPROPERTY)){ |
|
162 |
geometry = handler.getProfile().getMultiGeometryPropertyTypeBinding(). |
|
163 |
parse(parser, handler); |
|
164 |
} |
|
165 |
//GEOMETRIES |
|
166 |
else if (CompareUtils.compareWithNamespace(tag,GMLTags.GML_POINTMEMBER)){ |
|
167 |
geometry = handler.getProfile().getPointMemberTypeBinding(). |
|
168 |
parse(parser, handler); |
|
169 |
}else if (CompareUtils.compareWithNamespace(tag,GMLTags.GML_POINT)){ |
|
170 |
geometry = handler.getProfile().getPointTypeBinding(). |
|
171 |
parse(parser, handler); |
|
172 |
}else if (CompareUtils.compareWithNamespace(tag,GMLTags.GML_LINESTRINGMEMBER)){ |
|
173 |
geometry = handler.getProfile().getLineStringMemberTypeBinding(). |
|
174 |
parse(parser, handler); |
|
175 |
}else if (CompareUtils.compareWithNamespace(tag,GMLTags.GML_LINESTRING)){ |
|
176 |
geometry = handler.getProfile().getLineStringTypeBinding(). |
|
177 |
parse(parser, handler); |
|
178 |
}else if (CompareUtils.compareWithNamespace(tag,GMLTags.GML_LINEARRING)){ |
|
179 |
geometry = handler.getProfile().getLinearRingTypeBinding(). |
|
180 |
parse(parser, handler); |
|
181 |
}else if (CompareUtils.compareWithNamespace(tag,GMLTags.GML_POLYGONMEMBER)){ |
|
182 |
geometry = handler.getProfile().getPointMemberTypeBinding(). |
|
183 |
parse(parser, handler); |
|
184 |
}else if (CompareUtils.compareWithNamespace(tag,GMLTags.GML_POLYGON)){ |
|
185 |
geometry = handler.getProfile().getPolygonTypeBinding(). |
|
186 |
parse(parser, handler); |
|
187 |
}else if (CompareUtils.compareWithNamespace(tag,GMLTags.GML_GEOMETRYMEMBER)){ |
|
188 |
geometry = handler.getProfile().getGeometryMemberTypeBinding(). |
|
189 |
parse(parser, handler); |
|
190 |
}else if (CompareUtils.compareWithNamespace(tag,GMLTags.GML_MULTIPOINT)){ |
|
191 |
geometry = handler.getProfile().getMultiPointTypeBinding(). |
|
192 |
parse(parser, handler); |
|
193 |
}else if (CompareUtils.compareWithNamespace(tag,GMLTags.GML_MULTILINESTRING)){ |
|
194 |
geometry = handler.getProfile().getMultiLineStringTypeBinding(). |
|
195 |
parse(parser, handler); |
|
196 |
}else if (CompareUtils.compareWithNamespace(tag,GMLTags.GML_MULTIPOLYGON)){ |
|
197 |
geometry = handler.getProfile().getMultiPolygonTypeBinding(). |
|
198 |
parse(parser, handler); |
|
199 |
}else if (CompareUtils.compareWithNamespace(tag,GMLTags.GML_MULTIGEOMETRY)){ |
|
200 |
geometry = handler.getProfile().getMultiGeometryTypeBinding(). |
|
201 |
parse(parser, handler); |
|
202 |
} |
|
203 |
//POINT PROPERTY ALIASES |
|
204 |
else if (CompareUtils.compareWithNamespace(tag,GMLTags.GML_LOCATION) || |
|
205 |
CompareUtils.compareWithNamespace(tag,GMLTags.GML_CENTEROF) || |
|
206 |
CompareUtils.compareWithNamespace(tag,GMLTags.GML_POSITION)){ |
|
207 |
geometry = handler.getProfile().getPointTypeBinding(). |
|
208 |
parse(parser, handler); |
|
209 |
} |
|
210 |
//LINESTRING PROPERTY ALIASES |
|
211 |
else if (CompareUtils.compareWithNamespace(tag,GMLTags.GML_EDGEOF) || |
|
212 |
CompareUtils.compareWithNamespace(tag,GMLTags.GML_CENTERLINEOF)){ |
|
213 |
geometry = handler.getProfile().getLineStringPropertyTypeBinding(). |
|
214 |
parse(parser, handler); |
|
215 |
} |
|
216 |
//POLYGON PROPERTY ALIASES |
|
217 |
else if (CompareUtils.compareWithNamespace(tag,GMLTags.GML_EXTENTOF) || |
|
218 |
CompareUtils.compareWithNamespace(tag,GMLTags.GML_COVERAGE)){ |
|
219 |
geometry = handler.getProfile().getPolygonPropertyTypeBinding(). |
|
220 |
parse(parser, handler); |
|
221 |
} |
|
222 |
//MULTIPOINT PROPERTY ALIASES |
|
223 |
else if (CompareUtils.compareWithNamespace(tag,GMLTags.GML_MULTILOCATION) || |
|
224 |
CompareUtils.compareWithNamespace(tag,GMLTags.GML_MULTIPOSITION)){ |
|
225 |
geometry = handler.getProfile().getMultiPointPropertyTypeBinding(). |
|
226 |
parse(parser, handler); |
|
227 |
} |
|
228 |
//MULTILINESTRING PROPERTY ALIASES |
|
229 |
else if (CompareUtils.compareWithNamespace(tag,GMLTags.GML_MULTIEDGEOF) || |
|
230 |
CompareUtils.compareWithNamespace(tag,GMLTags.GML_MULTICENTERLINEOF)){ |
|
231 |
geometry =handler.getProfile().getMultiLineStringPropertyTypeBinding(). |
|
232 |
parse(parser, handler); |
|
233 |
} |
|
234 |
//MULTIPOLYGON PROPERTY ALIASES |
|
235 |
else if (CompareUtils.compareWithNamespace(tag,GMLTags.GML_MULTIEXTENTOF) || |
|
236 |
CompareUtils.compareWithNamespace(tag,GMLTags.GML_MULTICOVERAGE)){ |
|
237 |
geometry = handler.getProfile().getMultiPolygonTypeBinding(). |
|
238 |
parse(parser, handler); |
|
239 |
} |
|
240 |
return geometry; |
|
134 |
protected Object parseTag(IXmlStreamReader parser, GPEDefaultGmlParser handler) throws XmlStreamException, IOException{ |
|
135 |
parser.require(EventType.START_ELEMENT, null, null); |
|
136 |
final QName tag = parser.getElementName(); |
|
137 |
Object geometry = null; |
|
138 |
// PROPERTIES |
|
139 |
final IBindingProfile profile = handler.getProfile(); |
|
140 |
if (CompareUtils.compareWithNamespace(tag, GMLTags.GML_GEOMETRYPROPERTY)) { |
|
141 |
geometry = profile.getGeometryPropertyTypeBinding().parse(parser, handler); |
|
142 |
} else if (CompareUtils.compareWithNamespace(tag, GMLTags.GML_POINTPROPERTY)) { |
|
143 |
geometry = profile.getPointPropertyTypeBinding().parse(parser, handler); |
|
144 |
} else if (CompareUtils.compareWithNamespace(tag, GMLTags.GML_LINESTRINGPROPERTY)) { |
|
145 |
geometry = profile.getLineStringPropertyTypeBinding().parse(parser, handler); |
|
146 |
} else if (CompareUtils.compareWithNamespace(tag, GMLTags.GML_POLYGONPROPERTY)) { |
|
147 |
geometry = profile.getPolygonPropertyTypeBinding().parse(parser, handler); |
|
148 |
} else if (CompareUtils.compareWithNamespace(tag, GMLTags.GML_MULTIPOINTPROPERTY)) { |
|
149 |
geometry = profile.getMultiPointPropertyTypeBinding().parse(parser, handler); |
|
150 |
} else if (CompareUtils.compareWithNamespace(tag, GMLTags.GML_MULTILINESTRINGPROPERTY)) { |
|
151 |
geometry = profile.getMultiLineStringPropertyTypeBinding().parse(parser, handler); |
|
152 |
} else if (CompareUtils.compareWithNamespace(tag, GMLTags.GML_MULTIPOLYGONPROPERTY)) { |
|
153 |
geometry = profile.getMultiPolygonPropertyTypeBinding().parse(parser, handler); |
|
154 |
} else if (CompareUtils.compareWithNamespace(tag, GMLTags.GML_MULTIGEOMETRYPROPERTY)) { |
|
155 |
geometry = profile.getMultiGeometryPropertyTypeBinding().parse(parser, handler); |
|
156 |
} |
|
157 |
// GEOMETRIES |
|
158 |
else if (CompareUtils.compareWithNamespace(tag, GMLTags.GML_POINTMEMBER)) { |
|
159 |
geometry = profile.getPointMemberTypeBinding().parse(parser, handler); |
|
160 |
} else if (CompareUtils.compareWithNamespace(tag, GMLTags.GML_POINT)) { |
|
161 |
geometry = profile.getPointTypeBinding().parse(parser, handler); |
|
162 |
} else if (CompareUtils.compareWithNamespace(tag, GMLTags.GML_LINESTRINGMEMBER)) { |
|
163 |
geometry = profile.getLineStringMemberTypeBinding().parse(parser, handler); |
|
164 |
} else if (CompareUtils.compareWithNamespace(tag, GMLTags.GML_LINESTRING)) { |
|
165 |
geometry = profile.getLineStringTypeBinding().parse(parser, handler); |
|
166 |
} else if (CompareUtils.compareWithNamespace(tag, GMLTags.GML_LINEARRING)) { |
|
167 |
geometry = profile.getLinearRingTypeBinding().parse(parser, handler); |
|
168 |
} else if (CompareUtils.compareWithNamespace(tag, GMLTags.GML_POLYGONMEMBER)) { |
|
169 |
geometry = profile.getPointMemberTypeBinding().parse(parser, handler); |
|
170 |
} else if (CompareUtils.compareWithNamespace(tag, GMLTags.GML_POLYGON)) { |
|
171 |
geometry = profile.getPolygonTypeBinding().parse(parser, handler); |
|
172 |
} else if (CompareUtils.compareWithNamespace(tag, GMLTags.GML_GEOMETRYMEMBER)) { |
|
173 |
geometry = profile.getGeometryMemberTypeBinding().parse(parser, handler); |
|
174 |
} else if (CompareUtils.compareWithNamespace(tag, GMLTags.GML_MULTIPOINT)) { |
|
175 |
geometry = profile.getMultiPointTypeBinding().parse(parser, handler); |
|
176 |
} else if (CompareUtils.compareWithNamespace(tag, GMLTags.GML_MULTILINESTRING)) { |
|
177 |
geometry = profile.getMultiLineStringTypeBinding().parse(parser, handler); |
|
178 |
} else if (CompareUtils.compareWithNamespace(tag, GMLTags.GML_MULTIPOLYGON)) { |
|
179 |
geometry = profile.getMultiPolygonTypeBinding().parse(parser, handler); |
|
180 |
} else if (CompareUtils.compareWithNamespace(tag, GMLTags.GML_MULTIGEOMETRY)) { |
|
181 |
geometry = profile.getMultiGeometryTypeBinding().parse(parser, handler); |
|
182 |
} |
|
183 |
// POINT PROPERTY ALIASES |
|
184 |
else if (CompareUtils.compareWithNamespace(tag, GMLTags.GML_LOCATION) |
|
185 |
|| CompareUtils.compareWithNamespace(tag, GMLTags.GML_CENTEROF) |
|
186 |
|| CompareUtils.compareWithNamespace(tag, GMLTags.GML_POSITION)) { |
|
187 |
geometry = profile.getPointTypeBinding().parse(parser, handler); |
|
188 |
} |
|
189 |
// LINESTRING PROPERTY ALIASES |
|
190 |
else if (CompareUtils.compareWithNamespace(tag, GMLTags.GML_EDGEOF) |
|
191 |
|| CompareUtils.compareWithNamespace(tag, GMLTags.GML_CENTERLINEOF)) { |
|
192 |
geometry = profile.getLineStringPropertyTypeBinding().parse(parser, handler); |
|
193 |
} |
|
194 |
// POLYGON PROPERTY ALIASES |
|
195 |
else if (CompareUtils.compareWithNamespace(tag, GMLTags.GML_EXTENTOF) |
|
196 |
|| CompareUtils.compareWithNamespace(tag, GMLTags.GML_COVERAGE)) { |
|
197 |
geometry = profile.getPolygonPropertyTypeBinding().parse(parser, handler); |
|
198 |
} |
|
199 |
// MULTIPOINT PROPERTY ALIASES |
|
200 |
else if (CompareUtils.compareWithNamespace(tag, GMLTags.GML_MULTILOCATION) |
|
201 |
|| CompareUtils.compareWithNamespace(tag, GMLTags.GML_MULTIPOSITION)) { |
|
202 |
geometry = profile.getMultiPointPropertyTypeBinding().parse(parser, handler); |
|
203 |
} |
|
204 |
// MULTILINESTRING PROPERTY ALIASES |
|
205 |
else if (CompareUtils.compareWithNamespace(tag, GMLTags.GML_MULTIEDGEOF) |
|
206 |
|| CompareUtils.compareWithNamespace(tag, GMLTags.GML_MULTICENTERLINEOF)) { |
|
207 |
geometry = profile.getMultiLineStringPropertyTypeBinding().parse(parser, handler); |
|
208 |
} |
|
209 |
// MULTIPOLYGON PROPERTY ALIASES |
|
210 |
else if (CompareUtils.compareWithNamespace(tag, GMLTags.GML_MULTIEXTENTOF) |
|
211 |
|| CompareUtils.compareWithNamespace(tag, GMLTags.GML_MULTICOVERAGE)) { |
|
212 |
geometry = profile.getMultiPolygonTypeBinding().parse(parser, handler); |
|
213 |
} else { |
|
214 |
throw new IllegalStateException("Found no binding for element " + tag); |
|
215 |
} |
|
216 |
|
|
217 |
// make sure the parse method consumed the element fully |
|
218 |
///////parser.require(EventType.END_ELEMENT, tag.getNamespaceURI(), tag.getLocalPart()); |
|
219 |
return geometry; |
|
241 | 220 |
} |
242 | 221 |
|
222 |
/** |
|
223 |
* Save about 20% the geometry parsing time by cacheing the gml to GPE CRS names |
|
224 |
*/ |
|
225 |
private Map gmlToGPESrsNames = new HashMap(); |
|
226 |
|
|
243 | 227 |
/** |
244 | 228 |
* This method has to be invoked by all the geometries |
245 | 229 |
* before to make the parse process. It retrieves |
... | ... | |
260 | 244 |
id = null; |
261 | 245 |
} |
262 | 246 |
Object objSrs = attributes.get(GMLTags.GML_SRS_NAME); |
247 |
if(objSrs == null){ |
|
248 |
objSrs = attributes.get(new QName(GMLTags.GML_SRS_NAME.getLocalPart())); |
|
249 |
} |
|
263 | 250 |
if (objSrs != null){ |
264 |
srsName = GMLProjectionFactory.fromGMLToGPE((String)objSrs, errorHandler); |
|
251 |
srsName = (String) gmlToGPESrsNames.get(objSrs); |
|
252 |
if(srsName == null){ |
|
253 |
srsName = GMLProjectionFactory.fromGMLToGPE((String)objSrs, errorHandler); |
|
254 |
gmlToGPESrsNames.put(objSrs, srsName); |
|
255 |
} |
|
265 | 256 |
}else{ |
266 | 257 |
srsName = null; |
267 | 258 |
} |
Also available in: Unified diff