Statistics
| Revision:

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

History | View | Annotate | Download (13.8 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.io.InputStreamReader;
12
import java.io.Reader;
13
import java.util.ArrayList;
14
import java.util.TreeMap;
15
import org.gvsig.remoteClient.utils.CapabilitiesTags;
16
import org.gvsig.remoteClient.utils.ExceptionTags;
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.1.0
23
 * </p>
24
 */
25
public class WMSProtocolHandler1_1_0 extends org.gvsig.remoteClient.wms.WMSProtocolHandler
26
{
27
        private WMSLayer1_1_0 fakeRootLayer;
28
    
29
        public WMSProtocolHandler1_1_0()
30
        {
31
                this.version = "1.1.0";
32
                this.name = "WMS1.1.0";
33
                this.serviceInfo = new ServiceInformation(); 
34
                this.layers = new TreeMap();
35
        }
36
    
37
//------------------------------------------------------------------------------
38
// Parsing methods....    
39
//------------------------------------------------------------------------------    
40
/**
41
 * <p>Parse the xml data retrieved from the WMS, it will parse the WMS Capabilities</p>
42
 * 
43
 */
44
    public void parse(File f)
45
    {       
46
            FileReader reader = null;          
47
            try
48
            {
49
                    reader = new FileReader(f);
50
                    BufferedReader br = new BufferedReader(reader);
51
                    char[] buffer = new char[100];
52
                    br.read(buffer);
53
                    StringBuffer st = new StringBuffer(new String(buffer));
54
                    String searchText = "encoding=\"";
55
                    int index = st.indexOf(searchText);
56
                    if (index>-1) {
57
                            st.delete(0, index+searchText.length());
58
                            encoding = st.substring(0, st.indexOf("\""));
59
                    }
60
            }
61
            catch(FileNotFoundException ex)        {
62
                    ex.printStackTrace();
63
            } catch (IOException e) {
64
                        e.printStackTrace();
65
                }
66
            
67
            int tag;
68
            KXmlParser kxmlParser = null;
69
            kxmlParser = new KXmlParser();
70
            try
71
            {
72
                    kxmlParser.setInput(new FileInputStream(f), encoding);                
73
                        kxmlParser.nextTag();
74
                    if ( kxmlParser.getEventType() != KXmlParser.END_DOCUMENT ) 
75
                    {                    
76
                            kxmlParser.require(KXmlParser.START_TAG, null, CapabilitiesTags.CAPABILITIES_ROOT1_1_1);                            
77
                            tag = kxmlParser.nextTag();
78
                                 while(tag != KXmlParser.END_DOCUMENT)
79
                                 {
80
                     switch(tag)
81
                                         {
82
                         
83
                                                case KXmlParser.START_TAG:
84
                                                        if (kxmlParser.getName().compareTo(CapabilitiesTags.SERVICE )==0)
85
                                                        {
86
                                                                parseServiceTag(kxmlParser);
87
                                                        }        
88
                                                        else if (kxmlParser.getName().compareTo(CapabilitiesTags.CAPABILITY)==0)
89
                                                        {
90
                                                                parseCapabilityTag(kxmlParser);
91
                                                        }
92
                                                        break;
93
                                                case KXmlParser.END_TAG:                                                        
94
                                                        break;
95
                                                case KXmlParser.TEXT:
96
                                                                                                
97
                                                break;
98
                                         }
99
                                     tag = kxmlParser.next();
100
                             }
101

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

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