Statistics
| Revision:

svn-gvsig-desktop / trunk / libraries / libRemoteServices / src / org / gvsig / remoteClient / wms / wms_1_1_0 / WMSProtocolHandler1_1_0.java @ 14705

History | View | Annotate | Download (15 KB)

1

    
2
package org.gvsig.remoteClient.wms.wms_1_1_0;
3

    
4
import java.io.BufferedReader;
5
import java.io.ByteArrayInputStream;
6
import java.io.File;
7
import java.io.FileInputStream;
8
import java.io.FileNotFoundException;
9
import java.io.FileReader;
10
import java.io.IOException;
11
import java.util.ArrayList;
12
import java.util.TreeMap;
13
import org.gvsig.remoteClient.utils.CapabilitiesTags;
14
import org.gvsig.remoteClient.utils.EncodingXMLParser;
15
import org.gvsig.remoteClient.utils.ExceptionTags;
16
import org.kxml2.io.KXmlParser;
17
import org.xmlpull.v1.XmlPullParserException;
18

    
19
/**
20
 * <p>
21
 * Describes the handler to comunicate to a WMS 1.1.0
22
 * </p>
23
 */
24
public class WMSProtocolHandler1_1_0 extends org.gvsig.remoteClient.wms.WMSProtocolHandler
25
{
26
        private WMSLayer1_1_0 fakeRootLayer;
27
    
28
        public WMSProtocolHandler1_1_0()
29
        {
30
                this.version = "1.1.0";
31
                this.name = "WMS1.1.0";
32
                this.serviceInfo = new ServiceInformation(); 
33
                this.layers = new TreeMap();
34
        }
35
    
36
//------------------------------------------------------------------------------
37
// Parsing methods....    
38
//------------------------------------------------------------------------------    
39
/**
40
 * <p>Parse the xml data retrieved from the WMS, it will parse the WMS Capabilities</p>
41
 * 
42
 */
43
    public void parse(File f)
44
    {       
45
            rootLayer = null;
46
            int tag;
47
            EncodingXMLParser kxmlParser = null;
48
            kxmlParser = new EncodingXMLParser();
49
            try
50
            {
51
                    kxmlParser.setInput(f);
52
                    kxmlParser.nextTag();
53
                    if ( kxmlParser.getEventType() != KXmlParser.END_DOCUMENT ) 
54
                    {                    
55
                            kxmlParser.require(KXmlParser.START_TAG, null, CapabilitiesTags.CAPABILITIES_ROOT1_1_1);                            
56
                            tag = kxmlParser.nextTag();
57
                                 while(tag != KXmlParser.END_DOCUMENT)
58
                                 {
59
                     switch(tag)
60
                                         {
61
                         
62
                                                case KXmlParser.START_TAG:
63
                                                        if (kxmlParser.getName().compareTo(CapabilitiesTags.SERVICE )==0)
64
                                                        {
65
                                                                parseServiceTag(kxmlParser);
66
                                                        }        
67
                                                        else if (kxmlParser.getName().compareTo(CapabilitiesTags.CAPABILITY)==0)
68
                                                        {
69
                                                                parseCapabilityTag(kxmlParser);
70
                                                        }
71
                                                        break;
72
                                                case KXmlParser.END_TAG:                                                        
73
                                                        break;
74
                                                case KXmlParser.TEXT:
75
                                                                                                
76
                                                break;
77
                                         }
78
                                     tag = kxmlParser.next();
79
                             }
80

    
81
                            kxmlParser.require(KXmlParser.END_DOCUMENT, null, null);
82
                    }
83
            }
84
            catch(XmlPullParserException parser_ex){
85
                    parser_ex.printStackTrace();
86
            }
87
                   catch (IOException ioe) {                        
88
                           ioe.printStackTrace();
89
                } finally {
90
            
91
        }
92
    } 
93
    
94
    /**
95
     * <p>Parses the Service Information </p>
96
     */    
97
    private void parseServiceTag(KXmlParser parser) throws IOException, XmlPullParserException 
98
    {
99
            int currentTag;
100
            boolean end = false;
101
            
102
            parser.require(KXmlParser.START_TAG, null, CapabilitiesTags.SERVICE);
103
            currentTag = parser.next();
104
            
105
            while (!end) 
106
            {
107
                         switch(currentTag)
108
                         {
109
                                case KXmlParser.START_TAG:
110
                                        if (parser.getName().compareTo(CapabilitiesTags.NAME)==0)
111
                                        {
112
                                                serviceInfo.name = parser.nextText(); 
113
                                        }        
114
                                        else if (parser.getName().compareTo(CapabilitiesTags.TITLE)==0)
115
                                        {
116
                                                serviceInfo.title = parser.nextText(); 
117
                                        }
118
                                        else if (parser.getName().compareTo(CapabilitiesTags.ABSTRACT)==0)
119
                                        {
120
                                                serviceInfo.abstr = parser.nextText(); 
121
                                        }
122
                                        else if (parser.getName().compareTo(CapabilitiesTags.ONLINERESOURCE)==0)
123
                                        {
124
                                            String value = null;
125
                                        value = parser.getAttributeValue("", CapabilitiesTags.XLINK_HREF);
126
                                        if (value != null){
127
                                                serviceInfo.online_resource = value;
128
                                        }
129
                                        }                                        
130
                                        else if ((parser.getName().compareTo(CapabilitiesTags.KEYWORDLIST)==0) ||
131
                                                        (parser.getName().compareTo(CapabilitiesTags.CONTACTINFORMATION)==0))
132
                                        {
133
                                                parser.skipSubTree();
134
                                        }                                        
135
                                        break;
136
                                case KXmlParser.END_TAG:
137
                                        if (parser.getName().compareTo(CapabilitiesTags.SERVICE) == 0)
138
                                                end = true;
139
                                        break;
140
                                case KXmlParser.TEXT:                                        
141
                                break;
142
                         }
143
             if (!end)
144
                 currentTag = parser.next();
145
            }
146
            parser.require(KXmlParser.END_TAG, null, CapabilitiesTags.SERVICE);
147
    }
148
    
149
    /**
150
     * <p>Parses the Capability Tag </p>
151
     */    
152
    private void parseCapabilityTag(KXmlParser parser) throws IOException, XmlPullParserException
153
    {         
154
            int currentTag;
155
            boolean end = false;
156
            
157
            parser.require(KXmlParser.START_TAG, null, CapabilitiesTags.CAPABILITY);
158
            currentTag = parser.next();
159
            
160
            while (!end) 
161
            {
162
                         switch(currentTag)
163
                         {
164
                                case KXmlParser.START_TAG:
165
                                        if (parser.getName().compareTo(CapabilitiesTags.REQUEST)==0)
166
                                        {
167
                                                parseRequestTag(parser); 
168
                                        }        
169
                                        else if (parser.getName().compareTo(CapabilitiesTags.EXCEPTION)==0)
170
                                        {
171
                                                // TODO:
172
                                                // add the exception formats supported.
173
                                        }
174
                                        else if (parser.getName().compareTo(CapabilitiesTags.LAYER)==0)
175
                                        {
176
                                                WMSLayer1_1_0 lyr = new WMSLayer1_1_0();
177
                        if (rootLayer == null)
178
                            rootLayer = lyr;
179
                        else {
180
                            // Handles when there is no general root layer, will use
181
                            // a fake non-queryable one.
182
                            if (!rootLayer.equals(getFakeRootLayer())){
183
                                WMSLayer1_1_0 aux = (WMSLayer1_1_0) rootLayer;
184
                                rootLayer  = getFakeRootLayer();
185
                                rootLayer.getChildren().add(aux);
186
                            }
187
                            rootLayer.getChildren().add(lyr);
188
                        }
189
                                                lyr.parse(parser, layers);
190
                                                
191
                        if (lyr.getName()!=null)
192
                                                    layers.put(lyr.getName(), lyr);                                                                                                         
193
                                        }
194
                                        else if ((parser.getName().compareTo(CapabilitiesTags.VENDORSPECIFICCAPABILITIES)==0) ||
195
                                                        (parser.getName().compareTo(CapabilitiesTags.USERDEFINEDSYMBOLIZATION )==0))
196
                            
197
                                        {
198
                                                parser.skipSubTree();
199
                                        }                                        
200
                                        break;
201
                                case KXmlParser.END_TAG:
202
                                        if (parser.getName().compareTo(CapabilitiesTags.CAPABILITY) == 0)
203
                                                end = true;
204
                                        break;
205
                                case KXmlParser.TEXT:                                        
206
                                break;
207
                         }
208
                         if (!end)
209
                         currentTag = parser.next();
210
            }
211
            //parser.require(KXmlParser.END_TAG, null, CapabilitiesTags.CAPABILITY);            
212
    }
213
    
214
    /**
215
     * <p>Parses the Request tag </p>
216
     */ 
217
    private void parseRequestTag(KXmlParser parser) throws IOException, XmlPullParserException
218
    {        
219
            int currentTag;
220
            boolean end = false;
221
            
222
            parser.require(KXmlParser.START_TAG, null, CapabilitiesTags.REQUEST);
223
            currentTag = parser.next();
224
            
225
            while (!end) 
226
            {
227
                         switch(currentTag)
228
                         {
229
                                case KXmlParser.START_TAG:
230
                                        if (parser.getName().compareTo(CapabilitiesTags.GETCAPABILITIES)==0)
231
                                        {
232
                                                serviceInfo.operations.put(CapabilitiesTags.GETCAPABILITIES , null); 
233
                                        }        
234
                                        else if (parser.getName().compareTo(CapabilitiesTags.GETMAP)==0)
235
                                        {        
236
                                                serviceInfo.operations.put(CapabilitiesTags.GETMAP, null);
237
                                                parseGetMapTag(parser);                                                
238
                                        }
239
                                        else if (parser.getName().compareTo(CapabilitiesTags.GETFEATUREINFO)==0)
240
                                        {
241
                                                serviceInfo.operations.put(CapabilitiesTags.GETFEATUREINFO, null); 
242
                                                parseGetFeatureInfoTag(parser);
243
                                        }                
244
                                        else if (parser.getName().compareTo(CapabilitiesTags.DESCRIBELAYER)==0)
245
                                        {
246
                                                serviceInfo.operations.put(CapabilitiesTags.DESCRIBELAYER, null); 
247
                                        }        
248
                                        else if (parser.getName().compareTo(CapabilitiesTags.GETLEGENDGRAPHIC)==0)
249
                                        {
250
                                                serviceInfo.operations.put(CapabilitiesTags.GETLEGENDGRAPHIC, null); 
251
                                                parseGetLegendGraphicTag(parser);
252
                                        }                                        
253
                                        break;
254
                                case KXmlParser.END_TAG:
255
                                        if (parser.getName().compareTo(CapabilitiesTags.REQUEST) == 0)
256
                                                end = true;
257
                                        break;
258
                                case KXmlParser.TEXT:                                        
259
                                break;
260
                         }
261
                         if(!end)
262
                                 currentTag = parser.next();
263
            }
264
            // TODO: does not get such a tag when arrives here!!!!!!
265
            //parser.require(KXmlParser.END_TAG, null, CapabilitiesTags.REQUEST);            
266
    }
267

    
268
    /**
269
     * <p>Parses the GetMap tag </p>
270
     */ 
271
    private void parseGetMapTag(KXmlParser parser) throws IOException, XmlPullParserException
272
    {        
273
            int currentTag;
274
            boolean end = false;
275
            
276
            parser.require(KXmlParser.START_TAG, null, CapabilitiesTags.GETMAP);
277
            currentTag = parser.next();
278
            
279
            while (!end) 
280
            {
281
                         switch(currentTag)
282
                         {
283
                                case KXmlParser.START_TAG:
284
                                        if (parser.getName().compareTo(CapabilitiesTags.FORMAT)==0)
285
                                        {
286
                                                serviceInfo.formats.add(parser.nextText());
287
                                        }        
288
                                        else if (parser.getName().compareTo(CapabilitiesTags.DCPTYPE)==0)
289
                                        {                        
290
                                                currentTag = parser.nextTag();
291
                                                if(parser.getName().compareTo(CapabilitiesTags.HTTP)==0)
292
                                                {
293
                                                        currentTag = parser.nextTag();
294
                                                        if(parser.getName().compareTo(CapabilitiesTags.GET)==0)
295
                                                        {
296
                                                                currentTag = parser.nextTag();
297
                                                                if (parser.getName().compareTo(CapabilitiesTags.ONLINERESOURCE)==0)
298
                                                                {
299
                                                                        String value = new String();
300
                                                                        value = parser.getAttributeValue("", CapabilitiesTags.XLINK_HREF);
301
                                                                        if (value != null){
302
                                                                                serviceInfo.operations.put(CapabilitiesTags.GETMAP, value);
303
                                                                        }
304
                                                                }
305
                                                        }
306
                                                }
307
                                        }                        
308
                                        break;
309
                                case KXmlParser.END_TAG:
310
                                        if (parser.getName().compareTo(CapabilitiesTags.GETMAP) == 0)
311
                                                end = true;
312
                                        break;
313
                                case KXmlParser.TEXT:                                        
314
                                break;
315
                         }
316
                         if(!end)
317
                                 currentTag = parser.next();
318
            }        
319
    }    
320
    
321
    /**
322
     * <p>Parses the GetFeatureInfo tag </p>
323
     */ 
324
    private void parseGetFeatureInfoTag(KXmlParser parser) throws IOException, XmlPullParserException
325
    {        
326
            int currentTag;
327
            boolean end = false;
328
            
329
            parser.require(KXmlParser.START_TAG, null, CapabilitiesTags.GETFEATUREINFO);
330
            currentTag = parser.next();
331
            
332
            while (!end) 
333
            {
334
                         switch(currentTag)
335
                         {
336
                                case KXmlParser.START_TAG:
337
                                        if (parser.getName().compareTo(CapabilitiesTags.FORMAT)==0)
338
                                        {
339
                                                //TODO:
340
                                                // add the supported formats by the GetFeatureInfo request
341
                                                //serviceInfo.formats.add(parser.nextText());
342
                                        }        
343
                                        else if (parser.getName().compareTo(CapabilitiesTags.DCPTYPE)==0)
344
                                        {                        
345
                                                currentTag = parser.nextTag();
346
                                                if(parser.getName().compareTo(CapabilitiesTags.HTTP)==0)
347
                                                {
348
                                                        currentTag = parser.nextTag();
349
                                                        if(parser.getName().compareTo(CapabilitiesTags.GET)==0)
350
                                                        {
351
                                                                currentTag = parser.nextTag();
352
                                                                if (parser.getName().compareTo(CapabilitiesTags.ONLINERESOURCE)==0)
353
                                                                {
354
                                                                        String value = new String();
355
                                                                        value = parser.getAttributeValue("", CapabilitiesTags.XLINK_HREF);
356
                                                                        if (value != null){
357
                                                                                //serviceInfo.online_resource = value;
358
                                                                                serviceInfo.operations.put(CapabilitiesTags.GETFEATUREINFO, value);
359
                                                                        }
360
                                                                }
361
                                                        }
362
                                                }
363
                                        }                        
364
                                        break;
365
                                case KXmlParser.END_TAG:
366
                                        if (parser.getName().compareTo(CapabilitiesTags.GETFEATUREINFO) == 0)
367
                                                end = true;
368
                                        break;
369
                                case KXmlParser.TEXT:                                        
370
                                break;
371
                         }
372
                         if(!end)
373
                                 currentTag = parser.next();
374
            }        
375
    }     
376
 
377
    /**
378
     * <p>Parses the GetLegendGraphic tag </p>
379
     */ 
380
    private void parseGetLegendGraphicTag(KXmlParser parser) throws IOException, XmlPullParserException
381
    {        
382
            int currentTag;
383
            boolean end = false;
384
            
385
            parser.require(KXmlParser.START_TAG, null, CapabilitiesTags.GETLEGENDGRAPHIC);
386
            currentTag = parser.next();
387
            
388
            while (!end) 
389
            {
390
                         switch(currentTag)
391
                         {
392
                                case KXmlParser.START_TAG:
393
                                        if (parser.getName().compareTo(CapabilitiesTags.FORMAT)==0)
394
                                        {
395
                                                //TODO:
396
                                                // add the supported formats by the GetLegendGraphic request
397
                                                //serviceInfo.formats.add(parser.nextText());
398
                                        }        
399
                                        else if (parser.getName().compareTo(CapabilitiesTags.DCPTYPE)==0)
400
                                        {                        
401
                                                currentTag = parser.nextTag();
402
                                                if(parser.getName().compareTo(CapabilitiesTags.HTTP)==0)
403
                                                {
404
                                                        currentTag = parser.nextTag();
405
                                                        if(parser.getName().compareTo(CapabilitiesTags.GET)==0)
406
                                                        {
407
                                                                currentTag = parser.nextTag();
408
                                                                if (parser.getName().compareTo(CapabilitiesTags.ONLINERESOURCE)==0)
409
                                                                {
410
                                                                        String value = new String();
411
                                                                        value = parser.getAttributeValue("", CapabilitiesTags.XLINK_HREF);
412
                                                                        if (value != null){
413
                                                                                serviceInfo.operations.put(CapabilitiesTags.GETLEGENDGRAPHIC, value);
414
                                                                        }
415
                                                                }
416
                                                        }
417
                                                }
418
                                        }                        
419
                                        break;
420
                                case KXmlParser.END_TAG:
421
                                        if (parser.getName().compareTo(CapabilitiesTags.GETLEGENDGRAPHIC) == 0)
422
                                                end = true;
423
                                        break;
424
                                case KXmlParser.TEXT:                                        
425
                                break;
426
                         }
427
                         if(!end)
428
                                 currentTag = parser.next();
429
            }        
430
    }
431
    
432
    private WMSLayer1_1_0 getFakeRootLayer(){
433
        if (fakeRootLayer == null){
434
            fakeRootLayer = new WMSLayer1_1_0();
435
            fakeRootLayer.setTitle(serviceInfo.title);
436
            fakeRootLayer.setQueryable(false);
437
            fakeRootLayer.setName(null);
438
        }
439
        return fakeRootLayer;
440
    }
441
    
442
    /* (non-Javadoc)
443
     * @see org.gvsig.remoteClient.wms.WMSProtocolHandler#parseException(byte[])
444
     */
445
    protected String parseException(byte[] data) {
446
        ArrayList errors = new ArrayList();
447
        KXmlParser kxmlParser = new KXmlParser();
448
        
449
        try
450
        {
451
            kxmlParser.setInput(new ByteArrayInputStream(data), encoding);        
452
            kxmlParser.nextTag();
453
            int tag;
454
            if ( kxmlParser.getEventType() != KXmlParser.END_DOCUMENT ) 
455
            { 
456
                kxmlParser.require(KXmlParser.START_TAG, null, ExceptionTags.EXCEPTION_ROOT);             
457
                tag = kxmlParser.nextTag();
458
                 while(tag != KXmlParser.END_DOCUMENT)
459
                 {
460
                     switch(tag)
461
                     {
462
                        case KXmlParser.START_TAG:
463
                            if (kxmlParser.getName().compareTo(ExceptionTags.SERVICE_EXCEPTION)==0){
464
                                String errorCode = kxmlParser.getAttributeValue("", ExceptionTags.CODE);
465
                                errorCode = (errorCode != null) ? "["+errorCode+"] " : "";
466
                                String errorMessage = kxmlParser.nextText();
467
                                errors.add(errorCode+errorMessage);
468
                            }
469
                            break;
470
                        case KXmlParser.END_TAG:                            
471
                            break;
472
                        
473
                     }
474
                     tag = kxmlParser.nextTag();
475
                 }
476
                 //kxmlParser.require(KXmlParser.END_DOCUMENT, null, null);
477
            }
478
        }
479
        catch(XmlPullParserException parser_ex){
480
            System.out.println(parser_ex.getMessage());
481
            parser_ex.printStackTrace();
482
        }
483
        catch (IOException ioe) {           
484
            ioe.printStackTrace();            
485
        }
486
        String message = errors.size()>0? "" : null;
487
        for (int i = 0; i < errors.size(); i++) {
488
            message += (String) errors.get(i)+"\n";
489
        }
490
        return message;
491
    }
492
    
493
  }