Statistics
| Revision:

root / trunk / libraries / libRemoteServices / src / org / gvsig / remoteClient / wms / wms_1_1_1 / WMSProtocolHandler1_1_1.java @ 3655

History | View | Annotate | Download (10.8 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
import java.util.Vector;
14

    
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.1
23
 * </p>
24
 */
25
public class WMSProtocolHandler1_1_1 extends org.gvsig.remoteClient.wms.WMSProtocolHandler {
26
        private WMSLayer1_1_1 fakeRootLayer;
27
    
28
        public WMSProtocolHandler1_1_1()
29
        {
30
                this.version = "1.1.1";
31
                this.name = "WMS1.1.1";
32
                this.serviceInfo = new ServiceInformation(); 
33
                this.layers = new TreeMap();
34
                this.srs = new Vector();
35
        
36
        }
37
    
38
//------------------------------------------------------------------------------
39
// Parsing methods....    
40
//------------------------------------------------------------------------------    
41
/**
42
 * <p>Parse the xml data retrieved from the WMS, it will parse the WMS Capabilities</p>
43
 * 
44
 */
45
    public void parse(File f)
46
    {       
47
            FileReader reader = null;            
48
            try
49
            {
50
                    reader = new FileReader(f);
51
            }
52
            catch(FileNotFoundException ex)        {
53
                    ex.printStackTrace();
54
            }
55
            
56
            int tag;
57
            KXmlParser kxmlParser = null;
58
            kxmlParser = new KXmlParser();
59
            try
60
            {
61
                    kxmlParser.setInput(reader);                
62
                        kxmlParser.nextTag();
63
                    if ( kxmlParser.getEventType() != KXmlParser.END_DOCUMENT ) 
64
                    {                    
65
                            kxmlParser.require(KXmlParser.START_TAG, null, CapabilitiesTags.CAPABILITIES_ROOT);                            
66
                            tag = kxmlParser.nextTag();
67
                                 while(tag != KXmlParser.END_DOCUMENT)
68
                                 {
69
                     switch(tag)
70
                                         {
71
                         
72
                                                case KXmlParser.START_TAG:
73
                                                        if (kxmlParser.getName().compareTo(CapabilitiesTags.SERVICE )==0)
74
                                                        {
75
                                                                parseServiceTag(kxmlParser);
76
                                                        }        
77
                                                        else if (kxmlParser.getName().compareTo(CapabilitiesTags.CAPABILITY)==0)
78
                                                        {
79
                                                                parseCapabilityTag(kxmlParser);
80
                                                        }
81
                                                        break;
82
                                                case KXmlParser.END_TAG:                                                        
83
                                                        break;
84
                                                case KXmlParser.TEXT:
85
                                                        System.out.println("[TEXT]["+kxmlParser.getText()+"]");                                                        
86
                                                break;
87
                                         }
88
                                     tag = kxmlParser.next();
89
                             }
90
//                            while (kxmlParser.nextTag() != KXmlParser.END_DOCUMENT) {
91
//                                    //readXMLData(kxmlParser);
92
//                            }
93
                            //kxmlParser.require(KXmlParser.END_TAG, null, CapabilitiesTags.CAPABILITIES_ROOT);
94
                            //kxmlParser.next();
95
                            kxmlParser.require(KXmlParser.END_DOCUMENT, null, null);
96
                    }
97
            }
98
            catch(XmlPullParserException parser_ex){
99
                    System.out.println(parser_ex.getMessage());
100
                    parser_ex.printStackTrace();
101
                    // TODO: Implement logic to handle the exceptions
102
            }
103
                   catch (IOException ioe) {                        
104
                           ioe.printStackTrace();
105
                           // TODO: Implement logic to handle the exceptions
106
                } finally {
107
            
108
        }
109
                   // In the parsing process the layer has been filled                  
110
    } 
111
    
112
    /**
113
     * <p>Parses the Service Information </p>
114
     */    
115
    private void parseServiceTag(KXmlParser parser) throws IOException, XmlPullParserException 
116
    {
117
            int currentTag;
118
            boolean end = false;
119
            
120
            parser.require(KXmlParser.START_TAG, null, CapabilitiesTags.SERVICE);
121
            currentTag = parser.next();
122
            
123
            while (!end) 
124
            {
125
                         switch(currentTag)
126
                         {
127
                                case KXmlParser.START_TAG:
128
                                        if (parser.getName().compareTo(CapabilitiesTags.NAME)==0)
129
                                        {
130
                                                serviceInfo.name = parser.nextText(); 
131
                                        }        
132
                                        else if (parser.getName().compareTo(CapabilitiesTags.TITLE)==0)
133
                                        {
134
                                                serviceInfo.title = parser.nextText(); 
135
                                        }
136
                                        else if (parser.getName().compareTo(CapabilitiesTags.ABSTRACT)==0)
137
                                        {
138
                                                serviceInfo.abstr = parser.nextText(); 
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 i;
164
            int currentTag;
165
            boolean end = false;
166
            
167
            parser.require(KXmlParser.START_TAG, null, CapabilitiesTags.CAPABILITY);
168
            currentTag = parser.next();
169
            
170
            while (!end) 
171
            {
172
                         switch(currentTag)
173
                         {
174
                                case KXmlParser.START_TAG:
175
                                        if (parser.getName().compareTo(CapabilitiesTags.REQUEST)==0)
176
                                        {
177
                                                parseRequestTag(parser); 
178
                                        }        
179
                                        else if (parser.getName().compareTo(CapabilitiesTags.EXCEPTION)==0)
180
                                        {
181
                                                //Parse exception tags...
182
                                        }
183
                                        else if (parser.getName().compareTo(CapabilitiesTags.LAYER)==0)
184
                                        {
185
                                                WMSLayer1_1_1 lyr = new WMSLayer1_1_1();
186
                        if (rootLayer == null)
187
                            rootLayer = lyr;
188
                        else {
189
                            // Handles when there is no general root layer, will use
190
                            // a fake non-queryable one.
191
                            if (!rootLayer.equals(getFakeRootLayer())){
192
                                WMSLayer1_1_1 aux = (WMSLayer1_1_1) rootLayer;
193
                                rootLayer  = getFakeRootLayer();
194
                                rootLayer.getChildren().add(aux);
195
                            }
196
                            rootLayer.getChildren().add(lyr);
197
                        }
198
                                                lyr.parse(parser, layers);
199
                                                
200
                        if (lyr.getName()!=null)
201
                                                    layers.put(lyr.getName(), lyr);                                                         
202
                                                //Add all the SRS that the layer supports to the WMSProtocolHandler if they dont exist already
203
                                                for (i=0;i<lyr.getAllSrs().size();i++)
204
                                                {
205
                                                    if (!this.srs.contains(lyr.getAllSrs().elementAt(i)))
206
                                                    {
207
                                                        this.srs.add( lyr.getAllSrs().elementAt(i));
208
                                                    }
209
                                                }
210
                                                
211
                                        }
212
                                        else if ((parser.getName().compareTo(CapabilitiesTags.VENDORSPECIFICCAPABILITIES)==0) ||
213
                                                        (parser.getName().compareTo(CapabilitiesTags.USERDEFINEDSYMBOLIZATION )==0))
214
                            
215
                                        {
216
                                                parser.skipSubTree();
217
                                        }                                        
218
                                        break;
219
                                case KXmlParser.END_TAG:
220
                                        if (parser.getName().compareTo(CapabilitiesTags.CAPABILITY) == 0)
221
                                                end = true;
222
                                        break;
223
                                case KXmlParser.TEXT:                                        
224
                                break;
225
                         }
226
                         currentTag = parser.next();
227
            }
228
            //parser.require(KXmlParser.END_TAG, null, CapabilitiesTags.CAPABILITY);            
229
    }
230
    
231
    /**
232
     * <p>Parses the Request tag </p>
233
     */ 
234
    private void parseRequestTag(KXmlParser parser) throws IOException, XmlPullParserException
235
    {        
236
            int currentTag;
237
            boolean end = false;
238
            
239
            parser.require(KXmlParser.START_TAG, null, CapabilitiesTags.REQUEST);
240
            currentTag = parser.next();
241
            
242
            while (!end) 
243
            {
244
                         switch(currentTag)
245
                         {
246
                                case KXmlParser.START_TAG:
247
                                        if (parser.getName().compareTo(CapabilitiesTags.GETCAPABILITIES)==0)
248
                                        {
249
                                        }        
250
                                        else if (parser.getName().compareTo(CapabilitiesTags.GETMAP)==0)
251
                                        {
252
                                                currentTag = parser.nextTag();
253
                                                parser.require(KXmlParser.START_TAG, null, CapabilitiesTags.FORMAT);  
254
                                                while ((currentTag == KXmlParser.START_TAG) &&
255
                                                                (parser.getName().compareTo(CapabilitiesTags.FORMAT)==0))
256
                                                {
257
                                                        parser.require(KXmlParser.START_TAG, null, CapabilitiesTags.FORMAT);
258
                                                        serviceInfo.formats.add(parser.nextText());
259
                                                        parser.nextTag();
260
                                                }                                                                                                                                                                
261
                                        }
262
                                        else if (parser.getName().compareTo(CapabilitiesTags.GETFEATUREINFO)==0)
263
                                        {
264
                                        }                                
265
                                        break;
266
                                case KXmlParser.END_TAG:
267
                                        if (parser.getName().compareTo(CapabilitiesTags.REQUEST) == 0)
268
                                                end = true;
269
                                        break;
270
                                case KXmlParser.TEXT:                                        
271
                                break;
272
                         }
273
                         currentTag = parser.next();
274
            }
275
            // TODO: does not get such a tag when arrives here!!!!!!
276
            //parser.require(KXmlParser.END_TAG, null, CapabilitiesTags.REQUEST);            
277
    }
278

    
279
    private WMSLayer1_1_1 getFakeRootLayer(){
280
        if (fakeRootLayer == null){
281
            fakeRootLayer = new WMSLayer1_1_1();
282
            fakeRootLayer.setTitle(serviceInfo.title);
283
            fakeRootLayer.setQueryable(false);
284
            fakeRootLayer.setName(null);
285
        }
286
        return fakeRootLayer;
287
    }
288
    /* (non-Javadoc)
289
     * @see org.gvsig.remoteClient.wms.WMSProtocolHandler#parseException(byte[])
290
     */
291
    protected String parseException(byte[] data) {
292
        ArrayList errors = new ArrayList();
293
        KXmlParser kxmlParser = new KXmlParser();
294
        Reader reader = new InputStreamReader(new ByteArrayInputStream(data));
295
        try
296
        {
297
            kxmlParser.setInput(reader);        
298
            kxmlParser.nextTag();
299
            int tag;
300
            if ( kxmlParser.getEventType() != KXmlParser.END_DOCUMENT ) 
301
            { 
302
                kxmlParser.require(KXmlParser.START_TAG, null, ExceptionTags.EXCEPTION_ROOT);             
303
                tag = kxmlParser.nextTag();
304
                 while(tag != KXmlParser.END_DOCUMENT)
305
                 {
306
                     switch(tag)
307
                     {
308
                        case KXmlParser.START_TAG:
309
                            if (kxmlParser.getName().compareTo(ExceptionTags.SERVICE_EXCEPTION)==0){
310
                                String errorCode = kxmlParser.getAttributeValue("", ExceptionTags.CODE);
311
                                errorCode = (errorCode != null) ? "["+errorCode+"] " : "";
312
                                String errorMessage = kxmlParser.nextText();
313
                                errors.add(errorCode+errorMessage);
314
                            }
315
                            break;
316
                        case KXmlParser.END_TAG:                            
317
                            break;
318
                        
319
                     }
320
                     tag = kxmlParser.nextTag();
321
                 }
322
                 //kxmlParser.require(KXmlParser.END_DOCUMENT, null, null);
323
            }
324
        }
325
        catch(XmlPullParserException parser_ex){
326
            System.out.println(parser_ex.getMessage());
327
            parser_ex.printStackTrace();
328
        }
329
        catch (IOException ioe) {           
330
            ioe.printStackTrace();            
331
        }
332
        String message = errors.size()>0? "" : null;
333
        for (int i = 0; i < errors.size(); i++) {
334
            message += (String) errors.get(i)+"\n";
335
        }
336
        return message;
337
    }
338
    
339
  }