Statistics
| Revision:

svn-gvsig-desktop / trunk / libraries / libRemoteServices / src / org / gvsig / remoteClient / wms / wms_1_1_0 / WMSLayer1_1_0.java @ 34406

History | View | Annotate | Download (10.7 KB)

1

    
2
package org.gvsig.remoteClient.wms.wms_1_1_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.gvsig.remoteClient.wms.WMSExtent;
13
import org.kxml2.io.KXmlParser;
14
import org.xmlpull.v1.XmlPullParserException;
15

    
16

    
17
/**
18
 * <p>WMS Layer for WMS 1.1.0</p>
19
 * 
20
 */
21
public class WMSLayer1_1_0 extends org.gvsig.remoteClient.wms.WMSLayer {
22
    
23
    /**
24
     * <p>Extents defined for the layer in the capabilities doc</p>
25
     */
26
    private java.util.ArrayList extents = new ArrayList();
27
    
28
    /**
29
     * <p> gets the extent vector defined in this layer</p>
30
     * @return 
31
     */
32
    public ArrayList getExtents() {        
33
        return extents;
34
    } 
35
    
36
    public WMSExtent getExtent(String name)
37
    {
38
            for(int i = 0; i < extents.size(); i++ ){
39
                    if(((WMSExtent)extents.get(i)).getName().compareTo(name)==0)
40
                    {
41
                            return (WMSExtent)extents.get(i);
42
                    }
43
            }
44
            return null;
45
    }
46
    
47
    /**
48
     * <p>Adds an extent to the extent vector </p>
49
     * @param extent 
50
     */
51
    public void addExtent(org.gvsig.remoteClient.wms.WMSExtent extent) {        
52
        extents.add(extent);
53
    }   
54
    
55
    public ArrayList getDimensions()
56
    {   
57
        WMSDimension dimension;
58
        WMSExtent extent;
59
            for(int i = 0; i < dimensions.size(); i++)
60
            {
61
                    dimension = (WMSDimension)dimensions.get(i);
62
                    extent = getExtent(dimension.getName()); 
63
                    if(extent != null)
64
                    {                            
65
                            ((WMSDimension)dimensions.get(i)).setDimensionExpression( extent.getExtentExpression());                            
66
                    }
67
            }            
68
            
69
        WMSDimension pDimension;
70
        WMSDimension myDimension;    
71
        ArrayList myDimensions = (ArrayList) this.dimensions.clone();        
72
        ArrayList pDimensions;        
73
        if (parent!=null)
74
        {
75
                pDimensions = parent.getDimensions();
76
                for (int i= 0; i < pDimensions.size(); i++){
77
                        pDimension = (WMSDimension)pDimensions.get(i);
78
                        myDimension = getDimension(pDimension.getName());
79
                        if (myDimension != null){
80
                                pDimensions.remove(pDimension);
81
                        }
82
                }
83
                myDimensions.addAll(pDimensions);
84
        }
85
        return myDimensions;
86
    }
87
    
88
    public WMSLayer1_1_0()
89
    {
90
        children = new ArrayList();
91
    }
92
    /**
93
     * <p>Parses the contents of the parser(WMSCapabilities)
94
     * to extract the information about an WMSLayer</p>
95
     * 
96
     */
97
    public void parse(KXmlParser parser, TreeMap layerTreeMap)
98
    throws IOException, XmlPullParserException
99
    {
100
        int currentTag;
101
        boolean end = false;
102
        String value;
103
        BoundaryBox bbox;
104
        parser.require(KXmlParser.START_TAG, null, CapabilitiesTags.LAYER);
105
        
106
        //First of all set whether the layer is Queryable reading the attribute.
107
        value = parser.getAttributeValue("", CapabilitiesTags.QUERYABLE);
108
        if (value != null)
109
        {
110
            if (value.compareTo("0")==0)
111
                setQueryable(false);
112
            else
113
                setQueryable(true);
114
        }
115
        
116
        currentTag = parser.nextTag();
117
        
118
        while (!end) 
119
        {
120
            switch(currentTag)
121
            {
122
                case KXmlParser.START_TAG:
123
                    if (parser.getName().compareTo(CapabilitiesTags.LAYER)==0)
124
                    {        
125
                        WMSLayer1_1_0 lyr = new WMSLayer1_1_0();                                                
126
                        //parser.next(); 
127
                        lyr.parse(parser, layerTreeMap);
128
                        lyr.setParent(this);
129
                        this.children.add(lyr);
130
                        // Jaume
131
                        if (lyr.getName()!=null)
132
                            layerTreeMap.put(lyr.getName(), lyr);
133
                    }
134
                    else if (parser.getName().compareTo(CapabilitiesTags.ATTRIBUTION)==0){
135
                        // TODO comprobar que esto se necesite o se deseche
136
                        parser.skipSubTree();
137
                    }
138
                    else if (parser.getName().compareTo(CapabilitiesTags.NAME)==0)
139
                    {                
140
                        value = parser.nextText();
141
                        if (value != null) setName(value);                                                
142
                    }        
143
                    else if (parser.getName().compareTo(CapabilitiesTags.TITLE)==0)
144
                    {
145
                        value = parser.nextText();
146
                        if (value != null) setTitle(value);
147
                    }
148
                    else if (parser.getName().compareTo(CapabilitiesTags.ABSTRACT)==0)
149
                    {
150
                        value = parser.nextText();
151
                        if (value != null) setAbstract(value);
152
                    }
153
                    else if (parser.getName().compareTo(CapabilitiesTags.SRS)==0)
154
                    {
155
                        value = parser.nextText();
156
                        if (value != null){
157
                            String[] mySRSs = value.split(" ");
158
                            for (int i = 0; i < mySRSs.length; i++) {
159
                                addSrs(mySRSs[i]);    
160
                            }
161
                            
162
                        }
163
                    }                                        
164
                    else if (parser.getName().compareTo(CapabilitiesTags.BOUNDINGBOX)==0)
165
                    {
166
                        bbox = new BoundaryBox();
167
                        value = parser.getAttributeValue("",CapabilitiesTags.SRS);
168
                        if (value != null)
169
                            bbox.setSrs(value);
170
                        value = parser.getAttributeValue("",CapabilitiesTags.MINX);
171
                        if ((value != null) && (Utilities.isNumber(value)))
172
                            bbox.setXmin(Double.parseDouble(value));        
173
                        value = parser.getAttributeValue("",CapabilitiesTags.MINY);
174
                        if ((value != null) && (Utilities.isNumber(value)))
175
                            bbox.setYmin(Double.parseDouble(value));        
176
                        value = parser.getAttributeValue("",CapabilitiesTags.MAXX);
177
                        if ((value != null) && (Utilities.isNumber(value)))
178
                            bbox.setXmax(Double.parseDouble(value));        
179
                        value = parser.getAttributeValue("",CapabilitiesTags.MAXY);
180
                        if ((value != null) && (Utilities.isNumber(value)))
181
                            bbox.setYmax(Double.parseDouble(value));        
182
                        addBBox(bbox);
183
                        addSrs(bbox.getSrs());
184
                    }        
185
                    else if (parser.getName().compareTo(CapabilitiesTags.LATLONBOUNDINGBOX)==0)
186
                    {
187
                        bbox = new BoundaryBox();
188
                        bbox.setSrs(CapabilitiesTags.EPSG_4326);
189
                        value = parser.getAttributeValue("",CapabilitiesTags.MINX);
190
                        if ((value != null) && (Utilities.isNumber(value)))
191
                            bbox.setXmin(Double.parseDouble(value));        
192
                        value = parser.getAttributeValue("",CapabilitiesTags.MINY);
193
                        if ((value != null) && (Utilities.isNumber(value)))
194
                            bbox.setYmin(Double.parseDouble(value));        
195
                        value = parser.getAttributeValue("",CapabilitiesTags.MAXX);
196
                        if ((value != null) && (Utilities.isNumber(value)))
197
                            bbox.setXmax(Double.parseDouble(value));        
198
                        value = parser.getAttributeValue("",CapabilitiesTags.MAXY);
199
                        if ((value != null) && (Utilities.isNumber(value)))
200
                            bbox.setYmax(Double.parseDouble(value));        
201
                        addBBox(bbox);
202
                        setLatLonBox(bbox);
203
                        addSrs(bbox.getSrs());
204
                    }
205
                    // don't use the scalehint param to set scaleMin and scaleMax, because
206
                    // - its semantincs is different to MinScaleDenominator and MaxScaleDenominator (wms 1.3.0)
207
                    // - they are quite useless as they are defined in wms 1.1.1
208
                    // - they break the usage of scaleMin and scaleMax
209
//                    else if (parser.getName().compareTo(CapabilitiesTags.SCALEHINT)==0)
210
//                    {
211
//                        value = parser.getAttributeValue("",CapabilitiesTags.MIN);
212
//                        if ((value != null) && (Utilities.isNumber(value)))
213
//                            setScaleMin(Double.parseDouble(value));
214
//                        value = parser.getAttributeValue("",CapabilitiesTags.MAX);
215
//                        if ((value != null) && (Utilities.isNumber(value)))
216
//                            setScaleMax(Double.parseDouble(value));                                                                                                                                        
217
//                    }                                                
218
                    else if (parser.getName().compareTo(CapabilitiesTags.STYLE)==0)
219
                    {
220
                        WMSStyle1_1_0 style = new WMSStyle1_1_0();
221
                        style.parse(parser);
222
                        if ((style != null) && (style.getName() != null))
223
                        {
224
                            styles.add(style);
225
                        }
226
                    }
227
                    else if (parser.getName().compareTo(CapabilitiesTags.DIMENSION)==0)
228
                    {
229
                        WMSDimension dim = new WMSDimension();
230
                        dim.parse(parser);
231
                        if ((dim != null) && (dim.getName() != null))
232
                        {
233
                            addDimension(dim);
234
                        }
235
                    }
236
                    else if (parser.getName().compareTo(CapabilitiesTags.EXTENT)==0)
237
                    {                            
238
                        WMSExtent extent = new WMSExtent();
239
                        extent.parse(parser);
240
                        if ((extent != null) && (extent.getName() != null))
241
                        {
242
                            addExtent(extent);
243
                            
244
                        }
245
                    }                      
246
                    break;
247
                case KXmlParser.END_TAG:
248
                    if (parser.getName().compareTo(CapabilitiesTags.LAYER) == 0)
249
                        end = true;
250
                    break;
251
                case KXmlParser.TEXT:                                        
252
                    break;
253
            }
254
            if (!end)
255
                    currentTag = parser.next();
256
        }
257
        parser.require(KXmlParser.END_TAG, null, CapabilitiesTags.LAYER);
258
    }      
259
    
260
    public String toString(){
261
        return super.toString();
262
    }
263
}