Statistics
| Revision:

svn-gvsig-desktop / trunk / libraries / libRemoteServices / src / org / gvsig / remoteClient / wms / wms_1_1_1 / WMSProtocolHandler1_1_1.java @ 3592

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.exceptions.WMSException;
16
import org.gvsig.remoteClient.utils.CapabilitiesTags;
17
import org.gvsig.remoteClient.utils.ExceptionTags;
18
import org.kxml2.io.KXmlParser;
19
import org.xmlpull.v1.XmlPullParserException;
20

    
21
/**
22
 * <p>
23
 * Describes the handler to comunicate to a WMS 1.1.1
24
 * </p>
25
 */
26
public class WMSProtocolHandler1_1_1 extends org.gvsig.remoteClient.wms.WMSProtocolHandler {
27
        private WMSLayer1_1_1 fakeRootLayer;
28
    
29
        public WMSProtocolHandler1_1_1()
30
        {
31
                this.version = "1.1.1";
32
                this.name = "WMS1.1.1";
33
                this.serviceInfo = new ServiceInformation(); 
34
                this.layers = new TreeMap();
35
                this.srs = new Vector();
36
        
37
        }
38
    
39
//------------------------------------------------------------------------------
40
// Parsing methods....    
41
//------------------------------------------------------------------------------    
42
/**
43
 * <p>Parse the xml data retrieved from the WMS, it will parse the WMS Capabilities</p>
44
 * 
45
 */
46
    public void parse(File f)
47
    {       
48
            FileReader reader = null;            
49
            try
50
            {
51
                    reader = new FileReader(f);
52
            }
53
            catch(FileNotFoundException ex)        {
54
                    ex.printStackTrace();
55
            }
56
            
57
            int tag;
58
            KXmlParser kxmlParser = null;
59
            kxmlParser = new KXmlParser();
60
            try
61
            {
62
                    kxmlParser.setInput(reader);                
63
                        kxmlParser.nextTag();
64
                    if ( kxmlParser.getEventType() != KXmlParser.END_DOCUMENT ) 
65
                    {                    
66
                            kxmlParser.require(KXmlParser.START_TAG, null, CapabilitiesTags.CAPABILITIES_ROOT);                            
67
                            tag = kxmlParser.nextTag();
68
                                 while(tag != KXmlParser.END_DOCUMENT)
69
                                 {
70
                                         switch(tag)
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
                         currentTag = parser.next();
154
            }
155
//            parser.require(KXmlParser.END_TAG, null, CapabilitiesTags.SERVICE);
156
    }
157
    /**
158
     * <p>Parses the Capability Tag </p>
159
     */    
160
    private void parseCapabilityTag(KXmlParser parser) throws IOException, XmlPullParserException
161
    {         
162
            int i;
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_1_1 lyr = new WMSLayer1_1_1();
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
                                                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
                                        }
211
                                        else if ((parser.getName().compareTo(CapabilitiesTags.VENDORSPECIFICCAPABILITIES)==0) ||
212
                                                        (parser.getName().compareTo(CapabilitiesTags.USERDEFINEDSYMBOLIZATION )==0))
213
                            
214
                                        {
215
                                                parser.skipSubTree();
216
                                        }                                        
217
                                        break;
218
                                case KXmlParser.END_TAG:
219
                                        if (parser.getName().compareTo(CapabilitiesTags.CAPABILITY) == 0)
220
                                                end = true;
221
                                        break;
222
                                case KXmlParser.TEXT:                                        
223
                                break;
224
                         }
225
                         currentTag = parser.next();
226
            }
227
            //parser.require(KXmlParser.END_TAG, null, CapabilitiesTags.CAPABILITY);            
228
    }
229
    
230
    /**
231
     * <p>Parses the Request tag </p>
232
     */ 
233
    private void parseRequestTag(KXmlParser parser) throws IOException, XmlPullParserException
234
    {        
235
            int currentTag;
236
            boolean end = false;
237
            
238
            parser.require(KXmlParser.START_TAG, null, CapabilitiesTags.REQUEST);
239
            currentTag = parser.next();
240
            
241
            while (!end) 
242
            {
243
                         switch(currentTag)
244
                         {
245
                                case KXmlParser.START_TAG:
246
                                        if (parser.getName().compareTo(CapabilitiesTags.GETCAPABILITIES)==0)
247
                                        {
248
                                        }        
249
                                        else if (parser.getName().compareTo(CapabilitiesTags.GETMAP)==0)
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
                                        }
261
                                        else if (parser.getName().compareTo(CapabilitiesTags.GETFEATUREINFO)==0)
262
                                        {
263
                                        }                                
264
                                        break;
265
                                case KXmlParser.END_TAG:
266
                                        if (parser.getName().compareTo(CapabilitiesTags.REQUEST) == 0)
267
                                                end = true;
268
                                        break;
269
                                case KXmlParser.TEXT:                                        
270
                                break;
271
                         }
272
                         currentTag = parser.next();
273
            }
274
            // TODO: does not get such a tag when arrives here!!!!!!
275
            //parser.require(KXmlParser.END_TAG, null, CapabilitiesTags.REQUEST);            
276
    }
277

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