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 @ 1864

History | View | Annotate | Download (40.6 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.Point;
28
import java.awt.Rectangle;
29
import java.awt.geom.AffineTransform;
30
import java.awt.geom.NoninvertibleTransformException;
31
import java.awt.geom.Point2D;
32
import java.awt.geom.Rectangle2D;
33
import java.awt.image.BufferedImage;
34
import java.lang.ref.WeakReference;
35
import java.util.ArrayList;
36
import java.util.HashMap;
37
import java.util.Iterator;
38
import java.util.List;
39
import java.util.Vector;
40
import java.util.prefs.Preferences;
41

    
42
import javax.print.attribute.PrintRequestAttributeSet;
43
import javax.swing.JOptionPane;
44

    
45
import org.cresques.cts.ICoordTrans;
46
import org.cresques.cts.IProjection;
47
import org.gvsig.andami.PluginServices;
48
import org.gvsig.fmap.dal.DALLocator;
49
import org.gvsig.fmap.dal.DataManager;
50
import org.gvsig.fmap.dal.DataParameters;
51
import org.gvsig.fmap.dal.DataStore;
52
import org.gvsig.fmap.dal.DataStoreParameters;
53
import org.gvsig.fmap.dal.coverage.RasterLocator;
54
import org.gvsig.fmap.dal.coverage.RasterManager;
55
import org.gvsig.fmap.dal.coverage.datastruct.Extent;
56
import org.gvsig.fmap.dal.coverage.datastruct.ViewPortData;
57
import org.gvsig.fmap.dal.coverage.exception.FilePaletteException;
58
import org.gvsig.fmap.dal.coverage.exception.InfoByPointException;
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.RemoteStoreParameters;
67
import org.gvsig.fmap.dal.coverage.store.parameter.TileDataParameters;
68
import org.gvsig.fmap.dal.exception.DataException;
69
import org.gvsig.fmap.dal.exception.InitializeException;
70
import org.gvsig.fmap.dal.exception.ProviderNotRegisteredException;
71
import org.gvsig.fmap.dal.exception.ReadException;
72
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
73
import org.gvsig.fmap.dal.spi.DataManagerProviderServices;
74
import org.gvsig.fmap.geom.GeometryLocator;
75
import org.gvsig.fmap.geom.GeometryManager;
76
import org.gvsig.fmap.geom.Geometry.SUBTYPES;
77
import org.gvsig.fmap.geom.exception.CreateEnvelopeException;
78
import org.gvsig.fmap.geom.primitive.Envelope;
79
import org.gvsig.fmap.mapcontext.ViewPort;
80
import org.gvsig.fmap.mapcontext.exceptions.LoadLayerException;
81
import org.gvsig.fmap.mapcontext.exceptions.UnsupportedVersionLayerException;
82
import org.gvsig.fmap.mapcontext.layers.FLayer;
83
import org.gvsig.fmap.mapcontext.layers.FLyrDefault;
84
import org.gvsig.fmap.mapcontext.layers.Tiling;
85
import org.gvsig.fmap.mapcontext.layers.operations.ComposedLayer;
86
import org.gvsig.fmap.mapcontext.rendering.legend.ILegend;
87
import org.gvsig.gui.beans.Messages;
88
import org.gvsig.raster.fmap.layers.DefaultFLyrRaster;
89
import org.gvsig.raster.fmap.layers.IRasterLayerActions;
90
import org.gvsig.raster.fmap.layers.NotAvailableStateException;
91
import org.gvsig.raster.fmap.legend.ImageLegend;
92
import org.gvsig.raster.util.CancelTaskImpl;
93
import org.gvsig.raster.wms.app.wmsclient.wmc.WebMapContextTags;
94
import org.gvsig.raster.wms.app.wmsclient.wmc.XmlBuilder;
95
import org.gvsig.raster.wms.io.RemoteWMSStyle;
96
import org.gvsig.raster.wms.io.WMSDataParameters;
97
import org.gvsig.raster.wms.io.WMSLayerNode;
98
import org.gvsig.raster.wms.io.WMSServerExplorer;
99
import org.gvsig.raster.wms.io.WMSServerExplorerParameters;
100
import org.gvsig.tools.ToolsLocator;
101
import org.gvsig.tools.dynobject.DynObjectSet;
102
import org.gvsig.tools.dynobject.DynStruct;
103
import org.gvsig.tools.persistence.PersistenceManager;
104
import org.gvsig.tools.persistence.PersistentState;
105
import org.gvsig.tools.persistence.exception.PersistenceException;
106
import org.gvsig.tools.task.Cancellable;
107
import org.gvsig.tools.task.SimpleTaskStatus;
108
import org.gvsig.tools.task.TaskStatusManager;
109
import org.slf4j.Logger;
110
import org.slf4j.LoggerFactory;
111

    
112

    
113

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

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

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

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

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

    
267
                super.loadFromState(state);
268
                params = getDataStore().getParameters();
269
                this.fullEnvelope = (Envelope) state.get("fullEnvelope");
270
                getParameters().setName((String)state.get("name"));
271
                //En servicios WMS nunca se carga con tabla de color ya que esta cambia para cada petici?n 
272
                //y adem?s no puede ser cambiada por el usuario
273
                this.colorTableLoadedFromProject = null;
274
        }
275

    
276
        /*
277
         * (non-Javadoc)
278
         * @see org.gvsig.raster.fmap.layers.DefaultFLyrRaster#saveToState(org.gvsig.tools.persistence.PersistentState)
279
         */
280
        @Override
281
        public void saveToState(PersistentState state) throws PersistenceException {
282
                super.saveToState(state);
283
                state.set("fullEnvelope", this.fullEnvelope);
284
                state.set("host", getParameters().getURI());
285
                state.set("name", getName());
286
        }
287

    
288
        public static void registerPersistent() {
289
                PersistenceManager manager = ToolsLocator.getPersistenceManager();
290
                DynStruct definition = manager.getDefinition(PERSISTENT_NAME);
291
                if( definition == null ) {
292
                        if (manager.getDefinition(FLyrDefault.class) == null) {
293
                                FLyrDefault.registerPersistent();
294
                        }
295

    
296
                        definition = manager.addDefinition(
297
                                        FLyrWMS.class,
298
                                        PERSISTENT_NAME,
299
                                        PERSISTENT_DESCRIPTION,
300
                                        null, 
301
                                        null
302
                        );
303
                        
304
                        definition.extend(PersistenceManager.PERSISTENCE_NAMESPACE, "FLyrDefault");
305
                }
306

    
307
                DefaultFLyrRaster.registerPersistence(definition);
308
                definition.addDynFieldObject("fullEnvelope").setClassOfValue(Envelope.class).setMandatory(false);
309
                definition.addDynFieldString("host").setMandatory(false);
310
                definition.addDynFieldString("name").setMandatory(false);
311
        }
312
        
313
        /*
314
         * (non-Javadoc)
315
         * @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)
316
         */
317
        public void draw(BufferedImage image, Graphics2D g, ViewPort viewPort,
318
                        Cancellable cancel, double scale) throws ReadException {
319
                TaskStatusManager manager = ToolsLocator.getTaskStatusManager();
320
                SimpleTaskStatus taskStatus = new RasterTaskStatus("Drawing " + getName() + "...", cancel);
321
                manager.add(taskStatus);
322
                taskStatus.setAutoremove(true);
323
                
324
                if(!firstLoad) {
325
                        try {
326
                                initFilters();
327
                        } catch (FilePaletteException e) {
328
                                logger.error(e.getMessage(), this, e);
329
                        }
330
                        firstLoad = true;
331
                }
332
                
333
                callCount = 0;  
334
                
335
                enableStopped();
336
                
337
                if(recalcLevel) {
338
                        double pixelSize = viewPort.getEnvelope().getLength(0) / (double)viewPort.getImageWidth();
339
                        zoomLevel = dataStore.getNearestLevel(pixelSize);
340
                }
341
                recalcLevel = true;
342

    
343
                if (isWithinScale(scale)) {
344

    
345
                        if(mustTileDraw) {
346
                                Point2D p = viewPort.getOffset();
347
                                Rectangle r = new Rectangle((int) p.getX(), (int) p.getY(), viewPort.getImageWidth(), viewPort.getImageHeight());
348
                                Tiling tiles = new Tiling(maxTileDrawWidth, maxTileDrawHeight, r);
349
                                tiles.setAffineTransform((AffineTransform) viewPort.getAffineTransform().clone());
350

    
351
                                for (int tileNr = 0; tileNr < tiles.getNumTiles(); tileNr++) {
352
                                        // drawing part
353
                                        try {
354
                                                ViewPort vp = tiles.getTileViewPort(viewPort, tileNr);
355
                                                drawTile(g, vp, taskStatus, scale);
356
                                        } catch (LoadLayerException e) {
357
                                                throw new ReadException(e.getMessage(), e);
358
                                        } catch (NoninvertibleTransformException e) {
359
                                                throw new ReadException(e.getMessage(), e);
360
                                        }
361
                                }
362
                        } else {
363
                                try {
364
                                        drawTile(g, viewPort, taskStatus, scale);
365
                                } catch (LoadLayerException e) {
366
                                        setAvailable(false);
367
                                        logger.error("Server error:" + e.getMessage(), e);
368
                                }
369
                        }
370
                }
371
                disableStopped();
372
        }
373
        
374
                
375
        /**
376
         * This is the method used to draw a tile in a WMS mosaic layer.
377
         * @throws LoadLayerException
378
         * @throws ReadDriverException
379
         * @return true when a tile has been painted
380
         */
381
        private void drawTile(Graphics2D g, ViewPort vp, SimpleTaskStatus taskStatus, double scale) throws LoadLayerException, ReadException {
382
                callCount++;
383
        
384
                // Compute the query geometry
385
                // 1. Check if it is within borders
386
                Envelope envelope = getFullEnvelope();
387
                Envelope vpEnv = vp.getAdjustedExtent();
388
                if (!vpEnv.intersects(envelope)) {
389
                        return;
390
                }
391

    
392
                // 2. Compute extent to be requested.
393
                Rectangle2D bBox = new Rectangle2D.Double();
394
                Rectangle2D.intersect(getRectable2DFromEnvelope(vpEnv),
395
                                getRectable2DFromEnvelope(envelope), bBox);
396

    
397
                // 3. Compute size in pixels
398
                double scalex = vp.getAffineTransform().getScaleX();
399
                double scaley = vp.getAffineTransform().getScaleY();
400
                int wImg = (int) Math.ceil(Math.abs(bBox.getWidth() * scalex) + 1);
401
                int hImg = (int) Math.ceil(Math.abs(bBox.getHeight() * scaley) + 1);
402

    
403
                Dimension sz = new Dimension(wImg, hImg);
404

    
405
                if ((wImg <= 0) || (hImg <= 0)) {
406
                        return;
407
                }
408

    
409
                try {
410
                        
411
                        Rectangle2D extent = new Rectangle2D.Double();
412
                        Rectangle2D.Double vpExtent = this.getRectable2DFromEnvelope(vpEnv);
413
                        Rectangle2D.intersect(vpExtent, bBox, extent);
414
                        
415
                        Extent ex = rManager.getDataStructFactory().createExtent(
416
                                        vp.getAdjustedEnvelope().getMinimum(0), 
417
                                        vp.getAdjustedEnvelope().getMaximum(1), 
418
                                        vp.getAdjustedEnvelope().getMaximum(0), 
419
                                        vp.getAdjustedEnvelope().getMinimum(1));
420
                        ViewPortData vpData = rManager.getDataStructFactory().createViewPortData(vp.getProjection(), ex, sz );
421
                        vpData.setMat(vp.getAffineTransform());
422

    
423
                        try {
424
                                getParameters().setExtent(bBox);
425
                                if(getParameters().isSizeFixed()) {
426
                                        getParameters().setWidth((int)getParameters().getFixedSize().getWidth());
427
                                        getParameters().setHeight((int)getParameters().getFixedSize().getHeight());
428
                                } else {
429
                                        getParameters().setWidth(wImg);
430
                                        getParameters().setHeight(hImg);
431
                                }
432
                                
433
                                if(params instanceof WMSDataParameters) {
434
                                        getRender().draw(g, vpData, taskStatus);
435
                                } else {
436
                                        Envelope adjustedExtent = vp.getAdjustedExtent();
437
                                        Extent e = rManager.getDataStructFactory().createExtent(adjustedExtent.getLowerCorner().getX(),
438
                                                        adjustedExtent.getUpperCorner().getY(), adjustedExtent.getUpperCorner().getX(),
439
                                                        adjustedExtent.getLowerCorner().getY());
440
                                        ViewPortData vp2 = rManager.getDataStructFactory().createViewPortData(vp.getProjection(), e, vp.getImageSize() );
441
                                        vp2.setMat(vp.getAffineTransform());
442
                                        getParameters().setExtent(ex.toRectangle2D());
443
                                        getRender().drawTiledService(g, vp2, vp.getImageSize(), taskStatus);
444
                                }
445
                                //this.updateDrawVersion();
446
                        } catch (RasterDriverException e) {
447
                                setAvailable(false);
448
                                JOptionPane.showMessageDialog(null, "Problems drawing this layer:" + e.getMessage(), Messages.getText("Error"), JOptionPane.ERROR_MESSAGE);
449
                                logger.info("Problems drawing this layer:" + e.getMessage(), e);
450
                        } catch (InvalidSetViewException e) {
451
                                throw new RemoteServiceException("Problems drawing this layer: " + e.getMessage(), e);
452
                        } catch (ProcessInterruptedException e) {
453
                        } finally {
454
                                taskStatus.terminate();                                
455
                        }
456

    
457
                } catch (RemoteServiceException e) {
458
                        if (!taskStatus.isCancellationRequested()) {
459
                                if (callCount < MAX_RETRY_TIMES) {
460
                                        logger.warn("\n[ FLyrWMS.drawFixedSize() ]  Failed in trying " + callCount + "/" + MAX_RETRY_TIMES + ")\n"); // mess code
461
                                        drawTile(g, vp, taskStatus, scale);
462
                                } else {
463
                                        if (!isPrinting) {
464
                                                this.setVisible(false);
465
                                        }
466
                                        logger.error("Server error:" + e.getMessage(), e);
467
                                }
468
                        }
469
                }
470
                callCount--;
471
                return;
472
        }
473

    
474
        /**
475
         * @see com.iver.cit.gvsig.fmap.layers.FLayer#print(java.awt.Graphics2D,
476
         *                 com.iver.cit.gvsig.fmap.ViewPort,
477
         *                 com.iver.cit.gvsig.fmap.operations.Cancellable)
478
         */
479
        public void print(Graphics2D g, ViewPort viewPort, Cancellable cancel, double scale, PrintRequestAttributeSet properties)
480
        throws ReadException {
481
                TaskStatusManager manager = ToolsLocator.getTaskStatusManager();
482
                SimpleTaskStatus taskStatus = new RasterTaskStatus("Printing " + getName() + "...", cancel);
483
                manager.add(taskStatus);
484
                taskStatus.setAutoremove(true);
485

    
486
                if (isVisible() && isWithinScale(scale)){
487
                        isPrinting = true;
488
                        if (!mustTilePrint) {
489
                                draw(null, g, viewPort, cancel,scale);
490
                        } else {
491
                                Tiling tiles = new Tiling(maxTilePrintWidth, maxTilePrintHeight, g.getClipBounds());
492
                                tiles.setAffineTransform((AffineTransform) viewPort.getAffineTransform().clone());
493
                                for (int tileNr = 0; tileNr < tiles.getNumTiles(); tileNr++) {
494
                                        // Parte que dibuja
495
                                        try {
496
                                                ViewPort vp = tiles.getTileViewPort(viewPort, tileNr);
497
                                                drawTile(g, vp, taskStatus, scale);
498
                                        } catch (NoninvertibleTransformException e) {
499
                                                throw new ReadException(e.getMessage(), e);
500
                                        } catch (LoadLayerException e) {
501
                                                throw new ReadException(e.getMessage(), e);
502
                                        }
503
                                }
504
                        }
505
                        isPrinting = false;
506
                }
507
                taskStatus.terminate();
508
        }
509

    
510
        public void _print(Graphics2D g, ViewPort viewPort, Cancellable cancel,
511
                        double scale) throws ReadException {
512
                draw(null, g, viewPort, cancel,scale);
513
        }
514

    
515
        /**
516
         * Inserta la extensi?n total de la capa.
517
         *
518
         * @param fullExtent
519
         *            Rectangulo.
520
         */
521
        public void setFullExtent(Rectangle2D fullExtent) {
522
                this.setFullEnvelope(this.getEnvelopeFromRectable2D(fullExtent));
523
        }
524

    
525
        /**
526
         * Inserta la extensi?n total de la capa en la proyeccion original.
527
         *
528
         * @param fullExtent
529
         *            Rect?ngulo.
530
         */
531
        public void setFullEnvelope(Envelope envelope) {
532
                Envelope cur = this.getFullEnvelope();
533
                if (cur == envelope) {
534
                        return;
535
                }
536
                if (cur != null && cur.equals(envelope)) {
537
                        return;
538
                }
539

    
540
                this.fullEnvelope = envelope;
541
                this.updateDrawVersion();
542
        }
543

    
544
        public HashMap<String, Object> getProperties() {
545
                HashMap<String, Object> info = new HashMap<String, Object>();
546
                String[] layerNames = getParameters().getLayerQuery().split(",");
547
                Vector<WMSLayerNode> layers = new Vector<WMSLayerNode>(layerNames.length);
548
                try {
549
                        //explorer.connect(null);
550
                        for (int i = 0; i < layerNames.length; i++) {
551
                                layers.add(i, explorer.getLayer(layerNames[i]));
552
                        }
553
                        info.put("name", getName());
554
                        info.put("selectedLayers", layers);
555
                        info.put("host", getParameters().getURI());
556
                        info.put("srs", getParameters().getSRSCode());
557
                        info.put("format", getParameters().getFormat());
558
                        info.put("wmsTransparency", new Boolean(getParameters().isWmsTransparent()));
559
                        info.put("styles", getParameters().getStyles());
560
                        info.put("dimensions", getParameters().getDimensions());
561
                        info.put("fixedSize", getParameters().getFixedSize());
562
                        return info;
563
                } /*catch (WMSException e) {
564
                        JOptionPane.showMessageDialog((Component)PluginServices.getMainFrame(), PluginServices.getText(null, "connect_error"));
565
                }*/ catch (Exception e) {
566
                        e.printStackTrace();
567
                }
568
                return null;
569
        }
570

    
571
        /**
572
         * Creates the part of a OGC's MapContext document that would describe this
573
         * layer(s).
574
         * @param version, The desired version of the resulting document. (1.1.0)
575
         * @return String containing the xml.
576
         * @throws UnsupportedVersionLayerException
577
         */
578
        @SuppressWarnings("unchecked")
579
        public String toMapContext(String mapContextVersion) {
580
                XmlBuilder xml = new XmlBuilder();
581
                
582
                String query = getParameters().getLayerQuery();
583
                String[] layerNames = query.split(",");
584
                String[] styleNames = (String[]) getParameters().getStyles().toArray(new String[0]);
585
                for (int i = 0; i < layerNames.length; i++) {
586
                        WMSLayerNode layer = explorer.getLayer(layerNames[i]);
587
                        HashMap xmlAttrs = new HashMap();
588

    
589
                        // <Layer>
590
                        xmlAttrs.put(WebMapContextTags.HIDDEN, !isVisible() + "");
591
                        xmlAttrs.put(WebMapContextTags.QUERYABLE, explorer.isQueryable() + "");
592
                        xml.openTag(WebMapContextTags.LAYER, xmlAttrs);
593
                        xmlAttrs.clear();
594
                        if (mapContextVersion.equals("1.1.0") || mapContextVersion.equals("1.0.0")) {
595
                                // <Server>
596
                                xmlAttrs.put(WebMapContextTags.SERVICE, WebMapContextTags.WMS);
597
                                xmlAttrs.put(WebMapContextTags.VERSION, explorer.getVersion());
598
                                xmlAttrs.put(WebMapContextTags.SERVER_TITLE, explorer.getServiceTitle());
599
                                xml.openTag(WebMapContextTags.SERVER, xmlAttrs);
600
                                xmlAttrs.clear();
601

    
602
                                // <OnlineResource>
603
                                xmlAttrs.put(WebMapContextTags.XLINK_TYPE, "simple");
604
                                xmlAttrs.put(WebMapContextTags.XLINK_HREF, getParameters().getURI().toString());
605
                                xml.writeTag(WebMapContextTags.ONLINE_RESOURCE, xmlAttrs);
606
                                xmlAttrs.clear();
607
                                // </OnlineResource>
608

    
609
                                xml.closeTag();
610
                                // </Server>
611

    
612
                                // <Name>
613
                                xml.writeTag(WebMapContextTags.NAME, layer.getName().trim());
614
                                // </Name>
615

    
616
                                // <Title>
617
                                xml.writeTag(WebMapContextTags.TITLE, layer.getTitle().trim());
618
                                //?xml.writeTag(WebMapContextTags.TITLE, getName().trim());
619
                                // </Title>
620

    
621
                                // <Abstract>
622
                                if (layer.getAbstract() != null) {
623
                                        xml.writeTag(WebMapContextTags.ABSTRACT, layer.getAbstract());
624
                                        // </Abstract>
625
                                }
626

    
627
                                // <SRS> (a list of available SRS for the enclosing layer)
628
                                String[] strings = (String[]) layer.getAllSrs().toArray(new String[0]);
629
                                String mySRS = strings[0];
630
                                for (int j = 1; j < strings.length; j++) {
631
                                        mySRS += ","+strings[j];
632
                                }
633
                                xml.writeTag(WebMapContextTags.SRS, mySRS);
634
                                // </SRS>
635

    
636
                                // <FormatList>
637
                                xml.openTag(WebMapContextTags.FORMAT_LIST);
638
                                strings = explorer.getFormats();
639
                                for (int j = 0; j < strings.length; j++) {
640
                                        // <Format>
641
                                        String str = strings[j].trim();
642
                                        if (str.equals(getParameters().getFormat())) {
643
                                                xml.writeTag(WebMapContextTags.FORMAT, str, WebMapContextTags.CURRENT, "1");
644
                                        } else {
645
                                                xml.writeTag(WebMapContextTags.FORMAT, str);
646
                                                // </Format>
647
                                        }
648
                                }
649
                                xml.closeTag();
650
                                // </FormatList>
651

    
652
                                // <StyleList>
653
                                xml.openTag(WebMapContextTags.STYLE_LIST);
654

    
655
                                if (layer.getStyles().size() > 0) {
656
                                        for (int j = 0; j < layer.getStyles().size(); j++) {
657
                                                // <Style>
658
                                                RemoteWMSStyle st = layer.getStyles().get(j);
659
                                                if (st.getName().equals(styleNames[i])) {
660
                                                        xmlAttrs.put(WebMapContextTags.CURRENT, "1");
661
                                                }
662
                                                xml.openTag(WebMapContextTags.STYLE, xmlAttrs);
663
                                                xmlAttrs.clear();
664

    
665
                                                // <Name>
666
                                                xml.writeTag(WebMapContextTags.NAME, st.getName());
667
                                                // </Name>
668

    
669
                                                // <Title>
670
                                                xml.writeTag(WebMapContextTags.TITLE, st.getTitle());
671
                                                // </Title>
672

    
673
                                                // <LegendURL width="180" format="image/gif" height="50">
674
                                                // <OnlineResource xlink:type="simple" xlink:href="http://globe.digitalearth.gov/globe/en/icons/colorbars/NATIONAL.gif"/>
675
                                                // </OnlineResource>
676
                                                // </LegendURL>
677
                                                xml.closeTag();
678
                                                // </Style>
679

    
680
                                        }
681

    
682
                                } else {
683
                                        // Create fake style (for compatibility issues)
684
                                        xmlAttrs.put(WebMapContextTags.CURRENT, "1");
685
                                        // <Style>
686
                                        xml.openTag(WebMapContextTags.STYLE, xmlAttrs);
687
                                        xmlAttrs.clear();
688
                                        // <Name>
689
                                        xml.writeTag(WebMapContextTags.NAME, "default");
690
                                        // </Name>
691

    
692
                                        // <Title>
693
                                        xml.writeTag(WebMapContextTags.TITLE, "default");
694
                                        xml.closeTag();
695
                                }
696
                                // </StyleList>
697
                                xml.closeTag();
698
                                if (mapContextVersion.compareTo("1.0.0") > 0) {
699
                                        // <DimensionList>
700
                                        xml.openTag(WebMapContextTags.DIMENSION_LIST);
701
                                        // <Dimension>
702
                                        // </Dimension>
703
                                        xml.closeTag();
704
                                        // </DimensionList>
705
                                }
706
                        } else {
707
                                xml.writeTag("ERROR", PluginServices.getText(this, "unsupported_map_context_version"));
708
                        }
709
                        // </Layer>
710
                        xml.closeTag();
711
                }
712
                return xml.getXML();
713
        }
714

    
715
        public String getTocImageIcon() {
716
                return "icon-layer-wms";
717
        }
718

    
719
        /*
720
         *  (non-Javadoc)
721
         * @see com.iver.cit.gvsig.fmap.layers.RasterOperations#getTileSize()
722
         */
723
        public int[] getTileSize() {
724
                int[] size = {maxTileDrawWidth, maxTileDrawHeight};
725
                return size;
726
        }
727

    
728
        /*
729
         *  (non-Javadoc)
730
         * @see com.iver.cit.gvsig.fmap.layers.RasterOperations#isTiled()
731
         */
732
        public boolean isTiled() {
733
                return mustTileDraw;
734
        }
735

    
736
        /* (non-Javadoc)
737
         * @see com.iver.cit.gvsig.fmap.layers.FLayer#newComposedLayer()
738
         */
739
        public ComposedLayer newComposedLayer() {
740
                Preferences prefs = Preferences.userRoot().node("gvsig.wms");
741

    
742
                /*
743
                 * from java.util.prefs import Preferences
744
                 * prefs = Preferences.userRoot().node("gvsig.wms")
745
                 * prefs.put("useComposedLayer","true")
746
                 */
747

    
748
                String str = prefs.get("useComposedLayer","false");
749
                Boolean useComposedLayer = Boolean.TRUE; // por defecto ya se usan
750
                try {
751
                        useComposedLayer = Boolean.valueOf(str);
752
                } catch (Exception e) {
753

    
754
                }
755
                if (useComposedLayer.booleanValue()) {
756
                        return new ComposedLayerWMS();
757
                } else {
758
                        return null;
759
                }
760
        }
761

    
762
        /*
763
         * Checks if can make a single petition for the two layers to the server
764
         * @see com.iver.cit.gvsig.fmap.layers.ComposedLayerWMS#canAdd(com.iver.cit.gvsig.fmap.layers.FLayer)
765
         */
766
        boolean isComposedLayerCompatible(FLayer layer) {
767
                FLyrWMS aLayer;
768

    
769
                if (!(layer instanceof FLyrWMS)) {
770
                        return false;
771
                }
772
                aLayer = (FLyrWMS)layer;
773
                if (!getParameters().getURI().equals(aLayer.getParameters().getURI())) {
774
                        return false;
775
                }
776
                
777
                WMSDataParameters p = params instanceof WMSDataParameters ? (WMSDataParameters)params : 
778
                        params instanceof TileDataParameters ? (WMSDataParameters)((TileDataParameters) params).getDataParameters() : null;
779
                
780
                if (!p.getFormat().equals(aLayer.getParameters().getFormat())) {
781
                        return false;
782
                }
783
                if (!p.getSRS().equals(aLayer.getParameters().getSRS())) {
784
                        return false;
785
                }
786
                if (p.getInfoLayerQuery() != null) {
787
                        if (!p.getInfoLayerQuery().equals(aLayer.getParameters().getInfoLayerQuery())) {
788
                                return false;
789
                        }
790
                }else if (p.getInfoLayerQuery() != null) {
791
                        return false;
792
                }
793

    
794

    
795
                // isFixedSize es privado
796
                if ((getParameters().getFixedSize() != null) &&
797
                                (aLayer.getParameters().getFixedSize() != null)) {
798
                        if (getParameters().getFixedSize().equals(aLayer.getParameters().getFixedSize())) {
799
                                return false;
800
                        }
801
                } else if ((getParameters().getFixedSize() != null) != (aLayer.getParameters().getFixedSize() != null)) {
802
                        return false;
803
                }
804

    
805
                // time elevation (dimensions)
806
                if ((p.getDimensions() != null) &&
807
                                (aLayer.getParameters().getDimensions() != null)) {
808
                        if (p.getDimensions().size() != aLayer.getParameters().getDimensions().size()) {
809
                                return false;
810
                        } else {
811
                                Iterator<String> iter = p.getDimensions().iterator();
812
                                while (iter.hasNext()) {
813
                                        if (!aLayer.getParameters().getDimensions().contains(iter.next())) {
814
                                                return false;
815
                                        }
816
                                }
817
                        }
818

    
819
                } else if ((p.getDimensions() != null) != (aLayer.getParameters().getDimensions() != null)) {
820
                        return false;
821
                }
822

    
823
                return true;
824
        }
825

    
826
        /*
827
         * (non-Javadoc)
828
         * @see org.gvsig.fmap.raster.layers.FLyrRasterSE#isActionEnabled(int)
829
         */
830
        public boolean isActionEnabled(int action) {
831
                switch (action) {
832
                case IRasterLayerActions.ZOOM_PIXEL_RESOLUTION:
833
                case IRasterLayerActions.FLYRASTER_BAR_TOOLS:
834
                case IRasterLayerActions.BANDS_FILE_LIST:
835
                case IRasterLayerActions.COLOR_TABLE:
836
                case IRasterLayerActions.GEOLOCATION:
837
                case IRasterLayerActions.PANSHARPENING:
838
                case IRasterLayerActions.SAVE_COLORINTERP:
839
                case IRasterLayerActions.SAVEAS:
840
                case IRasterLayerActions.BANDS_RGB:
841
                case IRasterLayerActions.ENHANCED:
842
                case IRasterLayerActions.STATS:
843
                case IRasterLayerActions.NODATA:
844
                        return false;
845
                case IRasterLayerActions.REMOTE_ACTIONS:
846
                        return true;
847
                }
848

    
849
                return super.isActionEnabled(action);
850
        }
851

    
852
        /*
853
         * (non-Javadoc)
854
         * @see org.gvsig.fmap.raster.layers.FLyrRasterSE#getLegend()
855
         */
856
        public ILegend getLegend() {
857
                return new ImageLegend(getDataStore().getImageLegend());
858
        }
859
        
860
        /*
861
         * (non-Javadoc)
862
         * @see org.gvsig.raster.fmap.layers.FLyrRaster#isRemote()
863
         */
864
        public boolean isRemote() {
865
                return true;
866
        }
867

    
868
        /*
869
         * (non-Javadoc)
870
         * @see org.gvsig.fmap.raster.layers.FLyrRasterSE#overviewsSupport()
871
         */
872
        public boolean overviewsSupport() {
873
                return false;
874
        }
875

    
876
        protected void updateDrawVersion() {
877
                if (this.disableUpdateDrawVersion != null){
878

    
879
                        Thread curThread = Thread.currentThread();
880

    
881
                        Thread aThread;
882

    
883
                        Iterator<WeakReference<Thread>> iter = this.disableUpdateDrawVersion.iterator();
884
                        while (iter.hasNext()){
885
                                aThread = (Thread) ((WeakReference<?>)iter.next()).get();
886
                                if (aThread == null){
887
                                        iter.remove();
888
                                } else if(aThread.equals(curThread)){
889
                                        return;
890
                                }
891
                        }
892
                }
893
                //                Exception ex = new Exception();
894
                //                ex.printStackTrace();
895
                super.updateDrawVersion();
896
        }
897

    
898
        protected void disableUpdateDrawVersion() {
899
                if (this.disableUpdateDrawVersion == null) {
900
                        this.disableUpdateDrawVersion = new ArrayList<WeakReference<Thread>>();
901
                }
902
                this.disableUpdateDrawVersion.add(new WeakReference<Thread>(Thread.currentThread()));
903
        }
904

    
905
        protected void enableUpdateDrawVersion() {
906
                if (this.disableUpdateDrawVersion == null){
907
                        return;
908
                }
909
                Thread curThread = Thread.currentThread();
910
                Thread aThread;
911

    
912
                Iterator<WeakReference<Thread>> iter = this.disableUpdateDrawVersion.iterator();
913
                while (iter.hasNext()) {
914
                        aThread = (Thread) ((WeakReference<?>)iter.next()).get();
915
                        if (aThread == null) {
916
                                iter.remove();
917
                        } else if(aThread.equals(curThread)) {
918
                                iter.remove();
919
                                break;
920
                        }
921
                }
922

    
923
        }
924

    
925
        private Rectangle2D.Double getRectable2DFromEnvelope(Envelope env) {
926
                return new Rectangle2D.Double(env.getMinimum(0), env.getMinimum(1), env
927
                                .getLength(0), env.getLength(1));
928
        }
929

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

    
978
        /**
979
         * Devuelve el envelope en la proyeccion de la vista
980
         */
981
        public Envelope getFullEnvelope() {
982
                Envelope rAux;
983
                rAux = this.fullEnvelope;
984

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

    
1014
        }
1015
        
1016
        /*
1017
         * (non-Javadoc)
1018
         * @see org.gvsig.raster.fmap.layers.FLyrRaster#getFullRasterExtent()
1019
         */
1020
        public Extent getFullRasterExtent() {
1021
                return getExtentFromEnvelope(getFullEnvelope());
1022
        }
1023
        
1024
        public DynObjectSet getInfo(org.gvsig.fmap.geom.primitive.Point p, double tolerance) throws LoadLayerException, DataException {
1025
                Point p1 = new Point((int)p.getX(), (int)p.getY());
1026
                return getInfo(p1, tolerance, null, false);
1027
        }
1028

    
1029
        @Override
1030
        public DynObjectSet getInfo(Point p, double tolerance, Cancellable cancel,
1031
                        boolean fast) throws LoadLayerException, DataException {
1032

    
1033
                //try {
1034
                ViewPort viewPort = getMapContext().getViewPort();
1035

    
1036
                getParameters().setExtent(this.getRectable2DFromEnvelope(viewPort.getAdjustedEnvelope()));
1037
                if(getParameters().isSizeFixed()) {
1038
                        getParameters().setWidth((int)getParameters().getFixedSize().getWidth());
1039
                        getParameters().setHeight((int)getParameters().getFixedSize().getHeight());
1040
                } else {
1041
                        getParameters().setWidth(viewPort.getImageWidth());
1042
                        getParameters().setHeight(viewPort.getImageHeight());
1043
                }
1044
                
1045
                CancelTaskImpl cancellable = new CancelTaskImpl(cancel);
1046
                getParameters().setCancellable(cancellable);
1047
                
1048
                String fInfo;
1049
                try {
1050
                        //Point2D pt = new Point2D.Double();
1051
                        //try {
1052
                                //viewPort.getAffineTransform().transform(p, pt);
1053
                        /*} catch (NoninvertibleTransformException e) {
1054
                                return null;
1055
                        }*/
1056
                        
1057
                        Extent bbox = getExtentFromEnvelope(viewPort.getAdjustedEnvelope());
1058
                        fInfo = getDataStore().getInfoByPoint(p.getX(), 
1059
                                        p.getY(), 
1060
                                        bbox, 
1061
                                        viewPort.getImageWidth(), 
1062
                                        viewPort.getImageHeight(), 
1063
                                        cancellable);
1064
                } catch (InfoByPointException e) {
1065
                        throw new LoadLayerException("Error in getInfoByPoint", e);
1066
                }
1067
                return new DynObjectSetWMSInfo(fInfo, getParameters().getInfoFormat());
1068
        }
1069
        
1070
        private Extent getExtentFromEnvelope(Envelope env) {
1071
                double minx = env.getMinimum(0);
1072
                double miny = env.getMinimum(1);
1073
                double maxx = env.getMaximum(0);
1074
                double maxy = env.getMaximum(1);
1075
                Point2D ul = new Point2D.Double(minx, maxy);
1076
                Point2D ur = new Point2D.Double(maxx, maxy);
1077
                Point2D ll = new Point2D.Double(minx, miny);
1078
                Point2D lr = new Point2D.Double(maxx, miny);
1079
                return rManager.getDataStructFactory().createExtent(ul, lr, ur, ll);
1080
        }
1081
    
1082
    /**
1083
     * Sets the data store parameters
1084
     * @param params
1085
     * @throws InitializeException
1086
     */
1087
    public void setParameters(DataStoreParameters params) throws InitializeException {
1088
            this.params = params;
1089
            
1090
            if(params instanceof TileDataParameters) {
1091
                        ((TileDataParameters)params).deleteCache(deleteCache);
1092
                }
1093
            
1094
            DataManagerProviderServices dataman = (DataManagerProviderServices) DALLocator.getDataManager();
1095
                try {
1096
                        DataStore dStore = dataman.openStore(params.getDataStoreName(), params);
1097
                        this.setDataStore(dStore);
1098
                        
1099
                        if(params instanceof WMSDataParameters) {
1100
                                this.setName(((WMSDataParameters)params).getURI());
1101
                        }
1102
                        
1103
                        if(params instanceof TileDataParameters) {
1104
                                DataParameters p = ((TileDataParameters) params).getDataParameters();
1105
                                if(p instanceof WMSDataParameters) {
1106
                                        this.setName(((WMSDataParameters) p).getURI());
1107
                                }
1108
                        }
1109
                } catch (ValidateDataParametersException e) {
1110
                        throw new InitializeException(e);
1111
                } catch (ProviderNotRegisteredException e) {
1112
                        throw new InitializeException(e);
1113
                } catch (LoadLayerException e) {
1114
                        throw new InitializeException(e);
1115
                }
1116
    }
1117
    
1118
        public WMSDataParameters getParameters() {
1119
            if(params == null) {
1120
                    DataManager datamanager = DALLocator.getDataManager();
1121
                        WMSServerExplorerParameters explorerParams = null;
1122
                        try {
1123
                                explorerParams = (WMSServerExplorerParameters) datamanager.createServerExplorerParameters(WMSServerExplorer.NAME);
1124
                                explorerParams.setHost("");
1125
                                explorer = (WMSServerExplorer) datamanager.createServerExplorer(explorerParams);
1126
                                DataStoreParameters parameters = explorer.getStoreParameters();
1127
                                if(parameters instanceof WMSDataParameters) {
1128
                                        params = (WMSDataParameters) parameters;
1129
                                }
1130
                        } catch (InitializeException e) {
1131
                        } catch (ProviderNotRegisteredException e) {
1132
                        } catch (ValidateDataParametersException e) {
1133
                        }
1134
            }
1135
            return getWMSParameters(params);
1136
    }
1137
    
1138
    /**
1139
     * Gets <code>WMSDataParameters</code>
1140
     * @param parameters
1141
     * @return
1142
     */
1143
    private WMSDataParameters getWMSParameters(DataStoreParameters parameters) {
1144
            WMSDataParameters params = null;
1145
            if(parameters instanceof WMSDataParameters) {
1146
                        params = (WMSDataParameters) parameters;
1147
                }
1148
                
1149
                if(parameters instanceof TileDataParameters) {
1150
                        DataParameters p = ((TileDataParameters) parameters).getDataParameters();
1151
                        if(p instanceof WMSDataParameters) {
1152
                                params = (WMSDataParameters) p;
1153
                        }
1154
                }
1155
                return params;
1156
    }
1157
    
1158
    /**
1159
         * Assigns the flag to delete this layer from the cache
1160
         * @param selected
1161
         */
1162
        public void deleteCache(boolean deleteCache) {
1163
                this.deleteCache = deleteCache;
1164
        }
1165
    
1166
    /**
1167
     * Sets the explorer
1168
     * @param explorer
1169
     */
1170
    public void setExplorer(WMSServerExplorer explorer) {
1171
            this.explorer = explorer;
1172
    }
1173
    
1174
    /**
1175
     * Gets the explorer
1176
     * @return
1177
     */
1178
    public WMSServerExplorer getExplorer() {
1179
            return this.explorer;
1180
    }
1181
    
1182
    /*
1183
         * (non-Javadoc)
1184
         * @see org.gvsig.fmap.mapcontext.layers.FLyrDefault#cloneLayer()
1185
         */
1186
        public FLayer cloneLayer() throws Exception {
1187
                RasterDataStore  ds = dataStore.cloneDataStore();
1188
                FLyrWMS newLayer = new FLyrWMS();
1189
                newLayer.setName(getName());
1190
                newLayer.setOpenRasterStore(ds);
1191
                newLayer.fullEnvelope = fullEnvelope;
1192
                newLayer.params = params;
1193
                //newLayer.firstLoad = firstLoad;
1194
                newLayer.explorer = explorer;
1195
                
1196
                List<RasterFilter> filters = getRender().getFilterList().getStatusCloned();
1197

    
1198
                //Hacemos una copia de las bandas a renderizar
1199
                if(getRender().getRenderBands() != null) {
1200
                        int[] rb = new int[getRender().getRenderBands().length];
1201
                        for (int i = 0; i < rb.length; i++)
1202
                                rb[i] = getRender().getRenderBands()[i];
1203
                        newLayer.getRender().setRenderBands(rb);
1204
                }
1205

    
1206
                //Asignamos el entorno
1207
                if(newLayer.getRender().getFilterList() == null)
1208
                        newLayer.getRender().setFilterList(RasterLocator.getManager().createEmptyFilterList(getRender().getFilterList().getInitDataType()));
1209
                newLayer.getRender().getFilterList().setEnv(getRender().getFilterList().getEnv());
1210
                newLayer.getRender().getFilterList().setStatus(filters);
1211

    
1212
                // Asignamos los valores noData del original
1213
                newLayer.setNoDataValue(getNoDataValue());
1214
                if(dataStore.getNoDataValue().isDefined())
1215
                        newLayer.setNoDataTransparent(true);
1216
                newLayer.enableOpen();
1217
                
1218
                return newLayer;
1219
        }
1220
        
1221

    
1222
}