Revision 8692 org.gvsig.raster/branches/org.gvsig.raster.2.4/org.gvsig.wms/org.gvsig.wms.provider/src/main/java/org/gvsig/wms/provider/DefaultWMSLayerNode.java

View differences:

DefaultWMSLayerNode.java
22 22
 */
23 23
package org.gvsig.wms.provider;
24 24

  
25
import java.net.URL;
25 26
import java.util.ArrayList;
26 27
import java.util.Collections;
27 28
import java.util.Enumeration;
28 29
import java.util.Iterator;
29 30
import java.util.List;
31
import java.util.Vector;
30 32

  
31 33
import javax.swing.tree.TreeNode;
32 34

  
33 35
import org.apache.commons.lang3.StringUtils;
36
import org.cresques.cts.IProjection;
37
import org.slf4j.Logger;
38
import org.slf4j.LoggerFactory;
34 39

  
40
import org.gvsig.fmap.crs.CRSFactory;
35 41
import org.gvsig.fmap.dal.OpenDataStoreParameters;
42
import org.gvsig.remoteclient.wms.WMSClient;
36 43
import org.gvsig.remoteclient.wms.WMSLayer;
37 44
import org.gvsig.remoteclient.wms.WMSStyle;
45
import org.gvsig.tools.util.Invocable;
38 46

  
39 47

  
40 48
/**
......
43 51
 */
44 52
public class DefaultWMSLayerNode implements WMSLayerNode {
45 53

  
54
    private static final Logger logger =
55
        LoggerFactory.getLogger(DefaultWMSLayerNode.class);
56

  
46 57
    private TreeNode parent;
47
    private List<WMSLayerNode> children;
58
    private List<WMSLayerNode> children = null;
48 59
    private List<WMSStyleData> styles;
49 60
    private int selectedStyleIndex = -1;
50 61
    private String name;
51 62
    private String title;
63
    private WMSLayer sourceLayer;
64
    private WMSClient wmsClient;
65
    private URL service;
52 66

  
67
    private WMSRasterProviderParameters parameters;
68

  
53 69
    /**
54 70
     * @param layer
55 71
     * @param parent
72
     * @param wmsClient
73
     * @param service
56 74
     *
57 75
     */
58
    public DefaultWMSLayerNode(WMSLayer layer, TreeNode parent) {
59
        this.name = layer.getName();
60
        this.title = layer.getTitle();
76
    public DefaultWMSLayerNode(WMSLayer layer, TreeNode parent, WMSClient wmsClient, URL service) {
77
        this.sourceLayer = layer;
78
        this.wmsClient = wmsClient;
79
        this.service = service;
80
        this.name = this.sourceLayer.getName();
81
        this.title = this.sourceLayer.getTitle();
61 82
        this.parent = parent;
62 83
        setSelectedStyleIndex(-1);
63
        ArrayList<WMSStyle> layerStyles = layer.getStyles();
84
        ArrayList<WMSStyle> layerStyles = this.sourceLayer.getStyles();
64 85
        styles = new ArrayList<>(layerStyles.size());
65 86
        for (Iterator<WMSStyle> iterator = layerStyles.iterator(); iterator.hasNext();) {
66 87
            WMSStyle wmsStyle = iterator.next();
......
69 90
        if(layerStyles.size()>0){
70 91
            setSelectedStyleIndex(0);
71 92
        }
93
    }
72 94

  
73
        ArrayList<WMSLayer> layerChildren = layer.getChildren();
74
        children = new ArrayList<>(layerChildren.size());
75
        for (Iterator<WMSLayer> iterator = layerChildren.iterator(); iterator.hasNext();) {
76
            WMSLayer wmsLayer = iterator.next();
77
            children.add(new DefaultWMSLayerNode(wmsLayer, this));
95
    /**
96
     * @return the children
97
     */
98
    public List<WMSLayerNode> getChildren() {
99
        if (children == null) {
100
            ArrayList<WMSLayer> layerChildren = this.sourceLayer.getChildren();
101
            children = new ArrayList<>(layerChildren.size());
102
            for (Iterator<WMSLayer> iterator = layerChildren.iterator(); iterator.hasNext();) {
103
                WMSLayer wmsLayer = iterator.next();
104
                children.add(new DefaultWMSLayerNode(wmsLayer, this, wmsClient, service));
105
            }
78 106
        }
107
        return children;
79 108
    }
80 109

  
81 110
    @Override
82 111
    public TreeNode getChildAt(int childIndex) {
83
        return children.get(childIndex);
112
        return getChildren().get(childIndex);
84 113
    }
85 114

  
86 115
    @Override
87 116
    public int getChildCount() {
88
        return children.size();
117
        return getChildren().size();
89 118
    }
90 119

  
91 120
    @Override
......
95 124

  
96 125
    @Override
97 126
    public int getIndex(TreeNode node) {
98
        for(int i =0; i<children.size(); i++){
99
            if(children.get(i).equals(node)){
127
        for(int i =0; i<getChildren().size(); i++){
128
            if(getChildren().get(i).equals(node)){
100 129
                return i;
101 130
            }
102 131
        }
......
105 134

  
106 135
    @Override
107 136
    public boolean getAllowsChildren() {
108
        return (children.size() > 0);
137
        return (this.sourceLayer.getChildren().size() > 0);
109 138
    }
110 139

  
111 140
    @Override
112 141
    public boolean isLeaf() {
113
        return (children.size() == 0);
142
        return (this.sourceLayer.getChildren().size() == 0);
114 143
    }
115 144

  
116 145
    @Override
117 146
    public Enumeration children() {
118
        return Collections.enumeration(children);
147
        return Collections.enumeration(getChildren());
119 148
    }
120 149

  
121 150
    @Override
......
169 198

  
170 199
    @Override
171 200
    public OpenDataStoreParameters getParameters() {
201

  
202
        if (this.parameters == null) {
203
            this.parameters = new WMSRasterProviderParameters();
204
            this.parameters.setService(this.service);
205
            List<String> paramLayers = new ArrayList<String>();
206
            paramLayers.add(this.sourceLayer.getName());
207
            this.parameters.setLayers(paramLayers);
208

  
209
            @SuppressWarnings("unchecked")
210
            ArrayList<WMSStyle> styles = this.sourceLayer.getStyles();
211
            if (styles != null && styles.size() > 0) {
212
                List<String> paramStyles = new ArrayList<String>();
213
                paramStyles.add(((WMSStyle) (styles.get(0))).getName());
214
                this.parameters.setStyles(paramStyles);
215
            }
216

  
217
            @SuppressWarnings("unchecked")
218
            Vector<String> formats = wmsClient.getFormats();
219
            if (formats != null && formats.size() > 0) {
220
                this.parameters.setFormat((String) (formats.get(0)));
221
            }
222

  
223
            @SuppressWarnings("unchecked")
224
            Vector<String> infoFormats = wmsClient.getInfoFormats();
225
            if (infoFormats != null && infoFormats.size() > 0) {
226
                this.parameters.setInfoFormat((String) infoFormats.get(0));
227
            }
228

  
229
            @SuppressWarnings("unchecked")
230
            Vector<String> allSrs = this.sourceLayer.getAllSrs();
231
            if (allSrs != null && allSrs.size() > 0) {
232
                int i = 0;
233
                while (i < allSrs.size()) {
234
                    String srs = allSrs.get(i);
235
                    if (isValidSrs(srs)) {
236
                        this.parameters.setCRS(srs);
237
                        break;
238
                    }
239
                    i++;
240
                }
241
                if (i >= allSrs.size()) {
242
                    throw new IllegalArgumentException("The server '" + service.getHost()
243
                        + "' does not provide any valid srs.'");
244
                }
245
            }
246
        }
247
        return this.parameters;
248
    }
249

  
250
    private boolean isValidSrs(String srs){
251
        try{
252
            IProjection crs=CRSFactory.getCRS(srs);
253
            if(crs!=null){
254
                return true;
255
            }
256
        }catch(Exception e){
257
            logger.info("Can't get crs from: '"+srs+"' code", e);
258
            return false;
259
        }
260
        return false;
261
    }
262

  
263

  
264
    @Override
265
    public List<WMSRasterProviderParameters> getAllChildren() {
172 266
        // TODO Auto-generated method stub
173 267
        return null;
174 268
    }
175 269

  
270
    @Override
271
    public void removeEmptyFolders() {
272
        for(int i=getChildCount()-1; i>=0; i--){
273
            WMSLayerNode child = (WMSLayerNode) getChildAt(i);
274
            if(!child.isLeaf()) {
275
                child.removeEmptyFolders();
276
                if(child.getChildCount()==0){
277
                    removeChild(child);
278
                }
279
            }
280
        }
281
    }
176 282

  
283
    @Override
284
    public void removeChild(WMSLayerNode child) {
285
        getChildren().remove(child);
286
    }
287

  
288
    @Override
289
    public void removeChildren(Invocable filter) {
290
        for(int i=getChildCount()-1; i>=0; i--){
291
            WMSLayerNode child = (WMSLayerNode) getChildAt(i);
292
            if(child.isLeaf()){
293
                if ((Boolean)filter.call(child)){
294
                    removeChild(child);
295
                }
296
            } else {
297
                child.removeChildren(filter);
298
            }
299
        }
300
    }
301

  
302
    @Override
303
    public boolean equals(Object obj) {
304
        if(obj instanceof DefaultWMSLayerNode){
305
            DefaultWMSLayerNode other = ((DefaultWMSLayerNode)obj);
306
            return other.sourceLayer.equals(this.sourceLayer);
307
        }
308
        return false;
309
    }
310

  
311
    @Override
312
    public void setTitle(String title) {
313
        this.title = title;
314
    }
315

  
177 316
}

Also available in: Unified diff