Statistics
| Revision:

gvsig-raster / org.gvsig.raster.wms / trunk / org.gvsig.raster.wms / org.gvsig.raster.wms.app / org.gvsig.raster.wms.app.wmsclient / src / main / java / org / gvsig / raster / wms / app / wmsclient / layer / FLyrWMS.java @ 859

History | View | Annotate | Download (40 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
 
23
package org.gvsig.raster.wms.app.wmsclient.layer;
24

    
25
import java.awt.Dimension;
26
import java.awt.Graphics2D;
27
import java.awt.Image;
28
import java.awt.Point;
29
import java.awt.Rectangle;
30
import java.awt.geom.AffineTransform;
31
import java.awt.geom.NoninvertibleTransformException;
32
import java.awt.geom.Point2D;
33
import java.awt.geom.Rectangle2D;
34
import java.awt.image.BufferedImage;
35
import java.lang.ref.WeakReference;
36
import java.util.ArrayList;
37
import java.util.HashMap;
38
import java.util.Iterator;
39
import java.util.List;
40
import java.util.Vector;
41
import java.util.prefs.Preferences;
42

    
43
import javax.print.attribute.PrintRequestAttributeSet;
44

    
45
import org.cresques.cts.ICoordTrans;
46
import org.cresques.cts.IProjection;
47
import org.gvsig.andami.PluginServices;
48
import org.gvsig.compat.net.ICancellable;
49
import org.gvsig.fmap.dal.DALLocator;
50
import org.gvsig.fmap.dal.DataManager;
51
import org.gvsig.fmap.dal.DataParameters;
52
import org.gvsig.fmap.dal.DataStore;
53
import org.gvsig.fmap.dal.DataStoreParameters;
54
import org.gvsig.fmap.dal.coverage.RasterLocator;
55
import org.gvsig.fmap.dal.coverage.RasterManager;
56
import org.gvsig.fmap.dal.coverage.datastruct.Extent;
57
import org.gvsig.fmap.dal.coverage.datastruct.ViewPortData;
58
import org.gvsig.fmap.dal.coverage.exception.FilePaletteException;
59
import org.gvsig.fmap.dal.coverage.exception.InvalidSetViewException;
60
import org.gvsig.fmap.dal.coverage.exception.ProcessInterruptedException;
61
import org.gvsig.fmap.dal.coverage.exception.RasterDriverException;
62
import org.gvsig.fmap.dal.coverage.exception.RemoteServiceException;
63
import org.gvsig.fmap.dal.coverage.grid.RasterFilter;
64
import org.gvsig.fmap.dal.coverage.store.RasterDataStore;
65
import org.gvsig.fmap.dal.coverage.store.parameter.RasterDataParameters;
66
import org.gvsig.fmap.dal.coverage.store.parameter.TileDataParameters;
67
import org.gvsig.fmap.dal.exception.DataException;
68
import org.gvsig.fmap.dal.exception.InitializeException;
69
import org.gvsig.fmap.dal.exception.ProviderNotRegisteredException;
70
import org.gvsig.fmap.dal.exception.ReadException;
71
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
72
import org.gvsig.fmap.dal.spi.DataManagerProviderServices;
73
import org.gvsig.fmap.geom.GeometryLocator;
74
import org.gvsig.fmap.geom.GeometryManager;
75
import org.gvsig.fmap.geom.Geometry.SUBTYPES;
76
import org.gvsig.fmap.geom.exception.CreateEnvelopeException;
77
import org.gvsig.fmap.geom.primitive.Envelope;
78
import org.gvsig.fmap.mapcontext.ViewPort;
79
import org.gvsig.fmap.mapcontext.exceptions.LoadLayerException;
80
import org.gvsig.fmap.mapcontext.exceptions.UnsupportedVersionLayerException;
81
import org.gvsig.fmap.mapcontext.layers.FLayer;
82
import org.gvsig.fmap.mapcontext.layers.FLyrDefault;
83
import org.gvsig.fmap.mapcontext.layers.Tiling;
84
import org.gvsig.fmap.mapcontext.layers.operations.ComposedLayer;
85
import org.gvsig.fmap.mapcontext.layers.operations.IHasImageLegend;
86
import org.gvsig.fmap.mapcontext.rendering.legend.ILegend;
87
import org.gvsig.raster.fmap.layers.DefaultFLyrRaster;
88
import org.gvsig.raster.fmap.layers.IRasterLayerActions;
89
import org.gvsig.raster.fmap.layers.NotAvailableStateException;
90
import org.gvsig.raster.util.CancelTaskImpl;
91
import org.gvsig.raster.wms.app.wmsclient.wmc.WebMapContextTags;
92
import org.gvsig.raster.wms.app.wmsclient.wmc.XmlBuilder;
93
import org.gvsig.raster.wms.io.RemoteWMSStyle;
94
import org.gvsig.raster.wms.io.WMSDataParameters;
95
import org.gvsig.raster.wms.io.WMSLayerNode;
96
import org.gvsig.raster.wms.io.WMSServerExplorer;
97
import org.gvsig.raster.wms.io.WMSServerExplorerParameters;
98
import org.gvsig.tools.ToolsLocator;
99
import org.gvsig.tools.dynobject.DynObjectSet;
100
import org.gvsig.tools.dynobject.DynStruct;
101
import org.gvsig.tools.persistence.PersistenceManager;
102
import org.gvsig.tools.persistence.PersistentState;
103
import org.gvsig.tools.persistence.exception.PersistenceException;
104
import org.gvsig.tools.task.Cancellable;
105
import org.slf4j.Logger;
106
import org.slf4j.LoggerFactory;
107

    
108

    
109

    
110
/**
111
 * FMap's WMS Layer class.
112
 *
113
 * Las capas WMS son tileadas para descargarlas del servidor. Esto quiere decir que
114
 * est?n formadas por multiples ficheros raster. Por esto la fuente de datos raster (IRasterDatasource)
115
 * de la capa FLyrWMS es un objeto de tipo CompositeDataset. Este objeto est? compuesto por un array
116
 * bidimensional de MultiRasterDataset. Cada uno de los MultiRasterDataset corresponde con un tile
117
 * salvado en disco. Estos MultiRasterDataset se crean cada vez que se repinta ya que en WMS a cada
118
 * zoom varian los ficheros fuente. La secuencia de creaci?n de un CompositeDataset ser?a la siguiente:
119
 * <UL>
120
 * <LI>Se hace una petici?n de dibujado por parte del usuario llamando al m?todo draw de FLyrWMS</LI>
121
 * <LI>Se tilea la petici?n</LI>
122
 * <LI>Cada tile se dibuja abriendo una FLyerRaster para ese tile</LI>
123
 * <LI>Si es el primer dibujado se guarda una referencia en la capa WMS a las propiedades de renderizado, orden de bandas,
124
 * transparencia, filtros aplicados, ...</LI>
125
 * <LI>Si no es el primer dibujado se asignan las propiedades de renderizado cuya referencia se guarda en la capa WMS</LI>
126
 * <LI>Se guarda el MultiRasterDataset de cada tile</LI>
127
 * <LI>Al acabar todos los tiles creamos un CompositeDataset con los MultiRasterDataset de todos los tiles</LI>
128
 * <LI>Asignamos a la capa la referencia de las propiedades de renderizado que tenemos almacenadas. De esta forma si hay
129
 * alguna modificaci?n desde el cuadro de propiedades ser? efectiva sobre los tiles que se dibujan.</LI>
130
 * </UL>
131
 *
132
 *
133
 * @author Jaume Dominguez Faus
134
 *
135
 */
136
public class FLyrWMS extends DefaultFLyrRaster implements IHasImageLegend {
137
        public static final String           PERSISTENT_NAME           = "FLyrWMS_Persistent";
138
        public static final String           PERSISTENT_DESCRIPTION    = "FLyrWMS Persistent Definition";
139
        private static final int             MAX_RETRY_TIMES           = 5;
140
        
141
        private static final GeometryManager geomManager               = GeometryLocator.getGeometryManager();
142
        private static final Logger          logger                    = LoggerFactory.getLogger(FLyrWMS.class);
143
        private boolean                                          isPrinting                = false;
144
        private boolean                                          mustTileDraw              = false;
145
        private boolean                                          mustTilePrint             = true;
146
        private final int                                          maxTileDrawWidth          = 1023;
147
        private final int                                          maxTileDrawHeight         = 1023;
148
        private final int                                          maxTilePrintWidth         = 1023;
149
        private final int                                          maxTilePrintHeight        = 1023;
150
        private List<WeakReference<Thread>>         disableUpdateDrawVersion;
151
        private Envelope                                         fullEnvelope              = null;
152
        private int                          callCount;
153
        private boolean                                                 firstLoad                 = false;
154
        private RasterManager                rManager                  = RasterLocator.getManager();
155
        private DataStoreParameters          params                    = null;
156
        private WMSServerExplorer            explorer                  = null;
157
        private boolean                      deleteCache               = false;
158

    
159
        public FLyrWMS() {
160
                super();
161
                this.updateDrawVersion();
162
                try {
163
                        enableAwake();
164
                } catch (NotAvailableStateException e) {
165
                        logger.error("Fallo el estado de open. Closed=" + isClosed() + " Awake=" + isAwake(), this, e);
166
                }
167
        }
168
        
169
   public FLyrWMS(DataStoreParameters dataStoreParameters) throws Exception {
170
        this();
171
        //Create the explorer and connect
172
        DataManager dataManager = DALLocator.getDataManager();
173
        WMSServerExplorerParameters explorerParams = (WMSServerExplorerParameters) 
174
               dataManager.createServerExplorerParameters(WMSServerExplorer.NAME);
175
        explorerParams.setHost((String)dataStoreParameters.getDynValue("uri"));        
176
        WMSServerExplorer wmsServerExplorer = 
177
            (WMSServerExplorer) dataManager.openServerExplorer(WMSServerExplorer.NAME, explorerParams);
178
        wmsServerExplorer.connect(null);
179
        
180
        //Set the parameters
181
        setParameters((WMSDataParameters)dataStoreParameters);
182
        setExplorer(wmsServerExplorer);
183
    }
184
        
185
        public static DataStore createDataStore(String host, IProjection srs) throws InitializeException {
186
                DataManagerProviderServices dataman = (DataManagerProviderServices) DALLocator.getDataManager();
187
                RasterDataParameters params = null;
188
                try {
189
                        params = (RasterDataParameters)dataman.createServerExplorerParameters(WMSServerExplorer.NAME);
190
                } catch (InitializeException e) {
191
                        return null;
192
                } catch (ProviderNotRegisteredException e) {
193
                        return null;
194
                }
195
                params.setURI(host);
196
                params.setSRS(srs);
197
                
198
                try {
199
                        return dataman.openStore(params.getDataStoreName(), params);
200
                } catch (ValidateDataParametersException e) {
201
                        throw new InitializeException(e);
202
                } catch (ProviderNotRegisteredException e) {
203
                        throw new InitializeException(e);
204
                }
205
        }
206

    
207
        /*
208
         * (non-Javadoc)
209
         * @see org.gvsig.fmap.mapcontext.layers.operations.SingleLayer#setDataStore(org.gvsig.fmap.dal.DataStore)
210
         */
211
        public void setDataStore(DataStore dataStore) throws LoadLayerException {
212
                this.dataStore = (RasterDataStore) dataStore;
213
                try {
214
                        if(!this.dataStore.isOpen())
215
                                enableOpen();
216
                } catch (NotAvailableStateException e) {
217
                        logger.error("Fallo el estado de open. Closed=" + isClosed() + " Awake=" + isAwake(), this, e);
218
                }
219
                setProjection(this.dataStore.getProjection());
220
        }
221

    
222
        /**
223
         * It choose the best format to load different maps if the server
224
         * supports it. This format could be png, because it supports
225
         * transparency.
226
         * @param formats
227
         * Arraywith all the formats supported by the server
228
         * @return
229
         */
230
        @SuppressWarnings("unused")
231
        private String getGreatFormat(Vector<String> formats){
232
                for (int i=0 ; i<formats.size() ; i++){
233
                        String format = (String) formats.get(i);
234
                        if (format.equals("image/jpg")){
235
                                return format;
236
                        }
237
                        if (format.equals("image/jpeg")){
238
                                return format;
239
                        }
240
                }
241

    
242
                return (String)formats.get(0);
243
        }
244

    
245
        /*
246
         * (non-Javadoc)
247
         * @see org.gvsig.raster.fmap.layers.DefaultFLyrRaster#loadFromState(org.gvsig.tools.persistence.PersistentState)
248
         */
249
        @Override
250
        public void loadFromState(PersistentState state)
251
        throws PersistenceException {
252
                String host = state.getString("host");
253
                try {
254
                        getParameters();
255
                        WMSServerExplorerParameters params = (WMSServerExplorerParameters)explorer.getParameters();
256
                        params.setHost(host);
257
                        explorer.connect(new CancelTaskImpl());
258
                } catch (Exception e) {
259
                        throw new PersistenceException("Server comunication error", e);
260
                }
261

    
262
                super.loadFromState(state);
263
                params = getDataStore().getParameters();
264
                this.fullEnvelope = (Envelope) state.get("fullEnvelope");
265
                getParameters().setName((String)state.get("name"));
266
        }
267

    
268
        /*
269
         * (non-Javadoc)
270
         * @see org.gvsig.raster.fmap.layers.DefaultFLyrRaster#saveToState(org.gvsig.tools.persistence.PersistentState)
271
         */
272
        @Override
273
        public void saveToState(PersistentState state) throws PersistenceException {
274
                super.saveToState(state);
275
                state.set("fullEnvelope", this.fullEnvelope);
276
                state.set("host", getParameters().getURI());
277
                state.set("name", getName());
278
        }
279

    
280
        public static void registerPersistent() {
281
                PersistenceManager manager = ToolsLocator.getPersistenceManager();
282
                DynStruct definition = manager.getDefinition(PERSISTENT_NAME);
283
                if( definition == null ) {
284
                        if (manager.getDefinition(FLyrDefault.class) == null) {
285
                                FLyrDefault.registerPersistent();
286
                        }
287

    
288
                        definition = manager.addDefinition(
289
                                        FLyrWMS.class,
290
                                        PERSISTENT_NAME,
291
                                        PERSISTENT_DESCRIPTION,
292
                                        null, 
293
                                        null
294
                        );
295
                        
296
                        definition.extend(PersistenceManager.PERSISTENCE_NAMESPACE, "FLyrDefault");
297
                }
298

    
299
                DefaultFLyrRaster.registerPersistence(definition);
300
                definition.addDynFieldObject("fullEnvelope").setClassOfValue(Envelope.class).setMandatory(false);
301
                definition.addDynFieldString("host").setMandatory(false);
302
                definition.addDynFieldString("name").setMandatory(false);
303
        }
304
        
305
        /*
306
         * (non-Javadoc)
307
         * @see org.gvsig.raster.fmap.layers.DefaultFLyrRaster#draw(java.awt.image.BufferedImage, java.awt.Graphics2D, org.gvsig.fmap.mapcontext.ViewPort, org.gvsig.tools.task.Cancellable, double)
308
         */
309
        public void draw(BufferedImage image, Graphics2D g, ViewPort viewPort,
310
                        Cancellable cancel, double scale) throws ReadException {
311
                CancelTaskImpl cancellable = new CancelTaskImpl(cancel);
312
                
313
                if(!firstLoad) {
314
                        try {
315
                                initFilters();
316
                        } catch (FilePaletteException e) {
317
                                logger.error(e.getMessage(), this, e);
318
                        }
319
                        firstLoad = true;
320
                }
321
                
322
                callCount = 0;  
323
                
324
                enableStopped();
325
                
326
                if(recalcLevel) {
327
                        double pixelSize = viewPort.getEnvelope().getLength(0) / (double)viewPort.getImageWidth();
328
                        zoomLevel = dataStore.getNearestLevel(pixelSize);
329
                }
330
                recalcLevel = true;
331

    
332
                if (isWithinScale(scale)) {
333

    
334
                        if(mustTileDraw) {
335
                                Point2D p = viewPort.getOffset();
336
                                Rectangle r = new Rectangle((int) p.getX(), (int) p.getY(), viewPort.getImageWidth(), viewPort.getImageHeight());
337
                                Tiling tiles = new Tiling(maxTileDrawWidth, maxTileDrawHeight, r);
338
                                tiles.setAffineTransform((AffineTransform) viewPort.getAffineTransform().clone());
339

    
340
                                for (int tileNr = 0; tileNr < tiles.getNumTiles(); tileNr++) {
341
                                        // drawing part
342
                                        try {
343
                                                ViewPort vp = tiles.getTileViewPort(viewPort, tileNr);
344
                                                drawTile(g, vp, cancellable, scale);
345
                                        } catch (LoadLayerException e) {
346
                                                throw new ReadException(e.getMessage(), e);
347
                                        } catch (NoninvertibleTransformException e) {
348
                                                throw new ReadException(e.getMessage(), e);
349
                                        }
350
                                }
351
                        } else {
352
                                try {
353
                                        drawTile(g, viewPort, cancellable, scale);
354
                                } catch (LoadLayerException e) {
355
                                        throw new ReadException(e.getMessage(), e);
356
                                }
357
                        }
358
                }
359
                disableStopped();
360
        }
361
        
362
                
363
        /**
364
         * This is the method used to draw a tile in a WMS mosaic layer.
365
         * @throws LoadLayerException
366
         * @throws ReadDriverException
367
         * @return true when a tile has been painted
368
         */
369
        @SuppressWarnings("deprecation")
370
        private void drawTile(Graphics2D g, ViewPort vp, ICancellable cancel, double scale) throws LoadLayerException, ReadException {
371
                callCount++;
372
        
373
                // Compute the query geometry
374
                // 1. Check if it is within borders
375
                Envelope envelope = getFullEnvelope();
376
                Envelope vpEnv = vp.getAdjustedExtent();
377
                if (!vpEnv.intersects(envelope)) {
378
                        return;
379
                }
380

    
381
                // 2. Compute extent to be requested.
382
                Rectangle2D bBox = new Rectangle2D.Double();
383
                Rectangle2D.intersect(getRectable2DFromEnvelope(vpEnv),
384
                                getRectable2DFromEnvelope(envelope), bBox);
385

    
386
                // 3. Compute size in pixels
387
                double scalex = vp.getAffineTransform().getScaleX();
388
                double scaley = vp.getAffineTransform().getScaleY();
389
                int wImg = (int) Math.ceil(Math.abs(bBox.getWidth() * scalex) + 1);
390
                int hImg = (int) Math.ceil(Math.abs(bBox.getHeight() * scaley) + 1);
391

    
392
                Dimension sz = new Dimension(wImg, hImg);
393

    
394
                if ((wImg <= 0) || (hImg <= 0)) {
395
                        return;
396
                }
397

    
398
                try {
399
                        
400
                        Rectangle2D extent = new Rectangle2D.Double();
401
                        Rectangle2D.Double vpExtent = this.getRectable2DFromEnvelope(vpEnv);
402
                        Rectangle2D.intersect(vpExtent, bBox, extent);
403
                        
404
                        Extent ex = rManager.getDataStructFactory().createExtent(
405
                                        vp.getAdjustedEnvelope().getMinimum(0), 
406
                                        vp.getAdjustedEnvelope().getMaximum(1), 
407
                                        vp.getAdjustedEnvelope().getMaximum(0), 
408
                                        vp.getAdjustedEnvelope().getMinimum(1));
409
                        ViewPortData vpData = rManager.createViewPortData(vp.getProjection(), ex, sz );
410
                        vpData.setMat(vp.getAffineTransform());
411

    
412
                        try {
413
                                getParameters().setExtent(bBox);
414
                                if(getParameters().isSizeFixed()) {
415
                                        getParameters().setWidth((int)getParameters().getFixedSize().getWidth());
416
                                        getParameters().setHeight((int)getParameters().getFixedSize().getHeight());
417
                                } else {
418
                                        getParameters().setWidth(wImg);
419
                                        getParameters().setHeight(hImg);
420
                                }
421
                                getParameters().setCancellable(cancel);
422
                                if(params instanceof WMSDataParameters)
423
                                        getRender().draw(g, vpData);
424
                                else
425
                                        getRender().drawTiledService(g, vpData, vp.getImageSize());
426
                                //this.updateDrawVersion();
427
                        } catch (RasterDriverException e) {
428
                                throw new RemoteServiceException("Problems drawing this layer: " + e.getMessage(), e);
429
                        } catch (InvalidSetViewException e) {
430
                                throw new RemoteServiceException("Problems drawing this layer: " + e.getMessage(), e);
431
                        } catch (ProcessInterruptedException e) {
432
                        }
433

    
434
                } catch (RemoteServiceException e) {
435
                        if (!cancel.isCanceled()) {
436
                                if (callCount < MAX_RETRY_TIMES) {
437
                                        logger.warn("\n[ FLyrWMS.drawFixedSize() ]  Failed in trying " + callCount + "/" + MAX_RETRY_TIMES + ")\n"); // mess code
438
                                        drawTile(g, vp, cancel, scale);
439
                                } else {
440
                                        if (!isPrinting) {
441
                                                this.setVisible(false);
442
                                        }
443
                                        throw new LoadLayerException(getName(), e);
444
                                }
445
                        }
446
                }
447
                callCount--;
448
                return;
449
        }
450

    
451
        /**
452
         * @see com.iver.cit.gvsig.fmap.layers.FLayer#print(java.awt.Graphics2D,
453
         *                 com.iver.cit.gvsig.fmap.ViewPort,
454
         *                 com.iver.cit.gvsig.fmap.operations.Cancellable)
455
         */
456
        public void print(Graphics2D g, ViewPort viewPort, Cancellable cancel, double scale, PrintRequestAttributeSet properties)
457
        throws ReadException {
458
                CancelTaskImpl cancellable = new CancelTaskImpl(cancel);
459
                
460
                if (isVisible() && isWithinScale(scale)){
461
                        isPrinting = true;
462
                        if (!mustTilePrint) {
463
                                draw(null, g, viewPort, cancel,scale);
464
                        } else {
465
                                Tiling tiles = new Tiling(maxTilePrintWidth, maxTilePrintHeight, g.getClipBounds());
466
                                tiles.setAffineTransform((AffineTransform) viewPort.getAffineTransform().clone());
467
                                for (int tileNr = 0; tileNr < tiles.getNumTiles(); tileNr++) {
468
                                        // Parte que dibuja
469
                                        try {
470
                                                ViewPort vp = tiles.getTileViewPort(viewPort, tileNr);
471
                                                drawTile(g, vp, cancellable, scale);
472
                                        } catch (NoninvertibleTransformException e) {
473
                                                throw new ReadException(e.getMessage(), e);
474
                                        } catch (LoadLayerException e) {
475
                                                throw new ReadException(e.getMessage(), e);
476
                                        }
477
                                }
478
                        }
479
                        isPrinting = false;
480
                }
481
        }
482

    
483
        public void _print(Graphics2D g, ViewPort viewPort, Cancellable cancel,
484
                        double scale) throws ReadException {
485
                draw(null, g, viewPort, cancel,scale);
486
        }
487

    
488
        /**
489
         * Inserta la extensi?n total de la capa.
490
         *
491
         * @param fullExtent
492
         *            Rectangulo.
493
         */
494
        public void setFullExtent(Rectangle2D fullExtent) {
495
                this.setFullEnvelope(this.getEnvelopeFromRectable2D(fullExtent));
496
        }
497

    
498
        /**
499
         * Inserta la extensi?n total de la capa en la proyeccion original.
500
         *
501
         * @param fullExtent
502
         *            Rect?ngulo.
503
         */
504
        public void setFullEnvelope(Envelope envelope) {
505
                Envelope cur = this.getFullEnvelope();
506
                if (cur == envelope) {
507
                        return;
508
                }
509
                if (cur != null && cur.equals(envelope)) {
510
                        return;
511
                }
512

    
513
                this.fullEnvelope = envelope;
514
                this.updateDrawVersion();
515
        }
516

    
517
        public HashMap<String, Object> getProperties() {
518
                HashMap<String, Object> info = new HashMap<String, Object>();
519
                String[] layerNames = getParameters().getLayerQuery().split(",");
520
                Vector<WMSLayerNode> layers = new Vector<WMSLayerNode>(layerNames.length);
521
                try {
522
                        //explorer.connect(null);
523
                        for (int i = 0; i < layerNames.length; i++) {
524
                                layers.add(i, explorer.getLayer(layerNames[i]));
525
                        }
526
                        info.put("name", getName());
527
                        info.put("selectedLayers", layers);
528
                        info.put("host", getParameters().getURI());
529
                        info.put("srs", getParameters().getSRSCode());
530
                        info.put("format", getParameters().getFormat());
531
                        info.put("wmsTransparency", new Boolean(getParameters().isWmsTransparent()));
532
                        info.put("styles", getParameters().getStyles());
533
                        info.put("dimensions", getParameters().getDimensions());
534
                        info.put("fixedSize", getParameters().getFixedSize());
535
                        return info;
536
                } /*catch (WMSException e) {
537
                        JOptionPane.showMessageDialog((Component)PluginServices.getMainFrame(), PluginServices.getText(null, "connect_error"));
538
                }*/ catch (Exception e) {
539
                        e.printStackTrace();
540
                }
541
                return null;
542
        }
543

    
544
        /**
545
         * Creates the part of a OGC's MapContext document that would describe this
546
         * layer(s).
547
         * @param version, The desired version of the resulting document. (1.1.0)
548
         * @return String containing the xml.
549
         * @throws UnsupportedVersionLayerException
550
         */
551
        @SuppressWarnings("unchecked")
552
        public String toMapContext(String mapContextVersion) {
553
                XmlBuilder xml = new XmlBuilder();
554
                
555
                String query = getParameters().getLayerQuery();
556
                String[] layerNames = query.split(",");
557
                String[] styleNames = (String[]) getParameters().getStyles().toArray(new String[0]);
558
                for (int i = 0; i < layerNames.length; i++) {
559
                        WMSLayerNode layer = explorer.getLayer(layerNames[i]);
560
                        HashMap xmlAttrs = new HashMap();
561

    
562
                        // <Layer>
563
                        xmlAttrs.put(WebMapContextTags.HIDDEN, !isVisible() + "");
564
                        xmlAttrs.put(WebMapContextTags.QUERYABLE, explorer.isQueryable() + "");
565
                        xml.openTag(WebMapContextTags.LAYER, xmlAttrs);
566
                        xmlAttrs.clear();
567
                        if (mapContextVersion.equals("1.1.0") || mapContextVersion.equals("1.0.0")) {
568
                                // <Server>
569
                                xmlAttrs.put(WebMapContextTags.SERVICE, WebMapContextTags.WMS);
570
                                xmlAttrs.put(WebMapContextTags.VERSION, explorer.getVersion());
571
                                xmlAttrs.put(WebMapContextTags.SERVER_TITLE, explorer.getServiceTitle());
572
                                xml.openTag(WebMapContextTags.SERVER, xmlAttrs);
573
                                xmlAttrs.clear();
574

    
575
                                // <OnlineResource>
576
                                xmlAttrs.put(WebMapContextTags.XLINK_TYPE, "simple");
577
                                xmlAttrs.put(WebMapContextTags.XLINK_HREF, getParameters().getURI().toString());
578
                                xml.writeTag(WebMapContextTags.ONLINE_RESOURCE, xmlAttrs);
579
                                xmlAttrs.clear();
580
                                // </OnlineResource>
581

    
582
                                xml.closeTag();
583
                                // </Server>
584

    
585
                                // <Name>
586
                                xml.writeTag(WebMapContextTags.NAME, layer.getName().trim());
587
                                // </Name>
588

    
589
                                // <Title>
590
                                xml.writeTag(WebMapContextTags.TITLE, layer.getTitle().trim());
591
                                //?xml.writeTag(WebMapContextTags.TITLE, getName().trim());
592
                                // </Title>
593

    
594
                                // <Abstract>
595
                                if (layer.getAbstract() != null) {
596
                                        xml.writeTag(WebMapContextTags.ABSTRACT, layer.getAbstract());
597
                                        // </Abstract>
598
                                }
599

    
600
                                // <SRS> (a list of available SRS for the enclosing layer)
601
                                String[] strings = (String[]) layer.getAllSrs().toArray(new String[0]);
602
                                String mySRS = strings[0];
603
                                for (int j = 1; j < strings.length; j++) {
604
                                        mySRS += ","+strings[j];
605
                                }
606
                                xml.writeTag(WebMapContextTags.SRS, mySRS);
607
                                // </SRS>
608

    
609
                                // <FormatList>
610
                                xml.openTag(WebMapContextTags.FORMAT_LIST);
611
                                strings = explorer.getFormats();
612
                                for (int j = 0; j < strings.length; j++) {
613
                                        // <Format>
614
                                        String str = strings[j].trim();
615
                                        if (str.equals(getParameters().getFormat())) {
616
                                                xml.writeTag(WebMapContextTags.FORMAT, str, WebMapContextTags.CURRENT, "1");
617
                                        } else {
618
                                                xml.writeTag(WebMapContextTags.FORMAT, str);
619
                                                // </Format>
620
                                        }
621
                                }
622
                                xml.closeTag();
623
                                // </FormatList>
624

    
625
                                // <StyleList>
626
                                xml.openTag(WebMapContextTags.STYLE_LIST);
627

    
628
                                if (layer.getStyles().size() > 0) {
629
                                        for (int j = 0; j < layer.getStyles().size(); j++) {
630
                                                // <Style>
631
                                                RemoteWMSStyle st = layer.getStyles().get(j);
632
                                                if (st.getName().equals(styleNames[i])) {
633
                                                        xmlAttrs.put(WebMapContextTags.CURRENT, "1");
634
                                                }
635
                                                xml.openTag(WebMapContextTags.STYLE, xmlAttrs);
636
                                                xmlAttrs.clear();
637

    
638
                                                // <Name>
639
                                                xml.writeTag(WebMapContextTags.NAME, st.getName());
640
                                                // </Name>
641

    
642
                                                // <Title>
643
                                                xml.writeTag(WebMapContextTags.TITLE, st.getTitle());
644
                                                // </Title>
645

    
646
                                                // <LegendURL width="180" format="image/gif" height="50">
647
                                                // <OnlineResource xlink:type="simple" xlink:href="http://globe.digitalearth.gov/globe/en/icons/colorbars/NATIONAL.gif"/>
648
                                                // </OnlineResource>
649
                                                // </LegendURL>
650
                                                xml.closeTag();
651
                                                // </Style>
652

    
653
                                        }
654

    
655
                                } else {
656
                                        // Create fake style (for compatibility issues)
657
                                        xmlAttrs.put(WebMapContextTags.CURRENT, "1");
658
                                        // <Style>
659
                                        xml.openTag(WebMapContextTags.STYLE, xmlAttrs);
660
                                        xmlAttrs.clear();
661
                                        // <Name>
662
                                        xml.writeTag(WebMapContextTags.NAME, "default");
663
                                        // </Name>
664

    
665
                                        // <Title>
666
                                        xml.writeTag(WebMapContextTags.TITLE, "default");
667
                                        xml.closeTag();
668
                                }
669
                                // </StyleList>
670
                                xml.closeTag();
671
                                if (mapContextVersion.compareTo("1.0.0") > 0) {
672
                                        // <DimensionList>
673
                                        xml.openTag(WebMapContextTags.DIMENSION_LIST);
674
                                        // <Dimension>
675
                                        // </Dimension>
676
                                        xml.closeTag();
677
                                        // </DimensionList>
678
                                }
679
                        } else {
680
                                xml.writeTag("ERROR", PluginServices.getText(this, "unsupported_map_context_version"));
681
                        }
682
                        // </Layer>
683
                        xml.closeTag();
684
                }
685
                return xml.getXML();
686
        }
687

    
688
        public String getTocImageIcon() {
689
                return "icon-layer-wms";
690
        }
691

    
692
        /*
693
         *  (non-Javadoc)
694
         * @see com.iver.cit.gvsig.fmap.layers.RasterOperations#getTileSize()
695
         */
696
        public int[] getTileSize() {
697
                int[] size = {maxTileDrawWidth, maxTileDrawHeight};
698
                return size;
699
        }
700

    
701
        /*
702
         *  (non-Javadoc)
703
         * @see com.iver.cit.gvsig.fmap.layers.RasterOperations#isTiled()
704
         */
705
        public boolean isTiled() {
706
                return mustTileDraw;
707
        }
708

    
709
        public Image getImageLegend() {
710
                /*try {
711
                        if (wms == null) {
712
                                wms = getDriver();
713
                        }
714
                        if (wms.hasLegendGraphic()) {
715
                                wmsStatus.setOnlineResource((String) onlineResources
716
                                                .get("GetLegendGraphic"));
717
                                String path = getPathImage();// File legend =
718
                                // getDriver().getLegendGraphic(wmsStatus,
719
                                // layerQuery, null);
720
                                Image img = null;
721
                                if ((path != null) && (path.length() > 0)) {
722
                                        img = new ImageIcon(path).getImage();
723
                                }
724
                                return img;
725
                        }
726
                } catch (Exception e) {
727
                }*/
728
                return null;
729
        }
730

    
731
        public String getPathImage() {
732
                //TODO:Ver quien aporta getLegendGraphic
733
                return null;
734
                /*try {
735
                        RemoteRasterServiceStore store = (RemoteRasterServiceStore)this.dataStore;
736
                        File legend = store.getLegendGraphic(getParameters().getLayerQuery(), null);
737
                        return legend.getAbsolutePath();
738
                } catch(Exception e){
739
                        e.printStackTrace();
740
                        return null;
741
                }*/
742
        }
743

    
744
        /* (non-Javadoc)
745
         * @see com.iver.cit.gvsig.fmap.layers.FLayer#newComposedLayer()
746
         */
747
        public ComposedLayer newComposedLayer() {
748
                Preferences prefs = Preferences.userRoot().node("gvsig.wms");
749

    
750
                /*
751
                 * from java.util.prefs import Preferences
752
                 * prefs = Preferences.userRoot().node("gvsig.wms")
753
                 * prefs.put("useComposedLayer","true")
754
                 */
755

    
756
                String str = prefs.get("useComposedLayer","false");
757
                Boolean useComposedLayer = Boolean.TRUE; // por defecto ya se usan
758
                try {
759
                        useComposedLayer = Boolean.valueOf(str);
760
                } catch (Exception e) {
761

    
762
                }
763
                if (useComposedLayer.booleanValue()) {
764
                        return new ComposedLayerWMS();
765
                } else {
766
                        return null;
767
                }
768
        }
769

    
770
        /*
771
         * Checks if can make a single petition for the two layers to the server
772
         * @see com.iver.cit.gvsig.fmap.layers.ComposedLayerWMS#canAdd(com.iver.cit.gvsig.fmap.layers.FLayer)
773
         */
774
        boolean isComposedLayerCompatible(FLayer layer) {
775
                FLyrWMS aLayer;
776

    
777
                if (!(layer instanceof FLyrWMS)) {
778
                        return false;
779
                }
780
                aLayer = (FLyrWMS)layer;
781
                if (!getParameters().getURI().equals(aLayer.getParameters().getURI())) {
782
                        return false;
783
                }
784
                
785
                WMSDataParameters p = params instanceof WMSDataParameters ? (WMSDataParameters)params : 
786
                        params instanceof TileDataParameters ? (WMSDataParameters)((TileDataParameters) params).getDataParameters() : null;
787
                
788
                if (!p.getFormat().equals(aLayer.getParameters().getFormat())) {
789
                        return false;
790
                }
791
                if (!p.getSRS().equals(aLayer.getParameters().getSRS())) {
792
                        return false;
793
                }
794
                if (p.getInfoLayerQuery() != null) {
795
                        if (!p.getInfoLayerQuery().equals(aLayer.getParameters().getInfoLayerQuery())) {
796
                                return false;
797
                        }
798
                }else if (p.getInfoLayerQuery() != null) {
799
                        return false;
800
                }
801

    
802

    
803
                // isFixedSize es privado
804
                if ((getParameters().getFixedSize() != null) &&
805
                                (aLayer.getParameters().getFixedSize() != null)) {
806
                        if (getParameters().getFixedSize().equals(aLayer.getParameters().getFixedSize())) {
807
                                return false;
808
                        }
809
                } else if ((getParameters().getFixedSize() != null) != (aLayer.getParameters().getFixedSize() != null)) {
810
                        return false;
811
                }
812

    
813
                // time elevation (dimensions)
814
                if ((p.getDimensions() != null) &&
815
                                (aLayer.getParameters().getDimensions() != null)) {
816
                        if (p.getDimensions().size() != aLayer.getParameters().getDimensions().size()) {
817
                                return false;
818
                        } else {
819
                                Iterator<String> iter = p.getDimensions().iterator();
820
                                while (iter.hasNext()) {
821
                                        if (!aLayer.getParameters().getDimensions().contains(iter.next())) {
822
                                                return false;
823
                                        }
824
                                }
825
                        }
826

    
827
                } else if ((p.getDimensions() != null) != (aLayer.getParameters().getDimensions() != null)) {
828
                        return false;
829
                }
830

    
831
                return true;
832
        }
833

    
834
        /*
835
         * (non-Javadoc)
836
         * @see org.gvsig.fmap.raster.layers.FLyrRasterSE#isActionEnabled(int)
837
         */
838
        public boolean isActionEnabled(int action) {
839
                switch (action) {
840
                case IRasterLayerActions.ZOOM_PIXEL_RESOLUTION:
841
                case IRasterLayerActions.FLYRASTER_BAR_TOOLS:
842
                case IRasterLayerActions.BANDS_FILE_LIST:
843
                case IRasterLayerActions.COLOR_TABLE:
844
                case IRasterLayerActions.GEOLOCATION:
845
                case IRasterLayerActions.PANSHARPENING:
846
                case IRasterLayerActions.SAVE_COLORINTERP:
847
                case IRasterLayerActions.SAVEAS:
848
                case IRasterLayerActions.BANDS_RGB:
849
                case IRasterLayerActions.ENHANCED:
850
                case IRasterLayerActions.STATS:
851
                case IRasterLayerActions.NODATA:
852
                        return false;
853
                case IRasterLayerActions.REMOTE_ACTIONS:
854
                        return true;
855
                }
856

    
857
                return super.isActionEnabled(action);
858
        }
859

    
860
        /*
861
         * (non-Javadoc)
862
         * @see org.gvsig.fmap.raster.layers.FLyrRasterSE#getLegend()
863
         */
864
        public ILegend getLegend() {
865
                return null;
866
        }
867
        
868
        /*
869
         * (non-Javadoc)
870
         * @see org.gvsig.raster.fmap.layers.FLyrRaster#isRemote()
871
         */
872
        public boolean isRemote() {
873
                return true;
874
        }
875

    
876
        /*
877
         * (non-Javadoc)
878
         * @see org.gvsig.fmap.raster.layers.FLyrRasterSE#overviewsSupport()
879
         */
880
        public boolean overviewsSupport() {
881
                return false;
882
        }
883

    
884
        protected void updateDrawVersion() {
885
                if (this.disableUpdateDrawVersion != null){
886

    
887
                        Thread curThread = Thread.currentThread();
888

    
889
                        Thread aThread;
890

    
891
                        Iterator<WeakReference<Thread>> iter = this.disableUpdateDrawVersion.iterator();
892
                        while (iter.hasNext()){
893
                                aThread = (Thread) ((WeakReference<?>)iter.next()).get();
894
                                if (aThread == null){
895
                                        iter.remove();
896
                                } else if(aThread.equals(curThread)){
897
                                        return;
898
                                }
899
                        }
900
                }
901
                //                Exception ex = new Exception();
902
                //                ex.printStackTrace();
903
                super.updateDrawVersion();
904
        }
905

    
906
        protected void disableUpdateDrawVersion() {
907
                if (this.disableUpdateDrawVersion == null) {
908
                        this.disableUpdateDrawVersion = new ArrayList<WeakReference<Thread>>();
909
                }
910
                this.disableUpdateDrawVersion.add(new WeakReference<Thread>(Thread.currentThread()));
911
        }
912

    
913
        protected void enableUpdateDrawVersion() {
914
                if (this.disableUpdateDrawVersion == null){
915
                        return;
916
                }
917
                Thread curThread = Thread.currentThread();
918
                Thread aThread;
919

    
920
                Iterator<WeakReference<Thread>> iter = this.disableUpdateDrawVersion.iterator();
921
                while (iter.hasNext()) {
922
                        aThread = (Thread) ((WeakReference<?>)iter.next()).get();
923
                        if (aThread == null) {
924
                                iter.remove();
925
                        } else if(aThread.equals(curThread)) {
926
                                iter.remove();
927
                                break;
928
                        }
929
                }
930

    
931
        }
932

    
933
        private Rectangle2D.Double getRectable2DFromEnvelope(Envelope env) {
934
                return new Rectangle2D.Double(env.getMinimum(0), env.getMinimum(1), env
935
                                .getLength(0), env.getLength(1));
936
        }
937

    
938
        private Envelope getEnvelopeFromRectable2D(Rectangle2D rect) {
939
                try {
940
                        return geomManager.createEnvelope(rect.getMinX(), rect.getMinY(),
941
                                        rect.getMaxX(), rect.getMaxY(),
942
                                        SUBTYPES.GEOM2D);
943
                } catch (CreateEnvelopeException e) {
944
                        logger.error("Error creating the envelope", e);
945
                }
946
                return null;
947
        }
948
        
949
        /*
950
         * (non-Javadoc)
951
         * @see org.gvsig.raster.fmap.layers.FLyrRaster#getFileFormat()
952
         */
953
        @Override
954
        public String getFileFormat() {
955
                return "WMS";
956
        }
957
        
958
        /*
959
         * (non-Javadoc)
960
         * @see org.gvsig.raster.fmap.layers.DefaultFLyrRaster#getFileLayer()
961
         */
962
        @Override
963
        public FLayer getFileLayer() throws RasterDriverException {
964
                /*if(getDataStore() instanceof DefaultRemoteRasterStore) {
965
                        RemoteRasterProvider prov = (RemoteRasterProvider)((DefaultRemoteRasterStore)getDataStore()).getProvider(0);
966
                        File file = null;
967
                        
968
                        if(getParameters().isSizeFixed()) {
969
                                file = prov.getFileLayer();
970
                        } else {
971
                                file = prov.getLastRequest();
972
                        }
973
                                
974
                        if(file == null)
975
                                return null;
976
                        
977
                        try {
978
                                return DefaultFLyrRaster.createLayer("tmp", file);
979
                        } catch (LoadLayerException e) {
980
                                throw new RasterDriverException(e.getMessage(), e);
981
                        }
982
                }*/
983
                return null;
984
        }
985

    
986
        /**
987
         * Devuelve el envelope en la proyeccion de la vista
988
         */
989
        public Envelope getFullEnvelope() {
990
                Envelope rAux;
991
                rAux = this.fullEnvelope;
992

    
993
                // Esto es para cuando se crea una capa nueva con el fullExtent de ancho
994
                // y alto 0.
995
                if (rAux == null || rAux.getMaximum(0) - rAux.getMinimum(0) == 0
996
                                && rAux.getMaximum(1) - rAux.getMinimum(1) == 0) {
997
                        try {
998
                                rAux = geomManager.createEnvelope(0, 0, 100, 100, SUBTYPES.GEOM2D);
999
                        } catch (CreateEnvelopeException e) {
1000
                                logger.error("Error creating the envelope", e);
1001
                        }
1002
                }
1003
                // Si existe reproyecci?n, reproyectar el extent
1004
                ICoordTrans ct = getCoordTrans();
1005
                if (ct != null) {
1006
                        Point2D pt1 = new Point2D.Double(rAux.getMinimum(0), rAux
1007
                                        .getMinimum(1));
1008
                        Point2D pt2 = new Point2D.Double(rAux.getMaximum(0), rAux
1009
                                        .getMaximum(1));
1010
                        pt1 = ct.convert(pt1, null);
1011
                        pt2 = ct.convert(pt2, null);
1012
                        try {
1013
                                rAux = geomManager.createEnvelope(pt1.getX(), pt1.getY(), pt2
1014
                                                .getX(), pt2.getY(), SUBTYPES.GEOM2D);
1015
                        } catch (CreateEnvelopeException e) {
1016
                                logger.error("Error creating the envelope", e);
1017
                        }// new
1018
                        // Rectangle2D.Double();
1019
                }
1020
                return rAux;
1021

    
1022
        }
1023
        
1024
        /*
1025
         * (non-Javadoc)
1026
         * @see org.gvsig.raster.fmap.layers.FLyrRaster#getFullRasterExtent()
1027
         */
1028
        public Extent getFullRasterExtent() {
1029
                Envelope env = getFullEnvelope();
1030
                double minx = env.getMinimum(0);
1031
                double miny = env.getMinimum(1);
1032
                double maxx = env.getMaximum(0);
1033
                double maxy = env.getMaximum(1);
1034
                Point2D ul = new Point2D.Double(minx, maxy);
1035
                Point2D ur = new Point2D.Double(maxx, maxy);
1036
                Point2D ll = new Point2D.Double(minx, miny);
1037
                Point2D lr = new Point2D.Double(maxx, miny);
1038
                return rManager.getDataStructFactory().createExtent(ul, lr, ur, ll);
1039
        }
1040

    
1041
        @SuppressWarnings("deprecation")
1042
        @Override
1043
        public DynObjectSet getInfo(Point p, double tolerance, Cancellable cancel,
1044
                        boolean fast) throws LoadLayerException, DataException {
1045

    
1046
                //try {
1047
                ViewPort viewPort = getMapContext().getViewPort();
1048

    
1049
                Point tiledPoint = new Point((int) p.getX() % maxTilePrintWidth, (int) p.getY() % maxTilePrintHeight);
1050
                Rectangle rect = new Rectangle(0, 0, viewPort.getImageWidth() - 1, viewPort.getImageHeight() - 1);
1051
                Tiling tiles = new Tiling(maxTilePrintWidth, maxTilePrintHeight, rect);
1052
                tiles.setAffineTransform((AffineTransform) viewPort.getAffineTransform().clone());
1053
                int nCols = tiles.getNumCols();
1054

    
1055
                int col = (int) p.getX() / maxTilePrintWidth;
1056
                int row = (int) p.getY() / maxTilePrintHeight;
1057
                int tileIndex = (row * nCols) + col;
1058

    
1059
                ViewPort vp = null;
1060
                try {
1061
                        vp = tiles.getTileViewPort(viewPort, tileIndex);
1062
                } catch (NoninvertibleTransformException e1) {
1063
                        throw new LoadLayerException("", e1);
1064
                }
1065

    
1066
                getParameters().setExtent(this.getRectable2DFromEnvelope(vp.getAdjustedExtent()));
1067
                if(getParameters().isSizeFixed()) {
1068
                        getParameters().setWidth((int)getParameters().getFixedSize().getWidth());
1069
                        getParameters().setHeight((int)getParameters().getFixedSize().getHeight());
1070
                } else {
1071
                        getParameters().setWidth(vp.getImageWidth());
1072
                        getParameters().setHeight(vp.getImageHeight());
1073
                }
1074
                
1075
                CancelTaskImpl cancellable = new CancelTaskImpl(cancel);
1076
                getParameters().setCancellable(cancellable);
1077
                
1078
                String fInfo;
1079
                try {
1080
                        fInfo = getDataStore().getInfoByPoint(tiledPoint.getX(), tiledPoint.getY(), cancellable);
1081
                } catch (RemoteServiceException e) {
1082
                        throw new LoadLayerException("Error in getInfoByPoint", e);
1083
                }
1084
                return new DynObjectSetWMSInfo(fInfo, DynObjectSetWMSInfo.TYPE_TEXT);
1085
        }
1086
    
1087
    /**
1088
     * Sets the data store parameters
1089
     * @param params
1090
     * @throws InitializeException
1091
     */
1092
    public void setParameters(DataStoreParameters params) throws InitializeException {
1093
            this.params = params;
1094
            
1095
            if(params instanceof TileDataParameters) {
1096
                        ((TileDataParameters)params).deleteCache(deleteCache);
1097
                }
1098
            
1099
            DataManagerProviderServices dataman = (DataManagerProviderServices) DALLocator.getDataManager();
1100
                try {
1101
                        DataStore dStore = dataman.openStore(params.getDataStoreName(), params);
1102
                        this.setDataStore(dStore);
1103
                        
1104
                        if(params instanceof WMSDataParameters) {
1105
                                this.setName(((WMSDataParameters)params).getURI());
1106
                        }
1107
                        
1108
                        if(params instanceof TileDataParameters) {
1109
                                DataParameters p = ((TileDataParameters) params).getDataParameters();
1110
                                if(p instanceof WMSDataParameters) {
1111
                                        this.setName(((WMSDataParameters) p).getURI());
1112
                                }
1113
                        }
1114
                } catch (ValidateDataParametersException e) {
1115
                        throw new InitializeException(e);
1116
                } catch (ProviderNotRegisteredException e) {
1117
                        throw new InitializeException(e);
1118
                } catch (InitializeException e) {
1119
                        throw new InitializeException(e);
1120
                } catch (LoadLayerException e) {
1121
                        throw new InitializeException(e);
1122
                }
1123
    }
1124
    
1125
    @SuppressWarnings("deprecation")
1126
        public WMSDataParameters getParameters() {
1127
            if(params == null) {
1128
                    DataManager datamanager = DALLocator.getDataManager();
1129
                        WMSServerExplorerParameters explorerParams = null;
1130
                        try {
1131
                                explorerParams = (WMSServerExplorerParameters) datamanager.createServerExplorerParameters(WMSServerExplorer.NAME);
1132
                                explorerParams.setHost("");
1133
                                explorer = (WMSServerExplorer) datamanager.createServerExplorer(explorerParams);
1134
                                DataStoreParameters parameters = explorer.getStoreParameters();
1135
                                if(parameters instanceof WMSDataParameters) {
1136
                                        params = (WMSDataParameters) parameters;
1137
                                }
1138
                        } catch (InitializeException e) {
1139
                        } catch (ProviderNotRegisteredException e) {
1140
                        } catch (ValidateDataParametersException e) {
1141
                        }
1142
            }
1143
            return getWMSParameters(params);
1144
    }
1145
    
1146
    /**
1147
     * Gets <code>WMSDataParameters</code>
1148
     * @param parameters
1149
     * @return
1150
     */
1151
    private WMSDataParameters getWMSParameters(DataStoreParameters parameters) {
1152
            WMSDataParameters params = null;
1153
            if(parameters instanceof WMSDataParameters) {
1154
                        params = (WMSDataParameters) parameters;
1155
                }
1156
                
1157
                if(parameters instanceof TileDataParameters) {
1158
                        DataParameters p = ((TileDataParameters) parameters).getDataParameters();
1159
                        if(p instanceof WMSDataParameters) {
1160
                                params = (WMSDataParameters) p;
1161
                        }
1162
                }
1163
                return params;
1164
    }
1165
    
1166
    /**
1167
         * Assigns the flag to delete this layer from the cache
1168
         * @param selected
1169
         */
1170
        public void deleteCache(boolean deleteCache) {
1171
                this.deleteCache = deleteCache;
1172
        }
1173
    
1174
    /**
1175
     * Sets the explorer
1176
     * @param explorer
1177
     */
1178
    public void setExplorer(WMSServerExplorer explorer) {
1179
            this.explorer = explorer;
1180
    }
1181
    
1182
    /**
1183
     * Gets the explorer
1184
     * @return
1185
     */
1186
    public WMSServerExplorer getExplorer() {
1187
            return this.explorer;
1188
    }
1189
    
1190
    /*
1191
         * (non-Javadoc)
1192
         * @see org.gvsig.fmap.mapcontext.layers.FLyrDefault#cloneLayer()
1193
         */
1194
        public FLayer cloneLayer() throws Exception {
1195
                RasterDataStore  ds = dataStore.cloneDataStore();
1196
                FLyrWMS newLayer = new FLyrWMS();
1197
                newLayer.setName(getName());
1198
                newLayer.setOpenRasterStore(ds);
1199
                newLayer.fullEnvelope = fullEnvelope;
1200
                newLayer.params = params;
1201
                //newLayer.firstLoad = firstLoad;
1202
                newLayer.explorer = explorer;
1203
                
1204
                ArrayList<RasterFilter> filters = getRender().getFilterList().getStatusCloned();
1205

    
1206
                //Hacemos una copia de las bandas a renderizar
1207
                if(getRender().getRenderBands() != null) {
1208
                        int[] rb = new int[getRender().getRenderBands().length];
1209
                        for (int i = 0; i < rb.length; i++)
1210
                                rb[i] = getRender().getRenderBands()[i];
1211
                        newLayer.getRender().setRenderBands(rb);
1212
                }
1213

    
1214
                //Asignamos el entorno
1215
                if(newLayer.getRender().getFilterList() == null)
1216
                        newLayer.getRender().setFilterList(RasterLocator.getManager().createEmptyFilterList(getRender().getFilterList().getInitDataType()));
1217
                newLayer.getRender().getFilterList().setEnv(getRender().getFilterList().getEnv());
1218
                newLayer.getRender().getFilterList().setStatus(filters);
1219

    
1220
                // Asignamos los valores noData del original
1221
                newLayer.setNoDataValue(getNoDataValue());
1222
                if(dataStore.getNoDataValue().isDefined())
1223
                        newLayer.setNoDataTransparent(true);
1224
                newLayer.enableOpen();
1225
                
1226
                return newLayer;
1227
        }
1228
        
1229

    
1230
}