Statistics
| Revision:

root / branches / v05 / libraries / libRemoteServices / src / org / gvsig / remoteClient / wms / wms_1_3_0 / WMSProtocolHandler1_3_0.java @ 4019

History | View | Annotate | Download (14 KB)

1

    
2
package org.gvsig.remoteClient.wms.wms_1_3_0;
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.gvsig.remoteClient.wms.WMSProtocolHandler;
17
import org.kxml2.io.KXmlParser;
18
import org.xmlpull.v1.XmlPullParserException;
19

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

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