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

History | View | Annotate | Download (39.9 KB)

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

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

    
44
import javax.print.attribute.PrintRequestAttributeSet;
45

    
46
import org.cresques.cts.ICoordTrans;
47
import org.cresques.cts.IProjection;
48
import org.gvsig.andami.PluginServices;
49
import org.gvsig.compat.net.ICancellable;
50
import org.gvsig.fmap.dal.DALLocator;
51
import org.gvsig.fmap.dal.DataManager;
52
import org.gvsig.fmap.dal.DataStore;
53
import org.gvsig.fmap.dal.DataStoreParameters;
54
import org.gvsig.fmap.dal.DataTypes;
55
import org.gvsig.fmap.dal.coverage.RasterLocator;
56
import org.gvsig.fmap.dal.coverage.RasterManager;
57
import org.gvsig.fmap.dal.coverage.datastruct.Extent;
58
import org.gvsig.fmap.dal.coverage.datastruct.RemoteStyle;
59
import org.gvsig.fmap.dal.coverage.datastruct.ViewPortData;
60
import org.gvsig.fmap.dal.coverage.exception.FilePaletteException;
61
import org.gvsig.fmap.dal.coverage.exception.InvalidSetViewException;
62
import org.gvsig.fmap.dal.coverage.exception.ProcessInterruptedException;
63
import org.gvsig.fmap.dal.coverage.exception.RasterDriverException;
64
import org.gvsig.fmap.dal.coverage.exception.RemoteServiceException;
65
import org.gvsig.fmap.dal.coverage.explorer.WMSServerExplorer;
66
import org.gvsig.fmap.dal.coverage.explorer.WMSServerExplorerParameters;
67
import org.gvsig.fmap.dal.coverage.grid.RasterFilter;
68
import org.gvsig.fmap.dal.coverage.store.RasterDataParameters;
69
import org.gvsig.fmap.dal.coverage.store.RasterDataStore;
70
import org.gvsig.fmap.dal.coverage.store.parameter.WMSDataParameters;
71
import org.gvsig.fmap.dal.coverage.store.parameter.WMTSDataParameters;
72
import org.gvsig.fmap.dal.coverage.store.remote.RemoteWMSLayerNode;
73
import org.gvsig.fmap.dal.coverage.util.ProviderServices;
74
import org.gvsig.fmap.dal.exception.DataException;
75
import org.gvsig.fmap.dal.exception.InitializeException;
76
import org.gvsig.fmap.dal.exception.ProviderNotRegisteredException;
77
import org.gvsig.fmap.dal.exception.ReadException;
78
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
79
import org.gvsig.fmap.dal.spi.DataManagerProviderServices;
80
import org.gvsig.fmap.geom.GeometryLocator;
81
import org.gvsig.fmap.geom.GeometryManager;
82
import org.gvsig.fmap.geom.Geometry.SUBTYPES;
83
import org.gvsig.fmap.geom.exception.CreateEnvelopeException;
84
import org.gvsig.fmap.geom.primitive.Envelope;
85
import org.gvsig.fmap.mapcontext.ViewPort;
86
import org.gvsig.fmap.mapcontext.exceptions.LoadLayerException;
87
import org.gvsig.fmap.mapcontext.exceptions.UnsupportedVersionLayerException;
88
import org.gvsig.fmap.mapcontext.layers.FLayer;
89
import org.gvsig.fmap.mapcontext.layers.Tiling;
90
import org.gvsig.fmap.mapcontext.layers.operations.ComposedLayer;
91
import org.gvsig.fmap.mapcontext.layers.operations.IHasImageLegend;
92
import org.gvsig.fmap.mapcontext.rendering.legend.ILegend;
93
import org.gvsig.raster.fmap.layers.DefaultFLyrRaster;
94
import org.gvsig.raster.fmap.layers.IRasterLayerActions;
95
import org.gvsig.raster.fmap.layers.NotAvailableStateException;
96
import org.gvsig.raster.util.CancelTaskImpl;
97
import org.gvsig.raster.wms.app.wmsclient.wmc.WebMapContextTags;
98
import org.gvsig.raster.wms.app.wmsclient.wmc.XmlBuilder;
99
import org.gvsig.tools.ToolsLocator;
100
import org.gvsig.tools.dynobject.DynClass;
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.slf4j.Logger;
108
import org.slf4j.LoggerFactory;
109

    
110

    
111

    
112
/**
113
 * FMap's WMS Layer class.
114
 *
115
 * Las capas WMS son tileadas para descargarlas del servidor. Esto quiere decir que
116
 * est?n formadas por multiples ficheros raster. Por esto la fuente de datos raster (IRasterDatasource)
117
 * de la capa FLyrWMS es un objeto de tipo CompositeDataset. Este objeto est? compuesto por un array
118
 * bidimensional de MultiRasterDataset. Cada uno de los MultiRasterDataset corresponde con un tile
119
 * salvado en disco. Estos MultiRasterDataset se crean cada vez que se repinta ya que en WMS a cada
120
 * zoom varian los ficheros fuente. La secuencia de creaci?n de un CompositeDataset ser?a la siguiente:
121
 * <UL>
122
 * <LI>Se hace una petici?n de dibujado por parte del usuario llamando al m?todo draw de FLyrWMS</LI>
123
 * <LI>Se tilea la petici?n</LI>
124
 * <LI>Cada tile se dibuja abriendo una FLyerRaster para ese tile</LI>
125
 * <LI>Si es el primer dibujado se guarda una referencia en la capa WMS a las propiedades de renderizado, orden de bandas,
126
 * transparencia, filtros aplicados, ...</LI>
127
 * <LI>Si no es el primer dibujado se asignan las propiedades de renderizado cuya referencia se guarda en la capa WMS</LI>
128
 * <LI>Se guarda el MultiRasterDataset de cada tile</LI>
129
 * <LI>Al acabar todos los tiles creamos un CompositeDataset con los MultiRasterDataset de todos los tiles</LI>
130
 * <LI>Asignamos a la capa la referencia de las propiedades de renderizado que tenemos almacenadas. De esta forma si hay
131
 * alguna modificaci?n desde el cuadro de propiedades ser? efectiva sobre los tiles que se dibujan.</LI>
132
 * </UL>
133
 *
134
 *
135
 * @author Jaume Dominguez Faus
136
 *
137
 */
138
public class FLyrWMS extends DefaultFLyrRaster implements IHasImageLegend {
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 WMSDataParameters            params                    = null;
158
        private WMSServerExplorer            explorer                  = null;
159

    
160
        public FLyrWMS() {
161
                super();
162
                this.updateDrawVersion();
163
                try {
164
                        enableAwake();
165
                } catch (NotAvailableStateException e) {
166
                        logger.error("Fallo el estado de open. Closed=" + isClosed() + " Awake=" + isAwake(), this, e);
167
                }
168
        }
169
        
170
        public static DataStore createDataStore(String host, IProjection srs) throws InitializeException {
171
                ProviderServices pServ = RasterLocator.getManager().getProviderServices();
172
                RasterDataParameters params = pServ.createParameters(host, WMSServerExplorer.TYPE_WMS);
173
                params.setURI(host);
174
                params.setSRS(srs);
175

    
176
                DataManagerProviderServices dataman = (DataManagerProviderServices) DALLocator.getDataManager();
177
                try {
178
                        return dataman.openStore(params.getDataStoreName(), params);
179
                } catch (ValidateDataParametersException e) {
180
                        throw new InitializeException(e);
181
                } catch (ProviderNotRegisteredException e) {
182
                        throw new InitializeException(e);
183
                }
184
        }
185

    
186
        /*
187
         * (non-Javadoc)
188
         * @see org.gvsig.fmap.mapcontext.layers.operations.SingleLayer#setDataStore(org.gvsig.fmap.dal.DataStore)
189
         */
190
        public void setDataStore(DataStore dataStore) throws LoadLayerException {
191
                this.dataStore = (RasterDataStore) dataStore;
192
                try {
193
                        if(!this.dataStore.isOpen())
194
                                enableOpen();
195
                } catch (NotAvailableStateException e) {
196
                        logger.error("Fallo el estado de open. Closed=" + isClosed() + " Awake=" + isAwake(), this, e);
197
                }
198
                setProjection(this.dataStore.getProjection());
199
        }
200

    
201
        /**
202
         * It choose the best format to load different maps if the server
203
         * supports it. This format could be png, because it supports
204
         * transparency.
205
         * @param formats
206
         * Arraywith all the formats supported by the server
207
         * @return
208
         */
209
        @SuppressWarnings("unused")
210
        private String getGreatFormat(Vector<String> formats){
211
                for (int i=0 ; i<formats.size() ; i++){
212
                        String format = (String) formats.get(i);
213
                        if (format.equals("image/jpg")){
214
                                return format;
215
                        }
216
                        if (format.equals("image/jpeg")){
217
                                return format;
218
                        }
219
                }
220

    
221
                return (String)formats.get(0);
222
        }
223

    
224

    
225
        @SuppressWarnings("unchecked")
226
        @Override
227
        public void loadFromState(PersistentState state)
228
        throws PersistenceException {
229
                super.loadFromState(state);
230

    
231
                this.fullEnvelope = (Envelope) state.get("fullExtent");
232

    
233
                // Host
234
                getParameters().setHost((String)state.get("host"));
235

    
236
                // Part of the query that is not the host, or the
237
                // layer names, or other not listed bellow
238
                getParameters().setInfoLayerQuery(state.getString("infoLayerQuery"));
239

    
240
                // Part of the query containing the layer names
241
                getParameters().setLayerQuery(state.getString("layerQuery"));
242

    
243
                // Format
244
                getParameters().setFormat(state.getString("format"));
245

    
246
                // SRS
247
                getParameters().setSRS(state.getString("srs"));
248

    
249
                // Transparency
250
                if (state.hasValue("wms_transparency")) {
251
                        getParameters().setWmsTransparency(state.getBoolean("wms_transparency"));
252
                }
253

    
254
                // Styles
255
                if (state.hasValue("styles")){
256
                        getParameters().setStyles(new Vector(state.getList("styles")));
257
                }
258

    
259
                // Dimensions
260
                if (state.hasValue("dimensions")){
261
                        getParameters().setDimensions(new Vector(state.getList("dimensions")));
262
                }
263

    
264
                // OnlineResources
265
                if (state.hasValue("onlineResources")) {
266
                        getParameters().setOnlineResources(new Hashtable(state.getMap("onlineResources")));
267
                }
268

    
269
                // Queryable
270
                if (state.hasValue("queryable")) {
271
                        getParameters().setQueryable(state.getBoolean("queryable"));
272
                }
273

    
274
                // fixedSize
275
                if (state.hasValue("fixedSize")) {
276
                        getParameters().setFixedSize((Dimension) state.get("fixedSize"));
277
                } else {
278
                        getParameters().setFixedSize(null);
279
                }
280
        }
281

    
282
        @Override
283
        public void saveToState(PersistentState state) throws PersistenceException {
284
                super.saveToState(state);
285

    
286
                state.set("fullEnvelope", this.fullEnvelope);
287

    
288
                // Host
289
                state.set("host", getParameters().getHost());
290

    
291
                // Part of the query that is not the host, or the
292
                // layer names, or other not listed bellow
293
                state.set("infoLayerQuery", getParameters().getInfoLayerQuery());
294

    
295
                // Part of the query containing the layer names
296
                state.set("layerQuery", getParameters().getLayerQuery());
297

    
298
                // Format
299
                state.set("format", getParameters().getFormat());
300

    
301
                // SRS
302
                state.set("srs", getParameters().getSRSCode());
303

    
304
                // Transparency
305
                state.set("wms_transparency", getParameters().isWmsTransparent());
306

    
307
                // Styles
308
                if (getParameters().getStyles() != null) {
309
                        state.set("styles", getParameters().getStyles());
310
                }
311

    
312
                // Dimensions
313
                if (getParameters().getDimensions() != null){
314
                        state.set("dimensions", getParameters().getDimensions());
315
                }
316

    
317
                // OnlineResources
318
                state.set("onlineResources", getParameters().getOnlineResource());
319

    
320
                // Queryable
321
                state.set("queryable", getParameters().isQueryable());
322

    
323
                // fixedSize
324
                if (getParameters().isSizeFixed()) {
325
                        state.set("fixedSize", getParameters().getFixedSize());
326
                }
327
        }
328

    
329
        public static void registerPersistent() {
330
                PersistenceManager manager = ToolsLocator.getPersistenceManager();
331
                DynStruct definition = manager.getDefinition(PERSISTENT_NAME);
332
                if( definition == null ) {
333
                        DefaultFLyrRaster.registerPersistent();
334
                        definition = manager.addDefinition(
335
                                        FLyrWMS.class,
336
                                        PERSISTENT_NAME,
337
                                        PERSISTENT_DESCRIPTION,
338
                                        null, 
339
                                        null
340
                        );
341
                        definition.extend(
342
                                        (DynClass)ToolsLocator.getPersistenceManager()
343
                                                .getDefinition(DefaultFLyrRaster.class)
344
                        );
345
        
346
                        definition.addDynFieldObject("fullExtent")
347
                                .setType(DataTypes.ENVELOPE)
348
                                .setMandatory(true);
349
                        definition.addDynFieldURL("host")
350
                                .setMandatory(true);
351
                        definition.addDynFieldString("infoLayerQuery").setMandatory(true);                
352
                        definition.addDynFieldString("layerQuery").setMandatory(true);
353
                        definition.addDynFieldString("format").setMandatory(true);
354
                        definition.addDynFieldString("srs").setMandatory(true);
355
                        definition.addDynFieldBoolean("wms_transparency").setMandatory(true);
356
                        definition.addDynFieldList("styles")
357
                                .setClassOfItems(String.class)
358
                                .setMandatory(false);
359
                        definition.addDynFieldList("dimensions")
360
                                .setClassOfItems(String.class)
361
                                .setMandatory(false);
362
                        definition.addDynFieldMap("onlineResources")
363
                                .setClassOfItems(String.class)
364
                                .setMandatory(true);
365
                        definition.addDynFieldBoolean("queryable").setMandatory(false);
366
                        definition.addDynFieldObject("fixedSize")
367
                                .setClassOfValue(Dimension.class)
368
                                .setMandatory(false);
369
                }
370
        }
371
        
372
        /*
373
         * (non-Javadoc)
374
         * @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)
375
         */
376
        public void draw(BufferedImage image, Graphics2D g, ViewPort viewPort,
377
                        Cancellable cancel, double scale) throws ReadException {
378
                CancelTaskImpl cancellable = new CancelTaskImpl(cancel);
379
                
380
                if(!firstLoad) {
381
                        try {
382
                                initFilters();
383
                        } catch (FilePaletteException e) {
384
                                logger.error(e.getMessage(), this, e);
385
                        }
386
                        firstLoad = true;
387
                }
388
                
389
                callCount = 0;  
390
                
391
                enableStopped();
392

    
393
                if (isWithinScale(scale)) {
394

    
395
                        if(mustTileDraw) {
396
                                Point2D p = viewPort.getOffset();
397
                                Rectangle r = new Rectangle((int) p.getX(), (int) p.getY(), viewPort.getImageWidth(), viewPort.getImageHeight());
398
                                Tiling tiles = new Tiling(maxTileDrawWidth, maxTileDrawHeight, r);
399
                                tiles.setAffineTransform((AffineTransform) viewPort.getAffineTransform().clone());
400

    
401
                                for (int tileNr = 0; tileNr < tiles.getNumTiles(); tileNr++) {
402
                                        // drawing part
403
                                        try {
404
                                                ViewPort vp = tiles.getTileViewPort(viewPort, tileNr);
405
                                                drawTile(g, vp, cancellable, scale);
406
                                        } catch (LoadLayerException e) {
407
                                                throw new ReadException(e.getMessage(), e);
408
                                        } catch (NoninvertibleTransformException e) {
409
                                                throw new ReadException(e.getMessage(), e);
410
                                        }
411
                                }
412
                        } else {
413
                                try {
414
                                        drawTile(g, viewPort, cancellable, scale);
415
                                } catch (LoadLayerException e) {
416
                                        throw new ReadException(e.getMessage(), e);
417
                                }
418
                        }
419
                }
420
                disableStopped();
421
        }
422
        
423
                
424
        /**
425
         * This is the method used to draw a tile in a WMS mosaic layer.
426
         * @throws LoadLayerException
427
         * @throws ReadDriverException
428
         * @return true when a tile has been painted
429
         */
430
        @SuppressWarnings("deprecation")
431
        private void drawTile(Graphics2D g, ViewPort vp, ICancellable cancel, double scale) throws LoadLayerException, ReadException {
432
                callCount++;
433
        
434
                // Compute the query geometry
435
                // 1. Check if it is within borders
436
                Envelope envelope = getFullEnvelope();
437
                Envelope vpEnv = vp.getAdjustedExtent();
438
                if (!vpEnv.intersects(envelope)) {
439
                        return;
440
                }
441

    
442
                // 2. Compute extent to be requested.
443
                Rectangle2D bBox = new Rectangle2D.Double();
444
                Rectangle2D.intersect(getRectable2DFromEnvelope(vpEnv),
445
                                getRectable2DFromEnvelope(envelope), bBox);
446

    
447
                // 3. Compute size in pixels
448
                double scalex = vp.getAffineTransform().getScaleX();
449
                double scaley = vp.getAffineTransform().getScaleY();
450
                int wImg = (int) Math.ceil(Math.abs(bBox.getWidth() * scalex) + 1);
451
                int hImg = (int) Math.ceil(Math.abs(bBox.getHeight() * scaley) + 1);
452

    
453
                Dimension sz = new Dimension(wImg, hImg);
454

    
455
                if ((wImg <= 0) || (hImg <= 0)) {
456
                        return;
457
                }
458

    
459
                try {
460
                        
461
                        Rectangle2D extent = new Rectangle2D.Double();
462
                        Rectangle2D.Double vpExtent = this.getRectable2DFromEnvelope(vpEnv);
463
                        Rectangle2D.intersect(vpExtent, bBox, extent);
464
                        
465
                        Extent ex = rManager.getDataStructFactory().createExtent(
466
                                        vp.getAdjustedEnvelope().getMinimum(0), 
467
                                        vp.getAdjustedEnvelope().getMaximum(1), 
468
                                        vp.getAdjustedEnvelope().getMaximum(0), 
469
                                        vp.getAdjustedEnvelope().getMinimum(1));
470
                        ViewPortData vpData = rManager.createViewPortData(vp.getProjection(), ex, sz );
471
                        vpData.setMat(vp.getAffineTransform());
472

    
473
                        try {
474
                                getParameters().setExtent(bBox);
475
                                if(getParameters().isSizeFixed()) {
476
                                        getParameters().setWidth((int)getParameters().getFixedSize().getWidth());
477
                                        getParameters().setHeight((int)getParameters().getFixedSize().getHeight());
478
                                } else {
479
                                        getParameters().setWidth(wImg);
480
                                        getParameters().setHeight(hImg);
481
                                }
482
                                getParameters().setCancellable(cancel);
483
                                getRender().draw(g, vpData);
484
                                //this.updateDrawVersion();
485
                        } catch (RasterDriverException e) {
486
                                throw new RemoteServiceException("Problems drawing this layer: " + e.getMessage(), e);
487
                        } catch (InvalidSetViewException e) {
488
                                throw new RemoteServiceException("Problems drawing this layer: " + e.getMessage(), e);
489
                        } catch (ProcessInterruptedException e) {
490
                        }
491

    
492
                } catch (RemoteServiceException e) {
493
                        if (!cancel.isCanceled()) {
494
                                if (callCount < MAX_RETRY_TIMES) {
495
                                        logger.warn("\n[ FLyrWMS.drawFixedSize() ]  Failed in trying " + callCount + "/" + MAX_RETRY_TIMES + ")\n"); // mess code
496
                                        drawTile(g, vp, cancel, scale);
497
                                } else {
498
                                        if (!isPrinting) {
499
                                                this.setVisible(false);
500
                                        }
501
                                        throw new LoadLayerException(getName(), e);
502
                                }
503
                        }
504
                }
505
                callCount--;
506
                return;
507
        }
508

    
509
        /**
510
         * @see com.iver.cit.gvsig.fmap.layers.FLayer#print(java.awt.Graphics2D,
511
         *                 com.iver.cit.gvsig.fmap.ViewPort,
512
         *                 com.iver.cit.gvsig.fmap.operations.Cancellable)
513
         */
514
        public void print(Graphics2D g, ViewPort viewPort, Cancellable cancel, double scale, PrintRequestAttributeSet properties)
515
        throws ReadException {
516
                CancelTaskImpl cancellable = new CancelTaskImpl(cancel);
517
                
518
                if (isVisible() && isWithinScale(scale)){
519
                        isPrinting = true;
520
                        if (!mustTilePrint) {
521
                                draw(null, g, viewPort, cancel,scale);
522
                        } else {
523
                                Tiling tiles = new Tiling(maxTilePrintWidth, maxTilePrintHeight, g.getClipBounds());
524
                                tiles.setAffineTransform((AffineTransform) viewPort.getAffineTransform().clone());
525
                                for (int tileNr = 0; tileNr < tiles.getNumTiles(); tileNr++) {
526
                                        // Parte que dibuja
527
                                        try {
528
                                                ViewPort vp = tiles.getTileViewPort(viewPort, tileNr);
529
                                                drawTile(g, vp, cancellable, scale);
530
                                        } catch (NoninvertibleTransformException e) {
531
                                                throw new ReadException(e.getMessage(), e);
532
                                        } catch (LoadLayerException e) {
533
                                                throw new ReadException(e.getMessage(), e);
534
                                        }
535
                                }
536
                        }
537
                        isPrinting = false;
538
                }
539
        }
540

    
541
        public void _print(Graphics2D g, ViewPort viewPort, Cancellable cancel,
542
                        double scale) throws ReadException {
543
                draw(null, g, viewPort, cancel,scale);
544
        }
545

    
546
        /**
547
         * Inserta la extensi?n total de la capa.
548
         *
549
         * @param fullExtent
550
         *            Rectangulo.
551
         */
552
        public void setFullExtent(Rectangle2D fullExtent) {
553
                this.setFullEnvelope(this.getEnvelopeFromRectable2D(fullExtent));
554
        }
555

    
556
        /**
557
         * Inserta la extensi?n total de la capa en la proyeccion original.
558
         *
559
         * @param fullExtent
560
         *            Rect?ngulo.
561
         */
562
        public void setFullEnvelope(Envelope envelope) {
563
                Envelope cur = this.getFullEnvelope();
564
                if (cur == envelope) {
565
                        return;
566
                }
567
                if (cur != null && cur.equals(envelope)) {
568
                        return;
569
                }
570

    
571
                this.fullEnvelope = envelope;
572
                this.updateDrawVersion();
573
        }
574

    
575
        public HashMap<String, Object> getProperties() {
576
                HashMap<String, Object> info = new HashMap<String, Object>();
577
                String[] layerNames = getParameters().getLayerQuery().split(",");
578
                Vector<RemoteWMSLayerNode> layers = new Vector<RemoteWMSLayerNode>(layerNames.length);
579
                try {
580
                        //explorer.connect(null);
581
                        for (int i = 0; i < layerNames.length; i++) {
582
                                layers.add(i, explorer.getLayer(layerNames[i]));
583
                        }
584
                        info.put("name", getName());
585
                        info.put("selectedLayers", layers);
586
                        info.put("host", getParameters().getHost());
587
                        info.put("srs", getParameters().getSRSCode());
588
                        info.put("format", getParameters().getFormat());
589
                        info.put("wmsTransparency", new Boolean(getParameters().isWmsTransparent()));
590
                        info.put("styles", getParameters().getStyles());
591
                        info.put("dimensions", getParameters().getDimensions());
592
                        info.put("fixedSize", getParameters().getFixedSize());
593
                        return info;
594
                } /*catch (WMSException e) {
595
                        JOptionPane.showMessageDialog((Component)PluginServices.getMainFrame(), PluginServices.getText(null, "connect_error"));
596
                }*/ catch (Exception e) {
597
                        e.printStackTrace();
598
                }
599
                return null;
600
        }
601

    
602
        /**
603
         * Creates the part of a OGC's MapContext document that would describe this
604
         * layer(s).
605
         * @param version, The desired version of the resulting document. (1.1.0)
606
         * @return String containing the xml.
607
         * @throws UnsupportedVersionLayerException
608
         */
609
        @SuppressWarnings("unchecked")
610
        public String toMapContext(String mapContextVersion) {
611
                XmlBuilder xml = new XmlBuilder();
612
                
613
                String query = getParameters().getLayerQuery();
614
                String[] layerNames = query.split(",");
615
                String[] styleNames = (String[]) getParameters().getStyles().toArray(new String[0]);
616
                for (int i = 0; i < layerNames.length; i++) {
617
                        RemoteWMSLayerNode layer = explorer.getLayer(layerNames[i]);
618
                        HashMap xmlAttrs = new HashMap();
619

    
620
                        // <Layer>
621
                        xmlAttrs.put(WebMapContextTags.HIDDEN, !isVisible() + "");
622
                        xmlAttrs.put(WebMapContextTags.QUERYABLE, explorer.isQueryable() + "");
623
                        xml.openTag(WebMapContextTags.LAYER, xmlAttrs);
624
                        xmlAttrs.clear();
625
                        if (mapContextVersion.equals("1.1.0") || mapContextVersion.equals("1.0.0")) {
626
                                // <Server>
627
                                xmlAttrs.put(WebMapContextTags.SERVICE, WebMapContextTags.WMS);
628
                                xmlAttrs.put(WebMapContextTags.VERSION, explorer.getVersion());
629
                                xmlAttrs.put(WebMapContextTags.SERVER_TITLE, explorer.getServiceTitle());
630
                                xml.openTag(WebMapContextTags.SERVER, xmlAttrs);
631
                                xmlAttrs.clear();
632

    
633
                                // <OnlineResource>
634
                                xmlAttrs.put(WebMapContextTags.XLINK_TYPE, "simple");
635
                                xmlAttrs.put(WebMapContextTags.XLINK_HREF, getParameters().getHost().toString());
636
                                xml.writeTag(WebMapContextTags.ONLINE_RESOURCE, xmlAttrs);
637
                                xmlAttrs.clear();
638
                                // </OnlineResource>
639

    
640
                                xml.closeTag();
641
                                // </Server>
642

    
643
                                // <Name>
644
                                xml.writeTag(WebMapContextTags.NAME, layer.getName().trim());
645
                                // </Name>
646

    
647
                                // <Title>
648
                                xml.writeTag(WebMapContextTags.TITLE, layer.getTitle().trim());
649
                                //?xml.writeTag(WebMapContextTags.TITLE, getName().trim());
650
                                // </Title>
651

    
652
                                // <Abstract>
653
                                if (layer.getAbstract() != null) {
654
                                        xml.writeTag(WebMapContextTags.ABSTRACT, layer.getAbstract());
655
                                        // </Abstract>
656
                                }
657

    
658
                                // <SRS> (a list of available SRS for the enclosing layer)
659
                                String[] strings = (String[]) layer.getAllSrs().toArray(new String[0]);
660
                                String mySRS = strings[0];
661
                                for (int j = 1; j < strings.length; j++) {
662
                                        mySRS += ","+strings[j];
663
                                }
664
                                xml.writeTag(WebMapContextTags.SRS, mySRS);
665
                                // </SRS>
666

    
667
                                // <FormatList>
668
                                xml.openTag(WebMapContextTags.FORMAT_LIST);
669
                                strings = explorer.getFormats();
670
                                for (int j = 0; j < strings.length; j++) {
671
                                        // <Format>
672
                                        String str = strings[j].trim();
673
                                        if (str.equals(getParameters().getFormat())) {
674
                                                xml.writeTag(WebMapContextTags.FORMAT, str, WebMapContextTags.CURRENT, "1");
675
                                        } else {
676
                                                xml.writeTag(WebMapContextTags.FORMAT, str);
677
                                                // </Format>
678
                                        }
679
                                }
680
                                xml.closeTag();
681
                                // </FormatList>
682

    
683
                                // <StyleList>
684
                                xml.openTag(WebMapContextTags.STYLE_LIST);
685

    
686
                                if (layer.getStyles().size() > 0) {
687
                                        for (int j = 0; j < layer.getStyles().size(); j++) {
688
                                                // <Style>
689
                                                RemoteStyle st = layer.getStyles().get(j);
690
                                                if (st.getName().equals(styleNames[i])) {
691
                                                        xmlAttrs.put(WebMapContextTags.CURRENT, "1");
692
                                                }
693
                                                xml.openTag(WebMapContextTags.STYLE, xmlAttrs);
694
                                                xmlAttrs.clear();
695

    
696
                                                // <Name>
697
                                                xml.writeTag(WebMapContextTags.NAME, st.getName());
698
                                                // </Name>
699

    
700
                                                // <Title>
701
                                                xml.writeTag(WebMapContextTags.TITLE, st.getTitle());
702
                                                // </Title>
703

    
704
                                                // <LegendURL width="180" format="image/gif" height="50">
705
                                                // <OnlineResource xlink:type="simple" xlink:href="http://globe.digitalearth.gov/globe/en/icons/colorbars/NATIONAL.gif"/>
706
                                                // </OnlineResource>
707
                                                // </LegendURL>
708
                                                xml.closeTag();
709
                                                // </Style>
710

    
711
                                        }
712

    
713
                                } else {
714
                                        // Create fake style (for compatibility issues)
715
                                        xmlAttrs.put(WebMapContextTags.CURRENT, "1");
716
                                        // <Style>
717
                                        xml.openTag(WebMapContextTags.STYLE, xmlAttrs);
718
                                        xmlAttrs.clear();
719
                                        // <Name>
720
                                        xml.writeTag(WebMapContextTags.NAME, "default");
721
                                        // </Name>
722

    
723
                                        // <Title>
724
                                        xml.writeTag(WebMapContextTags.TITLE, "default");
725
                                        xml.closeTag();
726
                                }
727
                                // </StyleList>
728
                                xml.closeTag();
729
                                if (mapContextVersion.compareTo("1.0.0") > 0) {
730
                                        // <DimensionList>
731
                                        xml.openTag(WebMapContextTags.DIMENSION_LIST);
732
                                        // <Dimension>
733
                                        // </Dimension>
734
                                        xml.closeTag();
735
                                        // </DimensionList>
736
                                }
737
                        } else {
738
                                xml.writeTag("ERROR", PluginServices.getText(this, "unsupported_map_context_version"));
739
                        }
740
                        // </Layer>
741
                        xml.closeTag();
742
                }
743
                return xml.getXML();
744
        }
745

    
746
        public String getTocImageIcon() {
747
                return "icon-layer-wms";
748
        }
749

    
750
        /*
751
         *  (non-Javadoc)
752
         * @see com.iver.cit.gvsig.fmap.layers.RasterOperations#getTileSize()
753
         */
754
        public int[] getTileSize() {
755
                int[] size = {maxTileDrawWidth, maxTileDrawHeight};
756
                return size;
757
        }
758

    
759
        /*
760
         *  (non-Javadoc)
761
         * @see com.iver.cit.gvsig.fmap.layers.RasterOperations#isTiled()
762
         */
763
        public boolean isTiled() {
764
                return mustTileDraw;
765
        }
766

    
767
        public Image getImageLegend() {
768
                /*try {
769
                        if (wms == null) {
770
                                wms = getDriver();
771
                        }
772
                        if (wms.hasLegendGraphic()) {
773
                                wmsStatus.setOnlineResource((String) onlineResources
774
                                                .get("GetLegendGraphic"));
775
                                String path = getPathImage();// File legend =
776
                                // getDriver().getLegendGraphic(wmsStatus,
777
                                // layerQuery, null);
778
                                Image img = null;
779
                                if ((path != null) && (path.length() > 0)) {
780
                                        img = new ImageIcon(path).getImage();
781
                                }
782
                                return img;
783
                        }
784
                } catch (Exception e) {
785
                }*/
786
                return null;
787
        }
788

    
789
        public String getPathImage() {
790
                //TODO:Ver quien aporta getLegendGraphic
791
                return null;
792
                /*try {
793
                        RemoteRasterServiceStore store = (RemoteRasterServiceStore)this.dataStore;
794
                        File legend = store.getLegendGraphic(getParameters().getLayerQuery(), null);
795
                        return legend.getAbsolutePath();
796
                } catch(Exception e){
797
                        e.printStackTrace();
798
                        return null;
799
                }*/
800
        }
801

    
802
        /* (non-Javadoc)
803
         * @see com.iver.cit.gvsig.fmap.layers.FLayer#newComposedLayer()
804
         */
805
        public ComposedLayer newComposedLayer() {
806
                Preferences prefs = Preferences.userRoot().node("gvsig.wms");
807

    
808
                /*
809
                 * from java.util.prefs import Preferences
810
                 * prefs = Preferences.userRoot().node("gvsig.wms")
811
                 * prefs.put("useComposedLayer","true")
812
                 */
813

    
814
                String str = prefs.get("useComposedLayer","false");
815
                Boolean useComposedLayer = Boolean.TRUE; // por defecto ya se usan
816
                try {
817
                        useComposedLayer = Boolean.valueOf(str);
818
                } catch (Exception e) {
819

    
820
                }
821
                if (useComposedLayer.booleanValue()) {
822
                        return new ComposedLayerWMS();
823
                } else {
824
                        return null;
825
                }
826
        }
827

    
828
        /*
829
         * Checks if can make a single petition for the two layers to the server
830
         * @see com.iver.cit.gvsig.fmap.layers.ComposedLayerWMS#canAdd(com.iver.cit.gvsig.fmap.layers.FLayer)
831
         */
832
        boolean isComposedLayerCompatible(FLayer layer) {
833
                FLyrWMS aLayer;
834

    
835
                if (!(layer instanceof FLyrWMS)) {
836
                        return false;
837
                }
838
                aLayer = (FLyrWMS)layer;
839
                if (!getParameters().getHost().equals(aLayer.getParameters().getHost())) {
840
                        return false;
841
                }
842
                if (!params.getFormat().equals(aLayer.getParameters().getFormat())) {
843
                        return false;
844
                }
845
                if (!params.getSRS().equals(aLayer.getParameters().getSRS())) {
846
                        return false;
847
                }
848
                if (params.getInfoLayerQuery() != null) {
849
                        if (!params.getInfoLayerQuery().equals(aLayer.getParameters().getInfoLayerQuery())) {
850
                                return false;
851
                        }
852
                }else if (params.getInfoLayerQuery() != null) {
853
                        return false;
854
                }
855

    
856

    
857
                // isFixedSize es privado
858
                if ((getParameters().getFixedSize() != null) &&
859
                                (aLayer.getParameters().getFixedSize() != null)) {
860
                        if (getParameters().getFixedSize().equals(aLayer.getParameters().getFixedSize())) {
861
                                return false;
862
                        }
863
                } else if ((getParameters().getFixedSize() != null) != (aLayer.getParameters().getFixedSize() != null)) {
864
                        return false;
865
                }
866

    
867
                // time elevation (dimensions)
868
                if ((params.getDimensions() != null) &&
869
                                (aLayer.getParameters().getDimensions() != null)) {
870
                        if (params.getDimensions().size() != aLayer.getParameters().getDimensions().size()) {
871
                                return false;
872
                        } else {
873
                                Iterator<String> iter = params.getDimensions().iterator();
874
                                while (iter.hasNext()) {
875
                                        if (!aLayer.getParameters().getDimensions().contains(iter.next())) {
876
                                                return false;
877
                                        }
878
                                }
879
                        }
880

    
881
                } else if ((params.getDimensions() != null) != (aLayer.getParameters().getDimensions() != null)) {
882
                        return false;
883
                }
884

    
885
                return true;
886
        }
887

    
888
        /*
889
         * (non-Javadoc)
890
         * @see org.gvsig.fmap.raster.layers.FLyrRasterSE#isActionEnabled(int)
891
         */
892
        public boolean isActionEnabled(int action) {
893
                switch (action) {
894
                case IRasterLayerActions.ZOOM_PIXEL_RESOLUTION:
895
                case IRasterLayerActions.FLYRASTER_BAR_TOOLS:
896
                case IRasterLayerActions.BANDS_FILE_LIST:
897
                case IRasterLayerActions.COLOR_TABLE:
898
                case IRasterLayerActions.GEOLOCATION:
899
                case IRasterLayerActions.PANSHARPENING:
900
                case IRasterLayerActions.SAVE_COLORINTERP:
901
                case IRasterLayerActions.SAVEAS:
902
                case IRasterLayerActions.BANDS_RGB:
903
                case IRasterLayerActions.ENHANCED:
904
                case IRasterLayerActions.STATS:
905
                case IRasterLayerActions.NODATA:
906
                        return false;
907
                case IRasterLayerActions.REMOTE_ACTIONS:
908
                        return true;
909
                }
910

    
911
                return super.isActionEnabled(action);
912
        }
913

    
914
        /*
915
         * (non-Javadoc)
916
         * @see org.gvsig.fmap.raster.layers.FLyrRasterSE#getLegend()
917
         */
918
        public ILegend getLegend() {
919
                return null;
920
        }
921
        
922
        /*
923
         * (non-Javadoc)
924
         * @see org.gvsig.raster.fmap.layers.FLyrRaster#isRemote()
925
         */
926
        public boolean isRemote() {
927
                return true;
928
        }
929

    
930
        /*
931
         * (non-Javadoc)
932
         * @see org.gvsig.fmap.raster.layers.FLyrRasterSE#overviewsSupport()
933
         */
934
        public boolean overviewsSupport() {
935
                return false;
936
        }
937

    
938
        protected void updateDrawVersion() {
939
                if (this.disableUpdateDrawVersion != null){
940

    
941
                        Thread curThread = Thread.currentThread();
942

    
943
                        Thread aThread;
944

    
945
                        Iterator<WeakReference<Thread>> iter = this.disableUpdateDrawVersion.iterator();
946
                        while (iter.hasNext()){
947
                                aThread = (Thread) ((WeakReference<?>)iter.next()).get();
948
                                if (aThread == null){
949
                                        iter.remove();
950
                                } else if(aThread.equals(curThread)){
951
                                        return;
952
                                }
953
                        }
954
                }
955
                //                Exception ex = new Exception();
956
                //                ex.printStackTrace();
957
                super.updateDrawVersion();
958
        }
959

    
960
        protected void disableUpdateDrawVersion() {
961
                if (this.disableUpdateDrawVersion == null) {
962
                        this.disableUpdateDrawVersion = new ArrayList<WeakReference<Thread>>();
963
                }
964
                this.disableUpdateDrawVersion.add(new WeakReference<Thread>(Thread.currentThread()));
965
        }
966

    
967
        protected void enableUpdateDrawVersion() {
968
                if (this.disableUpdateDrawVersion == null){
969
                        return;
970
                }
971
                Thread curThread = Thread.currentThread();
972
                Thread aThread;
973

    
974
                Iterator<WeakReference<Thread>> iter = this.disableUpdateDrawVersion.iterator();
975
                while (iter.hasNext()) {
976
                        aThread = (Thread) ((WeakReference<?>)iter.next()).get();
977
                        if (aThread == null) {
978
                                iter.remove();
979
                        } else if(aThread.equals(curThread)) {
980
                                iter.remove();
981
                                break;
982
                        }
983
                }
984

    
985
        }
986

    
987
        private Rectangle2D.Double getRectable2DFromEnvelope(Envelope env) {
988
                return new Rectangle2D.Double(env.getMinimum(0), env.getMinimum(1), env
989
                                .getLength(0), env.getLength(1));
990
        }
991

    
992
        private Envelope getEnvelopeFromRectable2D(Rectangle2D rect) {
993
                try {
994
                        return geomManager.createEnvelope(rect.getMinX(), rect.getMinY(),
995
                                        rect.getMaxX(), rect.getMaxY(),
996
                                        SUBTYPES.GEOM2D);
997
                } catch (CreateEnvelopeException e) {
998
                        logger.error("Error creating the envelope", e);
999
                }
1000
                return null;
1001
        }
1002
        
1003
        /*
1004
         * (non-Javadoc)
1005
         * @see org.gvsig.raster.fmap.layers.FLyrRaster#getFileFormat()
1006
         */
1007
        @Override
1008
        public String getFileFormat() {
1009
                return "WMS";
1010
        }
1011
        
1012
        /*
1013
         * (non-Javadoc)
1014
         * @see org.gvsig.raster.fmap.layers.DefaultFLyrRaster#getFileLayer()
1015
         */
1016
        @Override
1017
        public FLayer getFileLayer() throws RasterDriverException {
1018
                /*if(getDataStore() instanceof DefaultRemoteRasterStore) {
1019
                        RemoteRasterProvider prov = (RemoteRasterProvider)((DefaultRemoteRasterStore)getDataStore()).getProvider(0);
1020
                        File file = null;
1021
                        
1022
                        if(getParameters().isSizeFixed()) {
1023
                                file = prov.getFileLayer();
1024
                        } else {
1025
                                file = prov.getLastRequest();
1026
                        }
1027
                                
1028
                        if(file == null)
1029
                                return null;
1030
                        
1031
                        try {
1032
                                return DefaultFLyrRaster.createLayer("tmp", file);
1033
                        } catch (LoadLayerException e) {
1034
                                throw new RasterDriverException(e.getMessage(), e);
1035
                        }
1036
                }*/
1037
                return null;
1038
        }
1039

    
1040
        /**
1041
         * Devuelve el envelope en la proyeccion de la vista
1042
         */
1043
        public Envelope getFullEnvelope() {
1044
                Envelope rAux;
1045
                rAux = this.fullEnvelope;
1046

    
1047
                // Esto es para cuando se crea una capa nueva con el fullExtent de ancho
1048
                // y alto 0.
1049
                if (rAux == null || rAux.getMaximum(0) - rAux.getMinimum(0) == 0
1050
                                && rAux.getMaximum(1) - rAux.getMinimum(1) == 0) {
1051
                        try {
1052
                                rAux = geomManager.createEnvelope(0, 0, 100, 100, SUBTYPES.GEOM2D);
1053
                        } catch (CreateEnvelopeException e) {
1054
                                logger.error("Error creating the envelope", e);
1055
                        }
1056
                }
1057
                // Si existe reproyecci?n, reproyectar el extent
1058
                ICoordTrans ct = getCoordTrans();
1059
                if (ct != null) {
1060
                        Point2D pt1 = new Point2D.Double(rAux.getMinimum(0), rAux
1061
                                        .getMinimum(1));
1062
                        Point2D pt2 = new Point2D.Double(rAux.getMaximum(0), rAux
1063
                                        .getMaximum(1));
1064
                        pt1 = ct.convert(pt1, null);
1065
                        pt2 = ct.convert(pt2, null);
1066
                        try {
1067
                                rAux = geomManager.createEnvelope(pt1.getX(), pt1.getY(), pt2
1068
                                                .getX(), pt2.getY(), SUBTYPES.GEOM2D);
1069
                        } catch (CreateEnvelopeException e) {
1070
                                logger.error("Error creating the envelope", e);
1071
                        }// new
1072
                        // Rectangle2D.Double();
1073
                }
1074
                return rAux;
1075

    
1076
        }
1077
        
1078
        /*
1079
         * (non-Javadoc)
1080
         * @see org.gvsig.raster.fmap.layers.FLyrRaster#getFullRasterExtent()
1081
         */
1082
        public Extent getFullRasterExtent() {
1083
                Envelope env = getFullEnvelope();
1084
                double minx = env.getMinimum(0);
1085
                double miny = env.getMinimum(1);
1086
                double maxx = env.getMaximum(0);
1087
                double maxy = env.getMaximum(1);
1088
                Point2D ul = new Point2D.Double(minx, maxy);
1089
                Point2D ur = new Point2D.Double(maxx, maxy);
1090
                Point2D ll = new Point2D.Double(minx, miny);
1091
                Point2D lr = new Point2D.Double(maxx, miny);
1092
                return rManager.getDataStructFactory().createExtent(ul, lr, ur, ll);
1093
        }
1094

    
1095
        @SuppressWarnings("deprecation")
1096
        @Override
1097
        public DynObjectSet getInfo(Point p, double tolerance, Cancellable cancel,
1098
                        boolean fast) throws LoadLayerException, DataException {
1099

    
1100
                //try {
1101
                ViewPort viewPort = getMapContext().getViewPort();
1102

    
1103
                Point tiledPoint = new Point((int) p.getX() % maxTilePrintWidth, (int) p.getY() % maxTilePrintHeight);
1104
                Rectangle rect = new Rectangle(0, 0, viewPort.getImageWidth() - 1, viewPort.getImageHeight() - 1);
1105
                Tiling tiles = new Tiling(maxTilePrintWidth, maxTilePrintHeight, rect);
1106
                tiles.setAffineTransform((AffineTransform) viewPort.getAffineTransform().clone());
1107
                int nCols = tiles.getNumCols();
1108

    
1109
                int col = (int) p.getX() / maxTilePrintWidth;
1110
                int row = (int) p.getY() / maxTilePrintHeight;
1111
                int tileIndex = (row * nCols) + col;
1112

    
1113
                ViewPort vp = null;
1114
                try {
1115
                        vp = tiles.getTileViewPort(viewPort, tileIndex);
1116
                } catch (NoninvertibleTransformException e1) {
1117
                        throw new LoadLayerException("", e1);
1118
                }
1119

    
1120
                getParameters().setExtent(this.getRectable2DFromEnvelope(vp.getAdjustedExtent()));
1121
                if(getParameters().isSizeFixed()) {
1122
                        getParameters().setWidth((int)getParameters().getFixedSize().getWidth());
1123
                        getParameters().setHeight((int)getParameters().getFixedSize().getHeight());
1124
                } else {
1125
                        getParameters().setWidth(vp.getImageWidth());
1126
                        getParameters().setHeight(vp.getImageHeight());
1127
                }
1128
                
1129
                CancelTaskImpl cancellable = new CancelTaskImpl(cancel);
1130
                getParameters().setCancellable(cancellable);
1131
                
1132
                String fInfo;
1133
                try {
1134
                        fInfo = getDataStore().getInfoByPoint(tiledPoint.getX(), tiledPoint.getY(), cancellable);
1135
                } catch (RemoteServiceException e) {
1136
                        throw new LoadLayerException("Error in getInfoByPoint", e);
1137
                }
1138
                return new DynObjectSetWMSInfo(fInfo, DynObjectSetWMSInfo.TYPE_TEXT);
1139
        }
1140
    
1141
    /**
1142
     * Sets the data store parameters
1143
     * @param params
1144
     * @throws InitializeException
1145
     */
1146
    public void setParameters(WMSDataParameters params) throws InitializeException {
1147
            this.params = params;
1148
            DataManagerProviderServices dataman = (DataManagerProviderServices) DALLocator.getDataManager();
1149
                try {
1150
                        DataStore dStore = dataman.openStore(params.getDataStoreName(), params);
1151
                        this.setDataStore(dStore);
1152
                        this.setName(params.getHost());
1153
                } catch (ValidateDataParametersException e) {
1154
                        throw new InitializeException(e);
1155
                } catch (ProviderNotRegisteredException e) {
1156
                        throw new InitializeException(e);
1157
                } catch (InitializeException e) {
1158
                        throw new InitializeException(e);
1159
                } catch (LoadLayerException e) {
1160
                        throw new InitializeException(e);
1161
                }
1162
    }
1163
    
1164
    @SuppressWarnings("deprecation")
1165
        public WMSDataParameters getParameters() {
1166
            if(params == null) {
1167
                    DataManager datamanager = DALLocator.getDataManager();
1168
                        WMSServerExplorerParameters explorerParams = null;
1169
                        try {
1170
                                explorerParams = (WMSServerExplorerParameters) datamanager.createServerExplorerParameters(WMSServerExplorer.NAME);
1171
                                explorerParams.setHost("");
1172
                                explorer = (WMSServerExplorer) datamanager.createServerExplorer(explorerParams);
1173
                                DataStoreParameters parameters = explorer.getStoreParameters();
1174
                                if(parameters instanceof WMTSDataParameters) {
1175
                                        params = (WMSDataParameters) parameters;
1176
                                }
1177
                        } catch (InitializeException e) {
1178
                        } catch (ProviderNotRegisteredException e) {
1179
                        } catch (ValidateDataParametersException e) {
1180
                        }
1181
            }
1182
            return params;
1183
    }
1184
    
1185
    /**
1186
     * Sets the explorer
1187
     * @param explorer
1188
     */
1189
    public void setExplorer(WMSServerExplorer explorer) {
1190
            this.explorer = explorer;
1191
    }
1192
    
1193
    /**
1194
     * Gets the explorer
1195
     * @return
1196
     */
1197
    public WMSServerExplorer getExplorer() {
1198
            return this.explorer;
1199
    }
1200
    
1201
    /*
1202
         * (non-Javadoc)
1203
         * @see org.gvsig.fmap.mapcontext.layers.FLyrDefault#cloneLayer()
1204
         */
1205
        public FLayer cloneLayer() throws Exception {
1206
                RasterDataStore  ds = dataStore.cloneDataStore();
1207
                FLyrWMS newLayer = new FLyrWMS();
1208
                newLayer.setName(getName());
1209
                newLayer.setOpenRasterStore(ds, RasterManager.TYPE_MULTIDATA);
1210
                newLayer.fullEnvelope = fullEnvelope;
1211
                newLayer.params = params;
1212
                //newLayer.firstLoad = firstLoad;
1213
                newLayer.explorer = explorer;
1214
                
1215
                ArrayList<RasterFilter> filters = getRender().getFilterList().getStatusCloned();
1216

    
1217
                //Hacemos una copia de las bandas a renderizar
1218
                if(getRender().getRenderBands() != null) {
1219
                        int[] rb = new int[getRender().getRenderBands().length];
1220
                        for (int i = 0; i < rb.length; i++)
1221
                                rb[i] = getRender().getRenderBands()[i];
1222
                        newLayer.getRender().setRenderBands(rb);
1223
                }
1224

    
1225
                //Asignamos el entorno
1226
                if(newLayer.getRender().getFilterList() == null)
1227
                        newLayer.getRender().setFilterList(RasterLocator.getManager().createEmptyFilterList(getRender().getFilterList().getInitDataType()));
1228
                newLayer.getRender().getFilterList().setEnv(getRender().getFilterList().getEnv());
1229
                newLayer.getRender().getFilterList().setStatus(filters);
1230

    
1231
                // Asignamos los valores noData del original
1232
                newLayer.setNoDataValue(getNoDataValue());
1233
                newLayer.setNoDataType(getNoDataType());
1234
                newLayer.applyNoData();
1235
                newLayer.enableOpen();
1236
                
1237
                return newLayer;
1238
        }
1239

    
1240
}