Statistics
| Revision:

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

History | View | Annotate | Download (17 KB)

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

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

    
7
import org.gvsig.gpe.GPEDefaults;
8
import org.gvsig.gpe.gml.GMLTags;
9
import org.gvsig.gpe.gml.writer.features.DescriptionWriter;
10
import org.gvsig.gpe.gml.writer.features.ElementWriter;
11
import org.gvsig.gpe.gml.writer.features.FeatureMemberWriter;
12
import org.gvsig.gpe.gml.writer.features.NameWriter;
13
import org.gvsig.gpe.gml.writer.geometries.BoundedByWriter;
14
import org.gvsig.gpe.gml.writer.geometries.GeometryMemberWriter;
15
import org.gvsig.gpe.gml.writer.geometries.InnerBoundaryIs;
16
import org.gvsig.gpe.gml.writer.geometries.LineStringMemberWriter;
17
import org.gvsig.gpe.gml.writer.geometries.LineStringWriter;
18
import org.gvsig.gpe.gml.writer.geometries.LinearRingWriter;
19
import org.gvsig.gpe.gml.writer.geometries.MultiGeometryWriter;
20
import org.gvsig.gpe.gml.writer.geometries.MultiLineStringWriter;
21
import org.gvsig.gpe.gml.writer.geometries.MultiPointWriter;
22
import org.gvsig.gpe.gml.writer.geometries.MultiPolygonWriter;
23
import org.gvsig.gpe.gml.writer.geometries.PointMemberWriter;
24
import org.gvsig.gpe.gml.writer.geometries.PointWriter;
25
import org.gvsig.gpe.gml.writer.geometries.PolygonMemberWriter;
26
import org.gvsig.gpe.gml.writer.geometries.PolygonWriter;
27
import org.gvsig.gpe.xml.writer.GPEXmlWriterHandler;
28
import org.gvsig.gpe.xml.writer.Writer;
29

    
30
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
31
 *
32
 * Copyright (C) 2004 IVER T.I. and Generalitat Valenciana.
33
 *
34
 * This program is free software; you can redistribute it and/or
35
 * modify it under the terms of the GNU General Public License
36
 * as published by the Free Software Foundation; either version 2
37
 * of the License, or (at your option) any later version.
38
 *
39
 * This program is distributed in the hope that it will be useful,
40
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
41
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
42
 * GNU General Public License for more details.
43
 *
44
 * You should have received a copy of the GNU General Public License
45
 * along with this program; if not, write to the Free Software
46
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
47
 *
48
 * For more information, contact:
49
 *
50
 *  Generalitat Valenciana
51
 *   Conselleria d'Infraestructures i Transport
52
 *   Av. Blasco Ib??ez, 50
53
 *   46010 VALENCIA
54
 *   SPAIN
55
 *
56
 *      +34 963862235
57
 *   gvsig@gva.es
58
 *      www.gvsig.gva.es
59
 *
60
 *    or
61
 *
62
 *   IVER T.I. S.A
63
 *   Salamanca 50
64
 *   46005 Valencia
65
 *   Spain
66
 *
67
 *   +34 963163400
68
 *   dac@iver.es
69
 */
70
/* CVS MESSAGES:
71
 *
72
 * $Id: GPEGmlWriterHandler.java 12071 2007-06-07 14:53:59Z jorpiell $
73
 * $Log$
74
 * Revision 1.17  2007-06-07 14:53:30  jorpiell
75
 * Add the schema support
76
 *
77
 * Revision 1.16  2007/05/17 14:33:51  jorpiell
78
 * The fid attribute is written
79
 *
80
 * Revision 1.15  2007/05/16 12:07:47  jorpiell
81
 * Some warnings throwed
82
 *
83
 * Revision 1.14  2007/05/15 11:55:11  jorpiell
84
 * MultiGeometry is now supported
85
 *
86
 * Revision 1.13  2007/05/15 10:14:45  jorpiell
87
 * The element and the feature is managed like a Stack
88
 *
89
 * Revision 1.12  2007/05/14 11:18:12  jorpiell
90
 * Add the ErrorHandler to all the methods
91
 *
92
 * Revision 1.11  2007/05/08 10:24:16  jorpiell
93
 * Add comments to create javadocs
94
 *
95
 * Revision 1.10  2007/05/07 07:08:02  jorpiell
96
 * Add a constructor with the name and the description fields
97
 *
98
 * Revision 1.9  2007/04/26 14:40:03  jorpiell
99
 * Some writer handler methods updated
100
 *
101
 * Revision 1.8  2007/04/19 07:25:49  jorpiell
102
 * Add the add methods to teh contenhandler and change the register mode
103
 *
104
 * Revision 1.7  2007/04/18 11:03:55  jorpiell
105
 * Add the default schema property
106
 *
107
 * Revision 1.6  2007/04/17 07:00:35  jorpiell
108
 * GML name, descripction and Id tags separated
109
 *
110
 * Revision 1.5  2007/04/14 16:07:30  jorpiell
111
 * The writer has been created
112
 *
113
 * Revision 1.4  2007/04/13 13:16:00  jorpiell
114
 * Add the multiple geometries
115
 *
116
 * Revision 1.3  2007/04/13 07:17:57  jorpiell
117
 * Add the writting tests for the simple geometries
118
 *
119
 * Revision 1.2  2007/04/12 17:06:44  jorpiell
120
 * First GML writing tests
121
 *
122
 * Revision 1.1  2007/04/12 10:23:41  jorpiell
123
 * Add some writers and the GPEXml parser
124
 *
125
 *
126
 */
127
/**
128
 * GPE writer handler for the GML format. It writes a 
129
 * GML file.
130
 * @author Jorge Piera LLodr? (jorge.piera@iver.es)
131
 */
132
public class GPEGmlWriterHandler extends GPEXmlWriterHandler{
133
        //In GML there is only one label. It the consumer
134
        //try to add more labels the driver will be report
135
        //one exception
136
        private boolean oneLayer = false;
137
        
138
        //Used for the multi-geometries
139
        private boolean isMultiple = false;
140
        
141
        //Used to know if the multiple geometries has type
142
        private boolean hasMultipleType = false;
143
        
144
        //Used to close the labels
145
        private Stack currentFeature = null;
146
        private Stack currentElement = null;        
147
        
148
        //To manage the end of file
149
        private boolean isInitialized = false;
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
                } catch (IOException e) {
189
                        getErrorHandler().addError(e);
190
                }                
191
        }
192
        
193
        /*
194
         * (non-Javadoc)
195
         * @see org.gvsig.gpe.writer.GPEWriterHandler#close()
196
         */
197
        public void close(){
198
                try {
199
                        writer.write("\n");
200
                        writer.write("</" + GMLTags.GML_NAMESPACE + ":" + GMLTags.GML_FEATURCOLLECTION + ">");
201
                        writer.flush();
202
                        writer.close();
203
                } catch (IOException e) {
204
                        getErrorHandler().addError(e);
205
                }
206
        }
207
        
208
        /*
209
         * (non-Javadoc)
210
         * @see org.gvsig.gpe.writer.GPEWriterHandler#startLayer(java.lang.String, java.lang.String, java.lang.String, java.lang.String)
211
         */
212
        public void startLayer(String id, String name, String description, String srs, String xsElementName) {
213
                if (!isInitialized){
214
                        initFileHeader(id);
215
                }
216
                //GML only can write one layer
217
                if (oneLayer){
218
                        //TODO: EXCEPCION DE NO PUEDO CON MAS DE UN LAYER
219
                }
220
                oneLayer = true;                
221
                try {
222
                        NameWriter.write(writer, name);
223
                        DescriptionWriter.write(writer, description);
224
                        //TODO: EL SRS SE PIERDE DEBIDO A LA SEMANTICA DEL GML
225
                } catch (IOException e) {
226
                        getErrorHandler().addError(e);
227
                }        
228
        }        
229
        
230
        /**
231
         * Writes the FeatureCollection tag with the fid and the 
232
         * sechemas
233
         * @param fid
234
         * Feature id
235
         */
236
        private void initFileHeader(String fid){
237
                try{
238
                        writer.write("\n");
239
                        writer.write("<" + GMLTags.GML_NAMESPACE + ":" + GMLTags.GML_FEATURCOLLECTION);
240
                        if (fid != null){
241
                                writer.write(" " + GMLTags.GML_FID + "=\"" + fid + "\"");
242
                        }
243
//                        Write the local namespace
244
                        String prefix = GPEDefaults.getStringProperty(GPEDefaults.NAMESPACE_PREFIX);
245
                        String uri = GPEDefaults.getStringProperty(GPEDefaults.NAMESPACE_URI);
246
                        if ((prefix != null) && (uri != null)){
247
                                writer.write(" " + GMLTags.XML_NAMESPACE + ":" + prefix + "=\"");
248
                                writer.write(uri + "\" ");                                
249
                        }
250
                        writer.write(" " + GMLTags.NAMESPACE_GML);
251
                        writer.write(" " + GMLTags.NAMESPACE_XML);
252
                        if (uri != null){
253
                                writer.write(" " + GMLTags.XML_XSI + ":" + GMLTags.XML_SCHEMA_LOCATION + "=\"");
254
                                writer.write(uri + " " + GPEDefaults.getStringProperty(GPEDefaults.XSD_SCHEMA_FILE) + "\"");
255
                        }                        
256
                        writer.write(">");
257
                } catch (IOException e) {
258
                        getErrorHandler().addError(e);
259
                }        
260
        }
261
        
262
        /*
263
         * (non-Javadoc)
264
         * @see org.gvsig.gpe.writers.GPEWriterHandler#endLayer()
265
         */
266
        public void endLayer() {
267

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

    
546
        /*
547
         * (non-Javadoc)
548
         * @see org.gvsig.gpe.writers.GPEWriterHandler#startMultiPoint(java.lang.String, java.lang.String)
549
         */
550
        public void startMultiGeometry(String id, String srs) {
551
                isMultiple = true;
552
                hasMultipleType = true;
553
                try {
554
                        MultiGeometryWriter.start(writer, getErrorHandler(), id, srs);
555
                } catch (IOException e) {
556
                        getErrorHandler().addError(e);
557
                }
558
        }
559
        
560
        /*
561
         * (non-Javadoc)
562
         * @see org.gvsig.gpe.writers.GPEWriterHandler#endMuliPoint()
563
         */
564
        public void endMultiGeometry() {
565
                isMultiple = false;
566
                hasMultipleType = false;
567
                try {
568
                        MultiGeometryWriter.end(writer, getErrorHandler());
569
                } catch (IOException e) {
570
                        getErrorHandler().addError(e);
571
                }
572
        }
573
        
574
        /*
575
         * (non-Javadoc)
576
         * @see org.gvsig.gpe.writers.GPEWriterHandler#startMultiLineString(java.lang.String, java.lang.String)
577
         */
578
        public void startMultiLineString(String id, String srs) {
579
                isMultiple = true;
580
                try {
581
                        MultiLineStringWriter.start(writer, getErrorHandler(), id, srs);
582
                } catch (IOException e) {
583
                        getErrorHandler().addError(e);
584
                }
585
        }
586
        
587
        /*
588
         * (non-Javadoc)
589
         * @see org.gvsig.gpe.writers.GPEWriterHandler#endMultiLineString()
590
         */
591
        public void endMultiLineString() {
592
                isMultiple = false;
593
                try {
594
                        MultiLineStringWriter.end(writer, getErrorHandler());
595
                } catch (IOException e) {
596
                        getErrorHandler().addError(e);
597
                }
598
        }
599

    
600
        /*
601
         * (non-Javadoc)
602
         * @see org.gvsig.gpe.writers.GPEWriterHandler#startMultiPolygon(java.lang.String, java.lang.String)
603
         */
604
        public void startMultiPolygon(String id, String srs) {
605
                isMultiple = true;
606
                try {
607
                        MultiPolygonWriter.start(writer, getErrorHandler(), id, srs);
608
                } catch (IOException e) {
609
                        getErrorHandler().addError(e);
610
                }                
611
        }
612
        
613
        /*
614
         * (non-Javadoc)
615
         * @see org.gvsig.gpe.writers.GPEWriterHandler#endMultiPolygon()
616
         */
617
        public void endMultiPolygon() {
618
                isMultiple = false;
619
                try {
620
                        MultiPolygonWriter.end(writer, getErrorHandler());
621
                } catch (IOException e) {
622
                        getErrorHandler().addError(e);
623
                }                
624
        }
625
}