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

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.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

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

    
109

    
110

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

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

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

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

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

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

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

    
284
        public static void registerPersistent() {
285
                PersistenceManager manager = ToolsLocator.getPersistenceManager();
286
                DynStruct definition = manager.getDefinition(PERSISTENT_NAME);
287
                if( definition == null ) {
288
                        if (manager.getDefinition(FLyrDefault.class) == null) {
289
                                FLyrDefault.registerPersistent();
290
                        }
291

    
292
                        definition = manager.addDefinition(
293
                                        FLyrWMS.class,
294
                                        PERSISTENT_NAME,
295
                                        PERSISTENT_DESCRIPTION,
296
                                        null, 
297
                                        null
298
                        );
299
                        
300
                        definition.extend(PersistenceManager.PERSISTENCE_NAMESPACE, "FLyrDefault");
301
                }
302

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

    
339
                if (isWithinScale(scale)) {
340

    
341
                        if(mustTileDraw) {
342
                                Point2D p = viewPort.getOffset();
343
                                Rectangle r = new Rectangle((int) p.getX(), (int) p.getY(), viewPort.getImageWidth(), viewPort.getImageHeight());
344
                                Tiling tiles = new Tiling(maxTileDrawWidth, maxTileDrawHeight, r);
345
                                tiles.setAffineTransform((AffineTransform) viewPort.getAffineTransform().clone());
346

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

    
388
                // 2. Compute extent to be requested.
389
                Rectangle2D bBox = new Rectangle2D.Double();
390
                Rectangle2D.intersect(getRectable2DFromEnvelope(vpEnv),
391
                                getRectable2DFromEnvelope(envelope), bBox);
392

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

    
399
                Dimension sz = new Dimension(wImg, hImg);
400

    
401
                if ((wImg <= 0) || (hImg <= 0)) {
402
                        return;
403
                }
404

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

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

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

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

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

    
505
        public void _print(Graphics2D g, ViewPort viewPort, Cancellable cancel,
506
                        double scale) throws ReadException {
507
                draw(null, g, viewPort, cancel,scale);
508
        }
509

    
510
        /**
511
         * Inserta la extensi?n total de la capa.
512
         *
513
         * @param fullExtent
514
         *            Rectangulo.
515
         */
516
        public void setFullExtent(Rectangle2D fullExtent) {
517
                this.setFullEnvelope(this.getEnvelopeFromRectable2D(fullExtent));
518
        }
519

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

    
535
                this.fullEnvelope = envelope;
536
                this.updateDrawVersion();
537
        }
538

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

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

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

    
597
                                // <OnlineResource>
598
                                xmlAttrs.put(WebMapContextTags.XLINK_TYPE, "simple");
599
                                xmlAttrs.put(WebMapContextTags.XLINK_HREF, getParameters().getURI().toString());
600
                                xml.writeTag(WebMapContextTags.ONLINE_RESOURCE, xmlAttrs);
601
                                xmlAttrs.clear();
602
                                // </OnlineResource>
603

    
604
                                xml.closeTag();
605
                                // </Server>
606

    
607
                                // <Name>
608
                                xml.writeTag(WebMapContextTags.NAME, layer.getName().trim());
609
                                // </Name>
610

    
611
                                // <Title>
612
                                xml.writeTag(WebMapContextTags.TITLE, layer.getTitle().trim());
613
                                //?xml.writeTag(WebMapContextTags.TITLE, getName().trim());
614
                                // </Title>
615

    
616
                                // <Abstract>
617
                                if (layer.getAbstract() != null) {
618
                                        xml.writeTag(WebMapContextTags.ABSTRACT, layer.getAbstract());
619
                                        // </Abstract>
620
                                }
621

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

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

    
647
                                // <StyleList>
648
                                xml.openTag(WebMapContextTags.STYLE_LIST);
649

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

    
660
                                                // <Name>
661
                                                xml.writeTag(WebMapContextTags.NAME, st.getName());
662
                                                // </Name>
663

    
664
                                                // <Title>
665
                                                xml.writeTag(WebMapContextTags.TITLE, st.getTitle());
666
                                                // </Title>
667

    
668
                                                // <LegendURL width="180" format="image/gif" height="50">
669
                                                // <OnlineResource xlink:type="simple" xlink:href="http://globe.digitalearth.gov/globe/en/icons/colorbars/NATIONAL.gif"/>
670
                                                // </OnlineResource>
671
                                                // </LegendURL>
672
                                                xml.closeTag();
673
                                                // </Style>
674

    
675
                                        }
676

    
677
                                } else {
678
                                        // Create fake style (for compatibility issues)
679
                                        xmlAttrs.put(WebMapContextTags.CURRENT, "1");
680
                                        // <Style>
681
                                        xml.openTag(WebMapContextTags.STYLE, xmlAttrs);
682
                                        xmlAttrs.clear();
683
                                        // <Name>
684
                                        xml.writeTag(WebMapContextTags.NAME, "default");
685
                                        // </Name>
686

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

    
710
        public String getTocImageIcon() {
711
                return "icon-layer-wms";
712
        }
713

    
714
        /*
715
         *  (non-Javadoc)
716
         * @see com.iver.cit.gvsig.fmap.layers.RasterOperations#getTileSize()
717
         */
718
        public int[] getTileSize() {
719
                int[] size = {maxTileDrawWidth, maxTileDrawHeight};
720
                return size;
721
        }
722

    
723
        /*
724
         *  (non-Javadoc)
725
         * @see com.iver.cit.gvsig.fmap.layers.RasterOperations#isTiled()
726
         */
727
        public boolean isTiled() {
728
                return mustTileDraw;
729
        }
730

    
731
        /* (non-Javadoc)
732
         * @see com.iver.cit.gvsig.fmap.layers.FLayer#newComposedLayer()
733
         */
734
        public ComposedLayer newComposedLayer() {
735
                Preferences prefs = Preferences.userRoot().node("gvsig.wms");
736

    
737
                /*
738
                 * from java.util.prefs import Preferences
739
                 * prefs = Preferences.userRoot().node("gvsig.wms")
740
                 * prefs.put("useComposedLayer","true")
741
                 */
742

    
743
                String str = prefs.get("useComposedLayer","false");
744
                Boolean useComposedLayer = Boolean.TRUE; // por defecto ya se usan
745
                try {
746
                        useComposedLayer = Boolean.valueOf(str);
747
                } catch (Exception e) {
748

    
749
                }
750
                if (useComposedLayer.booleanValue()) {
751
                        return new ComposedLayerWMS();
752
                } else {
753
                        return null;
754
                }
755
        }
756

    
757
        /*
758
         * Checks if can make a single petition for the two layers to the server
759
         * @see com.iver.cit.gvsig.fmap.layers.ComposedLayerWMS#canAdd(com.iver.cit.gvsig.fmap.layers.FLayer)
760
         */
761
        boolean isComposedLayerCompatible(FLayer layer) {
762
                FLyrWMS aLayer;
763

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

    
789

    
790
                // isFixedSize es privado
791
                if ((getParameters().getFixedSize() != null) &&
792
                                (aLayer.getParameters().getFixedSize() != null)) {
793
                        if (getParameters().getFixedSize().equals(aLayer.getParameters().getFixedSize())) {
794
                                return false;
795
                        }
796
                } else if ((getParameters().getFixedSize() != null) != (aLayer.getParameters().getFixedSize() != null)) {
797
                        return false;
798
                }
799

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

    
814
                } else if ((p.getDimensions() != null) != (aLayer.getParameters().getDimensions() != null)) {
815
                        return false;
816
                }
817

    
818
                return true;
819
        }
820

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

    
844
                return super.isActionEnabled(action);
845
        }
846

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

    
863
        /*
864
         * (non-Javadoc)
865
         * @see org.gvsig.fmap.raster.layers.FLyrRasterSE#overviewsSupport()
866
         */
867
        public boolean overviewsSupport() {
868
                return false;
869
        }
870

    
871
        protected void updateDrawVersion() {
872
                if (this.disableUpdateDrawVersion != null){
873

    
874
                        Thread curThread = Thread.currentThread();
875

    
876
                        Thread aThread;
877

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

    
893
        protected void disableUpdateDrawVersion() {
894
                if (this.disableUpdateDrawVersion == null) {
895
                        this.disableUpdateDrawVersion = new ArrayList<WeakReference<Thread>>();
896
                }
897
                this.disableUpdateDrawVersion.add(new WeakReference<Thread>(Thread.currentThread()));
898
        }
899

    
900
        protected void enableUpdateDrawVersion() {
901
                if (this.disableUpdateDrawVersion == null){
902
                        return;
903
                }
904
                Thread curThread = Thread.currentThread();
905
                Thread aThread;
906

    
907
                Iterator<WeakReference<Thread>> iter = this.disableUpdateDrawVersion.iterator();
908
                while (iter.hasNext()) {
909
                        aThread = (Thread) ((WeakReference<?>)iter.next()).get();
910
                        if (aThread == null) {
911
                                iter.remove();
912
                        } else if(aThread.equals(curThread)) {
913
                                iter.remove();
914
                                break;
915
                        }
916
                }
917

    
918
        }
919

    
920
        private Rectangle2D.Double getRectable2DFromEnvelope(Envelope env) {
921
                return new Rectangle2D.Double(env.getMinimum(0), env.getMinimum(1), env
922
                                .getLength(0), env.getLength(1));
923
        }
924

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

    
973
        /**
974
         * Devuelve el envelope en la proyeccion de la vista
975
         */
976
        public Envelope getFullEnvelope() {
977
                Envelope rAux;
978
                rAux = this.fullEnvelope;
979

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

    
1009
        }
1010
        
1011
        /*
1012
         * (non-Javadoc)
1013
         * @see org.gvsig.raster.fmap.layers.FLyrRaster#getFullRasterExtent()
1014
         */
1015
        public Extent getFullRasterExtent() {
1016
                Envelope env = getFullEnvelope();
1017
                double minx = env.getMinimum(0);
1018
                double miny = env.getMinimum(1);
1019
                double maxx = env.getMaximum(0);
1020
                double maxy = env.getMaximum(1);
1021
                Point2D ul = new Point2D.Double(minx, maxy);
1022
                Point2D ur = new Point2D.Double(maxx, maxy);
1023
                Point2D ll = new Point2D.Double(minx, miny);
1024
                Point2D lr = new Point2D.Double(maxx, miny);
1025
                return rManager.getDataStructFactory().createExtent(ul, lr, ur, ll);
1026
        }
1027
        
1028
        public DynObjectSet getInfo(org.gvsig.fmap.geom.primitive.Point p, double tolerance) throws LoadLayerException, DataException {
1029
                Point p1 = new Point((int)p.getX(), (int)p.getY());
1030
                return getInfo(p1, tolerance, null, false);
1031
        }
1032

    
1033
        @Override
1034
        public DynObjectSet getInfo(Point p, double tolerance, Cancellable cancel,
1035
                        boolean fast) throws LoadLayerException, DataException {
1036

    
1037
                //try {
1038
                ViewPort viewPort = getMapContext().getViewPort();
1039

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

    
1184
                //Hacemos una copia de las bandas a renderizar
1185
                if(getRender().getRenderBands() != null) {
1186
                        int[] rb = new int[getRender().getRenderBands().length];
1187
                        for (int i = 0; i < rb.length; i++)
1188
                                rb[i] = getRender().getRenderBands()[i];
1189
                        newLayer.getRender().setRenderBands(rb);
1190
                }
1191

    
1192
                //Asignamos el entorno
1193
                if(newLayer.getRender().getFilterList() == null)
1194
                        newLayer.getRender().setFilterList(RasterLocator.getManager().createEmptyFilterList(getRender().getFilterList().getInitDataType()));
1195
                newLayer.getRender().getFilterList().setEnv(getRender().getFilterList().getEnv());
1196
                newLayer.getRender().getFilterList().setStatus(filters);
1197

    
1198
                // Asignamos los valores noData del original
1199
                newLayer.setNoDataValue(getNoDataValue());
1200
                if(dataStore.getNoDataValue().isDefined())
1201
                        newLayer.setNoDataTransparent(true);
1202
                newLayer.enableOpen();
1203
                
1204
                return newLayer;
1205
        }
1206
        
1207

    
1208
}