Statistics
| Revision:

root / org.gvsig.wfs.app / trunk / org.gvsig.wfs.app / org.gvsig.wfs.app.mainplugin / src / main / java / org / gvsig / remoteclient / wfs / wfs_1_0_0 / WFSProtocolHandler1_0_0.java @ 112

History | View | Annotate | Download (17.6 KB)

1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (C) 2007-2013 gvSIG Association.
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 3
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 * For any additional information, do not hesitate to contact us
22
 * at info AT gvsig.com, or visit our website www.gvsig.com.
23
 */
24
package org.gvsig.remoteclient.wfs.wfs_1_0_0;
25

    
26
import java.io.File;
27
import java.io.FileNotFoundException;
28
import java.io.IOException;
29

    
30
import org.kxml2.io.KXmlParser;
31
import org.xmlpull.v1.XmlPullParserException;
32

    
33
import org.gvsig.compat.CompatLocator;
34
import org.gvsig.compat.lang.StringUtils;
35
import org.gvsig.remoteclient.utils.CapabilitiesTags;
36
import org.gvsig.remoteclient.utils.Utilities;
37
import org.gvsig.remoteclient.wfs.WFSProtocolHandler;
38
import org.gvsig.remoteclient.wfs.WFSStatus;
39
import org.gvsig.remoteclient.wfs.edition.WFSTTags;
40
import org.gvsig.remoteclient.wfs.exceptions.ExceptionsFactory;
41
import org.gvsig.remoteclient.wfs.exceptions.WFSException;
42
import org.gvsig.remoteclient.wfs.exceptions.WFSGetFeatureException;
43
import org.gvsig.remoteclient.wfs.request.WFSDescribeFeatureTypeRequest;
44
import org.gvsig.remoteclient.wfs.request.WFSGetFeatureRequest;
45
import org.gvsig.remoteclient.wfs.request.WFSTLockFeatureRequest;
46
import org.gvsig.remoteclient.wfs.request.WFSTransactionRequest;
47
import org.gvsig.remoteclient.wfs.request.WFSTransactionRequestInformation;
48
import org.gvsig.remoteclient.wfs.schema.XMLSchemaParser;
49
import org.gvsig.remoteclient.wfs.wfs_1_0_0.request.WFSDescribeFeatureTypeRequest1_0_0;
50
import org.gvsig.remoteclient.wfs.wfs_1_0_0.request.WFSGetFeatureRequest1_0_0;
51
import org.gvsig.remoteclient.wfs.wfs_1_0_0.request.WFSTLockFeatureRequest1_0_0;
52
import org.gvsig.remoteclient.wfs.wfs_1_0_0.request.WFSTransactionRequest1_0_0;
53
import org.slf4j.Logger;
54
import org.slf4j.LoggerFactory;
55

    
56
/**
57
 * @author Jorge Piera Llodr? (piera_jor@gva.es)
58
 */
59
public class WFSProtocolHandler1_0_0 extends WFSProtocolHandler{
60
    
61
    private static Logger logger = LoggerFactory.getLogger(WFSProtocolHandler1_0_0.class);
62
    private static final StringUtils stringUtils = CompatLocator.getStringUtils();
63
    
64
    public WFSProtocolHandler1_0_0(){
65
                this.version = "1.0.0";
66
                this.name = "WFS1.0.0";                
67
        }        
68
        
69
        /*
70
         * (non-Javadoc)
71
         * @see org.gvsig.remoteClient.OGCProtocolHandler#parseCapabilities(java.io.File)
72
         */
73
        public boolean parseCapabilities(File f) {
74
                int tag;
75
                XMLSchemaParser parser = null;
76
                parser = new XMLSchemaParser();
77
                try
78
                {
79
                        parser.setInput(f);
80
                        parser.nextTag();
81

    
82
                        if ( parser.getEventType() != KXmlParser.END_DOCUMENT ) 
83
                        {     
84
                                parser.require(KXmlParser.START_TAG, null, CapabilitiesTags.WFS_CAPABILITIES_ROOT1_0_0);             
85
                                //Parses the Namespaces...
86
                                parseNamespaces(parser);        
87
                                //Parse the capabilities document
88
                                tag = parser.nextTag();
89
                                while(tag != KXmlParser.END_DOCUMENT)
90
                                {
91
                                        switch(tag)
92
                                        {
93
                                        case KXmlParser.START_TAG:
94
                                                if (parser.getName().compareTo(CapabilitiesTags.SERVICE)==0)
95
                                                {
96
                                                        parseServiceTag(parser);
97
                                                } 
98
                                                else if (parser.getName().compareTo(CapabilitiesTags.CAPABILITY)==0)
99
                                                {
100
                                                        parseCapabilityTag(parser);
101
                                                } 
102
                                                else if (parser.getName().compareTo(CapabilitiesTags.WFS_FEATURETYPELIST)==0)
103
                                                {
104
                                                        parseFeatureTypeListTag(parser);
105
                                                } 
106
                                                break;
107
                                        case KXmlParser.END_TAG:                            
108
                                                break;
109
                                        case KXmlParser.TEXT:                                                                                                 
110
                                                break;
111
                                        }
112
                                        tag = parser.next();
113
                                }
114
                                parser.require(KXmlParser.END_DOCUMENT, null, null);                
115
                        }
116
                }
117
                catch(XmlPullParserException parser_ex){
118
                    logger.warn("Can't parse capabilities '"+Utilities.getAbsolutePathOrEmpty(f)+"'.",parser_ex);
119
                    return false;
120
                }
121
                catch (IOException ioe) {           
122
                    logger.warn("Can't parse capabilities '"+Utilities.getAbsolutePathOrEmpty(f)+"'.",ioe);
123
                    return false;
124
                }
125
                return true;
126
        }
127

    
128
        /**
129
         * <p>Parses the Service Information </p>
130
         */    
131
        private void parseServiceTag(KXmlParser parser) throws IOException, XmlPullParserException 
132
        {
133
                int currentTag;
134
                boolean end = false;
135

    
136
                parser.require(KXmlParser.START_TAG, null, CapabilitiesTags.SERVICE);
137
                currentTag = parser.next();
138

    
139
                while (!end) 
140
                {
141
                        switch(currentTag)
142
                        {
143
                        case KXmlParser.START_TAG:
144
                                if (parser.getName().compareToIgnoreCase(CapabilitiesTags.NAME)==0)
145
                                {
146
                                        serviceInfo.name = parser.nextText(); 
147
                                }   
148
                                else if (parser.getName().compareTo(CapabilitiesTags.WFS_TITLE)==0)
149
                                {
150
                                        serviceInfo.title = parser.nextText(); 
151
                                }
152
                                else if (parser.getName().compareTo(CapabilitiesTags.WFS_ABSTRACT)==0)
153
                                {
154
                                        serviceInfo.abstr = parser.nextText(); 
155
                                } 
156
                                else if (parser.getName().compareTo(CapabilitiesTags.ONLINERESOURCE)==0)
157
                                {
158
                                        serviceInfo.online_resource = parser.nextText();
159

    
160
                                }                               
161
                                break;
162
                        case KXmlParser.END_TAG:
163
                                if (parser.getName().compareTo(CapabilitiesTags.SERVICE) == 0)
164
                                        end = true;
165
                                break;
166
                        case KXmlParser.TEXT:                   
167
                                break;
168
                        }
169
                        if (!end){
170
                                currentTag = parser.next();
171
                        }
172
                }     
173
        }
174

    
175
        private void parseCapabilityTag(KXmlParser parser) throws IOException, XmlPullParserException
176
        {   
177
                int currentTag;
178
                boolean end = false;
179

    
180
                parser.require(KXmlParser.START_TAG, null, CapabilitiesTags.CAPABILITY);
181
                currentTag = parser.next();
182

    
183
                while (!end) 
184
                {
185
                        switch(currentTag)
186
                        {
187
                        case KXmlParser.START_TAG:
188
                                if (parser.getName().compareTo(CapabilitiesTags.REQUEST)==0)
189
                                {
190
                                        parseRequestTag(parser); 
191
                                }   
192
                                else if (parser.getName().compareTo(CapabilitiesTags.EXCEPTION)==0)
193
                                {
194
                                        //TODO Parse exception tags...
195
                                        parser.skipSubTree();
196
                                }
197
                                else if ((parser.getName().compareTo(CapabilitiesTags.VENDORSPECIFICCAPABILITIES)==0) ||
198
                                                (parser.getName().compareTo(CapabilitiesTags.USERDEFINEDSYMBOLIZATION )==0))
199
                                {
200
                                        parser.skipSubTree();
201
                                }                   
202
                                break;
203
                        case KXmlParser.END_TAG:
204
                                if (parser.getName().compareTo(CapabilitiesTags.CAPABILITY) == 0)
205
                                        end = true;
206
                                break;
207
                        case KXmlParser.TEXT:                   
208
                                break;
209
                        }
210
                        if (!end){
211
                                currentTag = parser.next();
212
                        }
213
                }
214
        }
215

    
216
        /**
217
         * <p>Parses the Request tag </p>
218
         */ 
219
        private void parseRequestTag(KXmlParser parser) throws IOException, XmlPullParserException
220
        {   
221
                int currentTag;
222
                boolean end = false;
223

    
224
                parser.require(KXmlParser.START_TAG, null, CapabilitiesTags.REQUEST);
225
                currentTag = parser.next();
226

    
227
                while (!end) 
228
                {
229
                        switch(currentTag)
230
                        {
231
                        case KXmlParser.START_TAG:
232
                                if (parser.getName().compareTo(CapabilitiesTags.GETCAPABILITIES)==0){
233
                                        parserDcpType(parser, CapabilitiesTags.GETCAPABILITIES);                                        
234
                                } else if (parser.getName().compareTo(CapabilitiesTags.WFS_DESCRIBEFEATURETYPE)==0)        {
235
                                        parserDcpType(parser, CapabilitiesTags.WFS_DESCRIBEFEATURETYPE);                                                             
236
                                }else if (parser.getName().compareTo(CapabilitiesTags.WFS_GETFEATURE)==0){
237
                                        parserDcpType(parser, CapabilitiesTags.WFS_GETFEATURE);
238
                                }else if (parser.getName().compareTo(CapabilitiesTags.WFS_LOCKFEATURE)==0){
239
                                        parserDcpType(parser, CapabilitiesTags.WFS_LOCKFEATURE);
240
                                }else if (parser.getName().compareTo(CapabilitiesTags.WFS_TRANSACTION)==0){
241
                                        parserDcpType(parser, CapabilitiesTags.WFS_TRANSACTION);
242
                                }               
243
                                break;
244
                        case KXmlParser.END_TAG:
245
                                if (parser.getName().compareTo(CapabilitiesTags.REQUEST) == 0)
246
                                        end = true;
247
                                break;
248
                        case KXmlParser.TEXT:                   
249
                                break;
250
                        }
251
                        if (!end){
252
                                currentTag = parser.next();
253
                        }
254
                }    
255
        }
256

    
257
        /**
258
         * It parses the feature typelist tag
259
         * @param parser
260
         * @throws IOException
261
         * @throws XmlPullParserException
262
         */
263
        private void parseFeatureTypeListTag(KXmlParser parser) throws IOException, XmlPullParserException{
264
                int currentTag;
265
                boolean end = false;
266

    
267
                parser.require(KXmlParser.START_TAG, null, CapabilitiesTags.WFS_FEATURETYPELIST);
268
                currentTag = parser.next();
269

    
270
                while (!end) 
271
                {
272
                        switch(currentTag)
273
                        {
274
                        case KXmlParser.START_TAG:
275
                                if (parser.getName().compareToIgnoreCase(CapabilitiesTags.WFS_FEATURETYPE)==0){
276
                                        //Parse the namespaces...
277
                                        parseNamespaces(parser);        
278
                                        WFSFeature1_0_0 feature = new WFSFeature1_0_0(serviceInfo);
279
                                        feature.parse(parser);        
280
                                        features.put(feature.getName(),feature);
281
                                }                                          
282
                                break;
283
                        case KXmlParser.END_TAG:
284
                                if (parser.getName().compareTo(CapabilitiesTags.WFS_FEATURETYPELIST) == 0)
285
                                        end = true;
286
                                break;
287
                        case KXmlParser.TEXT:                   
288
                                break;
289
                        }
290
                        if (!end){
291
                                currentTag = parser.next();
292
                        }
293
                }     
294
        }        
295

    
296
        /*
297
         *  (non-Javadoc)
298
         * @see org.gvsig.remoteClient.wfs.WFSProtocolHandler#parseGetFeature(java.io.File, java.lang.String)
299
         */
300
        protected boolean parseGetFeature(File f, String nameSpace) throws WFSException {
301
                XMLSchemaParser parser = null;
302
                parser = new XMLSchemaParser();
303
                try
304
                {
305
                        parser.setInput(f);
306
                        parser.nextTag();                                
307
                        if (parser.getName().compareTo(CapabilitiesTags.SERVICE_EXCEPTION_REPORT)==0){
308
                                throw ExceptionsFactory.parseServiceExceptionReport(parser);
309
                        }                        
310
                } catch (FileNotFoundException e) {
311
                        logger.warn("Can't get feature from file '"+Utilities.getAbsolutePathOrEmpty(f)+"' with namaspace '"+nameSpace+"'.",e);
312
                        throw new WFSGetFeatureException(e);
313
                } catch (XmlPullParserException e) {
314
                        logger.warn("Can't get feature from file '"+Utilities.getAbsolutePathOrEmpty(f)+"' with namaspace '"+nameSpace+"'.",e);
315
                        throw new WFSGetFeatureException(e);
316
                } catch (IOException e) {
317
                        logger.warn("Can't get feature from file '"+Utilities.getAbsolutePathOrEmpty(f)+"' with namaspace '"+nameSpace+"'.",e);
318
                        throw new WFSGetFeatureException(e);
319
                }        
320

    
321
                return true;
322
        }
323

    
324
        /*
325
         * (non-Javadoc)
326
         * @see org.gvsig.remoteClient.wfs.WFSProtocolHandler#parseTransaction(java.io.File, java.lang.String)
327
         */
328
        protected boolean parseTransaction(File f,  WFSStatus status) throws WFSException {
329
                int tag;
330
                XMLSchemaParser parser = null;
331
                parser = new XMLSchemaParser();
332
                
333
                WFSTransactionRequestInformation transactionRequestInformation =
334
                    (WFSTransactionRequestInformation)this.getLastWfsRequestInformation();
335
                
336
                try
337
                {
338
                        parser.setInput(f);
339
                        parser.nextTag();
340
                        if (CapabilitiesTags.SERVICE_EXCEPTION_REPORT.equals(parser.getName())) {
341
                                throw ExceptionsFactory.parseServiceExceptionReport(parser);
342
                        }else if (parser.getName().equals(CapabilitiesTags.EXCEPTION_REPORT)){
343
                throw ExceptionsFactory.parseExceptionReport(parser);
344
                    } 
345

    
346
                        if ( parser.getEventType() != KXmlParser.END_DOCUMENT ) 
347
                        {                                           
348
                                tag = parser.nextTag();
349
                                while(tag != KXmlParser.END_DOCUMENT)
350
                                {
351
                                        switch(tag)
352
                                        {
353
                                        case KXmlParser.START_TAG:
354
                                                if (parser.getName().compareTo(WFSTTags.WFST_TRANSACTIONRESULT)==0){
355
                                                        parseTransactionResult(parser, transactionRequestInformation);
356
                                                }else if (parser.getName().compareTo(WFSTTags.WFST_TRANSACTIONRESPONSE)==0){
357
                                                        parseFeaturesLocked(parser);
358
                                                }                                                
359
                                                break;
360
                                        case KXmlParser.END_TAG:                            
361
                                                break;
362
                                        case KXmlParser.TEXT:
363
                                                break;
364
                                        }
365
                                        tag = parser.next();
366
                                }
367
                                parser.require(KXmlParser.END_DOCUMENT, null, null);                
368
                        }
369
                }
370
                catch(XmlPullParserException parser_ex){
371
                        logger.warn("Can't parse transaction from file '"+Utilities.getAbsolutePathOrEmpty(f)+"'.",parser_ex);
372
                        return false;
373
                }
374
                catch (IOException ioe) {           
375
                        logger.warn("Can't parse transaction from file '"+Utilities.getAbsolutePathOrEmpty(f)+"'.",ioe);
376
                        return false;
377
                }
378
                return true;
379
        }
380

    
381
        /**
382
         * Parse the transaction result XML sub tree
383
         * @param parser
384
         * @param transaction
385
         * @throws IOException 
386
         * @throws XmlPullParserException 
387
         */
388
        private void parseTransactionResult(XMLSchemaParser parser,
389
                        WFSTransactionRequestInformation transactionRequestInformation) throws XmlPullParserException, IOException {
390
                int currentTag;
391
                boolean end = false;                
392

    
393
                currentTag = parser.next();
394

    
395
                while (!end) 
396
                {
397
                        switch(currentTag)
398
                        {
399
                        case KXmlParser.START_TAG:
400
                                if (parser.getName().compareTo(WFSTTags.WFST_STATUS)==0){
401
                                        parseStatus(parser, transactionRequestInformation);
402
                                }else if (parser.getName().compareTo(WFSTTags.WFST_TRANSACTIONMESSAGE)==0){
403
                                        parser.next();
404
                                        transactionRequestInformation.setMessage(parser.getText());
405
                                }
406
                                break;
407
                        case KXmlParser.END_TAG:
408
                                if (parser.getName().compareTo(WFSTTags.WFST_TRANSACTIONRESULT)==0)
409
                                        end = true;
410
                                break;
411
                        case KXmlParser.TEXT:                   
412
                                break;
413
                        }
414
                        if (!end){
415
                                currentTag = parser.next();
416
                        }
417
                }     
418
        }
419

    
420
        /**
421
         * Parser WFST Status subtree
422
         * @param parser
423
         * Teh xML parser
424
         * @param transaction
425
         * The current transaction
426
         * @throws IOException 
427
         * @throws XmlPullParserException 
428
         */
429
        private void parseStatus(XMLSchemaParser parser, WFSTransactionRequestInformation transactionRequestInformation) throws XmlPullParserException, IOException {
430
                int currentTag;
431
                boolean end = false;                
432

    
433
                currentTag = parser.next();
434
                
435
                while (!end) 
436
                {
437
                        switch(currentTag)
438
                        {
439
                        case KXmlParser.START_TAG:
440
                                if (parser.getName().compareTo(WFSTTags.WFST_SUCCESS)==0){
441
                                    transactionRequestInformation.setStatus(WFSTransactionRequestInformation.STATUS_SUCCESS);
442
                                }else if (parser.getName().compareTo(WFSTTags.WFST_FAILED)==0){
443
                                    transactionRequestInformation.setStatus(WFSTransactionRequestInformation.STATUS_FAILED);
444
                                }
445
                                break;
446
                        case KXmlParser.END_TAG:
447
                                if (parser.getName().compareTo(WFSTTags.WFST_STATUS)==0)
448
                                        end = true;
449
                                break;
450
                        case KXmlParser.TEXT:                   
451
                                break;
452
                        }
453
                        if (!end){
454
                                currentTag = parser.next();
455
                        }
456
                }    
457
        }
458

    
459
        /*
460
         * (non-Javadoc)
461
         * @see org.gvsig.remoteClient.wfs.WFSProtocolHandler#parseLockFeature(java.io.File, java.lang.String)
462
         */
463
        protected boolean parseLockFeature(File f, String nameSpace, WFSStatus status) throws WFSException {
464
                int tag;
465
                XMLSchemaParser parser = null;
466
                parser = new XMLSchemaParser();
467
                try
468
                {
469
                        parser.setInput(f);
470
                        parser.nextTag();
471
                        if (parser.getName().compareTo(CapabilitiesTags.SERVICE_EXCEPTION_REPORT)==0){
472
                                throw ExceptionsFactory.parseServiceExceptionReport(parser);
473
                        }                
474

    
475

    
476
                        if ( parser.getEventType() != KXmlParser.END_DOCUMENT ) 
477
                        {                                           
478
                                tag = parser.nextTag();
479
                                while(tag != KXmlParser.END_DOCUMENT)
480
                                {
481
                                        switch(tag)
482
                                        {
483
                                        case KXmlParser.START_TAG:
484
                                                if (parser.getName().compareTo(WFSTTags.WFST_LOCKID)==0){
485
                                                        parser.next();
486
                                                        status.addFeatureLocked(parser.getText());
487
                                                }else if (parser.getName().compareTo(WFSTTags.WFST_FEATURESLOCKED)==0){
488
                                                        parseFeaturesLocked(parser);
489
                                                }                                                
490
                                                break;
491
                                        case KXmlParser.END_TAG:                            
492
                                                break;
493
                                        case KXmlParser.TEXT:
494
                                                break;
495
                                        }
496
                                        tag = parser.next();
497
                                }
498
                                parser.require(KXmlParser.END_DOCUMENT, null, null);                
499
                        }
500
                }
501
                catch(XmlPullParserException parser_ex){
502
                        logger.warn("Can't parse lock-feature from file '"+Utilities.getAbsolutePathOrEmpty(f)+"'.",parser_ex);
503
                        return false;
504
                }
505
                catch (IOException ioe) {           
506
                        logger.warn("Can't parse lock-feature from file '"+Utilities.getAbsolutePathOrEmpty(f)+"'.",ioe);
507
                        return false;
508
                }
509
                return true;
510
        }
511

    
512
        /**
513
         * It parses the featuresLocked tag
514
         * @param parser
515
         * @throws IOException 
516
         * @throws XmlPullParserException 
517
         */
518
        private void parseFeaturesLocked(XMLSchemaParser parser) throws XmlPullParserException, IOException {
519
                int currentTag;
520
                boolean end = false;                
521

    
522
                currentTag = parser.next();
523

    
524
                while (!end) 
525
                {
526
                        switch(currentTag)
527
                        {
528
                        case KXmlParser.START_TAG:
529
                                if (parser.getName().compareTo(WFSTTags.WFST_FEATURESID)==0){
530

    
531
                                }
532
                                break;
533
                        case KXmlParser.END_TAG:
534
                                if (parser.getName().compareTo(WFSTTags.WFST_FEATURESLOCKED)==0)
535
                                        end = true;
536
                                break;
537
                        case KXmlParser.TEXT:                   
538
                                break;
539
                        }
540
                        if (!end){
541
                                currentTag = parser.next();
542
                        }
543
                }     
544
        }
545

    
546
        /*
547
         * (non-Javadoc)
548
         * @see org.gvsig.remoteClient.wfs.WFSProtocolHandler#createDescribeFeatureTypeRequest(org.gvsig.remoteClient.wfs.WFSStatus)
549
         */
550
        protected WFSDescribeFeatureTypeRequest createDescribeFeatureTypeRequest(
551
                        WFSStatus status) {
552
                return new WFSDescribeFeatureTypeRequest1_0_0(status, this);
553
        }
554

    
555
        /*
556
         * (non-Javadoc)
557
         * @see org.gvsig.remoteClient.wfs.WFSProtocolHandler#createGetFeatureRequest(org.gvsig.remoteClient.wfs.WFSStatus)
558
         */
559
        protected WFSGetFeatureRequest createGetFeatureRequest(WFSStatus status) {
560
                return new WFSGetFeatureRequest1_0_0(status, this);
561
        }
562

    
563
        /*
564
         * (non-Javadoc)
565
         * @see org.gvsig.remoteClient.wfs.WFSProtocolHandler#createLockFeatureRequest(org.gvsig.remoteClient.wfs.WFSStatus)
566
         */
567
        protected WFSTLockFeatureRequest createLockFeatureRequest(WFSStatus status) {
568
                return new WFSTLockFeatureRequest1_0_0(status, this);
569
        }
570

    
571
    protected WFSTransactionRequest createTransactionRequest(WFSStatus status) {
572
        return new WFSTransactionRequest1_0_0(status, this);
573
    }
574
}