Revision 53 branches/v1_9_0/libGPE-GML/src/org/gvsig/gpe/gml/parser/v2/geometries/GeometryBinding.java

View differences:

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