Statistics
| Revision:

svn-gvsig-desktop / trunk / extensions / extGPE-gvSIG / src / org / gvsig / fmap / drivers / gpe / handlers / DefaultFmapContentHandler.java @ 37960

History | View | Annotate | Download (15.6 KB)

1
package org.gvsig.fmap.drivers.gpe.handlers;
2

    
3
import java.io.IOException;
4

    
5
import javax.xml.namespace.QName;
6

    
7
import org.gvsig.fmap.drivers.gpe.exceptions.CurveConversionWarning;
8
import org.gvsig.fmap.drivers.gpe.exceptions.NotMultipleLayerWarning;
9
import org.gvsig.fmap.drivers.gpe.model.GPEBBox;
10
import org.gvsig.fmap.drivers.gpe.model.GPECurve;
11
import org.gvsig.fmap.drivers.gpe.model.GPEElement;
12
import org.gvsig.fmap.drivers.gpe.model.GPEFeature;
13
import org.gvsig.fmap.drivers.gpe.model.GPEGeometry;
14
import org.gvsig.fmap.drivers.gpe.model.GPEMetadata;
15
import org.gvsig.fmap.drivers.gpe.model.GPEMultiGeometry;
16
import org.gvsig.fmap.drivers.gpe.model.GPEMultiLineGeometry;
17
import org.gvsig.fmap.drivers.gpe.model.GPEMultiPointGeometry;
18
import org.gvsig.fmap.drivers.gpe.model.GPEMultiPolygonGeometry;
19
import org.gvsig.fmap.drivers.gpe.model.GPEPolygon;
20
import org.gvsig.fmap.drivers.gpe.reader.AddFeatureToDriver;
21
import org.gvsig.fmap.drivers.gpe.reader.GPEVectorialDriver;
22
import org.gvsig.fmap.drivers.gpe.reader.IGPEDriver;
23
import org.gvsig.fmap.drivers.gpe.reader.KMLVectorialDriver;
24
import org.gvsig.fmap.drivers.gpe.utils.GPETypesConversion;
25
import org.gvsig.gpe.parser.GPEContentHandler;
26
import org.gvsig.gpe.parser.GPEErrorHandler;
27
import org.gvsig.gpe.parser.IAttributesIterator;
28
import org.gvsig.gpe.parser.ICoordinateIterator;
29

    
30
import com.hardcode.gdbms.engine.values.ValueFactory;
31
import com.iver.cit.gvsig.fmap.core.GeneralPathX;
32
import com.iver.cit.gvsig.fmap.core.ShapeFactory;
33
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
34
 *
35
 * Copyright (C) 2004 IVER T.I. and Generalitat Valenciana.
36
 *
37
 * This program is free software; you can redistribute it and/or
38
 * modify it under the terms of the GNU General Public License
39
 * as published by the Free Software Foundation; either version 2
40
 * of the License, or (at your option) any later version.
41
 *
42
 * This program is distributed in the hope that it will be useful,
43
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
44
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
45
 * GNU General Public License for more details.
46
 *
47
 * You should have received a copy of the GNU General Public License
48
 * along with this program; if not, write to the Free Software
49
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
50
 *
51
 * For more information, contact:
52
 *
53
 *  Generalitat Valenciana
54
 *   Conselleria d'Infraestructures i Transport
55
 *   Av. Blasco Ib??ez, 50
56
 *   46010 VALENCIA
57
 *   SPAIN
58
 *
59
 *      +34 963862235
60
 *   gvsig@gva.es
61
 *      www.gvsig.gva.es
62
 *
63
 *    or
64
 *
65
 *   IVER T.I. S.A
66
 *   Salamanca 50
67
 *   46005 Valencia
68
 *   Spain
69
 *
70
 *   +34 963163400
71
 *   dac@iver.es
72
 */
73
/* CVS MESSAGES:
74
 *
75
 * $Id$
76
 * $Log$
77
 *
78
 */
79
/**
80
 * @author Jorge Piera LLodr? (jorge.piera@iver.es)
81
 */
82
public abstract class DefaultFmapContentHandler extends GPEContentHandler {
83
        protected AddFeatureToDriver addFeature = null;
84
        private int features = 0;
85
        private boolean hasLayer = false;
86
        private IGPEDriver driver = null;
87

    
88
        public DefaultFmapContentHandler(GPEErrorHandler errorHandler,
89
                        IGPEDriver driver) {
90
                super();                
91
                setErrorHandler(errorHandler);
92
                this.driver = driver;
93
                GPEFeature.initIdFeature();
94
        }
95
        
96
        
97
        /*
98
         * (non-Javadoc)
99
         * @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)
100
         */
101
        public Object startLayer(String id, String namespace, String name,
102
                        String description, String srs, IAttributesIterator attributesIterator, Object parentLayer, Object box) {
103
                //Only one layer is supported
104
                if (hasLayer == false){
105
                        hasLayer = true;
106
                        addFeature = new AddFeatureToDriver();
107
                        //addFeature.setSchema(getSchemaDocument());
108
                }else{
109
                        getErrorHandler().addWarning(new NotMultipleLayerWarning());
110
                        //TODO patch to support multilayer on KML
111
                        if (driver.getName().equals(KMLVectorialDriver.DRIVERNAME)){
112
                                return driver;
113
                        }
114
                        return null;
115
                }                        
116
                return driver;
117
        }
118

    
119
        /*
120
         * (non-Javadoc)
121
         * @see org.gvsig.gpe.IGPEContentHandler#endLayer(java.lang.Object)
122
         */
123
        public void endLayer(Object layer) {
124
                IGPEDriver gpeDriver = (IGPEDriver)layer;
125
        }
126

    
127
        /*
128
         * (non-Javadoc)
129
         * @see org.gvsig.gpe.parser.GPEContentHandler#startPoint(java.lang.String, org.gvsig.gpe.parser.ICoordinateIterator, java.lang.String)
130
         */
131
        public Object startPoint(String id, ICoordinateIterator coords, String srs) {
132
                double[] buffer = new double[coords.getDimension()];
133
                double y = 0.0;
134
                try {
135
                        coords.hasNext();
136
                        coords.next(buffer);
137
                        return new GPEGeometry(id, ShapeFactory.createPoint2D(buffer[0], buffer[1]), srs);
138
                } catch (IOException e) {
139
                        getErrorHandler().addError(e);
140
                }
141
                return null;
142
        }
143

    
144
        /* (non-Javadoc)
145
         * @see org.gvsig.gpe.parser.GPEContentHandler#startLineString(java.lang.String, org.gvsig.gpe.parser.ICoordinateIterator, java.lang.String)
146
         */
147
        public Object startLineString(String id, ICoordinateIterator coords,
148
                        String srs) {
149
                GeneralPathX gp = new GeneralPathX();
150
                double[] buffer = new double[coords.getDimension()];
151
                try {
152
                        while(coords.hasNext()){
153
                                coords.next(buffer);
154
                                gp.append(ShapeFactory.createPoint2D(buffer[0], buffer[1]), true);
155
                        }
156
                } catch (IOException e) {
157
                        getErrorHandler().addError(e);
158
                }                
159
                return new GPEGeometry(id, ShapeFactory.createPolyline2D(gp), srs);
160
        }
161

    
162
        /* (non-Javadoc)
163
         * @see org.gvsig.gpe.parser.GPEContentHandler#startPolygon(java.lang.String, org.gvsig.gpe.parser.ICoordinateIterator, java.lang.String)
164
         */
165
        
166
        public Object startPolygon(String id, ICoordinateIterator coords, String srs) {
167
                GeneralPathX gp = new GeneralPathX();
168
                double[] buffer = new double[coords.getDimension()];
169
                try {
170
                        while(coords.hasNext()){
171
                                coords.next(buffer);
172
                                gp.append(ShapeFactory.createPoint2D(buffer[0], buffer[1]), true);
173
                        }
174
                } catch (IOException e) {
175
                        getErrorHandler().addError(e);
176
                }        
177
                return new GPEPolygon(id, gp, srs);
178
        }
179
        
180
        /* (non-Javadoc)
181
         * @see org.gvsig.gpe.parser.GPEContentHandler#startInnerPolygon(java.lang.String, org.gvsig.gpe.parser.ICoordinateIterator, java.lang.String)
182
         */        
183
        public Object startInnerPolygon(String id, ICoordinateIterator coords,
184
                        String srs) {
185
                GeneralPathX gp = new GeneralPathX();
186
                double[] buffer = new double[coords.getDimension()];
187
                try {
188
                        while(coords.hasNext()){
189
                                coords.next(buffer);
190
                                gp.append(ShapeFactory.createPoint2D(buffer[0], buffer[1]), true);
191
                        }
192
                } catch (IOException e) {
193
                        getErrorHandler().addError(e);
194
                }        
195
                return new GPEPolygon(id, gp, srs);
196
        }
197
        
198
        
199

    
200
        /*
201
         * (non-Javadoc)
202
         * @see org.gvsig.gpe.IGPEContentHandler#addGeometryToFeature(java.lang.Object, java.lang.Object)
203
         */
204
        public void addGeometryToFeature(Object geometry, Object feature) {
205
                ((GPEFeature)feature).setGeometry((GPEGeometry)geometry);
206
        }        
207

    
208
        /*
209
         * (non-Javadoc)
210
         * @see org.gvsig.gpe.IGPEContentHandler#addBboxToLayer(java.lang.Object, java.lang.Object)
211
         */
212
        public void addBboxToLayer(Object bbox, Object layer) {
213
//                if (layer != null){
214
//                GPEBBox gpeBBox = (GPEBBox)bbox;
215
//                if (gpeBBox.getSrs() != null){
216
//                IProjection projection = null;
217
//                try{
218
//                CRSFactory.getCRS(gpeBBox.getSrs());
219
//                }catch(Exception e){
220
//                //If the CRS factory has an error.
221
//                }
222
//                if ((projection != null) && (!(projection.equals(((FLayer)layer).getProjection())))){
223
//                //TODO reproyectar la bbox y asignarsela a la capa                                
224
//                }
225
//                }
226
//                ((IGPEDriver)layer).setExtent(gpeBBox.getBbox2D());
227
//                }
228
        }
229

    
230
        /*
231
         * (non-Javadoc)
232
         * @see org.gvsig.gpe.IGPEContentHandler#addElementToFeature(java.lang.Object, java.lang.Object)
233
         */
234
        public void addElementToFeature(Object element, Object feature) {
235
                ((GPEFeature)feature).addElement((GPEElement)element);
236
        }
237

    
238
        /*
239
         * (non-Javadoc)
240
         * @see org.gvsig.gpe.IGPEContentHandler#addFeatureToLayer(java.lang.Object, java.lang.Object)
241
         */
242
        public void addFeatureToLayer(Object feature, Object layer) {
243
                //If it is null is a multilayer: not supported yet
244
                if (layer != null){
245
                        addFeature.addFeatureToLayer((GPEVectorialDriver)layer,
246
                                        (GPEFeature)feature);
247
                }
248
        }
249

    
250
        /*
251
         * (non-Javadoc)
252
         * @see org.gvsig.gpe.IGPEContentHandler#addInnerPolygonToPolygon(java.lang.Object, java.lang.Object)
253
         */
254
        public void addInnerPolygonToPolygon(Object innerPolygon, Object Polygon) {
255
                ((GPEPolygon)Polygon).addInnerPolygon(((GPEPolygon)innerPolygon));
256
        }
257

    
258
        /*
259
         * (non-Javadoc)
260
         * @see org.gvsig.gpe.IGPEContentHandler#addNameToFeature(java.lang.String, java.lang.Object)
261
         */
262
        public void addNameToFeature(String name, Object feature) {
263
                GPEElement ele = new GPEElement("Name", ValueFactory.createValue(name));
264
                ((GPEFeature)feature).addElement((GPEElement)ele);
265
        }
266

    
267
        /*
268
         * (non-Javadoc)
269
         * @see org.gvsig.gpe.IGPEContentHandler#addParentElementToElement(java.lang.Object, java.lang.Object)
270
         */
271
        public void addParentElementToElement(Object parent, Object element) {
272

    
273
        }
274

    
275
        /*
276
         * (non-Javadoc)
277
         * @see org.gvsig.gpe.IGPEContentHandler#addSrsToLayer(java.lang.String, java.lang.Object)
278
         */
279
        public void addSrsToLayer(String srs, Object Layer) {
280
//                this.srs = srs; 
281
        }
282

    
283

    
284
        /* (non-Javadoc)
285
         * @see org.gvsig.gpe.parser.GPEContentHandler#startBbox(java.lang.String, org.gvsig.gpe.parser.ICoordinateIterator, java.lang.String)
286
         */        
287
        public Object startBbox(String id, ICoordinateIterator coords, String srs) {
288
                return new GPEBBox(id,coords,srs);                
289
        }        
290
        
291
        /*
292
         * (non-Javadoc)
293
         * @see org.gvsig.gpe.parser.GPEContentHandler#startElement(java.lang.String, java.lang.String, java.lang.Object, org.gvsig.gpe.parser.IAttributesIterator, java.lang.Object)
294
         */
295
        public Object startElement(String namespace, String name, Object value,
296
                         IAttributesIterator attributesIterator, Object parentElement) {
297
                return new GPEElement(name, GPETypesConversion.fromJavaTogvSIG(value), (GPEElement)parentElement);
298
        }
299

    
300
        /*
301
         * (non-Javadoc)
302
         * @see org.gvsig.gpe.parser.GPEContentHandler#startFeature(java.lang.String, java.lang.String, java.lang.String, org.gvsig.gpe.parser.IAttributesIterator, java.lang.Object)
303
         */
304
        public Object startFeature(String id, String name, String xsElementName,  IAttributesIterator attributesIterator, Object layer) {
305
                
306
                return new GPEFeature(ValueFactory.createValue(id),
307
                                name, xsElementName);
308
        }
309
        
310
        /* (non-Javadoc)
311
         * @see org.gvsig.gpe.parser.GPEContentHandler#startLinearRing(java.lang.String, org.gvsig.gpe.parser.ICoordinateIterator, java.lang.String)
312
         */        
313
        public Object startLinearRing(String id, ICoordinateIterator coords,
314
                        String srs) {
315
                GeneralPathX gp = new GeneralPathX();
316
                double[] buffer = new double[coords.getDimension()];
317
                try {
318
                        while(coords.hasNext()){
319
                                coords.next(buffer);
320
                                gp.append(ShapeFactory.createPoint2D(buffer[0], buffer[1]), true);
321
                        }
322
                } catch (IOException e) {
323
                        getErrorHandler().addError(e);
324
                }                
325
                return new GPEGeometry(id, ShapeFactory.createPolygon2D(gp), srs);
326
        }
327

    
328

    
329
        /*
330
         * (non-Javadoc)
331
         * @see org.gvsig.gpe.IGPEContentHandler#startMultiPoint(java.lang.String, java.lang.String)
332
         */
333
        public Object startMultiPoint(String id, String srs) {
334
                return new GPEMultiPointGeometry(id, srs);
335
        }
336

    
337
        /*
338
         * (non-Javadoc)
339
         * @see org.gvsig.gpe.IGPEContentHandler#addPointToMultiPoint(java.lang.Object, java.lang.Object)
340
         */
341
        public void addPointToMultiPoint(Object point, Object multiPoint) {
342
                ((GPEMultiGeometry)multiPoint).addGeometry((GPEGeometry)point);
343
        }
344

    
345
        /*
346
         * (non-Javadoc)
347
         * @see org.gvsig.gpe.IGPEContentHandler#startMultiLineString(java.lang.String, java.lang.String)
348
         */
349
        public Object startMultiLineString(String id, String srs) {
350
                super.startMultiLineString(id, srs);
351
                return new GPEMultiLineGeometry(id, srs);
352
        }
353

    
354
        /*
355
         * (non-Javadoc)
356
         * @see org.gvsig.gpe.IGPEContentHandler#addLineStringToMultiLineString(java.lang.Object, java.lang.Object)
357
         */
358
        public void addLineStringToMultiLineString(Object lineString, Object multiLineString) {
359
                ((GPEMultiGeometry)multiLineString).addGeometry((GPEGeometry)lineString);
360
        }
361

    
362
        /*
363
         * (non-Javadoc)
364
         * @see org.gvsig.gpe.IGPEContentHandler#startMultiPolygon(java.lang.String, java.lang.String)
365
         */
366
        public Object startMultiPolygon(String id, String srs) {
367
                super.startMultiPolygon(id, srs);
368
                return new GPEMultiPolygonGeometry(id,srs);
369
        }
370

    
371
        /*
372
         * (non-Javadoc)
373
         * @see org.gvsig.gpe.IGPEContentHandler#addPolygonToMultiPolygon(java.lang.Object, java.lang.Object)
374
         */
375
        public void addPolygonToMultiPolygon(Object polygon, Object multiPolygon) {
376
                ((GPEMultiGeometry)multiPolygon).addGeometry((GPEGeometry)polygon);
377
        }                
378

    
379
        /* (non-Javadoc)
380
         * @see org.gvsig.gpe.GPEContentHandler#addCurveToMultiCurve(java.lang.Object, java.lang.Object)
381
         */
382
        public void addCurveToMultiCurve(Object curve, Object multiCurve) {
383
                ((GPEMultiGeometry)multiCurve).addGeometry((GPEGeometry)curve);
384
        }
385

    
386
        /* (non-Javadoc)
387
         * @see org.gvsig.gpe.GPEContentHandler#addSegmentToCurve(java.lang.Object, java.lang.Object)
388
         */
389
        public void addSegmentToCurve(Object segment, Object curve) {
390
                ((GPECurve)curve).addSegment((GPEGeometry)segment);                
391
        }
392

    
393
        /* (non-Javadoc)
394
         * @see org.gvsig.gpe.parser.GPEContentHandler#startCurve(java.lang.String, org.gvsig.gpe.parser.ICoordinateIterator, java.lang.String)
395
         */
396
        public Object startCurve(String id, ICoordinateIterator coords, String srs) {
397
                getErrorHandler().addWarning(new CurveConversionWarning(id));
398
                GeneralPathX gp = new GeneralPathX();
399
                double[] buffer = new double[coords.getDimension()];
400
                try {
401
                        while(coords.hasNext()){
402
                                coords.next(buffer);
403
                                gp.append(ShapeFactory.createPoint2D(buffer[0], buffer[1]), true);
404
                        }
405
                } catch (IOException e) {
406
                        getErrorHandler().addError(e);
407
                }                
408
                return new GPEGeometry(id, ShapeFactory.createPolyline2D(gp), srs);
409
        }
410

    
411
        /* (non-Javadoc)
412
         * @see org.gvsig.gpe.GPEContentHandler#startCurve(java.lang.String, java.lang.String)
413
         */
414
        public Object startCurve(String id, String srs) {
415
                getErrorHandler().addWarning(new CurveConversionWarning(id));
416
                return new GPECurve(id, srs);
417
        }
418

    
419
        /* (non-Javadoc)
420
         * @see org.gvsig.gpe.GPEContentHandler#startMultiCurve(java.lang.String, java.lang.String)
421
         */
422
        public Object startMultiCurve(String id, String srs) {
423
                return new GPEMultiLineGeometry(id, srs);                
424
        }
425

    
426
        /* (non-Javadoc)
427
         * @see org.gvsig.gpe.GPEContentHandler#addGeometryToMultiGeometry(java.lang.Object, java.lang.Object)
428
         */
429
        public void addGeometryToMultiGeometry(Object geometry, Object multiGeometry) {
430
                ((GPEMultiGeometry)multiGeometry).addGeometry((GPEGeometry)geometry);
431
        }
432

    
433
        /* (non-Javadoc)
434
         * @see org.gvsig.gpe.GPEContentHandler#startMultiGeometry(java.lang.String, java.lang.String)
435
         */
436
        public Object startMultiGeometry(String id, String srs) {
437
                return new GPEMultiGeometry(id, srs);
438
        }
439

    
440

    
441
        @Override
442
        public void addMetadataToLayer(Object metadata, Object layer) {
443
                addFeature.addMetadataToLayer((GPEVectorialDriver) driver, (GPEMetadata) metadata);
444
        }
445

    
446

    
447
        @Override
448
        public Object startMetadata(String type, String data, IAttributesIterator attributes) {
449
                GPEMetadata meta=null;
450
                
451
                // TODO: Revisar si esto es necesario (en los test parece que deja el cursor
452
                // de lectura tocado. Ser?a bueno que quitaramos este bloque, ya que no se usa.
453
//                try {
454
//                        
455
//                        for(int i = 0; i<attributes.getNumAttributes();i++)
456
//                        {
457
//                                //String[] buffer = new String[2];
458
//                                QName name = attributes.nextAttributeName();
459
//                                Object value = attributes.nextAttribute();
460
////                                System.out.println(name.getLocalPart() + ":" + value);
461
//                        }
462
//                } catch (IOException e) {
463
//                        // TODO Auto-generated catch block
464
//                        e.printStackTrace();
465
//                }
466
                meta = new GPEMetadata();
467
                meta.setTagType(type);
468
                meta.setTagData(data);
469
                return meta;
470
        }
471

    
472

    
473
        @Override
474
        public void addMetadataToFeature(Object metadata, Object feature) {
475
                ((GPEFeature)feature).addMetadata((GPEMetadata)metadata);
476
        }
477

    
478

    
479
        @Override
480
        public void addMetadataToMetadata(Object metadata, Object parent) {
481
                ((GPEMetadata)parent).addChildData((GPEMetadata)metadata);
482
        }
483

    
484
}