Statistics
| Revision:

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

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

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