Statistics
| Revision:

svn-gvsig-desktop / tags / gvSIGv0_6_1RELEASE / libraries / libRemoteServices / src / org / gvsig / remoteClient / wms / wms_1_1_1 / WMSProtocolHandler1_1_1.java @ 5222

History | View | Annotate | Download (14.4 KB)

1

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

    
4
import java.io.ByteArrayInputStream;
5
import java.io.File;
6
import java.io.FileNotFoundException;
7
import java.io.FileReader;
8
import java.io.IOException;
9
import java.io.InputStreamReader;
10
import java.io.Reader;
11
import java.util.ArrayList;
12
import java.util.TreeMap;
13

    
14
import org.gvsig.remoteClient.utils.CapabilitiesTags;
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.1
22
 * </p>
23
 */
24
public class WMSProtocolHandler1_1_1 extends org.gvsig.remoteClient.wms.WMSProtocolHandler {
25
        private WMSLayer1_1_1 fakeRootLayer;
26
    
27
        public WMSProtocolHandler1_1_1()
28
        {
29
                this.version = "1.1.1";
30
                this.name = "WMS1.1.1";
31
                this.serviceInfo = new ServiceInformation(); 
32
                this.layers = new TreeMap();
33
        }
34
    
35
//------------------------------------------------------------------------------
36
// Parsing methods....    
37
//------------------------------------------------------------------------------    
38
/**
39
 * <p>Parse the xml data retrieved from the WMS, it will parse the WMS Capabilities</p>
40
 * 
41
 */
42
    public void parse(File f)
43
    {       
44
            FileReader reader = null;            
45
            try
46
            {
47
                    reader = new FileReader(f);
48
            }
49
            catch(FileNotFoundException ex)        {
50
                    ex.printStackTrace();
51
            }
52
            
53
            int tag;
54
            KXmlParser kxmlParser = null;
55
            kxmlParser = new KXmlParser();
56
            try
57
            {
58
                    kxmlParser.setInput(reader);                
59
                        kxmlParser.nextTag();
60
                    if ( kxmlParser.getEventType() != KXmlParser.END_DOCUMENT ) 
61
                    {                    
62
                            kxmlParser.require(KXmlParser.START_TAG, null, CapabilitiesTags.CAPABILITIES_ROOT1_1_1);                            
63
                            tag = kxmlParser.nextTag();
64
                                 while(tag != KXmlParser.END_DOCUMENT)
65
                                 {
66
                     switch(tag)
67
                                         {
68
                         
69
                                                case KXmlParser.START_TAG:
70
                                                        if (kxmlParser.getName().compareTo(CapabilitiesTags.SERVICE )==0)
71
                                                        {
72
                                                                parseServiceTag(kxmlParser);
73
                                                        }        
74
                                                        else if (kxmlParser.getName().compareTo(CapabilitiesTags.CAPABILITY)==0)
75
                                                        {
76
                                                                parseCapabilityTag(kxmlParser);
77
                                                        }
78
                                                        break;
79
                                                case KXmlParser.END_TAG:                                                        
80
                                                        break;
81
                                                case KXmlParser.TEXT:
82
                                                        //System.out.println("[TEXT]["+kxmlParser.getText()+"]");                                                        
83
                                                break;
84
                                         }
85
                                     tag = kxmlParser.next();
86
                             }
87
                            kxmlParser.require(KXmlParser.END_DOCUMENT, null, null);
88
                    }
89
            }
90
            catch(XmlPullParserException parser_ex){
91
                    parser_ex.printStackTrace();
92
            }
93
                   catch (IOException ioe) {                        
94
                           ioe.printStackTrace();
95
                } finally {
96
            
97
        }
98
                   // In the parsing process the layer has been filled                  
99
    } 
100
    
101
    /**
102
     * <p>Parses the Service Information </p>
103
     */    
104
    private void parseServiceTag(KXmlParser parser) throws IOException, XmlPullParserException 
105
    {
106
            int currentTag;
107
            boolean end = false;
108
            
109
            parser.require(KXmlParser.START_TAG, null, CapabilitiesTags.SERVICE);
110
            currentTag = parser.next();
111
            
112
            while (!end) 
113
            {
114
                         switch(currentTag)
115
                         {
116
                                case KXmlParser.START_TAG:
117
                                        if (parser.getName().compareTo(CapabilitiesTags.NAME)==0)
118
                                        {
119
                                                serviceInfo.name = parser.nextText(); 
120
                                        }        
121
                                        else if (parser.getName().compareTo(CapabilitiesTags.TITLE)==0)
122
                                        {
123
                                                serviceInfo.title = parser.nextText(); 
124
                                        }
125
                                        else if (parser.getName().compareTo(CapabilitiesTags.ABSTRACT)==0)
126
                                        {
127
                                                serviceInfo.abstr = parser.nextText(); 
128
                                        }
129
                                        else if (parser.getName().compareTo(CapabilitiesTags.ONLINERESOURCE)==0)
130
                                        {
131
                                            String value = new String();
132
                                        value = parser.getAttributeValue("", CapabilitiesTags.XLINK_HREF);
133
                                        if (value != null){
134
                                                serviceInfo.online_resource = value;
135
                                        }
136
                                        }
137
                                        else if ((parser.getName().compareTo(CapabilitiesTags.KEYWORDLIST)==0) ||
138
                                                        (parser.getName().compareTo(CapabilitiesTags.CONTACTINFORMATION)==0))
139
                                        {
140
                                                parser.skipSubTree();
141
                                        }                                        
142
                                        break;
143
                                case KXmlParser.END_TAG:
144
                                        if (parser.getName().compareTo(CapabilitiesTags.SERVICE) == 0)
145
                                                end = true;
146
                                        break;
147
                                case KXmlParser.TEXT:                                        
148
                                break;
149
                         }
150
             if (!end)
151
                 currentTag = parser.next();
152
            }
153
            parser.require(KXmlParser.END_TAG, null, CapabilitiesTags.SERVICE);
154
    }
155
    /**
156
     * <p>Parses the Capability Tag </p>
157
     */    
158
    private void parseCapabilityTag(KXmlParser parser) throws IOException, XmlPullParserException
159
    {         
160
            int currentTag;
161
            boolean end = false;
162
 
163
            parser.require(KXmlParser.START_TAG, null, CapabilitiesTags.CAPABILITY);
164
            currentTag = parser.next();
165
            
166
            while (!end) 
167
            {
168
                         switch(currentTag)
169
                         {
170
                                case KXmlParser.START_TAG:
171
                                        if (parser.getName().compareTo(CapabilitiesTags.REQUEST)==0)
172
                                        {
173
                                                parseRequestTag(parser); 
174
                                        }        
175
                                        else if (parser.getName().compareTo(CapabilitiesTags.EXCEPTION)==0)
176
                                        {
177
                                                //TODO:
178
                                                //Add to serviceInfo the supported formats for the exceptions????
179
                                        }
180
                                        else if (parser.getName().compareTo(CapabilitiesTags.LAYER)==0)
181
                                        {
182
                                                WMSLayer1_1_1 lyr = new WMSLayer1_1_1();
183
                                                lyr.parse(parser, layers);
184
                                                
185
                        if (rootLayer == null)
186
                            rootLayer = lyr;
187
                        else {
188
                            // Handles when there is no general root layer, will use
189
                            // a fake non-queryable one.
190
                            if (!rootLayer.equals(getFakeRootLayer())){
191
                                WMSLayer1_1_1 aux = (WMSLayer1_1_1) rootLayer;
192
                                rootLayer  = getFakeRootLayer();
193
                                rootLayer.getChildren().add(aux);
194
                            }
195
                            rootLayer.getChildren().add(lyr);
196
                        }
197
                        
198
                        if (lyr.getName()!=null)
199
                                                    layers.put(lyr.getName(), lyr); 
200
                                                
201
//                        Collection layerCollection = layers.values(); 
202
//                        Iterator iter = layerCollection.iterator();
203
//                        while (iter.hasNext())
204
//                        {
205
//                                WMSLayer1_1_1 layer = (WMSLayer1_1_1)iter.next(); 
206
//                                                    //Add all the SRS that the layer supports to the WMSProtocolHandler if they dont exist already
207
//                                                    for (i=0;i<layer.getAllSrs().size();i++)
208
//                                                    {                                                           
209
////                                                        if (!layer.srs.contains(layer.getAllSrs().elementAt(i)))
210
////                                                        {
211
////                                                            this.srs.add(layer.getAllSrs().elementAt(i));
212
////                                                        }
213
//                                                    }                                
214
//                        }                                                
215
                                        }
216
                                        else if ((parser.getName().compareTo(CapabilitiesTags.VENDORSPECIFICCAPABILITIES)==0) ||
217
                                                        (parser.getName().compareTo(CapabilitiesTags.USERDEFINEDSYMBOLIZATION )==0))
218
                            
219
                                        {
220
                                                parser.skipSubTree();
221
                                        }                                        
222
                                        break;
223
                                case KXmlParser.END_TAG:
224
                                        if (parser.getName().compareTo(CapabilitiesTags.CAPABILITY) == 0)
225
                                                end = true;
226
                                        break;
227
                                case KXmlParser.TEXT:                                        
228
                                break;
229
                         }
230
                         if (!end)
231
                                 currentTag = parser.next();
232
            }
233
            //parser.require(KXmlParser.END_TAG, null, CapabilitiesTags.CAPABILITY);            
234
    }
235
    
236
    /**
237
     * <p>Parses the Request tag </p>
238
     */ 
239
    private void parseRequestTag(KXmlParser parser) throws IOException, XmlPullParserException
240
    {        
241
            int currentTag;
242
            boolean end = false;
243
            
244
            parser.require(KXmlParser.START_TAG, null, CapabilitiesTags.REQUEST);
245
            currentTag = parser.next();
246
            
247
            while (!end) 
248
            {
249
                         switch(currentTag)
250
                         {
251
                                case KXmlParser.START_TAG:
252
                                        if (parser.getName().compareTo(CapabilitiesTags.GETCAPABILITIES)==0)
253
                                        {
254
                                                serviceInfo.operations.put(CapabilitiesTags.GETCAPABILITIES, null); 
255
                                        }        
256
                                        else if (parser.getName().compareTo(CapabilitiesTags.GETMAP)==0)
257
                                        {
258
                                                // put a null to this key?
259
                                                // or leave it like it was with a CODE in a vector specifying this operation.
260
                                                // WMSProtocolHandler.GETMAP_OPERATION 
261
                                                serviceInfo.operations.put(CapabilitiesTags.GETMAP, null); 
262
                                                parseGetMapTag(parser);
263
                                        }
264
                                        else if (parser.getName().compareTo(CapabilitiesTags.GETFEATUREINFO)==0)
265
                                        {
266
                                                //serviceInfo.operations.put(WMSProtocolHandler.GETFEATUREINFO_OPERATION)
267
                                                serviceInfo.operations.put(CapabilitiesTags.GETFEATUREINFO, null);
268
                                                parseGetFeatureInfoTag(parser);
269
                                        }                
270
                                        else if (parser.getName().compareTo(CapabilitiesTags.DESCRIBELAYER)==0)
271
                                        {
272
                                                //serviceInfo.operations.put(WMSProtocolHandler.DESCRIBELAYER_OPERATION)
273
                                                serviceInfo.operations.put(CapabilitiesTags.DESCRIBELAYER, null); 
274
                                        }                                        
275
                                        break;
276
                                case KXmlParser.END_TAG:
277
                                        if (parser.getName().compareTo(CapabilitiesTags.REQUEST) == 0)
278
                                                end = true;
279
                                        break;
280
                                case KXmlParser.TEXT:                                        
281
                                break;
282
                         }
283
                         if(!end)
284
                                 currentTag = parser.next();
285
            }
286
            // TODO: does not get such a tag when arrives here!!!!!!
287
            //parser.require(KXmlParser.END_TAG, null, CapabilitiesTags.REQUEST);            
288
    }
289
    
290
    /**
291
     * <p>Parses the GetMap tag </p>
292
     */ 
293
    private void parseGetMapTag(KXmlParser parser) throws IOException, XmlPullParserException
294
    {        
295
            int currentTag;
296
            boolean end = false;
297
            
298
            parser.require(KXmlParser.START_TAG, null, CapabilitiesTags.GETMAP);
299
            currentTag = parser.next();
300
            
301
            while (!end) 
302
            {
303
                         switch(currentTag)
304
                         {
305
                                case KXmlParser.START_TAG:
306
                                        if (parser.getName().compareTo(CapabilitiesTags.FORMAT)==0)
307
                                        {
308
                                                serviceInfo.formats.add(parser.nextText());
309
                                        }        
310
                                        else if (parser.getName().compareTo(CapabilitiesTags.DCPTYPE)==0)
311
                                        {                        
312
                                                currentTag = parser.nextTag();
313
                                                if(parser.getName().compareTo(CapabilitiesTags.HTTP)==0)
314
                                                {
315
                                                        currentTag = parser.nextTag();
316
                                                        if(parser.getName().compareTo(CapabilitiesTags.GET)==0)
317
                                                        {
318
                                                                currentTag = parser.nextTag();
319
                                                                if (parser.getName().compareTo(CapabilitiesTags.ONLINERESOURCE)==0)
320
                                                                {
321
                                                                        String value = new String();
322
                                                                        value = parser.getAttributeValue("", CapabilitiesTags.XLINK_HREF);
323
                                                                        if (value != null){
324
                                                                                serviceInfo.operations.put(CapabilitiesTags.GETMAP, value);
325
                                                                        }
326
                                                                }
327
                                                        }
328
                                                }
329
                                        }                        
330
                                        break;
331
                                case KXmlParser.END_TAG:
332
                                        if (parser.getName().compareTo(CapabilitiesTags.GETMAP) == 0)
333
                                                end = true;
334
                                        break;
335
                                case KXmlParser.TEXT:                                        
336
                                break;
337
                         }
338
                         if(!end)
339
                                 currentTag = parser.next();
340
            }        
341
    }    
342
    
343
    /**
344
     * <p>Parses the GetMap tag </p>
345
     */ 
346
    private void parseGetFeatureInfoTag(KXmlParser parser) throws IOException, XmlPullParserException
347
    {        
348
            int currentTag;
349
            boolean end = false;
350
            
351
            parser.require(KXmlParser.START_TAG, null, CapabilitiesTags.GETFEATUREINFO);
352
            currentTag = parser.next();
353
            
354
            while (!end) 
355
            {
356
                         switch(currentTag)
357
                         {
358
                                case KXmlParser.START_TAG:
359
                                        if (parser.getName().compareTo(CapabilitiesTags.FORMAT)==0)
360
                                        {
361
                                                //TODO:
362
                                                // add the supported formats by the GetFeatureInfo request
363
                                                //serviceInfo.formats.add(parser.nextText());
364
                                        }        
365
                                        else if (parser.getName().compareTo(CapabilitiesTags.DCPTYPE)==0)
366
                                        {                        
367
                                                currentTag = parser.nextTag();
368
                                                if(parser.getName().compareTo(CapabilitiesTags.HTTP)==0)
369
                                                {
370
                                                        currentTag = parser.nextTag();
371
                                                        if(parser.getName().compareTo(CapabilitiesTags.GET)==0)
372
                                                        {
373
                                                                currentTag = parser.nextTag();
374
                                                                if (parser.getName().compareTo(CapabilitiesTags.ONLINERESOURCE)==0)
375
                                                                {
376
                                                                        String value = new String();
377
                                                                        value = parser.getAttributeValue("", CapabilitiesTags.XLINK_HREF);
378
                                                                        if (value != null){
379
                                                                                serviceInfo.operations.put(CapabilitiesTags.GETFEATUREINFO, value);
380
                                                                        }
381
                                                                }
382
                                                        }
383
                                                }
384
                                        }                        
385
                                        break;
386
                                case KXmlParser.END_TAG:
387
                                        if (parser.getName().compareTo(CapabilitiesTags.GETFEATUREINFO) == 0)
388
                                                end = true;
389
                                        break;
390
                                case KXmlParser.TEXT:                                        
391
                                break;
392
                         }
393
                         if(!end)
394
                                 currentTag = parser.next();
395
            }        
396
    }         
397

    
398
    private WMSLayer1_1_1 getFakeRootLayer(){
399
        if (fakeRootLayer == null){
400
            fakeRootLayer = new WMSLayer1_1_1();
401
            fakeRootLayer.setTitle(serviceInfo.title);
402
            fakeRootLayer.setQueryable(false);
403
            fakeRootLayer.setName(null);
404
        }
405
        return fakeRootLayer;
406
    }
407
    /* (non-Javadoc)
408
     * @see org.gvsig.remoteClient.wms.WMSProtocolHandler#parseException(byte[])
409
     */
410
    protected String parseException(byte[] data) {
411
        ArrayList errors = new ArrayList();
412
        KXmlParser kxmlParser = new KXmlParser();
413
        Reader reader = new InputStreamReader(new ByteArrayInputStream(data));
414
        try
415
        {
416
            kxmlParser.setInput(reader);        
417
            int tag;
418
            
419
            boolean end = false;
420
            tag = kxmlParser.nextTag();
421
            
422
            kxmlParser.require(KXmlParser.START_TAG, null, ExceptionTags.EXCEPTION_ROOT);
423
            
424
            while (!end) 
425
            {
426
                switch(tag)
427
                {
428
                    case KXmlParser.START_TAG:
429
                            if (kxmlParser.getName().compareTo(ExceptionTags.SERVICE_EXCEPTION)==0){
430
                                String errorCode = kxmlParser.getAttributeValue("", ExceptionTags.CODE);
431
                                errorCode = (errorCode != null) ? "["+errorCode+"] " : "";
432
                                String errorMessage = kxmlParser.nextText();
433
                                errors.add(errorCode+errorMessage);
434
                            }
435
                            break;
436
                    case KXmlParser.END_TAG:   
437
                            if (kxmlParser.getName().compareTo(ExceptionTags.EXCEPTION_ROOT) == 0)
438
                                end = true;
439
                            break; 
440
                     }
441
                        if (!end)
442
                        {
443
                                tag = kxmlParser.nextTag();
444
                        }
445
                 }
446
                }
447
        catch(XmlPullParserException parser_ex){
448
            System.out.println(parser_ex.getMessage());
449
            parser_ex.printStackTrace();
450
        }
451
        catch (IOException ioe) {           
452
            ioe.printStackTrace();            
453
        }
454
        String message = errors.size()>0? "" : null;
455
        for (int i = 0; i < errors.size(); i++) {
456
            message += (String) errors.get(i)+"\n";
457
        }
458
        return message;
459
    }
460
    
461
  }