Statistics
| Revision:

svn-gvsig-desktop / tags / v2_0_0_Build_2020 / libraries / libRemoteServices / src / org / gvsig / remoteclient / wms / wms_1_1_0 / WMSProtocolHandler1_1_0.java @ 33910

History | View | Annotate | Download (10.5 KB)

1

    
2
package org.gvsig.remoteclient.wms.wms_1_1_0;
3

    
4
import java.io.ByteArrayInputStream;
5
import java.io.File;
6
import java.io.IOException;
7
import java.util.ArrayList;
8
import java.util.TreeMap;
9

    
10
import org.kxml2.io.KXmlParser;
11
import org.xmlpull.v1.XmlPullParserException;
12

    
13
import org.gvsig.remoteclient.utils.CapabilitiesTags;
14
import org.gvsig.remoteclient.utils.EncodingXMLParser;
15
import org.gvsig.remoteclient.utils.ExceptionTags;
16
import org.gvsig.remoteclient.wms.WMSServiceInformation;
17
import org.gvsig.remoteclient.wms.WMSStatus;
18
import org.gvsig.remoteclient.wms.request.WMSGetCapabilitiesRequest;
19
import org.gvsig.remoteclient.wms.request.WMSGetFeatureInfoRequest;
20
import org.gvsig.remoteclient.wms.request.WMSGetLegendGraphicRequest;
21
import org.gvsig.remoteclient.wms.request.WMSGetMapRequest;
22
import org.gvsig.remoteclient.wms.wms_1_1_0.request.WMSGetCapabilitiesRequest1_1_0;
23
import org.gvsig.remoteclient.wms.wms_1_1_0.request.WMSGetFeatureInfoRequest1_1_0;
24
import org.gvsig.remoteclient.wms.wms_1_1_0.request.WMSGetLegendGraphicRequest1_1_0;
25
import org.gvsig.remoteclient.wms.wms_1_1_0.request.WMSGetMapRequest1_1_0;
26

    
27
/**
28
 * <p>
29
 * Describes the handler to comunicate to a WMS 1.1.0
30
 * </p>
31
 */
32
public class WMSProtocolHandler1_1_0 extends org.gvsig.remoteclient.wms.WMSProtocolHandler
33
{
34
        private WMSLayer1_1_0 fakeRootLayer;
35
    
36
        public WMSProtocolHandler1_1_0()
37
        {
38
                this.version = "1.1.0";
39
                this.name = "WMS1.1.0";
40
                this.serviceInfo = new WMSServiceInformation(); 
41
                this.layers = new TreeMap();
42
        }
43
    
44
//------------------------------------------------------------------------------
45
// Parsing methods....    
46
//------------------------------------------------------------------------------    
47

    
48

    
49
        public boolean parseCapabilities(File f)
50
    {       
51
            rootLayer = null;
52
            int tag;
53
            EncodingXMLParser kxmlParser = null;
54
            kxmlParser = new EncodingXMLParser();
55
            try
56
            {
57
                    kxmlParser.setInput(f);
58
                    kxmlParser.nextTag();
59
                    if ( kxmlParser.getEventType() != KXmlParser.END_DOCUMENT ) 
60
                    {                    
61
                            kxmlParser.require(KXmlParser.START_TAG, null, CapabilitiesTags.CAPABILITIES_ROOT1_1_1);                            
62
                            tag = kxmlParser.nextTag();
63
                                 while(tag != KXmlParser.END_DOCUMENT)
64
                                 {
65
                     switch(tag)
66
                                         {
67
                         
68
                                                case KXmlParser.START_TAG:
69
                                                        if (kxmlParser.getName().compareTo(CapabilitiesTags.SERVICE )==0)
70
                                                        {
71
                                                                parseServiceTag(kxmlParser);
72
                                                        }        
73
                                                        else if (kxmlParser.getName().compareTo(CapabilitiesTags.CAPABILITY)==0)
74
                                                        {
75
                                                                parseCapabilityTag(kxmlParser);
76
                                                        }
77
                                                        break;
78
                                                case KXmlParser.END_TAG:                                                        
79
                                                        break;
80
                                                case KXmlParser.TEXT:
81
                                                                                                
82
                                                break;
83
                                         }
84
                                     tag = kxmlParser.next();
85
                             }
86

    
87
                            kxmlParser.require(KXmlParser.END_DOCUMENT, null, null);
88
                    }
89
            }
90
            catch(XmlPullParserException parser_ex){
91
                    parser_ex.printStackTrace();
92
                    return false;
93
            }
94
                   catch (IOException ioe) {                        
95
                           ioe.printStackTrace();
96
                           return false;
97
                } finally {
98
            return true;
99
        }
100
    } 
101
    
102
    /**
103
     * <p>Parses the Service Information </p>
104
     */    
105
    private void parseServiceTag(KXmlParser parser) throws IOException, XmlPullParserException 
106
    {
107
            int currentTag;
108
            boolean end = false;
109
            
110
            parser.require(KXmlParser.START_TAG, null, CapabilitiesTags.SERVICE);
111
            currentTag = parser.next();
112
            
113
            while (!end) 
114
            {
115
                         switch(currentTag)
116
                         {
117
                                case KXmlParser.START_TAG:
118
                                        if (parser.getName().compareTo(CapabilitiesTags.NAME)==0)
119
                                        {
120
                                                serviceInfo.name = parser.nextText(); 
121
                                        }        
122
                                        else if (parser.getName().compareTo(CapabilitiesTags.TITLE)==0)
123
                                        {
124
                                                serviceInfo.title = parser.nextText(); 
125
                                        }
126
                                        else if (parser.getName().compareTo(CapabilitiesTags.ABSTRACT)==0)
127
                                        {
128
                                                serviceInfo.abstr = parser.nextText(); 
129
                                        }
130
                                        else if (parser.getName().compareTo(CapabilitiesTags.ONLINERESOURCE)==0)
131
                                        {
132
                                            String value = null;
133
                                        value = parser.getAttributeValue("", CapabilitiesTags.XLINK_HREF);
134
                                        if (value != null){
135
                                                serviceInfo.online_resource = value;
136
                                        }
137
                                        }                                        
138
                                        else if ((parser.getName().compareTo(CapabilitiesTags.KEYWORDLIST)==0) ||
139
                                                        (parser.getName().compareTo(CapabilitiesTags.CONTACTINFORMATION)==0))
140
                                        {
141
                                                parser.skipSubTree();
142
                                        }                                        
143
                                        break;
144
                                case KXmlParser.END_TAG:
145
                                        if (parser.getName().compareTo(CapabilitiesTags.SERVICE) == 0)
146
                                                end = true;
147
                                        break;
148
                                case KXmlParser.TEXT:                                        
149
                                break;
150
                         }
151
             if (!end)
152
                 currentTag = parser.next();
153
            }
154
            parser.require(KXmlParser.END_TAG, null, CapabilitiesTags.SERVICE);
155
    }
156
    
157
    /**
158
     * <p>Parses the Capability Tag </p>
159
     */    
160
    private void parseCapabilityTag(KXmlParser parser) throws IOException, XmlPullParserException
161
    {         
162
            int currentTag;
163
            boolean end = false;
164
            
165
            parser.require(KXmlParser.START_TAG, null, CapabilitiesTags.CAPABILITY);
166
            currentTag = parser.next();
167
            
168
            while (!end) 
169
            {
170
                         switch(currentTag)
171
                         {
172
                                case KXmlParser.START_TAG:
173
                                        if (parser.getName().compareTo(CapabilitiesTags.REQUEST)==0)
174
                                        {
175
                                                parseRequestTag(parser); 
176
                                        }        
177
                                        else if (parser.getName().compareTo(CapabilitiesTags.EXCEPTION)==0)
178
                                        {
179
                                                // TODO:
180
                                                // add the exception formats supported.
181
                                        }
182
                                        else if (parser.getName().compareTo(CapabilitiesTags.LAYER)==0)
183
                                        {
184
                                                WMSLayer1_1_0 lyr = new WMSLayer1_1_0();
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_0 aux = (WMSLayer1_1_0) 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
                                        }
202
                                        else if ((parser.getName().compareTo(CapabilitiesTags.VENDORSPECIFICCAPABILITIES)==0) ||
203
                                                        (parser.getName().compareTo(CapabilitiesTags.USERDEFINEDSYMBOLIZATION )==0))
204
                            
205
                                        {
206
                                                parser.skipSubTree();
207
                                        }                                        
208
                                        break;
209
                                case KXmlParser.END_TAG:
210
                                        if (parser.getName().compareTo(CapabilitiesTags.CAPABILITY) == 0)
211
                                                end = true;
212
                                        break;
213
                                case KXmlParser.TEXT:                                        
214
                                break;
215
                         }
216
                         if (!end)
217
                         currentTag = parser.next();
218
            }
219
            //parser.require(KXmlParser.END_TAG, null, CapabilitiesTags.CAPABILITY);            
220
    }   
221
    
222
    
223
    private WMSLayer1_1_0 getFakeRootLayer(){
224
        if (fakeRootLayer == null){
225
            fakeRootLayer = new WMSLayer1_1_0();
226
            fakeRootLayer.setTitle(serviceInfo.title);
227
            fakeRootLayer.setQueryable(false);
228
            fakeRootLayer.setName(null);
229
        }
230
        return fakeRootLayer;
231
    }
232
    
233
    /* (non-Javadoc)
234
     * @see org.gvsig.remoteClient.wms.WMSProtocolHandler#parseException(byte[])
235
     */
236
    protected String parseException(byte[] data) {
237
        ArrayList errors = new ArrayList();
238
        KXmlParser kxmlParser = new KXmlParser();
239
        
240
        try
241
        {
242
            kxmlParser.setInput(new ByteArrayInputStream(data), encoding);        
243
            kxmlParser.nextTag();
244
            int tag;
245
            if ( kxmlParser.getEventType() != KXmlParser.END_DOCUMENT ) 
246
            { 
247
                kxmlParser.require(KXmlParser.START_TAG, null, ExceptionTags.EXCEPTION_ROOT);             
248
                tag = kxmlParser.nextTag();
249
                 while(tag != KXmlParser.END_DOCUMENT)
250
                 {
251
                     switch(tag)
252
                     {
253
                        case KXmlParser.START_TAG:
254
                            if (kxmlParser.getName().compareTo(ExceptionTags.SERVICE_EXCEPTION)==0){
255
                                String errorCode = kxmlParser.getAttributeValue("", ExceptionTags.CODE);
256
                                errorCode = (errorCode != null) ? "["+errorCode+"] " : "";
257
                                String errorMessage = kxmlParser.nextText();
258
                                errors.add(errorCode+errorMessage);
259
                            }
260
                            break;
261
                        case KXmlParser.END_TAG:                            
262
                            break;
263
                        
264
                     }
265
                     tag = kxmlParser.nextTag();
266
                 }
267
                 //kxmlParser.require(KXmlParser.END_DOCUMENT, null, null);
268
            }
269
        }
270
        catch(XmlPullParserException parser_ex){
271
            System.out.println(parser_ex.getMessage());
272
            parser_ex.printStackTrace();
273
        }
274
        catch (IOException ioe) {           
275
            ioe.printStackTrace();            
276
        }
277
        String message = errors.size()>0? "" : null;
278
        for (int i = 0; i < errors.size(); i++) {
279
            message += (String) errors.get(i)+"\n";
280
        }
281
        return message;
282
    }
283

    
284
    /*
285
     * (non-Javadoc)
286
     * @see org.gvsig.remoteClient.wms.WMSProtocolHandler#createGetFeatureInfoRequest(org.gvsig.remoteClient.wms.WMSStatus, int, int)
287
     */
288
        protected WMSGetFeatureInfoRequest createGetFeatureInfoRequest(
289
                        WMSStatus status, int x, int y) {
290
                return new WMSGetFeatureInfoRequest1_1_0(status, this, x, y);
291
        }
292

    
293
        /*
294
         * (non-Javadoc)
295
         * @see org.gvsig.remoteClient.wms.WMSProtocolHandler#createGetMapRequest(org.gvsig.remoteClient.wms.WMSStatus)
296
         */
297
        protected WMSGetMapRequest createGetMapRequest(WMSStatus status) {
298
                return new WMSGetMapRequest1_1_0(status, this);
299
        }
300

    
301
        /*
302
         * (non-Javadoc)
303
         * @see org.gvsig.remoteClient.wms.WMSProtocolHandler#createGetLegendGraphicRequest(org.gvsig.remoteClient.wms.WMSStatus, java.lang.String)
304
         */
305
        protected WMSGetLegendGraphicRequest createGetLegendGraphicRequest(
306
                        WMSStatus status, String layerName) {
307
                return new WMSGetLegendGraphicRequest1_1_0(status, this, layerName);
308
        }
309

    
310
        /* (non-Javadoc)
311
         * @see org.gvsig.remoteclient.wms.WMSProtocolHandler#createGetCapabilitiesRequest(org.gvsig.remoteclient.wms.WMSStatus)
312
         */        
313
        protected WMSGetCapabilitiesRequest createGetCapabilitiesRequest(
314
                        WMSStatus status) {
315
                return new WMSGetCapabilitiesRequest1_1_0(status, this);
316
        }
317
    
318
  }