Statistics
| Revision:

svn-gvsig-desktop / trunk / libraries / libGPE-GML / src / org / gvsig / gpe / gml / writer / GPEGmlWriterHandler.java @ 11694

History | View | Annotate | Download (16.7 KB)

1
package org.gvsig.gpe.gml.writer;
2

    
3
import java.io.File;
4
import java.io.FileWriter;
5
import java.io.IOException;
6
import java.util.Stack;
7

    
8
import org.gvsig.gpe.xml.writer.Writer;
9

    
10
import org.apache.xml.utils.NameSpace;
11
import org.gvsig.gpe.GPEDefaults;
12
import org.gvsig.gpe.GPEErrorHandler;
13
import org.gvsig.gpe.gml.GMLTags;
14
import org.gvsig.gpe.gml.bindings.geometries.GeometryMemberTypeBinding;
15
import org.gvsig.gpe.gml.writer.features.DescriptionWriter;
16
import org.gvsig.gpe.gml.writer.features.ElementWriter;
17
import org.gvsig.gpe.gml.writer.features.FeatureMemberWriter;
18
import org.gvsig.gpe.gml.writer.features.GidWriter;
19
import org.gvsig.gpe.gml.writer.features.NameWriter;
20
import org.gvsig.gpe.gml.writer.geometries.BoundedByWriter;
21
import org.gvsig.gpe.gml.writer.geometries.BoxWriter;
22
import org.gvsig.gpe.gml.writer.geometries.GeometryMemberWriter;
23
import org.gvsig.gpe.gml.writer.geometries.InnerBoundaryIs;
24
import org.gvsig.gpe.gml.writer.geometries.LineStringMemberWriter;
25
import org.gvsig.gpe.gml.writer.geometries.LineStringWriter;
26
import org.gvsig.gpe.gml.writer.geometries.LinearRingWriter;
27
import org.gvsig.gpe.gml.writer.geometries.MultiGeometryWriter;
28
import org.gvsig.gpe.gml.writer.geometries.MultiLineStringWriter;
29
import org.gvsig.gpe.gml.writer.geometries.MultiPointWriter;
30
import org.gvsig.gpe.gml.writer.geometries.MultiPolygonWriter;
31
import org.gvsig.gpe.gml.writer.geometries.PointMemberWriter;
32
import org.gvsig.gpe.gml.writer.geometries.PointWriter;
33
import org.gvsig.gpe.gml.writer.geometries.PolygonMemberWriter;
34
import org.gvsig.gpe.gml.writer.geometries.PolygonWriter;
35
import org.gvsig.gpe.xml.writer.GPEXmlWriterHandler;
36

    
37
import sun.rmi.runtime.GetThreadPoolAction;
38

    
39
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
40
 *
41
 * Copyright (C) 2004 IVER T.I. and Generalitat Valenciana.
42
 *
43
 * This program is free software; you can redistribute it and/or
44
 * modify it under the terms of the GNU General Public License
45
 * as published by the Free Software Foundation; either version 2
46
 * of the License, or (at your option) any later version.
47
 *
48
 * This program is distributed in the hope that it will be useful,
49
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
50
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
51
 * GNU General Public License for more details.
52
 *
53
 * You should have received a copy of the GNU General Public License
54
 * along with this program; if not, write to the Free Software
55
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
56
 *
57
 * For more information, contact:
58
 *
59
 *  Generalitat Valenciana
60
 *   Conselleria d'Infraestructures i Transport
61
 *   Av. Blasco Ib??ez, 50
62
 *   46010 VALENCIA
63
 *   SPAIN
64
 *
65
 *      +34 963862235
66
 *   gvsig@gva.es
67
 *      www.gvsig.gva.es
68
 *
69
 *    or
70
 *
71
 *   IVER T.I. S.A
72
 *   Salamanca 50
73
 *   46005 Valencia
74
 *   Spain
75
 *
76
 *   +34 963163400
77
 *   dac@iver.es
78
 */
79
/* CVS MESSAGES:
80
 *
81
 * $Id: GPEGmlWriterHandler.java 11694 2007-05-16 12:07:47Z jorpiell $
82
 * $Log$
83
 * Revision 1.15  2007-05-16 12:07:47  jorpiell
84
 * Some warnings throwed
85
 *
86
 * Revision 1.14  2007/05/15 11:55:11  jorpiell
87
 * MultiGeometry is now supported
88
 *
89
 * Revision 1.13  2007/05/15 10:14:45  jorpiell
90
 * The element and the feature is managed like a Stack
91
 *
92
 * Revision 1.12  2007/05/14 11:18:12  jorpiell
93
 * Add the ErrorHandler to all the methods
94
 *
95
 * Revision 1.11  2007/05/08 10:24:16  jorpiell
96
 * Add comments to create javadocs
97
 *
98
 * Revision 1.10  2007/05/07 07:08:02  jorpiell
99
 * Add a constructor with the name and the description fields
100
 *
101
 * Revision 1.9  2007/04/26 14:40:03  jorpiell
102
 * Some writer handler methods updated
103
 *
104
 * Revision 1.8  2007/04/19 07:25:49  jorpiell
105
 * Add the add methods to teh contenhandler and change the register mode
106
 *
107
 * Revision 1.7  2007/04/18 11:03:55  jorpiell
108
 * Add the default schema property
109
 *
110
 * Revision 1.6  2007/04/17 07:00:35  jorpiell
111
 * GML name, descripction and Id tags separated
112
 *
113
 * Revision 1.5  2007/04/14 16:07:30  jorpiell
114
 * The writer has been created
115
 *
116
 * Revision 1.4  2007/04/13 13:16:00  jorpiell
117
 * Add the multiple geometries
118
 *
119
 * Revision 1.3  2007/04/13 07:17:57  jorpiell
120
 * Add the writting tests for the simple geometries
121
 *
122
 * Revision 1.2  2007/04/12 17:06:44  jorpiell
123
 * First GML writing tests
124
 *
125
 * Revision 1.1  2007/04/12 10:23:41  jorpiell
126
 * Add some writers and the GPEXml parser
127
 *
128
 *
129
 */
130
/**
131
 * GPE writer handler for the GML format. It writes a 
132
 * GML file.
133
 * @author Jorge Piera LLodr? (jorge.piera@iver.es)
134
 */
135
public class GPEGmlWriterHandler extends GPEXmlWriterHandler{
136
        //In GML there is only one label. It the consumer
137
        //try to add more labels the driver will be report
138
        //one exception
139
        private boolean oneLayer = false;
140
        
141
        //Used for the multi-geometries
142
        private boolean isMultiple = false;
143
        
144
        //Used to know if the multiple geometries has type
145
        private boolean hasMultipleType = false;
146
        
147
        //Used to close the labels
148
        private Stack currentFeature = null;
149
        private Stack currentElement = null;        
150
        
151
        public GPEGmlWriterHandler(String name, String description) {
152
                super(name, description);        
153
                currentFeature = new Stack();
154
                currentElement = new Stack();
155
        }
156

    
157
        /*
158
         * (non-Javadoc)
159
         * @see org.gvsig.gpe.xml.writer.GPEXmlWriterHandler#createOutputStream()
160
         */
161
        protected Writer createWriter() throws IOException {
162
                return new Writer(new FileWriter(getOutputFile()));
163
        }
164
        
165
        /*
166
         * (non-Javadoc)
167
         * @see org.gvsig.gpe.writers.GPEWriterHandler#getDefaultFormat()
168
         */
169
        public String getDefaultFormat() {
170
                return "GML";
171
        }
172

    
173
        /*
174
         * (non-Javadoc)
175
         * @see org.gvsig.gpe.writers.GPEWriterHandler#getDefaultVersion()
176
         */
177
        public String getDefaultVersion() {
178
                return "2.1.2";
179
        }        
180
        
181
        /*
182
         * (non-Javadoc)
183
         * @see org.gvsig.gpe.writer.GPEWriterHandler#initialize()
184
         */
185
        public void initialize(){
186
                try {
187
                        initXmlHeader();
188
                        writer.write("\n");
189
                        writer.write("<" + GMLTags.GML_NAMESPACE + ":" + GMLTags.GML_FEATURCOLLECTION);
190
//                        Write the local namespace
191
                        String prefix = GPEDefaults.getStringProperty(GPEDefaults.NAMESPACE_PREFIX);
192
                        String uri = GPEDefaults.getStringProperty(GPEDefaults.NAMESPACE_URI);
193
                        if ((prefix != null) && (uri != null)){
194
                                writer.write(" " + GMLTags.XML_NAMESPACE + ":" + prefix + "=\"");
195
                                writer.write(uri + "\" ");                                
196
                        }
197
                        writer.write(" " + GMLTags.NAMESPACE_GML);
198
                        writer.write(" " + GMLTags.NAMESPACE_XML);
199
                        if (uri != null){
200
                                writer.write(" " + GMLTags.XML_XSI + ":" + GMLTags.XML_SCHEMA_LOCATION + "=\"");
201
                                writer.write(uri + " " + GPEDefaults.getStringProperty(GPEDefaults.XSD_SCHEMA_FILE) + "\"");
202
                        }
203
                        writer.write(">");
204
                } catch (IOException e) {
205
                        getErrorHandler().addError(e);
206
                }                
207
        }
208
        
209
        /*
210
         * (non-Javadoc)
211
         * @see org.gvsig.gpe.writer.GPEWriterHandler#close()
212
         */
213
        public void close(){
214
                try {
215
                        writer.write("\n");
216
                        writer.write("</" + GMLTags.GML_NAMESPACE + ":" + GMLTags.GML_FEATURCOLLECTION + ">");
217
                        writer.flush();
218
                        writer.close();
219
                } catch (IOException e) {
220
                        getErrorHandler().addError(e);
221
                }
222
        }
223
        
224
        /*
225
         * (non-Javadoc)
226
         * @see org.gvsig.gpe.writer.GPEWriterHandler#startLayer(java.lang.String, java.lang.String, java.lang.String, java.lang.String)
227
         */
228
        public void startLayer(String id, String name, String description, String srs) {
229
                //GML only can write one layer
230
                if (oneLayer){
231
                        //TODO: EXCEPCION DE NO PUEDO CON MAS DE UN LAYER
232
                }
233
                oneLayer = true;                
234
                try {
235
                        GidWriter.write(writer, id);
236
                        NameWriter.write(writer, name);
237
                        DescriptionWriter.write(writer, description);
238
                        //TODO: EL SRS SE PIERDE DEBIDO A LA SEMANTICA DEL GML
239
                } catch (IOException e) {
240
                        getErrorHandler().addError(e);
241
                }        
242
        }        
243
        
244
        /*
245
         * (non-Javadoc)
246
         * @see org.gvsig.gpe.writers.GPEWriterHandler#endLayer()
247
         */
248
        public void endLayer() {
249

    
250
        }
251
        
252
        /*
253
         * (non-Javadoc)
254
         * @see org.gvsig.gpe.writer.GPEWriterHandler#startFeature(java.lang.String, java.lang.String)
255
         */
256
        public void startFeature(String id, String name) {
257
                currentFeature.push(name);
258
                try {
259
                        FeatureMemberWriter.start(writer, id, name, getNamespacePrefix());
260
                } catch (IOException e) {
261
                        getErrorHandler().addError(e);
262
                }
263
        }
264
        
265
        /*
266
         * (non-Javadoc)
267
         * @see org.gvsig.gpe.writer.GPEWriterHandler#endFeature()
268
         */
269
        public void endFeature() {
270
                try {
271
                        FeatureMemberWriter.end(writer, (String)currentFeature.pop(), getNamespacePrefix());
272
                } catch (IOException e) {
273
                        getErrorHandler().addError(e);
274
                }                
275
        }
276
        
277
        /*
278
         * (non-Javadoc)
279
         * @see org.gvsig.gpe.writer.GPEWriterHandler#startElement(java.lang.String, java.lang.Object, java.lang.Object)
280
         */
281
        public void startElement(String name, Object value, Object type) {
282
                currentElement.push(name);
283
                try {
284
                        ElementWriter.start(writer, name, getNamespacePrefix(), value, type);
285
                } catch (IOException e) {
286
                        getErrorHandler().addError(e);
287
                }
288
                
289
        }
290
        
291
        /*
292
         * (non-Javadoc)
293
         * @see org.gvsig.gpe.writer.GPEWriterHandler#endElement()
294
         */
295
        public void endElement() {
296
                try {
297
                        ElementWriter.end(writer, (String)currentElement.pop(), getNamespacePrefix());                   
298
                } catch (IOException e) {
299
                        getErrorHandler().addError(e);
300
                }                
301
        }
302
        
303
        /*
304
         * (non-Javadoc)
305
         * @see org.gvsig.gpe.writer.GPEWriterHandler#startPoint(java.lang.String, double, double, double, java.lang.String)
306
         */
307
        public void startPoint(String id, double x, double y, double z, String srs) {
308
                try {
309
                        if (isMultiple){
310
                                if (hasMultipleType){
311
                                        GeometryMemberWriter.startPoint(writer, getErrorHandler(), id, srs);
312
                                        PointWriter.start(writer, getErrorHandler(), id, x, y, z, srs);
313
                                }else{
314
                                        PointMemberWriter.start(writer, getErrorHandler(), id, x, y, z, srs);
315
                                }
316
                        }else{
317
                                PointWriter.start(writer, getErrorHandler(), id, x, y, z, srs);
318
                        }
319
                } catch (IOException e) {
320
                        getErrorHandler().addError(e);
321
                }                
322
        }
323
        
324
        /*
325
         * (non-Javadoc)
326
         * @see org.gvsig.gpe.writer.GPEWriterHandler#endPoint()
327
         */
328
        public void endPoint() {
329
                try {
330
                        if (isMultiple){
331
                                if (hasMultipleType){
332
                                        PointWriter.end(writer, getErrorHandler());
333
                                        GeometryMemberWriter.end(writer, getErrorHandler());
334
                                }else{
335
                                        PointMemberWriter.end(writer, getErrorHandler());
336
                                }
337
                        }else{
338
                                PointWriter.end(writer, getErrorHandler());
339
                        }
340
                } catch (IOException e) {
341
                        getErrorHandler().addError(e);
342
                }
343
                
344
        }
345
        
346
        /*
347
         * (non-Javadoc)
348
         * @see org.gvsig.gpe.writer.GPEWriterHandler#startLineString(java.lang.String, double[], double[], double[], java.lang.String)
349
         */
350
        public void startLineString(String id, double[] x, double[] y, double[] z, String srs) {
351
                try {
352
                        if (isMultiple){
353
                                if (hasMultipleType){
354
                                        GeometryMemberWriter.startPoint(writer, getErrorHandler(), id, srs);
355
                                        LineStringWriter.start(writer, getErrorHandler(), id, x, y, z, srs);
356
                                }else{
357
                                        LineStringMemberWriter.start(writer, getErrorHandler(), id, x, y, z, srs);
358
                                }
359
                        }else{
360
                                LineStringWriter.start(writer, getErrorHandler(), id, x, y, z, srs);
361
                        }
362
                } catch (IOException e) {
363
                        getErrorHandler().addError(e);
364
                }                
365
        }
366
        
367
        /*
368
         * (non-Javadoc)
369
         * @see org.gvsig.gpe.writer.GPEWriterHandler#endLineString()
370
         */
371
        public void endLineString() {
372
                try {
373
                        if (isMultiple){
374
                                if (hasMultipleType){
375
                                        LineStringWriter.end(writer, getErrorHandler());
376
                                        GeometryMemberWriter.end(writer, getErrorHandler());
377
                                }else{
378
                                        LineStringMemberWriter.end(writer, getErrorHandler());
379
                                }
380
                        }else{
381
                                LineStringWriter.end(writer, getErrorHandler());
382
                        }
383
                } catch (IOException e) {
384
                        getErrorHandler().addError(e);
385
                }                
386
        }
387
        
388
        /*
389
         * (non-Javadoc)
390
         * @see org.gvsig.gpe.writer.GPEWriterHandler#startBbox(java.lang.String, double[], double[], double[], java.lang.String)
391
         */
392
        public void startBbox(String id, double[] x, double[] y, double[] z, String srs) {
393
                try {
394
                        BoundedByWriter.start(writer, getErrorHandler(), id, x, y, z, srs);
395
                } catch (IOException e) {
396
                        getErrorHandler().addError(e);
397
                }                
398
        }
399
        
400
        /*
401
         * (non-Javadoc)
402
         * @see org.gvsig.gpe.writer.GPEWriterHandler#endBbox()
403
         */
404
        public void endBbox() {
405
                try {
406
                        BoundedByWriter.end(writer, getErrorHandler());
407
                } catch (IOException e) {
408
                        getErrorHandler().addError(e);
409
                }                        
410
        }
411
        
412
        /*
413
         * (non-Javadoc)
414
         * @see org.gvsig.gpe.writers.GPEWriterHandler#startLinearRing(java.lang.String, double[], double[], double[], java.lang.String)
415
         */
416
        public void startLinearRing(String id, double[] x, double[] y, double[] z, String srs) {
417
                try {
418
                        LinearRingWriter.start(writer, getErrorHandler(), id, x, y, z, srs);
419
                } catch (IOException e) {
420
                        getErrorHandler().addError(e);
421
                }                        
422
        }
423
        
424
        /*
425
         * (non-Javadoc)
426
         * @see org.gvsig.gpe.writers.GPEWriterHandler#endLinearRing()
427
         */
428
        public void endLinearRing() {
429
                try {
430
                        LinearRingWriter.end(writer, getErrorHandler());
431
                } catch (IOException e) {
432
                        getErrorHandler().addError(e);
433
                }                
434
        }
435
        
436
        /*
437
         * (non-Javadoc)
438
         * @see org.gvsig.gpe.writers.GPEWriterHandler#startPolygon(java.lang.String, double[], double[], double[], java.lang.String)
439
         */
440
        public void startPolygon(String id, double[] x, double[] y, double[] z, String srs) {
441
                try {
442
                        if (isMultiple){
443
                                if (hasMultipleType){
444
                                        GeometryMemberWriter.startPoint(writer, getErrorHandler(), id, srs);
445
                                        PolygonWriter.start(writer, getErrorHandler(), id, x, y, z, srs);
446
                                }else{
447
                                        PolygonMemberWriter.start(writer, getErrorHandler(), id, x, y, z, srs);
448
                                }
449
                        }else{
450
                                PolygonWriter.start(writer, getErrorHandler(), id, x, y, z, srs);
451
                        }
452
                } catch (IOException e) {
453
                        getErrorHandler().addError(e);
454
                }
455
        }
456
        
457
        /*
458
         * (non-Javadoc)
459
         * @see org.gvsig.gpe.writers.GPEWriterHandler#endPolygon()
460
         */
461
        public void endPolygon() {
462
                try {
463
                        if (isMultiple){
464
                                if (hasMultipleType){
465
                                        PolygonWriter.end(writer, getErrorHandler());
466
                                        GeometryMemberWriter.end(writer, getErrorHandler());
467
                                }else{
468
                                        PolygonMemberWriter.end(writer, getErrorHandler());
469
                                }
470
                        }else{
471
                                PolygonWriter.end(writer, getErrorHandler());
472
                        }
473
                } catch (IOException e) {
474
                        getErrorHandler().addError(e);
475
                }        
476
        }
477
        
478
        /*
479
         * (non-Javadoc)
480
         * @see org.gvsig.gpe.writers.GPEWriterHandler#startInnerBoundary(java.lang.String, double[], double[], double[], java.lang.String)
481
         */
482
        public void startInnerBoundary(String id, double[] x, double[] y, double[] z, String srs) {
483
                try {
484
                        InnerBoundaryIs.start(writer, getErrorHandler(), x, y, z);
485
                } catch (IOException e) {
486
                        getErrorHandler().addError(e);
487
                }
488
        }
489
        
490
        /*
491
         * (non-Javadoc)
492
         * @see org.gvsig.gpe.writers.GPEWriterHandler#endInnerBoundary()
493
         */
494
        public void endInnerBoundary() {
495
                try {
496
                        InnerBoundaryIs.end(writer, getErrorHandler());
497
                } catch (IOException e) {
498
                        getErrorHandler().addError(e);
499
                }        
500
        }
501
        
502
        /*
503
         * (non-Javadoc)
504
         * @see org.gvsig.gpe.writers.GPEWriterHandler#startMultiPoint(java.lang.String, java.lang.String)
505
         */
506
        public void startMultiPoint(String id, String srs) {
507
                isMultiple = true;
508
                try {
509
                        MultiPointWriter.start(writer, getErrorHandler(), id, srs);
510
                } catch (IOException e) {
511
                        getErrorHandler().addError(e);
512
                }
513
        }
514
        
515
        /*
516
         * (non-Javadoc)
517
         * @see org.gvsig.gpe.writers.GPEWriterHandler#endMuliPoint()
518
         */
519
        public void endMultiPoint() {
520
                isMultiple = false;
521
                try {
522
                        MultiPointWriter.end(writer, getErrorHandler());
523
                } catch (IOException e) {
524
                        getErrorHandler().addError(e);
525
                }
526
        }
527

    
528
        /*
529
         * (non-Javadoc)
530
         * @see org.gvsig.gpe.writers.GPEWriterHandler#startMultiPoint(java.lang.String, java.lang.String)
531
         */
532
        public void startMultiGeometry(String id, String srs) {
533
                isMultiple = true;
534
                hasMultipleType = true;
535
                try {
536
                        MultiGeometryWriter.start(writer, getErrorHandler(), id, srs);
537
                } catch (IOException e) {
538
                        getErrorHandler().addError(e);
539
                }
540
        }
541
        
542
        /*
543
         * (non-Javadoc)
544
         * @see org.gvsig.gpe.writers.GPEWriterHandler#endMuliPoint()
545
         */
546
        public void endMultiGeometry() {
547
                isMultiple = false;
548
                hasMultipleType = false;
549
                try {
550
                        MultiGeometryWriter.end(writer, getErrorHandler());
551
                } catch (IOException e) {
552
                        getErrorHandler().addError(e);
553
                }
554
        }
555
        
556
        /*
557
         * (non-Javadoc)
558
         * @see org.gvsig.gpe.writers.GPEWriterHandler#startMultiLineString(java.lang.String, java.lang.String)
559
         */
560
        public void startMultiLineString(String id, String srs) {
561
                isMultiple = true;
562
                try {
563
                        MultiLineStringWriter.start(writer, getErrorHandler(), id, srs);
564
                } catch (IOException e) {
565
                        getErrorHandler().addError(e);
566
                }
567
        }
568
        
569
        /*
570
         * (non-Javadoc)
571
         * @see org.gvsig.gpe.writers.GPEWriterHandler#endMultiLineString()
572
         */
573
        public void endMultiLineString() {
574
                isMultiple = false;
575
                try {
576
                        MultiLineStringWriter.end(writer, getErrorHandler());
577
                } catch (IOException e) {
578
                        getErrorHandler().addError(e);
579
                }
580
        }
581

    
582
        /*
583
         * (non-Javadoc)
584
         * @see org.gvsig.gpe.writers.GPEWriterHandler#startMultiPolygon(java.lang.String, java.lang.String)
585
         */
586
        public void startMultiPolygon(String id, String srs) {
587
                isMultiple = true;
588
                try {
589
                        MultiPolygonWriter.start(writer, getErrorHandler(), id, srs);
590
                } catch (IOException e) {
591
                        getErrorHandler().addError(e);
592
                }                
593
        }
594
        
595
        /*
596
         * (non-Javadoc)
597
         * @see org.gvsig.gpe.writers.GPEWriterHandler#endMultiPolygon()
598
         */
599
        public void endMultiPolygon() {
600
                isMultiple = false;
601
                try {
602
                        MultiPolygonWriter.end(writer, getErrorHandler());
603
                } catch (IOException e) {
604
                        getErrorHandler().addError(e);
605
                }                
606
        }
607
}