Revision 3660

View differences:

trunk/libraries/libRemoteServices/src/org/gvsig/remoteClient/wms/WMSLayer.java
277 277
    }
278 278
    
279 279
    
280
    public void setParent(WMSLayer1_1_1 parent) {
280
    public void setParent(WMSLayer parent) {
281 281
        this.parent = parent;
282 282
    }
283 283
    
trunk/libraries/libRemoteServices/src/org/gvsig/remoteClient/wms/wms_1_3_0/WMSStyle1_3_0.java
1

  
2
package org.gvsig.remoteClient.wms.wms_1_3_0;
3

  
4
import java.io.IOException;
5

  
6
import org.gvsig.remoteClient.utils.CapabilitiesTags;
7
import org.kxml2.io.KXmlParser;
8
import org.xmlpull.v1.XmlPullParserException;
9

  
10
/**
11
 * <p>Represents the layer style defined by the OGC Specifications for WMS 1.3.0</p>
12
 * 
13
 */
14
public class WMSStyle1_3_0 extends org.gvsig.remoteClient.wms.WMSStyle {
15

  
16
/**
17
 * <p>URL pointing to the legend for a layer with this style</p>
18
 */
19
    private org.gvsig.remoteClient.wms.wms_1_3_0.WMSStyle1_3_0.LegendURL legendURL;
20

  
21
/**
22
 * <p>Parses the STYLE TAG according with the OGC Specifications for the WMS 1.3.0</p>
23
 */
24
    public void parse(KXmlParser parser) throws IOException, XmlPullParserException
25
    {        
26
    	int currentTag;
27
    	boolean end = false;
28
    	
29
    	parser.require(KXmlParser.START_TAG, null, CapabilitiesTags.STYLE);
30
    	currentTag = parser.nextTag();
31
    	
32
    	while (!end) 
33
    	{
34
			 switch(currentTag)
35
			 {
36
				case KXmlParser.START_TAG:
37
					if (parser.getName().compareTo(CapabilitiesTags.NAME)==0)
38
					{						
39
						setName(parser.nextText());						
40
					}	
41
					else if (parser.getName().compareTo(CapabilitiesTags.TITLE)==0)
42
					{
43
						setTitle(parser.nextText());
44
					}
45
					else if (parser.getName().compareTo(CapabilitiesTags.ABSTRACT)==0)
46
					{
47
						setAbstract(parser.nextText());
48
					}	
49
					else if (parser.getName().compareTo(CapabilitiesTags.LEGENDURL)==0)
50
					break;
51
				case KXmlParser.END_TAG:
52
					if (parser.getName().compareTo(CapabilitiesTags.STYLE) == 0)
53
						end = true;
54
					break;
55
				case KXmlParser.TEXT:					
56
					break;
57
			 }
58
			 if (!end)
59
			 {
60
				 currentTag = parser.next();
61
			 }
62
    	}
63
    	parser.require(KXmlParser.END_TAG, null, CapabilitiesTags.STYLE);
64
    } 
65
    
66
    
67
/**
68
 * <p>Inner class describing the Legend URL defined for styles in the OGC specifications in WMS 1.3.0</p>
69
 * 
70
 */
71
protected class LegendURL {
72

  
73
    private int width;
74
    private int height;
75
    private String format;
76
    private String onlineResource;
77
 }
78

  
79
 }
0 80

  
trunk/libraries/libRemoteServices/src/org/gvsig/remoteClient/wms/wms_1_3_0/WMSLayer1_3_0.java
1

  
2
package org.gvsig.remoteClient.wms.wms_1_3_0;
3

  
4
import java.io.IOException;
5
import java.util.ArrayList;
6
import java.util.TreeMap;
7

  
8
import org.gvsig.remoteClient.utils.BoundaryBox;
9
import org.gvsig.remoteClient.utils.CapabilitiesTags;
10
import org.gvsig.remoteClient.utils.Utilities;
11
import org.gvsig.remoteClient.wms.WMSDimension;
12
import org.kxml2.io.KXmlParser;
13
import org.xmlpull.v1.XmlPullParserException;
14

  
15

  
16
/**
17
 * <p>WMS Layer for WMS 1.3.0</p>
18
 * 
19
 */
20
public class WMSLayer1_3_0 extends org.gvsig.remoteClient.wms.WMSLayer {
21
    
22
    
23
    public WMSLayer1_3_0()
24
    {
25
        children = new ArrayList();
26
    }
27
    /**
28
     * <p>Parses the contents of the parser(WMSCapabilities)
29
     * to extract the information about an WMSLayer</p>
30
     * 
31
     */
32
    public void parse(KXmlParser parser, TreeMap layerTreeMap)
33
    throws IOException, XmlPullParserException
34
    {
35
        int currentTag;
36
        boolean end = false;
37
        String value;
38
        BoundaryBox bbox;
39
        parser.require(KXmlParser.START_TAG, null, CapabilitiesTags.LAYER);
40
        
41
        //First of all set whether the layer is Queryable reading the attribute.
42
        value = parser.getAttributeValue("", CapabilitiesTags.QUERYABLE);
43
        if (value != null)
44
        {
45
            if (value.compareTo("0")==0)
46
                setQueryable(false);
47
            else
48
                setQueryable(true);
49
        }
50
        
51
        currentTag = parser.nextTag();
52
        
53
        while (!end) 
54
        {
55
            switch(currentTag)
56
            {
57
                case KXmlParser.START_TAG:
58
                    if (parser.getName().compareTo(CapabilitiesTags.LAYER)==0)
59
                    {	
60
                        WMSLayer1_3_0 lyr = new WMSLayer1_3_0();						
61
                        //parser.next(); 
62
                        lyr.parse(parser, layerTreeMap);
63
                        lyr.setParent(this);
64
                        getChildren().add(lyr);
65
                        // Jaume
66
                        if (lyr.getName()!=null)
67
                            layerTreeMap.put(lyr.getName(), lyr);
68
                    }
69
                    else if (parser.getName().compareTo(CapabilitiesTags.ATTRIBUTION)==0){
70
                        // TODO comprobar que esto se necesite o se deseche
71
                        parser.skipSubTree();
72
                    }
73
                    else if (parser.getName().compareTo(CapabilitiesTags.NAME)==0)
74
                    {		
75
                        value = parser.nextText();
76
                        if (value != null) setName(value);						
77
                    }	
78
                    else if (parser.getName().compareTo(CapabilitiesTags.TITLE)==0)
79
                    {
80
                        value = parser.nextText();
81
                        if (value != null) setTitle(value);
82
                    }
83
                    else if (parser.getName().compareTo(CapabilitiesTags.ABSTRACT)==0)
84
                    {
85
                        value = parser.nextText();
86
                        if (value != null) setAbstract(value);
87
                    }
88
                    else if (parser.getName().compareTo(CapabilitiesTags.SRS)==0)
89
                    {
90
                        value = parser.nextText();
91
                        if (value != null){
92
                            String[] srs = value.split(" ");
93
                            for (int i = 0; i < srs.length; i++) {
94
                                addSrs(srs[i]);    
95
                            }
96
                            
97
                        }
98
                    }					
99
                    else if (parser.getName().compareTo(CapabilitiesTags.BOUNDINGBOX)==0)
100
                    {
101
                        bbox = new BoundaryBox();
102
                        value = parser.getAttributeValue("",CapabilitiesTags.SRS);
103
                        if (value != null)
104
                            bbox.setSrs(value);
105
                        value = parser.getAttributeValue("",CapabilitiesTags.MINX);
106
                        if ((value != null) && (Utilities.isNumber(value)))
107
                            bbox.setXmin(Double.parseDouble(value));	
108
                        value = parser.getAttributeValue("",CapabilitiesTags.MINY);
109
                        if ((value != null) && (Utilities.isNumber(value)))
110
                            bbox.setYmin(Double.parseDouble(value));	
111
                        value = parser.getAttributeValue("",CapabilitiesTags.MAXX);
112
                        if ((value != null) && (Utilities.isNumber(value)))
113
                            bbox.setXmax(Double.parseDouble(value));	
114
                        value = parser.getAttributeValue("",CapabilitiesTags.MAXY);
115
                        if ((value != null) && (Utilities.isNumber(value)))
116
                            bbox.setYmax(Double.parseDouble(value));	
117
                        addBBox(bbox);
118
                    }	
119
                    else if (parser.getName().compareTo(CapabilitiesTags.LATLONBOUNDINGBOX)==0)
120
                    {
121
                        bbox = new BoundaryBox();
122
                        bbox.setSrs("EPSG:4326");
123
                        value = parser.getAttributeValue("",CapabilitiesTags.MINX);
124
                        if ((value != null) && (Utilities.isNumber(value)))
125
                            bbox.setXmin(Double.parseDouble(value));	
126
                        value = parser.getAttributeValue("",CapabilitiesTags.MINY);
127
                        if ((value != null) && (Utilities.isNumber(value)))
128
                            bbox.setYmin(Double.parseDouble(value));	
129
                        value = parser.getAttributeValue("",CapabilitiesTags.MAXX);
130
                        if ((value != null) && (Utilities.isNumber(value)))
131
                            bbox.setXmax(Double.parseDouble(value));	
132
                        value = parser.getAttributeValue("",CapabilitiesTags.MAXY);
133
                        if ((value != null) && (Utilities.isNumber(value)))
134
                            bbox.setYmax(Double.parseDouble(value));	
135
                        addBBox(bbox);
136
                        setLatLonBox(bbox);
137
                    }						
138
                    else if (parser.getName().compareTo(CapabilitiesTags.SCALEHINT)==0)
139
                    {
140
                        value = parser.getAttributeValue("",CapabilitiesTags.MIN);
141
                        if ((value != null) && (Utilities.isNumber(value)))
142
                            setScaleMin(Double.parseDouble(value));
143
                        value = parser.getAttributeValue("",CapabilitiesTags.MAX);
144
                        if ((value != null) && (Utilities.isNumber(value)))
145
                            setScaleMax(Double.parseDouble(value));																	
146
                    }						
147
                    else if (parser.getName().compareTo(CapabilitiesTags.STYLE)==0)
148
                    {
149
                        WMSStyle1_3_0 style = new WMSStyle1_3_0();
150
                        style.parse(parser);
151
                        if ((style != null) && (style.getName() != null))
152
                        {
153
                            styles.add(style);
154
                        }
155
                    }
156
                    else if (parser.getName().compareTo(CapabilitiesTags.DIMENSION)==0)
157
                    {
158
                        WMSDimension dim = new WMSDimension();
159
                        dim.parse(parser);
160
                        if ((dim != null) && (dim.getName() != null))
161
                        {
162
                            addDimension(dim);
163
                        }
164
                    }
165
                    break;
166
                case KXmlParser.END_TAG:
167
                    if (parser.getName().compareTo(CapabilitiesTags.LAYER) == 0)
168
                        end = true;
169
                    break;
170
                case KXmlParser.TEXT:					
171
                    break;
172
            }
173
            //if (!end)
174
            //{
175
            currentTag = parser.next();
176
            //}
177
        }
178
        //parser.require(KXmlParser.END_TAG, null, CapabilitiesTags.LAYER);
179
    }      
180
    
181
    public String toString(){
182
        return super.toString();
183
    }
184
}
0 185

  
trunk/libraries/libRemoteServices/src/org/gvsig/remoteClient/wms/wms_1_3_0/WMSProtocolHandler1_3_0.java
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
//------------------------------------------------------------------------------
39
// Parsing methods....    
40
//------------------------------------------------------------------------------    
41
/**
42
 * <p>Parse the xml data retrieved from the WMS, it will parse the WMS Capabilities</p>
43
 * 
44
 */
45
    public void parse(File f)
46
    {       
47
    	FileReader reader = null;    	
48
    	try
49
    	{
50
    		reader = new FileReader(f);
51
    	}
52
    	catch(FileNotFoundException ex)	{
53
    		ex.printStackTrace();
54
    	}
55
    	
56
    	int tag;
57
    	KXmlParser kxmlParser = null;
58
    	kxmlParser = new KXmlParser();
59
    	try
60
    	{
61
    		kxmlParser.setInput(reader);		
62
			kxmlParser.nextTag();
63
    		if ( kxmlParser.getEventType() != KXmlParser.END_DOCUMENT ) 
64
    		{    		
65
    			kxmlParser.require(KXmlParser.START_TAG, null, CapabilitiesTags.CAPABILITIES_ROOT);    			
66
    			tag = kxmlParser.nextTag();
67
				 while(tag != KXmlParser.END_DOCUMENT)
68
				 {
69
                     switch(tag)
70
					 {
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
             if (!end)
154
                 currentTag = parser.next();
155
    	}
156
    	parser.require(KXmlParser.END_TAG, null, CapabilitiesTags.SERVICE);
157
    }
158
    /**
159
     * <p>Parses the Capability Tag </p>
160
     */    
161
    private void parseCapabilityTag(KXmlParser parser) throws IOException, XmlPullParserException
162
    { 	
163
    	int i;
164
    	int currentTag;
165
    	boolean end = false;
166
    	
167
    	parser.require(KXmlParser.START_TAG, null, CapabilitiesTags.CAPABILITY);
168
    	currentTag = parser.next();
169
    	
170
    	while (!end) 
171
    	{
172
			 switch(currentTag)
173
			 {
174
				case KXmlParser.START_TAG:
175
					if (parser.getName().compareTo(CapabilitiesTags.REQUEST)==0)
176
					{
177
						parseRequestTag(parser); 
178
					}	
179
					else if (parser.getName().compareTo(CapabilitiesTags.EXCEPTION)==0)
180
					{
181
						//Parse exception tags...
182
					}
183
					else if (parser.getName().compareTo(CapabilitiesTags.LAYER)==0)
184
					{
185
						WMSLayer1_3_0 lyr = new WMSLayer1_3_0();
186
                        if (rootLayer == null)
187
                            rootLayer = lyr;
188
                        else {
189
                            // Handles when there is no general root layer, will use
190
                            // a fake non-queryable one.
191
                            if (!rootLayer.equals(getFakeRootLayer())){
192
                                WMSLayer1_3_0 aux = (WMSLayer1_3_0) rootLayer;
193
                                rootLayer  = getFakeRootLayer();
194
                                rootLayer.getChildren().add(aux);
195
                            }
196
                            rootLayer.getChildren().add(lyr);
197
                        }
198
						lyr.parse(parser, layers);
199
						
200
                        if (lyr.getName()!=null)
201
						    layers.put(lyr.getName(), lyr); 							
202
						//Add all the SRS that the layer supports to the WMSProtocolHandler if they dont exist already
203
						for (i=0;i<lyr.getAllSrs().size();i++)
204
						{
205
						    if (!this.srs.contains(lyr.getAllSrs().elementAt(i)))
206
						    {
207
						        this.srs.add( lyr.getAllSrs().elementAt(i));
208
						    }
209
						}
210
						
211
					}
212
					else if ((parser.getName().compareTo(CapabilitiesTags.VENDORSPECIFICCAPABILITIES)==0) ||
213
							(parser.getName().compareTo(CapabilitiesTags.USERDEFINEDSYMBOLIZATION )==0))
214
                            
215
					{
216
						parser.skipSubTree();
217
					}					
218
					break;
219
				case KXmlParser.END_TAG:
220
					if (parser.getName().compareTo(CapabilitiesTags.CAPABILITY) == 0)
221
						end = true;
222
					break;
223
				case KXmlParser.TEXT:					
224
				break;
225
			 }
226
			 currentTag = parser.next();
227
    	}
228
    	//parser.require(KXmlParser.END_TAG, null, CapabilitiesTags.CAPABILITY);    	
229
    }
230
    
231
    /**
232
     * <p>Parses the Request tag </p>
233
     */ 
234
    private void parseRequestTag(KXmlParser parser) throws IOException, XmlPullParserException
235
    {	
236
    	int currentTag;
237
    	boolean end = false;
238
    	
239
    	parser.require(KXmlParser.START_TAG, null, CapabilitiesTags.REQUEST);
240
    	currentTag = parser.next();
241
    	
242
    	while (!end) 
243
    	{
244
			 switch(currentTag)
245
			 {
246
				case KXmlParser.START_TAG:
247
					if (parser.getName().compareTo(CapabilitiesTags.GETCAPABILITIES)==0)
248
					{
249
					}	
250
					else if (parser.getName().compareTo(CapabilitiesTags.GETMAP)==0)
251
					{
252
						currentTag = parser.nextTag();
253
						parser.require(KXmlParser.START_TAG, null, CapabilitiesTags.FORMAT);  
254
						while ((currentTag == KXmlParser.START_TAG) &&
255
								(parser.getName().compareTo(CapabilitiesTags.FORMAT)==0))
256
						{
257
							parser.require(KXmlParser.START_TAG, null, CapabilitiesTags.FORMAT);
258
							serviceInfo.formats.add(parser.nextText());
259
							parser.nextTag();
260
						}																				
261
					}
262
					else if (parser.getName().compareTo(CapabilitiesTags.GETFEATUREINFO)==0)
263
					{
264
					}				
265
					break;
266
				case KXmlParser.END_TAG:
267
					if (parser.getName().compareTo(CapabilitiesTags.REQUEST) == 0)
268
						end = true;
269
					break;
270
				case KXmlParser.TEXT:					
271
				break;
272
			 }
273
			 currentTag = parser.next();
274
    	}
275
    	// TODO: does not get such a tag when arrives here!!!!!!
276
    	//parser.require(KXmlParser.END_TAG, null, CapabilitiesTags.REQUEST);    	
277
    }
278

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

  

Also available in: Unified diff