Revision 34026 branches/v2_0_0_prep/extensions/extGPE-gvSIG/src/org/gvsig/fmap/dal/store/gpe/handlers/FmapContentHandler.java

View differences:

FmapContentHandler.java
9 9
import java.util.Map;
10 10

  
11 11
import org.cresques.cts.IProjection;
12
import org.jfree.util.Log;
13
import org.slf4j.Logger;
14
import org.slf4j.LoggerFactory;
15

  
12 16
import org.gvsig.fmap.dal.DataTypes;
13 17
import org.gvsig.fmap.dal.exception.DataException;
14 18
import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor;
......
22 26
import org.gvsig.fmap.dal.store.gpe.model.GPEElement;
23 27
import org.gvsig.fmap.dal.store.gpe.model.GPEFeature;
24 28
import org.gvsig.fmap.geom.Geometry;
29
import org.gvsig.fmap.geom.Geometry.SUBTYPES;
30
import org.gvsig.fmap.geom.Geometry.TYPES;
25 31
import org.gvsig.fmap.geom.GeometryLocator;
26 32
import org.gvsig.fmap.geom.GeometryManager;
27
import org.gvsig.fmap.geom.Geometry.SUBTYPES;
28
import org.gvsig.fmap.geom.Geometry.TYPES;
29 33
import org.gvsig.fmap.geom.aggregate.MultiCurve;
30 34
import org.gvsig.fmap.geom.aggregate.MultiPoint;
31 35
import org.gvsig.fmap.geom.aggregate.MultiSurface;
......
90 94
 * @author Jorge Piera LLodr? (jorge.piera@iver.es)
91 95
 */
92 96
public class FmapContentHandler extends GPEContentHandler {
93
	private HashMap featureSet = null;
94
	private EditableFeatureType featureType = null;
95
	private FeatureStoreProviderServices store = null;
96
	private GPEStoreProvider storeProvider = null;
97
	private GeometryManager geomManager = GeometryLocator.getGeometryManager();
98
	private int featureId = 0;
99
	private Envelope envelope = null;
100
	private File file = null;
101
	private IProjection srs = null;
102
	private int geometryType = 0;
97
     private static final Logger LOG = LoggerFactory.getLogger(FmapContentHandler.class);
103 98

  
104
	public FmapContentHandler(IGPEErrorHandler errorHandler, FeatureStoreProviderServices store,
105
			GPEStoreProvider storeProvider, File file, IProjection srs, int geometryType) {
106
		super();
107
		setErrorHandler(errorHandler);
108
		this.store = store;
109
		this.storeProvider = storeProvider;
110
		this.file = file;
111
		this.srs = srs;
112
		this.geometryType = geometryType;
113
	}
99
    private HashMap featureSet = null;
100
    private EditableFeatureType featureType = null;
101
    private FeatureStoreProviderServices store = null;
102
    private GPEStoreProvider storeProvider = null;
103
    private GeometryManager geomManager = GeometryLocator.getGeometryManager();
104
    private int featureId = 0;
105
    private Envelope envelope = null;
106
    private File file = null;
107
    private IProjection srs = null;
108
    private int geometryType = 0;
114 109

  
115
	public int getFeaturesCount(){
116
		return featureSet.size();
117
	}
110
    public FmapContentHandler(IGPEErrorHandler errorHandler, FeatureStoreProviderServices store,
111
        GPEStoreProvider storeProvider, File file, IProjection srs, int geometryType) {
112
        super();
113
        setErrorHandler(errorHandler);
114
        this.store = store;
115
        this.storeProvider = storeProvider;
116
        this.file = file;
117
        this.srs = srs;
118
        this.geometryType = geometryType;
119
    }
118 120

  
119
	public Feature getFeatureAt(int index){
120
		return (Feature)featureSet.get(new Integer(index));
121
	}
121
    public int getFeaturesCount(){
122
        return featureSet.size();
123
    }
122 124

  
123
	public EditableFeatureType getFeatureType(){
124
		return featureType;
125
	}
125
    public Feature getFeatureAt(int index){
126
        return (Feature)featureSet.get(new Integer(index));
127
    }
126 128

  
129
    public EditableFeatureType getFeatureType(){
130
        return featureType;
131
    }
127 132

  
128
	/**
129
	 * @return the featureSet
130
	 */
131
	public HashMap getFeatureSet() {
132
		return featureSet;
133
	}
134 133

  
135
	/*
136
	 * (non-Javadoc)
137
	 * @see org.gvsig.gpe.parser.GPEContentHandler#startLayer(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, org.gvsig.gpe.parser.IAttributesIterator, java.lang.Object, java.lang.Object)
138
	 */
139
	public Object startLayer(String id, String namespace, String name,
140
			String description, String srs, IAttributesIterator iterator, Object parentLayer, Object box) {
141
		if (featureSet == null){
142
			featureSet = new HashMap();
143
		}
144
//		try {
145
//			schemaManager = new XMLSchemaManager();
146
//			schemaManager.addSchemas(iterator, file);
147
//		} catch (Exception e) {
148
//			getErrorHandler().addError(e);
149
//		}
150
		return featureSet;
151
	}
134
    /**
135
     * @return the featureSet
136
     */
137
    public HashMap getFeatureSet() {
138
        return featureSet;
139
    }
152 140

  
141
    /*
142
     * (non-Javadoc)
143
     * @see org.gvsig.gpe.parser.GPEContentHandler#startLayer(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, org.gvsig.gpe.parser.IAttributesIterator, java.lang.Object, java.lang.Object)
144
     */
145
    public Object startLayer(String id, String namespace, String name,
146
        String description, String srs, IAttributesIterator iterator, Object parentLayer, Object box) {
147
        if (featureSet == null){
148
            featureSet = new HashMap();
149
        }
150
        if (envelope == null){
151
            try {
152
                envelope = geomManager.createEnvelope(SUBTYPES.GEOM2D);
153
            } catch (CreateEnvelopeException e) {
154
                Log.error("Error creating the envelope", e);
155
            }
156
        }
157
        return featureSet;
158
    }
153 159

  
160
    /*
161
     * (non-Javadoc)
162
     * @see org.gvsig.gpe.IGPEContentHandler#endLayer(java.lang.Object)
163
     */
164
    public void endLayer(Object layer) {
165
        storeProvider.setEnvelope(envelope);
166
    }
154 167

  
155
	/*
156
	 * (non-Javadoc)
157
	 * @see org.gvsig.gpe.IGPEContentHandler#endLayer(java.lang.Object)
158
	 */
159
	public void endLayer(Object layer) {
160
		storeProvider.setEnvelope(envelope);
161
	}
168
    /*
169
     * (non-Javadoc)
170
     * @see org.gvsig.gpe.parser.GPEContentHandler#startPoint(java.lang.String, org.gvsig.gpe.parser.ICoordinateIterator, java.lang.String)
171
     */
172
    public Object startPoint(String id, ICoordinateIterator coords, String srs) {
173
        return createPoint(coords);
174
    }
162 175

  
163
	/*
164
	 * (non-Javadoc)
165
	 * @see org.gvsig.gpe.parser.GPEContentHandler#startPoint(java.lang.String, org.gvsig.gpe.parser.ICoordinateIterator, java.lang.String)
166
	 */
167
	public Object startPoint(String id, ICoordinateIterator coords, String srs) {
168
		return createPoint(coords);
169
	}
176
    private Point createPoint(ICoordinateIterator coords){
177
        double[] buffer = new double[coords.getDimension()];
178
        try {
179
            coords.hasNext();
180
            coords.next(buffer);
181
            Point point = null;
182
            if (coords.getDimension() == 2){
183
                point = (Point) geomManager.create(TYPES.POINT, SUBTYPES.GEOM2D);
184
            }else if (coords.getDimension() == 3){
185
                point = (Point) geomManager.create(TYPES.POINT, SUBTYPES.GEOM2DZ);
186
            }
187
            for (int i=0 ; i<buffer.length ; i++){
188
                point.setCoordinateAt(i, buffer[i]);
189
            }
190
            return point;
191
        } catch (IOException e) {
192
            getErrorHandler().addError(e);
193
        } catch (CreateGeometryException e) {
194
            getErrorHandler().addError(e);
195
        }
196
        return null;
197
    }
170 198

  
171
	private Point createPoint(ICoordinateIterator coords){
172
		double[] buffer = new double[coords.getDimension()];
173
		try {
174
			coords.hasNext();
175
			coords.next(buffer);
176
			Point point = null;
177
			if (coords.getDimension() == 2){
178
				point = (Point) geomManager.create(TYPES.POINT, SUBTYPES.GEOM2D);
179
			}else if (coords.getDimension() == 3){
180
				point = (Point) geomManager.create(TYPES.POINT, SUBTYPES.GEOM2DZ);
181
			}
182
			for (int i=0 ; i<buffer.length ; i++){
183
				point.setCoordinateAt(i, buffer[i]);
184
			}
185
			return point;
186
		} catch (IOException e) {
187
			getErrorHandler().addError(e);
188
		} catch (CreateGeometryException e) {
189
			getErrorHandler().addError(e);
190
		}
191
		return null;
192
	}
199
    private Point createPoint(double[] buffer){
200
        try {
201
            Point point = null;
202
            if (buffer.length == 2){
203
                point = (Point) geomManager.create(TYPES.POINT, SUBTYPES.GEOM2D);
204
            }else if (buffer.length == 3){
205
                point = (Point) geomManager.create(TYPES.POINT, SUBTYPES.GEOM2DZ);
206
            }
207
            for (int i=0 ; i<buffer.length ; i++){
208
                point.setCoordinateAt(i, buffer[i]);
209
            }
210
            return point;
211
        }catch (CreateGeometryException e) {
212
            getErrorHandler().addError(e);
213
        }
214
        return null;
215
    }
193 216

  
194
	private Point createPoint(double[] buffer){
195
		try {
196
			Point point = null;
197
			if (buffer.length == 2){
198
				point = (Point) geomManager.create(TYPES.POINT, SUBTYPES.GEOM2D);
199
			}else if (buffer.length == 3){
200
				point = (Point) geomManager.create(TYPES.POINT, SUBTYPES.GEOM2DZ);
201
			}
202
			for (int i=0 ; i<buffer.length ; i++){
203
				point.setCoordinateAt(i, buffer[i]);
204
			}
205
			return point;
206
		}catch (CreateGeometryException e) {
207
			getErrorHandler().addError(e);
208
		}
209
		return null;
210
	}
211 217

  
218
    /* (non-Javadoc)
219
     * @see org.gvsig.gpe.parser.GPEContentHandler#startLineString(java.lang.String, org.gvsig.gpe.parser.ICoordinateIterator, java.lang.String)
220
     */
221
    public Object startLineString(String id, ICoordinateIterator coords,
222
        String srs) {
223
        return createCurve(coords);
224
    }
212 225

  
213
	/* (non-Javadoc)
214
	 * @see org.gvsig.gpe.parser.GPEContentHandler#startLineString(java.lang.String, org.gvsig.gpe.parser.ICoordinateIterator, java.lang.String)
215
	 */
216
	public Object startLineString(String id, ICoordinateIterator coords,
217
			String srs) {
218
		return createCurve(coords);
219
	}
226
    private Curve createCurve(ICoordinateIterator coords){
227
        GeneralPathX gp = createGeneralPathX(coords);
228
        try {
229
            Curve curve = null;
230
            if (coords.getDimension() == 2){
231
                curve = (Curve) geomManager.create(TYPES.CURVE, SUBTYPES.GEOM2D);
232
            }else if (coords.getDimension() == 3){
233
                curve = (Curve) geomManager.create(TYPES.CURVE, SUBTYPES.GEOM2DZ);
234
            }
235
            curve.setGeneralPath(gp);
236
            return curve;
237
        } catch (CreateGeometryException e) {
238
            getErrorHandler().addError(e);
239
        }
240
        return null;
241
    }
220 242

  
221
	private Curve createCurve(ICoordinateIterator coords){
222
		GeneralPathX gp = createGeneralPathX(coords);
223
		try {
224
			Curve curve = null;
225
			if (coords.getDimension() == 2){
226
				curve = (Curve) geomManager.create(TYPES.CURVE, SUBTYPES.GEOM2D);
227
			}else if (coords.getDimension() == 3){
228
				curve = (Curve) geomManager.create(TYPES.CURVE, SUBTYPES.GEOM2DZ);
229
			}
230
			curve.setGeneralPath(gp);
231
			return curve;
232
		} catch (CreateGeometryException e) {
233
			getErrorHandler().addError(e);
234
		}
235
		return null;
236
	}
243
    private GeneralPathX createGeneralPathX(ICoordinateIterator coords){
244
        GeneralPathX gp = new GeneralPathX();
245
        if (coords == null){
246
            return gp;
247
        }
248
        double[] buffer = new double[coords.getDimension()];
249
        try {
250
            if (coords.hasNext()){
251
                coords.next(buffer);
252
                gp.moveTo(buffer[0], buffer[1]);
253
            }
254
            while(coords.hasNext()){
255
                coords.next(buffer);
256
                gp.lineTo(buffer[0], buffer[1]);
257
            }
258
        } catch (IOException e) {
259
            getErrorHandler().addError(e);
260
        }
261
        return gp;
262
    }
237 263

  
238
	private GeneralPathX createGeneralPathX(ICoordinateIterator coords){
239
		GeneralPathX gp = new GeneralPathX();
240
		if (coords == null){
241
			return gp;
242
		}
243
		double[] buffer = new double[coords.getDimension()];
244
		try {
245
			if (coords.hasNext()){
246
				coords.next(buffer);
247
				gp.moveTo(buffer[0], buffer[1]);
248
			}
249
			while(coords.hasNext()){
250
				coords.next(buffer);
251
				gp.lineTo(buffer[0], buffer[1]);
252
			}
253
		} catch (IOException e) {
254
			getErrorHandler().addError(e);
255
		}
256
		return gp;
257
	}
264
    /* (non-Javadoc)
265
     * @see org.gvsig.gpe.parser.GPEContentHandler#startPolygon(java.lang.String, org.gvsig.gpe.parser.ICoordinateIterator, java.lang.String)
266
     */
258 267

  
259
	/* (non-Javadoc)
260
	 * @see org.gvsig.gpe.parser.GPEContentHandler#startPolygon(java.lang.String, org.gvsig.gpe.parser.ICoordinateIterator, java.lang.String)
261
	 */
268
    public Object startPolygon(String id, ICoordinateIterator coords, String srs) {
269
        return createSurface(coords);
270
    }
262 271

  
263
	public Object startPolygon(String id, ICoordinateIterator coords, String srs) {
264
		return createSurface(coords);
265
	}
272
    private Surface createSurface(ICoordinateIterator coords){
273
        GeneralPathX gp = createGeneralPathX(coords);
274
        try {
275
            Surface surface = null;
276
            if (coords.getDimension() == 2){
277
                surface = (Surface) geomManager.create(TYPES.SURFACE, SUBTYPES.GEOM2D);
278
            }else if (coords.getDimension() == 3){
279
                surface = (Surface) geomManager.create(TYPES.SURFACE, SUBTYPES.GEOM2DZ);
280
            }
281
            surface.setGeneralPath(gp);
282
            return surface;
283
        } catch (CreateGeometryException e) {
284
            getErrorHandler().addError(e);
285
        }
286
        return null;
287
    }
266 288

  
267
	private Surface createSurface(ICoordinateIterator coords){
268
		GeneralPathX gp = createGeneralPathX(coords);
269
		try {
270
			Surface surface = null;
271
			if (coords.getDimension() == 2){
272
				surface = (Surface) geomManager.create(TYPES.SURFACE, SUBTYPES.GEOM2D);
273
			}else if (coords.getDimension() == 3){
274
				surface = (Surface) geomManager.create(TYPES.SURFACE, SUBTYPES.GEOM2DZ);
275
			}
276
			surface.setGeneralPath(gp);
277
			return surface;
278
		} catch (CreateGeometryException e) {
279
			getErrorHandler().addError(e);
280
		}
281
		return null;
282
	}
283 289

  
290
    /* (non-Javadoc)
291
     * @see org.gvsig.gpe.parser.GPEContentHandler#startInnerPolygon(java.lang.String, org.gvsig.gpe.parser.ICoordinateIterator, java.lang.String)
292
     */
293
    public Object startInnerPolygon(String id, ICoordinateIterator coords,
294
        String srs) {
295
        return createSurface(coords);
296
    }
284 297

  
285
	/* (non-Javadoc)
286
	 * @see org.gvsig.gpe.parser.GPEContentHandler#startInnerPolygon(java.lang.String, org.gvsig.gpe.parser.ICoordinateIterator, java.lang.String)
287
	 */
288
	public Object startInnerPolygon(String id, ICoordinateIterator coords,
289
			String srs) {
290
		return createSurface(coords);
291
	}
298
    /*
299
     * (non-Javadoc)
300
     * @see org.gvsig.gpe.IGPEContentHandler#addGeometryToFeature(java.lang.Object, java.lang.Object)
301
     */
302
    public void addGeometryToFeature(Object geometry, Object feature) {
303
        ((GPEFeature)feature).setGeometry((Geometry)geometry);
304
    }
292 305

  
293
	/*
294
	 * (non-Javadoc)
295
	 * @see org.gvsig.gpe.IGPEContentHandler#addGeometryToFeature(java.lang.Object, java.lang.Object)
296
	 */
297
	public void addGeometryToFeature(Object geometry, Object feature) {
298
		((GPEFeature)feature).setGeometry((Geometry)geometry);
299
	}
306
    /*
307
     * (non-Javadoc)
308
     * @see org.gvsig.gpe.IGPEContentHandler#addBboxToLayer(java.lang.Object, java.lang.Object)
309
     */
310
    public void addBboxToLayer(Object bbox, Object layer) {
311
        //		if (layer != null){
312
        //		GPEBBox gpeBBox = (GPEBBox)bbox;
313
        //		if (gpeBBox.getSrs() != null){
314
        //		IProjection projection = null;
315
        //		try{
316
        //		CRSFactory.getCRS(gpeBBox.getSrs());
317
        //		}catch(Exception e){
318
        //		//If the CRS factory has an error.
319
        //		}
320
        //		if ((projection != null) && (!(projection.equals(((FLayer)layer).getProjection())))){
321
        //		//TODO reproyectar la bbox y asignarsela a la capa
322
        //		}
323
        //		}
324
        //		((IGPEDriver)layer).setExtent(gpeBBox.getBbox2D());
325
        //		}
326
    }
300 327

  
301
	/*
302
	 * (non-Javadoc)
303
	 * @see org.gvsig.gpe.IGPEContentHandler#addBboxToLayer(java.lang.Object, java.lang.Object)
304
	 */
305
	public void addBboxToLayer(Object bbox, Object layer) {
306
		//		if (layer != null){
307
		//		GPEBBox gpeBBox = (GPEBBox)bbox;
308
		//		if (gpeBBox.getSrs() != null){
309
		//		IProjection projection = null;
310
		//		try{
311
		//		CRSFactory.getCRS(gpeBBox.getSrs());
312
		//		}catch(Exception e){
313
		//		//If the CRS factory has an error.
314
		//		}
315
		//		if ((projection != null) && (!(projection.equals(((FLayer)layer).getProjection())))){
316
		//		//TODO reproyectar la bbox y asignarsela a la capa
317
		//		}
318
		//		}
319
		//		((IGPEDriver)layer).setExtent(gpeBBox.getBbox2D());
320
		//		}
321
	}
328
    /*
329
     * (non-Javadoc)
330
     * @see org.gvsig.gpe.IGPEContentHandler#addElementToFeature(java.lang.Object, java.lang.Object)
331
     */
332
    public void addElementToFeature(Object element, Object feature) {
333
        GPEElement gpeElement = (GPEElement)element;
334
        ((GPEFeature)feature).addElement(gpeElement);
335
    }
322 336

  
323
	/*
324
	 * (non-Javadoc)
325
	 * @see org.gvsig.gpe.IGPEContentHandler#addElementToFeature(java.lang.Object, java.lang.Object)
326
	 */
327
	public void addElementToFeature(Object element, Object feature) {
328
		GPEElement gpeElement = (GPEElement)element;
329
		((GPEFeature)feature).addElement(gpeElement);
330
	}
337
    /*
338
     * (non-Javadoc)
339
     * @see org.gvsig.gpe.IGPEContentHandler#addFeatureToLayer(java.lang.Object, java.lang.Object)
340
     */
341
    public void addFeatureToLayer(Object feature, Object layer) {
342
        GPEFeature gpefeature = (GPEFeature)feature;
343
        Envelope currentEnvelope = gpefeature.getEnvelope();
344
        if (featureType == null){
345
            createFeatureType(gpefeature);
331 346

  
332
	/*
333
	 * (non-Javadoc)
334
	 * @see org.gvsig.gpe.IGPEContentHandler#addFeatureToLayer(java.lang.Object, java.lang.Object)
335
	 */
336
	public void addFeatureToLayer(Object feature, Object layer) {
337
		GPEFeature gpefeature = (GPEFeature)feature;
338
		Envelope currentEnvelope = gpefeature.getEnvelope();
339
		if (featureType == null){
340
			createFeatureType(gpefeature);
347
            //Initialize the envelope
348
            try {
349
                envelope = geomManager.createEnvelope(SUBTYPES.GEOM2D);
350
            } catch (CreateEnvelopeException e) {
351
                getErrorHandler().addError(e);
352
            }
353
            //Calculates the envelope
354
            envelope = currentEnvelope;
355
        }else{
356
            //Calculates the envelope
357
            if (currentEnvelope != null){
358
                envelope.add(currentEnvelope);
359
            }
360
        }
361
        //If it is null is a multilayer: not supported yet
362
        if (layer != null){
363
            FeatureProvider data;
364
            try {
365
                data = new DefaultFeatureProvider(featureType.getNotEditableCopy(), storeProvider.createNewOID());
366
                Map elements = gpefeature.getelements();
367
                Iterator keys = elements.keySet().iterator();
368
                Long gid = new Long(gpefeature.getId());
369
                data.set("gid", gid);
370
                data.setOID(gid);              
371
                while (keys.hasNext()){
372
                    String elementName = (String)keys.next();
373
                    data.set(elementName, ((GPEElement)elements.get(elementName)).getValue());
374
                }
375
                data.setDefaultGeometry(gpefeature.getGeometry());
376
                data.set(featureType.getDefaultGeometryAttributeIndex(), gpefeature.getGeometry());
377
                Feature dalFeature = store.createFeature(data);
378
                ((HashMap)layer).put(gid, dalFeature);
341 379

  
342
			//Initialize the envelope
343
			try {
344
				envelope = geomManager.createEnvelope(SUBTYPES.GEOM2D);
345
			} catch (CreateEnvelopeException e) {
346
				getErrorHandler().addError(e);
347
			}
348
			//Calculates the envelope
349
			envelope = currentEnvelope;
350
		}else{
351
			//Calculates the envelope
352
			envelope.add(currentEnvelope);
353
		}
354
		//If it is null is a multilayer: not supported yet
355
		if (layer != null){
356
			FeatureProvider data;
357
			try {
358
				data = new DefaultFeatureProvider(featureType.getNotEditableCopy(), storeProvider.createNewOID());
359
				Map elements = gpefeature.getelements();
360
				Iterator keys = elements.keySet().iterator();
361
				data.setDefaultGeometry(gpefeature.getGeometry());
362
				data.set("the_geom", gpefeature.getGeometry());
363
				data.setOID(gpefeature.getId());
364
				while (keys.hasNext()){
365
					String elementName = (String)keys.next();
366
					if (!elementName.equals("the_geom")){
367
						data.set(elementName, ((GPEElement)elements.get(elementName)).getValue());
368
					}
369
				}
370
				Feature dalFeature = store.createFeature(data);
371
				((HashMap)layer).put(gpefeature.getId(),dalFeature);
380
            } catch (DataException e) {
381
                getErrorHandler().addError(e);
382
            }
383
        }
384
    }
372 385

  
373
			} catch (DataException e) {
374
				getErrorHandler().addError(e);
375
			}
376
		}
377
	}
378
	
379
	private void createFeatureType(GPEFeature gpefeature){
380
		Map elements = gpefeature.getelements();
381
		Iterator keys = elements.keySet().iterator();
382
		featureType = store.createFeatureType();
383
		EditableFeatureAttributeDescriptor attributeDescriptor = featureType.add("the_geom", DataTypes.GEOMETRY).setGeometryType(geometryType);
384
		attributeDescriptor.setGeometrySubType(SUBTYPES.GEOM2D);
385
		attributeDescriptor.setSRS(srs);
386
		featureType.setDefaultGeometryAttributeName("the_geom");
387
		featureType.setHasOID(true);
388
		while (keys.hasNext()){
389
			String elementName = (String)keys.next();
390
			if (!elementName.equals("the_geom")){
391
				featureType.add(elementName, DataTypes.STRING);
392
			}
393
		}
394
		FeatureType defaultType = featureType.getNotEditableCopy();
395
		List types = new ArrayList(1);
396
		types.add(defaultType);
397
		this.store.setFeatureTypes(types, defaultType);
398
	}
386
    private void createFeatureType(GPEFeature gpefeature){
387
        Map elements = gpefeature.getelements();
388
        Iterator keys = elements.keySet().iterator();
389
        featureType = store.createFeatureType();
390
        //Adding the Geometry field
391
        EditableFeatureAttributeDescriptor attributeDescriptor = featureType.add("the_geom", DataTypes.GEOMETRY).setGeometryType(geometryType);
392
        attributeDescriptor.setGeometrySubType(SUBTYPES.GEOM2D);
393
        attributeDescriptor.setSRS(srs);
394
        featureType.setDefaultGeometryAttributeName("the_geom");
395
        //Adding the ID
396
        featureType.add("gid", DataTypes.LONG);
397
        featureType.setHasOID(true);
398
        while (keys.hasNext()){
399
            String elementName = (String)keys.next();
400
            if (!elementName.equals("the_geom")){
401
                featureType.add(elementName, DataTypes.STRING);
402
            }
403
        }
404
        FeatureType defaultType = featureType.getNotEditableCopy();
405
        List types = new ArrayList(1);
406
        types.add(defaultType);
407
        this.store.setFeatureTypes(types, defaultType);
408
    }
399 409

  
400
	/*
401
	 * (non-Javadoc)
402
	 * @see org.gvsig.gpe.IGPEContentHandler#addInnerPolygonToPolygon(java.lang.Object, java.lang.Object)
403
	 */
404
	public void addInnerPolygonToPolygon(Object innerPolygon, Object Polygon) {
405
		//((Geometry)Polygon).addGeometry((GPEGeometry)innerPolygon);
406
	}
410
    /*
411
     * (non-Javadoc)
412
     * @see org.gvsig.gpe.IGPEContentHandler#addInnerPolygonToPolygon(java.lang.Object, java.lang.Object)
413
     */
414
    public void addInnerPolygonToPolygon(Object innerPolygon, Object Polygon) {
415
        //((Geometry)Polygon).addGeometry((GPEGeometry)innerPolygon);
416
    }
407 417

  
408
	/*
409
	 * (non-Javadoc)
410
	 * @see org.gvsig.gpe.IGPEContentHandler#addNameToFeature(java.lang.String, java.lang.Object)
411
	 */
412
	public void addNameToFeature(String name, Object feature) {
418
    /*
419
     * (non-Javadoc)
420
     * @see org.gvsig.gpe.IGPEContentHandler#addNameToFeature(java.lang.String, java.lang.Object)
421
     */
422
    public void addNameToFeature(String name, Object feature) {
413 423

  
414
	}
424
    }
415 425

  
416
	/*
417
	 * (non-Javadoc)
418
	 * @see org.gvsig.gpe.IGPEContentHandler#addParentElementToElement(java.lang.Object, java.lang.Object)
419
	 */
420
	public void addParentElementToElement(Object parent, Object element) {
426
    /*
427
     * (non-Javadoc)
428
     * @see org.gvsig.gpe.IGPEContentHandler#addParentElementToElement(java.lang.Object, java.lang.Object)
429
     */
430
    public void addParentElementToElement(Object parent, Object element) {
421 431

  
422
	}
432
    }
423 433

  
424
	/*
425
	 * (non-Javadoc)
426
	 * @see org.gvsig.gpe.IGPEContentHandler#addSrsToLayer(java.lang.String, java.lang.Object)
427
	 */
428
	public void addSrsToLayer(String srs, Object Layer) {
429
		//		this.srs = srs;
430
	}
434
    /*
435
     * (non-Javadoc)
436
     * @see org.gvsig.gpe.IGPEContentHandler#addSrsToLayer(java.lang.String, java.lang.Object)
437
     */
438
    public void addSrsToLayer(String srs, Object Layer) {
439
        //		this.srs = srs;
440
    }
431 441

  
432 442

  
433
	/* (non-Javadoc)
434
	 * @see org.gvsig.gpe.parser.GPEContentHandler#startBbox(java.lang.String, org.gvsig.gpe.parser.ICoordinateIterator, java.lang.String)
435
	 */
436
	public Object startBbox(String id, ICoordinateIterator coords, String srs) {
437
		Envelope envelope = null;
438
		try {
439
			if (coords.getDimension() == 2){
440
				envelope = geomManager.createEnvelope(SUBTYPES.GEOM2D);
441
			}else if (coords.getDimension() == 3){
442
				envelope = geomManager.createEnvelope(SUBTYPES.GEOM2DZ);
443
			}
444
			double[] buffer = new double[coords.getDimension()];
443
    /* (non-Javadoc)
444
     * @see org.gvsig.gpe.parser.GPEContentHandler#startBbox(java.lang.String, org.gvsig.gpe.parser.ICoordinateIterator, java.lang.String)
445
     */
446
    public Object startBbox(String id, ICoordinateIterator coords, String srs) {
447
        Envelope envelope = null;
448
        try {
449
            if (coords.getDimension() == 2){
450
                envelope = geomManager.createEnvelope(SUBTYPES.GEOM2D);
451
            }else if (coords.getDimension() == 3){
452
                envelope = geomManager.createEnvelope(SUBTYPES.GEOM2DZ);
453
            }
454
            double[] buffer = new double[coords.getDimension()];
445 455

  
446
			if (coords.hasNext()){
447
				coords.next(buffer);
448
				envelope.setLowerCorner(createPoint(buffer));
449
			}
450
			if (coords.hasNext()){
451
				coords.next(buffer);
452
				envelope.setUpperCorner(createPoint(buffer));
453
			}
454
		} catch (IOException e) {
455
			getErrorHandler().addError(e);
456
		} catch (CreateEnvelopeException e) {
457
			getErrorHandler().addError(e);
458
		}
459
		return envelope;
460
	}
456
            if (coords.hasNext()){
457
                coords.next(buffer);
458
                envelope.setLowerCorner(createPoint(buffer));
459
            }
460
            if (coords.hasNext()){
461
                coords.next(buffer);
462
                envelope.setUpperCorner(createPoint(buffer));
463
            }
464
        } catch (IOException e) {
465
            getErrorHandler().addError(e);
466
        } catch (CreateEnvelopeException e) {
467
            getErrorHandler().addError(e);
468
        }
469
        return envelope;
470
    }
461 471

  
462
	/*
463
	 * (non-Javadoc)
464
	 * @see org.gvsig.gpe.parser.GPEContentHandler#startElement(java.lang.String, java.lang.String, java.lang.Object, org.gvsig.gpe.parser.IAttributesIterator, java.lang.Object)
465
	 */
466
	public Object startElement(String namespace, String name, Object value,
467
			IAttributesIterator attributesIterator,	Object parentElement) {
468
		return new GPEElement(name, (String)value, (GPEElement)parentElement);
469
	}
472
    /*
473
     * (non-Javadoc)
474
     * @see org.gvsig.gpe.parser.GPEContentHandler#startElement(java.lang.String, java.lang.String, java.lang.Object, org.gvsig.gpe.parser.IAttributesIterator, java.lang.Object)
475
     */
476
    public Object startElement(String namespace, String name, Object value,
477
        IAttributesIterator attributesIterator,	Object parentElement) {
478
        return new GPEElement(name, (String)value, (GPEElement)parentElement);
479
    }
470 480

  
471
	/*
472
	 * (non-Javadoc)
473
	 * @see org.gvsig.gpe.parser.GPEContentHandler#startFeature(java.lang.String, java.lang.String, java.lang.String, org.gvsig.gpe.parser.IAttributesIterator, java.lang.Object)
474
	 */
475
	public Object startFeature(String id, String namespace, String name,
476
			IAttributesIterator attributes, Object layer){
477
		String sId;
478
		if (id == null){
479
			sId = new String(new Long(featureId).toString());			
480
		}else{
481
			sId = id;
482
		}
483
		featureId++;
484
		//Check the xml schema...
485
//		for (int i=0 ; i<schemas.size() ; i++){
486
//			IXSSchema schema = schemas.get(i);
487
//			IXSElementDeclaration element = schema.getElementDeclarationByName(namespace, name);
488
//			if (element != null){
489
//				featureType = store.createFeatureType();
490
//				IXSTypeDefinition type = element.getTypeDefinition();
491
//				if (type instanceof IXSComplexTypeDefinition){
492
//					IXSComplexTypeDefinition complexType = (IXSComplexTypeDefinition)type;
493
//					complexType.getContentType().
494
//				}
495
//
496
//				featureType.add("the_geom", DataTypes.GEOMETRY).setGeometryType(TYPES.GEOMETRY);
497
//				featureType.setDefaultGeometryAttributeName("the_geom");
498
//				featureType.setHasOID(true);
499
//				while (keys.hasNext()){
500
//					String elementName = (String)keys.next();
501
//					featureType.add(elementName, DataTypes.STRING);
502
//				}
503
//				FeatureType defaultType = featureType.getNotEditableCopy();
504
//				List types = new ArrayList(1);
505
//				types.add(defaultType);
506
//				this.store.setFeatureTypes(types, defaultType);
507
//
508
//				//Initialize the envelope
509
//				try {
510
//					envelope = geomManager.createEnvelope(SUBTYPES.GEOM2D);
511
//				} catch (CreateEnvelopeException e) {
512
//					getErrorHandler().addError(e);
513
//				}
514
//			}
515
//		}
516
		return new GPEFeature(sId,
517
				name, name);
518
	}
481
    /*
482
     * (non-Javadoc)
483
     * @see org.gvsig.gpe.parser.GPEContentHandler#startFeature(java.lang.String, java.lang.String, java.lang.String, org.gvsig.gpe.parser.IAttributesIterator, java.lang.Object)
484
     */
485
    public Object startFeature(String id, String namespace, String name,
486
        IAttributesIterator attributes, Object layer){
487
        String sId;
488
        if (id == null){
489
            sId = new String(new Long(featureId).toString());			
490
        }else{
491
            sId = id;
492
        }
493
        featureId++;
494
        //Check the xml schema...
495
        //		for (int i=0 ; i<schemas.size() ; i++){
496
        //			IXSSchema schema = schemas.get(i);
497
        //			IXSElementDeclaration element = schema.getElementDeclarationByName(namespace, name);
498
        //			if (element != null){
499
        //				featureType = store.createFeatureType();
500
        //				IXSTypeDefinition type = element.getTypeDefinition();
501
        //				if (type instanceof IXSComplexTypeDefinition){
502
        //					IXSComplexTypeDefinition complexType = (IXSComplexTypeDefinition)type;
503
        //					complexType.getContentType().
504
        //				}
505
        //
506
        //				featureType.add("the_geom", DataTypes.GEOMETRY).setGeometryType(TYPES.GEOMETRY);
507
        //				featureType.setDefaultGeometryAttributeName("the_geom");
508
        //				featureType.setHasOID(true);
509
        //				while (keys.hasNext()){
510
        //					String elementName = (String)keys.next();
511
        //					featureType.add(elementName, DataTypes.STRING);
512
        //				}
513
        //				FeatureType defaultType = featureType.getNotEditableCopy();
514
        //				List types = new ArrayList(1);
515
        //				types.add(defaultType);
516
        //				this.store.setFeatureTypes(types, defaultType);
517
        //
518
        //				//Initialize the envelope
519
        //				try {
520
        //					envelope = geomManager.createEnvelope(SUBTYPES.GEOM2D);
521
        //				} catch (CreateEnvelopeException e) {
522
        //					getErrorHandler().addError(e);
523
        //				}
524
        //			}
525
        //		}
526
        return new GPEFeature(sId,
527
            name, name);
528
    }
519 529

  
520
	/* (non-Javadoc)
521
	 * @see org.gvsig.gpe.parser.GPEContentHandler#startLinearRing(java.lang.String, org.gvsig.gpe.parser.ICoordinateIterator, java.lang.String)
522
	 */
523
	public Object startLinearRing(String id, ICoordinateIterator coords,
524
			String srs) {
525
		return createSurface(coords);
526
	}
530
    /* (non-Javadoc)
531
     * @see org.gvsig.gpe.parser.GPEContentHandler#startLinearRing(java.lang.String, org.gvsig.gpe.parser.ICoordinateIterator, java.lang.String)
532
     */
533
    public Object startLinearRing(String id, ICoordinateIterator coords,
534
        String srs) {
535
        return createSurface(coords);
536
    }
527 537

  
528
	/*
529
	 * (non-Javadoc)
530
	 * @see org.gvsig.gpe.IGPEContentHandler#startMultiPoint(java.lang.String, java.lang.String)
531
	 */
532
	public Object startMultiPoint(String id, String srs) {
533
		try {
534
			return geomManager.create(TYPES.MULTIPOINT, SUBTYPES.GEOM2D);
535
		} catch (CreateGeometryException e) {
536
			getErrorHandler().addError(e);
537
		}
538
		return null;
539
	}
538
    /*
539
     * (non-Javadoc)
540
     * @see org.gvsig.gpe.IGPEContentHandler#startMultiPoint(java.lang.String, java.lang.String)
541
     */
542
    public Object startMultiPoint(String id, String srs) {
543
        try {
544
            return geomManager.create(TYPES.MULTIPOINT, SUBTYPES.GEOM2D);
545
        } catch (CreateGeometryException e) {
546
            getErrorHandler().addError(e);
547
        }
548
        return null;
549
    }
540 550

  
541
	/*
542
	 * (non-Javadoc)
543
	 * @see org.gvsig.gpe.IGPEContentHandler#addPointToMultiPoint(java.lang.Object, java.lang.Object)
544
	 */
545
	public void addPointToMultiPoint(Object point, Object multiPoint) {
546
		((MultiPoint)multiPoint).addPoint((Point)point);
547
	}
551
    /*
552
     * (non-Javadoc)
553
     * @see org.gvsig.gpe.IGPEContentHandler#addPointToMultiPoint(java.lang.Object, java.lang.Object)
554
     */
555
    public void addPointToMultiPoint(Object point, Object multiPoint) {
556
        ((MultiPoint)multiPoint).addPoint((Point)point);
557
    }
548 558

  
549
	/*
550
	 * (non-Javadoc)
551
	 * @see org.gvsig.gpe.IGPEContentHandler#startMultiLineString(java.lang.String, java.lang.String)
552
	 */
553
	public Object startMultiLineString(String id, String srs) {
554
		super.startMultiLineString(id, srs);
555
		try {
556
			return geomManager.create(TYPES.MULTICURVE, SUBTYPES.GEOM2D);
557
		} catch (CreateGeometryException e) {
558
			getErrorHandler().addError(e);
559
		}
560
		return null;
561
	}
559
    /*
560
     * (non-Javadoc)
561
     * @see org.gvsig.gpe.IGPEContentHandler#startMultiLineString(java.lang.String, java.lang.String)
562
     */
563
    public Object startMultiLineString(String id, String srs) {
564
        super.startMultiLineString(id, srs);
565
        try {
566
            return geomManager.create(TYPES.MULTICURVE, SUBTYPES.GEOM2D);
567
        } catch (CreateGeometryException e) {
568
            getErrorHandler().addError(e);
569
        }
570
        return null;
571
    }
562 572

  
563
	/*
564
	 * (non-Javadoc)
565
	 * @see org.gvsig.gpe.IGPEContentHandler#addLineStringToMultiLineString(java.lang.Object, java.lang.Object)
566
	 */
567
	public void addLineStringToMultiLineString(Object lineString, Object multiLineString) {
568
		((MultiCurve)multiLineString).addCurve((Curve)lineString);
569
	}
573
    /*
574
     * (non-Javadoc)
575
     * @see org.gvsig.gpe.IGPEContentHandler#addLineStringToMultiLineString(java.lang.Object, java.lang.Object)
576
     */
577
    public void addLineStringToMultiLineString(Object lineString, Object multiLineString) {
578
        ((MultiCurve)multiLineString).addCurve((Curve)lineString);
579
    }
570 580

  
571
	/*
572
	 * (non-Javadoc)
573
	 * @see org.gvsig.gpe.IGPEContentHandler#startMultiPolygon(java.lang.String, java.lang.String)
574
	 */
575
	public Object startMultiPolygon(String id, String srs) {
576
		super.startMultiPolygon(id, srs);
577
		try {
578
			return geomManager.create(TYPES.MULTISURFACE, SUBTYPES.GEOM2D);
579
		} catch (CreateGeometryException e) {
580
			getErrorHandler().addError(e);
581
		}
582
		return null;
583
	}
581
    /*
582
     * (non-Javadoc)
583
     * @see org.gvsig.gpe.IGPEContentHandler#startMultiPolygon(java.lang.String, java.lang.String)
584
     */
585
    public Object startMultiPolygon(String id, String srs) {
586
        super.startMultiPolygon(id, srs);
587
        try {
588
            return geomManager.create(TYPES.MULTISURFACE, SUBTYPES.GEOM2D);
589
        } catch (CreateGeometryException e) {
590
            getErrorHandler().addError(e);
591
        }
592
        return null;
593
    }
584 594

  
585
	/*
586
	 * (non-Javadoc)
587
	 * @see org.gvsig.gpe.IGPEContentHandler#addPolygonToMultiPolygon(java.lang.Object, java.lang.Object)
588
	 */
589
	public void addPolygonToMultiPolygon(Object polygon, Object multiPolygon) {
590
		((MultiSurface)multiPolygon).addSurface((Surface)polygon);
591
	}
595
    /*
596
     * (non-Javadoc)
597
     * @see org.gvsig.gpe.IGPEContentHandler#addPolygonToMultiPolygon(java.lang.Object, java.lang.Object)
598
     */
599
    public void addPolygonToMultiPolygon(Object polygon, Object multiPolygon) {
600
        ((MultiSurface)multiPolygon).addSurface((Surface)polygon);
601
    }
592 602

  
593
	/* (non-Javadoc)
594
	 * @see org.gvsig.gpe.GPEContentHandler#addCurveToMultiCurve(java.lang.Object, java.lang.Object)
595
	 */
596
	public void addCurveToMultiCurve(Object curve, Object multiCurve) {
597
		((MultiCurve)multiCurve).addCurve((Curve)curve);
598
	}
603
    /* (non-Javadoc)
604
     * @see org.gvsig.gpe.GPEContentHandler#addCurveToMultiCurve(java.lang.Object, java.lang.Object)
605
     */
606
    public void addCurveToMultiCurve(Object curve, Object multiCurve) {
607
        ((MultiCurve)multiCurve).addCurve((Curve)curve);
608
    }
599 609

  
600
	/* (non-Javadoc)
601
	 * @see org.gvsig.gpe.GPEContentHandler#addSegmentToCurve(java.lang.Object, java.lang.Object)
602
	 */
603
	public void addSegmentToCurve(Object segment, Object curve) {
604
		((Curve)curve).addVertex((Point)segment);
605
	}
610
    /* (non-Javadoc)
611
     * @see org.gvsig.gpe.GPEContentHandler#addSegmentToCurve(java.lang.Object, java.lang.Object)
612
     */
613
    public void addSegmentToCurve(Object segment, Object curve) {
614
        ((Curve)curve).addVertex((Point)segment);
615
    }
606 616

  
607
	/* (non-Javadoc)
608
	 * @see org.gvsig.gpe.parser.GPEContentHandler#startCurve(java.lang.String, org.gvsig.gpe.parser.ICoordinateIterator, java.lang.String)
609
	 */
610
	public Object startCurve(String id, ICoordinateIterator coords, String srs) {
611
		return createCurve(coords);
612
	}
617
    /* (non-Javadoc)
618
     * @see org.gvsig.gpe.parser.GPEContentHandler#startCurve(java.lang.String, org.gvsig.gpe.parser.ICoordinateIterator, java.lang.String)
619
     */
620
    public Object startCurve(String id, ICoordinateIterator coords, String srs) {
621
        return createCurve(coords);
622
    }
613 623

  
614
	/* (non-Javadoc)
615
	 * @see org.gvsig.gpe.GPEContentHandler#startCurve(java.lang.String, java.lang.String)
616
	 */
617
	public Object startCurve(String id, String srs) {
618
		return createCurve(null);
619
	}
624
    /* (non-Javadoc)
625
     * @see org.gvsig.gpe.GPEContentHandler#startCurve(java.lang.String, java.lang.String)
626
     */
627
    public Object startCurve(String id, String srs) {
628
        return createCurve(null);
629
    }
620 630

  
621
	/* (non-Javadoc)
622
	 * @see org.gvsig.gpe.GPEContentHandler#startMultiCurve(java.lang.String, java.lang.String)
623
	 */
624
	public Object startMultiCurve(String id, String srs) {
625
		try {
626
			return geomManager.create(TYPES.MULTICURVE, SUBTYPES.GEOM2D);
627
		} catch (CreateGeometryException e) {
628
			getErrorHandler().addError(e);
629
		}
630
		return null;
631
	}
631
    /* (non-Javadoc)
632
     * @see org.gvsig.gpe.GPEContentHandler#startMultiCurve(java.lang.String, java.lang.String)
633
     */
634
    public Object startMultiCurve(String id, String srs) {
635
        try {
636
            return geomManager.create(TYPES.MULTICURVE, SUBTYPES.GEOM2D);
637
        } catch (CreateGeometryException e) {
638
            getErrorHandler().addError(e);
639
        }
640
        return null;
641
    }
632 642

  
633
	/* (non-Javadoc)
634
	 * @see org.gvsig.gpe.GPEContentHandler#addGeometryToMultiGeometry(java.lang.Object, java.lang.Object)
635
	 */
636
	public void addGeometryToMultiGeometry(Object geometry, Object multiGeometry) {
637
		((MultiCurve)multiGeometry).addCurve((Curve)geometry);
638
	}
643
    /* (non-Javadoc)
644
     * @see org.gvsig.gpe.GPEContentHandler#addGeometryToMultiGeometry(java.lang.Object, java.lang.Object)
645
     */
646
    public void addGeometryToMultiGeometry(Object geometry, Object multiGeometry) {
647
        ((MultiCurve)multiGeometry).addCurve((Curve)geometry);
648
    }
639 649

  
640
	/* (non-Javadoc)
641
	 * @see org.gvsig.gpe.GPEContentHandler#startMultiGeometry(java.lang.String, java.lang.String)
642
	 */
643
	public Object startMultiGeometry(String id, String srs) {
644
		try {
645
			return geomManager.create(TYPES.AGGREGATE, SUBTYPES.GEOM2D);
646
		} catch (CreateGeometryException e) {
647
			getErrorHandler().addError(e);
648
		}
649
		return null;
650
	}
650
    /* (non-Javadoc)
651
     * @see org.gvsig.gpe.GPEContentHandler#startMultiGeometry(java.lang.String, java.lang.String)
652
     */
653
    public Object startMultiGeometry(String id, String srs) {
654
        try {
655
            return geomManager.create(TYPES.AGGREGATE, SUBTYPES.GEOM2D);
656
        } catch (CreateGeometryException e) {
657
            getErrorHandler().addError(e);
658
        }
659
        return null;
660
    }
651 661

  
652
	/**
653
	 * @return a new OID
654
	 */
655
	public Object createNewOID() {
656
		featureId++;
657
		return String.valueOf(featureId);
658
	}
662
    /**
663
     * @return a new OID
664
     */
665
    public Object createNewOID() {
666
        featureId++;
667
        return String.valueOf(featureId);
668
    }	
659 669

  
670
    /**
671
     * @param envelope the envelope to set
672
     */
673
    public void setEnvelope(Envelope envelope) {
674
        this.envelope = envelope;
675
    }
676

  
677
    /**
678
     * @param featureType the featureType to set
679
     */
680
    public void setFeatureType(EditableFeatureType featureType) {
681
        this.featureType = featureType;
682
    }
660 683
}

Also available in: Unified diff