Statistics
| Revision:

root / trunk / libraries / libRemoteServices / src / org / gvsig / remoteClient / wms / wms_1_3_0 / WMSProtocolHandler1_3_0.java @ 3743

History | View | Annotate | Download (10.5 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
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.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
                this.srs = new Vector();        
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
            }
51
            catch(FileNotFoundException ex)        {
52
                    ex.printStackTrace();
53
            }
54
            
55
            int tag;
56
            KXmlParser kxmlParser = null;
57
            kxmlParser = new KXmlParser();
58
            try
59
            {
60
                    kxmlParser.setInput(reader);                
61
                        kxmlParser.nextTag();
62
                    if ( kxmlParser.getEventType() != KXmlParser.END_DOCUMENT ) 
63
                    {                    
64
                            kxmlParser.require(KXmlParser.START_TAG, null, CapabilitiesTags.CAPABILITIES_ROOT1_3_0);                            
65
                            tag = kxmlParser.nextTag();
66
                                 while(tag != KXmlParser.END_DOCUMENT)
67
                                 {
68
                     switch(tag)
69
                                         {
70
                         
71
                                                case KXmlParser.START_TAG:
72
                                                        if (kxmlParser.getName().compareTo(CapabilitiesTags.SERVICE )==0)
73
                                                        {
74
                                                                parseServiceTag(kxmlParser);
75
                                                        }        
76
                                                        else if (kxmlParser.getName().compareTo(CapabilitiesTags.CAPABILITY)==0)
77
                                                        {
78
                                                                parseCapabilityTag(kxmlParser);
79
                                                        }
80
                                                        break;
81
                                                case KXmlParser.END_TAG:                                                        
82
                                                        break;
83
                                                case KXmlParser.TEXT:
84
                                                        System.out.println("[TEXT]["+kxmlParser.getText()+"]");                                                        
85
                                                break;
86
                                         }
87
                                     tag = kxmlParser.next();
88
                             }//while !END_DOCUMENT
89
                    }
90
            }
91
            catch(XmlPullParserException parser_ex){
92
                    System.out.println(parser_ex.getMessage());
93
                    parser_ex.printStackTrace();
94
                    // TODO: Implement logic to handle the exceptions
95
            }
96
                   catch (IOException ioe) {                        
97
                           ioe.printStackTrace();
98
                           // TODO: Implement logic to handle the exceptions
99
                } finally {
100
            
101
        }
102
                   // In the parsing process the layer has been filled                  
103
    } 
104
    
105
    /**
106
     * <p>Parses the Service Information </p>
107
     */    
108
    private void parseServiceTag(KXmlParser parser) throws IOException, XmlPullParserException 
109
    {
110
            int currentTag;
111
            boolean end = false;
112
            
113
            parser.require(KXmlParser.START_TAG, null, CapabilitiesTags.SERVICE);
114
            currentTag = parser.next();
115
            
116
            while (!end) 
117
            {
118
                         switch(currentTag)
119
                         {
120
                                case KXmlParser.START_TAG:
121
                                        if (parser.getName().compareTo(CapabilitiesTags.NAME)==0)
122
                                        {
123
                                                serviceInfo.name = parser.nextText(); 
124
                                        }        
125
                                        else if (parser.getName().compareTo(CapabilitiesTags.TITLE)==0)
126
                                        {
127
                                                serviceInfo.title = parser.nextText(); 
128
                                        }
129
                                        else if (parser.getName().compareTo(CapabilitiesTags.ABSTRACT)==0)
130
                                        {
131
                                                serviceInfo.abstr = parser.nextText(); 
132
                                        }
133
                                        else if ((parser.getName().compareTo(CapabilitiesTags.KEYWORDLIST)==0) ||
134
                                                        (parser.getName().compareTo(CapabilitiesTags.CONTACTINFORMATION)==0))
135
                                        {
136
                                                parser.skipSubTree();
137
                                        }                                        
138
                                        break;
139
                                case KXmlParser.END_TAG:
140
                                        if (parser.getName().compareTo(CapabilitiesTags.SERVICE) == 0)
141
                                                end = true;
142
                                        break;
143
                                case KXmlParser.TEXT:                                        
144
                                break;
145
                         }
146
             if (!end)
147
                 currentTag = parser.next();
148
            }
149
            parser.require(KXmlParser.END_TAG, null, CapabilitiesTags.SERVICE);
150
    }
151
    /**
152
     * <p>Parses the Capability Tag </p>
153
     */    
154
    private void parseCapabilityTag(KXmlParser parser) throws IOException, XmlPullParserException
155
    {         
156
            int i;
157
            int currentTag;
158
            boolean end = false;
159
            
160
            parser.require(KXmlParser.START_TAG, null, CapabilitiesTags.CAPABILITY);
161
            currentTag = parser.next();
162
            
163
            while (!end) 
164
            {
165
                         switch(currentTag)
166
                         {
167
                                case KXmlParser.START_TAG:
168
                                        if (parser.getName().compareTo(CapabilitiesTags.REQUEST)==0)
169
                                        {
170
                                                parseRequestTag(parser); 
171
                                        }        
172
                                        else if (parser.getName().compareTo(CapabilitiesTags.EXCEPTION)==0)
173
                                        {
174
                                                //Parse exception tags...
175
                                        }
176
                                        else if (parser.getName().compareTo(CapabilitiesTags.LAYER)==0)
177
                                        {
178
                                                WMSLayer1_3_0 lyr = new WMSLayer1_3_0();
179
                        if (rootLayer == null)
180
                            rootLayer = lyr;
181
                        else {
182
                            // Handles when there is no general root layer, will use
183
                            // a fake non-queryable one.
184
                            if (!rootLayer.equals(getFakeRootLayer())){
185
                                WMSLayer1_3_0 aux = (WMSLayer1_3_0) rootLayer;
186
                                rootLayer  = getFakeRootLayer();
187
                                rootLayer.getChildren().add(aux);
188
                            }
189
                            rootLayer.getChildren().add(lyr);
190
                        }
191
                                                lyr.parse(parser, layers);
192
                                                
193
                        if (lyr.getName()!=null)
194
                                                    layers.put(lyr.getName(), lyr);                                                         
195
                                                //Add all the SRS that the layer supports to the WMSProtocolHandler if they dont exist already
196
                                                for (i=0;i<lyr.getAllSrs().size();i++)
197
                                                {
198
                                                    if (!this.srs.contains(lyr.getAllSrs().elementAt(i)))
199
                                                    {
200
                                                        this.srs.add( lyr.getAllSrs().elementAt(i));
201
                                                    }
202
                                                }
203
                                                
204
                                        }
205
                                        else if ((parser.getName().compareTo(CapabilitiesTags.VENDORSPECIFICCAPABILITIES)==0) ||
206
                                                        (parser.getName().compareTo(CapabilitiesTags.USERDEFINEDSYMBOLIZATION )==0))
207
                            
208
                                        {
209
                                                parser.skipSubTree();
210
                                        }                                        
211
                                        break;
212
                                case KXmlParser.END_TAG:
213
                                        if (parser.getName().compareTo(CapabilitiesTags.CAPABILITY) == 0)
214
                                                end = true;
215
                                        break;
216
                                case KXmlParser.TEXT:                                        
217
                                break;
218
                         }
219
                         currentTag = parser.next();
220
            }
221
            //parser.require(KXmlParser.END_TAG, null, CapabilitiesTags.CAPABILITY);            
222
    }
223
    
224
    /**
225
     * <p>Parses the Request tag </p>
226
     */ 
227
    private void parseRequestTag(KXmlParser parser) throws IOException, XmlPullParserException
228
    {        
229
            int currentTag;
230
            boolean end = false;
231
            
232
            parser.require(KXmlParser.START_TAG, null, CapabilitiesTags.REQUEST);
233
            currentTag = parser.next();
234
            
235
            while (!end) 
236
            {
237
                         switch(currentTag)
238
                         {
239
                                case KXmlParser.START_TAG:
240
                                        if (parser.getName().compareTo(CapabilitiesTags.GETCAPABILITIES)==0)
241
                                        {
242
                                        }        
243
                                        else if (parser.getName().compareTo(CapabilitiesTags.GETMAP)==0)
244
                                        {
245
                                                currentTag = parser.nextTag();
246
                                                parser.require(KXmlParser.START_TAG, null, CapabilitiesTags.FORMAT);  
247
                                                while ((currentTag == KXmlParser.START_TAG) &&
248
                                                                (parser.getName().compareTo(CapabilitiesTags.FORMAT)==0))
249
                                                {
250
                                                        parser.require(KXmlParser.START_TAG, null, CapabilitiesTags.FORMAT);
251
                                                        serviceInfo.formats.add(parser.nextText());
252
                                                        parser.nextTag();
253
                                                }                                                                                                                                                                
254
                                        }
255
                                        else if (parser.getName().compareTo(CapabilitiesTags.GETFEATUREINFO)==0)
256
                                        {
257
                                        }                                
258
                                        break;
259
                                case KXmlParser.END_TAG:
260
                                        if (parser.getName().compareTo(CapabilitiesTags.REQUEST) == 0)
261
                                                end = true;
262
                                        break;
263
                                case KXmlParser.TEXT:                                        
264
                                break;
265
                         }
266
                         currentTag = parser.next();
267
            }
268
            // TODO: does not get such a tag when arrives here!!!!!!
269
            //parser.require(KXmlParser.END_TAG, null, CapabilitiesTags.REQUEST);            
270
    }
271

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