Statistics
| Revision:

root / branches / v2_0_0_prep / libraries / libRemoteServices / src / org / gvsig / remoteclient / wms / wms_1_3_0 / WMSProtocolHandler1_3_0.java @ 33738

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.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_3_0.request.WMSGetCapabilitiesRequest1_3_0;
23
import org.gvsig.remoteclient.wms.wms_1_3_0.request.WMSGetFeatureInfoRequest1_1_3;
24
import org.gvsig.remoteclient.wms.wms_1_3_0.request.WMSGetLegendGraphicRequest1_1_3;
25
import org.gvsig.remoteclient.wms.wms_1_3_0.request.WMSGetMapRequest1_1_3;
26

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

    
47
    public boolean parseCapabilities(File f)
48
    {   
49
            rootLayer = null;
50
            
51
            int tag;
52
              EncodingXMLParser kxmlParser = null;
53
            kxmlParser = new EncodingXMLParser();
54
            try
55
            {
56
                       kxmlParser.setInput(f);
57
                        kxmlParser.nextTag();
58
                    if ( kxmlParser.getEventType() != KXmlParser.END_DOCUMENT ) 
59
                    {                    
60
                            kxmlParser.require(KXmlParser.START_TAG, null, CapabilitiesTags.CAPABILITIES_ROOT1_3_0);                            
61
                            tag = kxmlParser.nextTag();
62
                                 while(tag != KXmlParser.END_DOCUMENT)
63
                                 {
64
                     switch(tag)
65
                                         {                       
66
                                                case KXmlParser.START_TAG:
67
                                                        if (kxmlParser.getName().compareTo(CapabilitiesTags.SERVICE )==0)
68
                                                        {
69
                                                                parseServiceTag(kxmlParser);
70
                                                        }        
71
                                                        else if (kxmlParser.getName().compareTo(CapabilitiesTags.CAPABILITY)==0)
72
                                                        {
73
                                                                parseCapabilityTag(kxmlParser);
74
                                                        }
75
                                                        break;
76
                                                case KXmlParser.END_TAG:                                                        
77
                                                        break;
78
                                                case KXmlParser.TEXT:
79
                                                        //System.out.println("[TEXT]["+kxmlParser.getText()+"]");                                                        
80
                                                break;
81
                                         }
82
                                     tag = kxmlParser.next();
83
                             }//while !END_DOCUMENT
84
                    }
85
            }
86
            catch(XmlPullParserException parser_ex){                    
87
                    parser_ex.printStackTrace();
88
                    return false;
89
            }
90
                   catch (IOException ioe) {                        
91
                           ioe.printStackTrace();
92
                           return false;
93
                 } finally {
94
            return true;
95
        }
96
                   // In the parsing process the layer has been filled                  
97
    } 
98
    
99
    /**
100
     * <p>Parses the Service Information </p>
101
     */    
102
    private void parseServiceTag(KXmlParser parser) throws IOException, XmlPullParserException 
103
    {
104
            int currentTag;
105
            boolean end = false;
106
            
107
            parser.require(KXmlParser.START_TAG, null, CapabilitiesTags.SERVICE);
108
            currentTag = parser.next();
109
            
110
            while (!end) 
111
            {
112
                         switch(currentTag)
113
                         {
114
                                case KXmlParser.START_TAG:
115
                                        if (parser.getName().compareTo(CapabilitiesTags.NAME)==0)
116
                                        {
117
                                                serviceInfo.name = parser.nextText(); 
118
                                        }        
119
                                        else if (parser.getName().compareTo(CapabilitiesTags.TITLE)==0)
120
                                        {
121
                                                serviceInfo.title = parser.nextText(); 
122
                                        }
123
                                        else if (parser.getName().compareTo(CapabilitiesTags.ABSTRACT)==0)
124
                                        {
125
                                                serviceInfo.abstr = parser.nextText(); 
126
                                        }
127
                                        else if (parser.getName().compareTo(CapabilitiesTags.ONLINERESOURCE)==0)
128
                                        {
129
                                            String value = new String();
130
                                        value = parser.getAttributeValue("", CapabilitiesTags.XLINK_HREF);
131
                                        if (value != null){
132
                                                serviceInfo.online_resource = value;
133
                                        }
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
             if (!end)
149
                 currentTag = parser.next();
150
            }
151
            parser.require(KXmlParser.END_TAG, null, CapabilitiesTags.SERVICE);
152
    }
153
    
154
    /**
155
     * <p>Parses the Capability Tag </p>
156
     */    
157
    private void parseCapabilityTag(KXmlParser parser) throws IOException, XmlPullParserException
158
    {         
159
            int currentTag;
160
            boolean end = false;
161
            
162
            parser.require(KXmlParser.START_TAG, null, CapabilitiesTags.CAPABILITY);
163
            currentTag = parser.next();
164
            
165
            while (!end) 
166
            {
167
                         switch(currentTag)
168
                         {
169
                                case KXmlParser.START_TAG:
170
                                        if (parser.getName().compareTo(CapabilitiesTags.REQUEST)==0)
171
                                        {
172
                                                parseRequestTag(parser); 
173
                                        }        
174
                                        else if (parser.getName().compareTo(CapabilitiesTags.EXCEPTION)==0)
175
                                        {
176
                                                //TODO:
177
                                                //Add to serviceInformation the supported exception formats.
178
                                        }
179
                                        else if (parser.getName().compareTo(CapabilitiesTags.LAYER)==0)
180
                                        {
181
                                                WMSLayer1_3_0 lyr = new WMSLayer1_3_0();
182
                        if (rootLayer == null)
183
                            rootLayer = lyr;
184
                        else {
185
                            // Handles when there is no general root layer, will use
186
                            // a fake non-queryable one.
187
                            if (!rootLayer.equals(getFakeRootLayer())){
188
                                WMSLayer1_3_0 aux = (WMSLayer1_3_0) rootLayer;
189
                                rootLayer  = getFakeRootLayer();
190
                                rootLayer.getChildren().add(aux);
191
                            }
192
                            rootLayer.getChildren().add(lyr);
193
                        }
194
                                                lyr.parse(parser, layers);
195
                                                
196
                        if (lyr.getName()!=null)
197
                                                    layers.put(lyr.getName(), lyr);                                                                                         
198
                                        }
199
                                        else if ((parser.getName().compareTo(CapabilitiesTags.VENDORSPECIFICCAPABILITIES)==0) ||
200
                                                        (parser.getName().compareTo(CapabilitiesTags.USERDEFINEDSYMBOLIZATION )==0))                            
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
                         if (!end)
213
                                 currentTag = parser.next();
214
            }
215
            //parser.require(KXmlParser.END_TAG, null, CapabilitiesTags.CAPABILITY);            
216
    }  
217
    
218
    private WMSLayer1_3_0 getFakeRootLayer(){
219
        if (fakeRootLayer == null){
220
            fakeRootLayer = new WMSLayer1_3_0();
221
            fakeRootLayer.setTitle(serviceInfo.title);
222
            fakeRootLayer.setQueryable(false);
223
            fakeRootLayer.setName(null);
224
        }
225
        return fakeRootLayer;
226
    }
227
    /* (non-Javadoc)
228
     * @see org.gvsig.remoteClient.wms.WMSProtocolHandler#parseException(byte[])
229
     */
230
    protected String parseException(byte[] data) {
231
        ArrayList errors = new ArrayList();
232
        KXmlParser kxmlParser = new KXmlParser();
233
        try
234
        {
235
            kxmlParser.setInput(new ByteArrayInputStream(data), encoding);        
236
            kxmlParser.nextTag();
237
            int tag;
238
            if ( kxmlParser.getEventType() != KXmlParser.END_DOCUMENT ) 
239
            { 
240
                kxmlParser.require(KXmlParser.START_TAG, null, ExceptionTags.EXCEPTION_ROOT);             
241
                tag = kxmlParser.nextTag();
242
                 while(tag != KXmlParser.END_DOCUMENT)
243
                 {
244
                     switch(tag)
245
                     {
246
                        case KXmlParser.START_TAG:
247
                            if (kxmlParser.getName().compareTo(ExceptionTags.SERVICE_EXCEPTION)==0){
248
                                String errorCode = kxmlParser.getAttributeValue("", ExceptionTags.CODE);
249
                                errorCode = (errorCode != null) ? "["+errorCode+"] " : "";
250
                                String errorMessage = kxmlParser.nextText();
251
                                errors.add(errorCode+errorMessage);
252
                            }
253
                            break;
254
                        case KXmlParser.END_TAG:                            
255
                            break;
256
                        
257
                     }
258
                     tag = kxmlParser.nextTag();
259
                 }
260
                 //kxmlParser.require(KXmlParser.END_DOCUMENT, null, null);
261
            }
262
        }
263
        catch(XmlPullParserException parser_ex){
264
            System.out.println(parser_ex.getMessage());
265
            parser_ex.printStackTrace();
266
        }
267
        catch (IOException ioe) {           
268
            ioe.printStackTrace();            
269
        }
270
        String message = errors.size()>0? "" : null;
271
        for (int i = 0; i < errors.size(); i++) {
272
            message += (String) errors.get(i)+"\n";
273
        }
274
        return message;
275
    }   
276
    
277
    /*
278
     * (non-Javadoc)
279
     * @see org.gvsig.remoteClient.wms.WMSProtocolHandler#createGetFeatureInfoRequest(org.gvsig.remoteClient.wms.WMSStatus, int, int)
280
     */
281
        protected WMSGetFeatureInfoRequest createGetFeatureInfoRequest(
282
                        WMSStatus status, int x, int y) {
283
                return new WMSGetFeatureInfoRequest1_1_3(status, this, x, y);
284
        }
285

    
286
        /*
287
         * (non-Javadoc)
288
         * @see org.gvsig.remoteClient.wms.WMSProtocolHandler#createGetMapRequest(org.gvsig.remoteClient.wms.WMSStatus)
289
         */
290
        protected WMSGetMapRequest createGetMapRequest(WMSStatus status) {
291
                return new WMSGetMapRequest1_1_3(status, this);
292
        }
293

    
294
        /*
295
         * (non-Javadoc)
296
         * @see org.gvsig.remoteClient.wms.WMSProtocolHandler#createGetLegendGraphicRequest(org.gvsig.remoteClient.wms.WMSStatus, java.lang.String)
297
         */
298
        protected WMSGetLegendGraphicRequest createGetLegendGraphicRequest(
299
                        WMSStatus status, String layerName) {
300
                return new WMSGetLegendGraphicRequest1_1_3(status, this, layerName);
301
        }
302
        
303

    
304
        /* (non-Javadoc)
305
         * @see org.gvsig.remoteclient.wms.WMSProtocolHandler#createGetCapabilitiesRequest(org.gvsig.remoteclient.wms.WMSStatus)
306
         */        
307
        protected WMSGetCapabilitiesRequest createGetCapabilitiesRequest(
308
                        WMSStatus status) {
309
                return new WMSGetCapabilitiesRequest1_3_0(status, this);
310
        }
311
  }