Statistics
| Revision:

gvsig-raster / org.gvsig.raster.wms / branches / org.gvsig.raster.wms_dataaccess_refactoring / org.gvsig.raster.wms.io / src / main / java / org / gvsig / raster / wms / io / WMSLayerNode.java @ 2378

History | View | Annotate | Download (12.8 KB)

1
/* gvSIG. Geographic Information System of the Valencian Government
2
 *
3
 * Copyright (C) 2007-2008 Infrastructures and Transports Department
4
 * of the Valencian Government (CIT)
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 2
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 */
22
package org.gvsig.raster.wms.io;
23

    
24
import java.awt.Dimension;
25
import java.util.ArrayList;
26
import java.util.List;
27

    
28
import org.gvsig.raster.wms.io.time.DefaultDimension;
29
import org.gvsig.raster.wms.io.time.RemoteTimeDimension;
30
import org.gvsig.raster.wms.io.time.TimeDimension;
31
import org.gvsig.tools.ToolsLocator;
32
import org.gvsig.tools.dynobject.DynStruct;
33
import org.gvsig.tools.persistence.PersistenceManager;
34
import org.gvsig.tools.persistence.Persistent;
35
import org.gvsig.tools.persistence.PersistentState;
36
import org.gvsig.tools.persistence.exception.PersistenceException;
37

    
38
/**
39
 * Class defining the node of the layer tree of a common WMS service.
40
 * @author jaume
41
 */
42
@SuppressWarnings("unchecked")
43
public class WMSLayerNode implements Persistent {
44
    private String                         _name              = null;
45
    private String                         _title             = null;
46
        private List<String>                   srs                = null;
47
    private boolean                        queryable;
48
    private boolean                        transparency;
49
    private String                         lAbstract          = null;
50
    private String                         latLonBox          = null;
51
    private int                            selectedStyleIndex = 0;
52
    private List<RemoteWMSStyle>           styles             = new ArrayList<RemoteWMSStyle>();
53
    private List<RemoteTimeDimension>      dimensions         = null;
54
    private List<String>                   keywords           = null;
55
    private List<WMSLayerNode>             children           = new ArrayList<WMSLayerNode>();
56
    private WMSLayerNode                   _parent            = null;
57
        private Dimension                      fixedSize          = null;
58
        
59
        public void loadFromState(PersistentState state) throws PersistenceException {
60
                this._name = state.getString("_name");
61
                this._title = state.getString("_title");
62
                this.srs = state.getList("srs");
63
                this.queryable = state.getBoolean("queryable");
64
                this.transparency = state.getBoolean("transparency");
65
                this.lAbstract = state.getString("lAbstract");
66
                this.latLonBox = state.getString("latLonBox");
67
                this.selectedStyleIndex = state.getInt("selectedStyleIndex");
68
                this.styles = state.getList("styles");
69
                this.dimensions = state.getList("dimensions");
70
                this.keywords = state.getList("keywords");
71
                this.children = state.getList("children");
72
                this._parent = (WMSLayerNode)state.get("_parent");
73
                this.fixedSize = (Dimension)state.get("fixedSize");
74
        }
75
        
76
        public void saveToState(PersistentState state) throws PersistenceException {
77
                state.set("_name", _name);
78
                state.set("_title", _title);
79
                state.set("srs", srs);
80
                state.set("queryable", queryable);
81
                state.set("transparency", transparency);
82
                state.set("lAbstract", lAbstract);
83
                state.set("latLonBox", latLonBox);
84
                state.set("selectedStyleIndex", selectedStyleIndex);
85
                state.set("styles", styles);
86
                state.set("dimensions", dimensions);
87
                state.set("keywords", keywords);
88
                state.set("children", children);
89
                state.set("_parent", _parent);
90
                state.set("fixedSize", fixedSize);
91
        }        
92
    
93
    public static void registerPersistent() {
94
                PersistenceManager manager = ToolsLocator.getPersistenceManager();
95
                DynStruct definition = manager.getDefinition("WMSLayerNode_Persistent");
96
                if( definition == null ) {
97
                        definition = manager.addDefinition(
98
                                        WMSLayerNode.class,
99
                                        "WMSLayerNode_Persistent",
100
                                        "WMSLayerNode Persistence",
101
                                        null, 
102
                                        null
103
                        );
104
                }
105

    
106
                definition.addDynFieldString("_name").setMandatory(false);
107
                definition.addDynFieldString("_title").setMandatory(false);
108
                definition.addDynFieldList("srs").setClassOfItems(String.class).setMandatory(false);
109
                definition.addDynFieldBoolean("queryable").setMandatory(false);
110
                definition.addDynFieldBoolean("transparency").setMandatory(false);
111
                definition.addDynFieldString("lAbstract").setMandatory(false);
112
                definition.addDynFieldString("latLonBox").setMandatory(false);                
113
                definition.addDynFieldInt("selectedStyleIndex").setMandatory(false);
114
                definition.addDynFieldList("styles").setClassOfItems(RemoteWMSStyle.class).setMandatory(false);
115
                definition.addDynFieldList("dimensions").setClassOfItems(RemoteTimeDimension.class).setMandatory(false);
116
                definition.addDynFieldList("keywords").setClassOfItems(String.class).setMandatory(false);
117
                definition.addDynFieldList("children").setClassOfItems(WMSLayerNode.class).setMandatory(false);
118
                definition.addDynFieldObject("_parent").setClassOfValue(WMSLayerNode.class).setMandatory(false);
119
                definition.addDynFieldObject("fixedSize").setClassOfValue(Dimension.class).setMandatory(false);
120
        }
121

    
122
        /**
123
     * @return Returns the name.
124
     */
125
    public String getName() {
126
        return _name;
127
    }
128

    
129
    public List<WMSLayerNode> getChildren() {
130
        return children;
131
    }
132

    
133
    /**
134
     * @param name The name to set.
135
     */
136
    public void setName(String name) {
137
        this._name = name;
138
    }
139

    
140
    /**
141
     * @return Returns the namedStyles.
142
     */
143
    public List<RemoteWMSStyle> getStyles() {
144
        return styles;
145
    }
146

    
147
    public List<String> getKeywords() {
148
            return keywords;
149
    }
150
   
151
    /**
152
     * @return Returns the queryable.
153
     */
154
    public boolean isQueryable() {
155
        return queryable;
156
    }
157

    
158
    /**
159
     * @param queryable The queryable to set.
160
     */
161
    public void setQueryable(boolean queryable) {
162
        this.queryable = queryable;
163
    }
164
    
165
    /**
166
     * @return Returns the srs.
167
     */
168
    public List<String> getAllSrs() {
169
        if ((srs.size() == 0) && _parent!=null)
170
            return _parent.getAllSrs();
171
        return srs;
172
    }
173

    
174
    /**
175
     * @param srs The srs to set.
176
     */
177
    public void setSrs(List<String> srs) {
178
        this.srs = srs;
179
    }
180

    
181
    /**
182
     * @return Returns the title.
183
     */
184
    public String getTitle() {
185
        return _title;
186
    }
187

    
188
    public void setTitle(String title) {
189
        this._title = title.trim();
190
    }
191

    
192
    /**
193
     * @return Returns the transparency.
194
     */
195
    public boolean isTransparent() {
196
        return transparency;
197
    }
198

    
199
    /**
200
     * @param transparency The transparency to set.
201
     */
202
    public void setTransparency(boolean transparency) {
203
        this.transparency = transparency;
204
    }
205

    
206
    /**
207
     * Sets the list of sons of this layer.
208
     * @param children
209
     */
210
    public void setChildren(List<WMSLayerNode> children) {
211
        this.children = children;
212
    }
213

    
214
    public WMSLayerNode getParent() {
215
        return _parent;
216
    }
217
    
218
    public void setParent(WMSLayerNode parentNode) {
219
        this._parent = parentNode;
220
    }
221

    
222
    public List<RemoteTimeDimension> getDimensions() {
223
        return dimensions;
224
    }
225

    
226
    /**
227
     * Gets the layer abstract.
228
     *
229
     * @return Returns the abstract.
230
     */
231
    public String getAbstract() {
232
        return lAbstract;
233
    }
234

    
235
    /**
236
     * Sets the layer abstract.
237
     *
238
     * @param abstract The abstract to set.
239
     */
240
    public void setAbstract(String _abstract) {
241
        lAbstract = _abstract;
242
    }
243

    
244
    /**
245
     * @param name
246
     * @param units
247
     * @param unitSymbol
248
     * @param dimensionExpression
249
     */
250
    public void addDimension(String name, String units, String unitSymbol, String dimExpression) {
251
            if (dimensions == null)
252
                    dimensions = new ArrayList<RemoteTimeDimension>();
253
            if (name.equalsIgnoreCase("time")) {
254
                    try {
255
                            dimensions.add(new TimeDimension(units, unitSymbol,
256
                                            dimExpression));
257
                    } catch (IllegalArgumentException e) {
258
                            // The TIME class does not yet support this kind of time so it
259
                            // will be treated as a DefaultDimension
260
                            dimensions.add(new DefaultDimension(name.toUpperCase(),
261
                                            units, unitSymbol, dimExpression));
262
                    }
263
            } else if (name.equalsIgnoreCase("sequence")) {
264
                    // TODO Not yet implemented
265
                    return;
266
            } else {
267
                    dimensions.add(new DefaultDimension(name.toUpperCase(), units,
268
                                    unitSymbol, dimExpression));
269
            }
270

    
271
    }
272

    
273
    
274
    public void setLatLonBox(String _latLonBox) {
275
        latLonBox = _latLonBox;
276
    }
277

    
278
    public String getLatLonBox() {
279
        return latLonBox;
280
    }
281

    
282
    /**
283
     * When a server cannot renderize images but just server them in constant size and
284
     * BBox, the layer must have this value set in order to correctly work.
285
     *
286
     * @param fixedWidth - the constant value for the image width
287
     * @param fixedHeight - the constant value for the image height
288
     */
289
    public void setFixedSize(int fixedWidth, int fixedHeight) {
290
                fixedSize = new Dimension(fixedWidth, fixedHeight);
291
        }
292

    
293
   /*
294
    * (non-Javadoc)
295
    * @see org.gvsig.fmap.dal.coverage.store.remote.RemoteLayerNode#getFixedSize()
296
    */
297
        public Dimension getFixedSize() {
298
                return fixedSize;
299
        }
300

    
301
        /*
302
         * (non-Javadoc)
303
         * @see org.gvsig.fmap.dal.coverage.store.remote.RemoteLayerNode#isSizeFixed()
304
         */
305
        public boolean isSizeFixed() {
306
                return fixedSize            != null &&
307
                       fixedSize.getWidth()  > 0    &&
308
                       fixedSize.getHeight() > 0;
309
        }
310

    
311
    /**
312
     *
313
     * @param _name
314
     * @param _title
315
     * @param _abstract
316
     */
317
    public void addStyle(org.gvsig.remoteclient.wms.WMSStyle style) {
318
            if (style.getName().equalsIgnoreCase("default"))
319
                    selectedStyleIndex = styles.size();
320
        if (styles == null)
321
            styles = new ArrayList<RemoteWMSStyle>();
322
        styles.add(new RemoteWMSStyle(style, this));
323

    
324
    }
325

    
326
    /*
327
     * (non-Javadoc)
328
     * @see org.gvsig.fmap.dal.coverage.store.remote.RemoteLayerNode#getSelectedStyle()
329
     */
330
    public RemoteWMSStyle getSelectedStyle() {
331
            if (styles == null || selectedStyleIndex > styles.size() - 1 || selectedStyleIndex == -1)
332
                    return null;
333
            return (RemoteWMSStyle) styles.get(selectedStyleIndex);
334
    }
335

    
336
    /*
337
     * (non-Javadoc)
338
     * @see org.gvsig.fmap.dal.coverage.store.remote.RemoteLayerNode#setSelectedStyleByIndex(int)
339
     */
340
    public void setSelectedStyleByIndex(int index) {
341
                selectedStyleIndex = index;
342
        }
343

    
344
    /*
345
     * (non-Javadoc)
346
     * @see org.gvsig.fmap.dal.coverage.store.remote.RemoteLayerNode#setSelectedStyleByName(java.lang.String)
347
     */
348
        public void setSelectedStyleByName(String styName) {
349
                if (styName == null || styName.equals(""))
350
                        setSelectedStyleByIndex(-1);
351
                for (int i = 0; i < styles.size(); i++) {
352
                        RemoteWMSStyle sty = (RemoteWMSStyle) styles.get(i);
353
                        if (sty.name.equals(styName)) {
354
                                setSelectedStyleByIndex(i);
355
                                return;
356
                        }
357

    
358
                }
359
                setSelectedStyleByIndex(-1);
360
        }
361

    
362
        public void addKeyword(String keyword) {
363
                if (keywords == null)
364
                        keywords = new ArrayList<String>();
365
                keywords.add(keyword);
366
        }
367

    
368
    public String toString(){
369
            String str;
370
            if (getName()==null)
371
                    str = getTitle();
372
            else
373
                    str = "["+getName()+"] "+getTitle();
374
        return str;
375
    }
376

    
377
    /*
378
     * (non-Javadoc)
379
     * @see java.lang.Object#clone()
380
     */
381
    public Object clone() throws CloneNotSupportedException {
382
        WMSLayerNode clone       = new WMSLayerNode();
383
        clone._name              = this._name;
384
        clone.queryable          = this.queryable;
385
        clone.srs                = this.srs;
386
        clone._title             = this._title;
387
        clone.transparency       = this.transparency;
388
        clone.styles             = new ArrayList<RemoteWMSStyle>();
389
        clone.lAbstract          = this.lAbstract;
390
        clone.latLonBox          = this.latLonBox;
391
        clone.selectedStyleIndex = this.selectedStyleIndex;
392

    
393
        if (keywords != null) {
394
                clone.keywords = new ArrayList<String>(keywords.size());
395
                for (int i = 0; i < keywords.size(); i++) {
396
                                clone.keywords.add((String) keywords.get(i));
397
                        }
398
        }
399
        if (styles != null)
400
                for (int i=0; i<styles.size(); i++){
401
                        RemoteWMSStyle sty = (RemoteWMSStyle) this.styles.get(i).clone();
402
                        ((RemoteWMSStyle)sty).parent = this;
403
                        clone.styles.add(sty);
404
                }
405

    
406
        if (dimensions!=null)
407
                for (int i = 0; i < dimensions.size(); i++) {
408
                        clone.dimensions = new ArrayList<RemoteTimeDimension>();
409
                        clone.dimensions.add((RemoteTimeDimension) this.dimensions.get(i));
410
                }
411

    
412
        return clone;
413
    }
414

    
415
}