Statistics
| Revision:

svn-gvsig-desktop / tags / v1_1_Build_1011 / libraries / libRemoteServices / src / org / gvsig / remoteClient / wms / wms_1_1_0 / WMSProtocolHandler1_1_0.java @ 12904

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
                        
47
            int tag;
48
              EncodingXMLParser kxmlParser = null;
49
            kxmlParser = new EncodingXMLParser();
50
            try
51
            {
52
                       kxmlParser.setInput(f);
53
                        kxmlParser.nextTag();
54
                    if ( kxmlParser.getEventType() != KXmlParser.END_DOCUMENT ) 
55
                    {                    
56
                            kxmlParser.require(KXmlParser.START_TAG, null, CapabilitiesTags.CAPABILITIES_ROOT1_1_1);                            
57
                            tag = kxmlParser.nextTag();
58
                                 while(tag != KXmlParser.END_DOCUMENT)
59
                                 {
60
                     switch(tag)
61
                                         {
62
                         
63
                                                case KXmlParser.START_TAG:
64
                                                        if (kxmlParser.getName().compareTo(CapabilitiesTags.SERVICE )==0)
65
                                                        {
66
                                                                parseServiceTag(kxmlParser);
67
                                                        }        
68
                                                        else if (kxmlParser.getName().compareTo(CapabilitiesTags.CAPABILITY)==0)
69
                                                        {
70
                                                                parseCapabilityTag(kxmlParser);
71
                                                        }
72
                                                        break;
73
                                                case KXmlParser.END_TAG:                                                        
74
                                                        break;
75
                                                case KXmlParser.TEXT:
76
                                                                                                
77
                                                break;
78
                                         }
79
                                     tag = kxmlParser.next();
80
                             }
81

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

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