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

History | View | Annotate | Download (39.8 KB)

1
/* gvSIG. Geographic Information System of the Valencian Government
2
*
3
* Copyright (C) 2007-2008 Infrastructures and Transports Department
4
* of the Valencian Government (CIT)
5
* 
6
* This program is free software; you can redistribute it and/or
7
* modify it under the terms of the GNU General Public License
8
* as published by the Free Software Foundation; either version 2
9
* of the License, or (at your option) any later version.
10
* 
11
* This program is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
* GNU General Public License for more details.
15
* 
16
* You should have received a copy of the GNU General Public License
17
* along with this program; if not, write to the Free Software
18
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 
19
* MA  02110-1301, USA.
20
* 
21
*/
22
 
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.ViewPortData;
59
import org.gvsig.fmap.dal.coverage.exception.FilePaletteException;
60
import org.gvsig.fmap.dal.coverage.exception.InvalidSetViewException;
61
import org.gvsig.fmap.dal.coverage.exception.ProcessInterruptedException;
62
import org.gvsig.fmap.dal.coverage.exception.RasterDriverException;
63
import org.gvsig.fmap.dal.coverage.exception.RemoteServiceException;
64
import org.gvsig.fmap.dal.coverage.grid.RasterFilter;
65
import org.gvsig.fmap.dal.coverage.store.RasterDataStore;
66
import org.gvsig.fmap.dal.coverage.store.parameter.RasterDataParameters;
67
import org.gvsig.fmap.dal.exception.DataException;
68
import org.gvsig.fmap.dal.exception.InitializeException;
69
import org.gvsig.fmap.dal.exception.ProviderNotRegisteredException;
70
import org.gvsig.fmap.dal.exception.ReadException;
71
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
72
import org.gvsig.fmap.dal.spi.DataManagerProviderServices;
73
import org.gvsig.fmap.geom.GeometryLocator;
74
import org.gvsig.fmap.geom.GeometryManager;
75
import org.gvsig.fmap.geom.Geometry.SUBTYPES;
76
import org.gvsig.fmap.geom.exception.CreateEnvelopeException;
77
import org.gvsig.fmap.geom.primitive.Envelope;
78
import org.gvsig.fmap.mapcontext.ViewPort;
79
import org.gvsig.fmap.mapcontext.exceptions.LoadLayerException;
80
import org.gvsig.fmap.mapcontext.exceptions.UnsupportedVersionLayerException;
81
import org.gvsig.fmap.mapcontext.layers.FLayer;
82
import org.gvsig.fmap.mapcontext.layers.Tiling;
83
import org.gvsig.fmap.mapcontext.layers.operations.ComposedLayer;
84
import org.gvsig.fmap.mapcontext.layers.operations.IHasImageLegend;
85
import org.gvsig.fmap.mapcontext.rendering.legend.ILegend;
86
import org.gvsig.raster.fmap.layers.DefaultFLyrRaster;
87
import org.gvsig.raster.fmap.layers.IRasterLayerActions;
88
import org.gvsig.raster.fmap.layers.NotAvailableStateException;
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.DynClass;
99
import org.gvsig.tools.dynobject.DynObjectSet;
100
import org.gvsig.tools.dynobject.DynStruct;
101
import org.gvsig.tools.persistence.PersistenceManager;
102
import org.gvsig.tools.persistence.PersistentState;
103
import org.gvsig.tools.persistence.exception.PersistenceException;
104
import org.gvsig.tools.task.Cancellable;
105
import org.slf4j.Logger;
106
import org.slf4j.LoggerFactory;
107

    
108

    
109

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

    
158
        public FLyrWMS() {
159
                super();
160
                this.updateDrawVersion();
161
                try {
162
                        enableAwake();
163
                } catch (NotAvailableStateException e) {
164
                        logger.error("Fallo el estado de open. Closed=" + isClosed() + " Awake=" + isAwake(), this, e);
165
                }
166
        }
167
        
168
        public static DataStore createDataStore(String host, IProjection srs) throws InitializeException {
169
                DataManagerProviderServices dataman = (DataManagerProviderServices) DALLocator.getDataManager();
170
                RasterDataParameters params = null;
171
                try {
172
                        params = (RasterDataParameters)dataman.createServerExplorerParameters(WMSServerExplorer.NAME);
173
                } catch (InitializeException e) {
174
                        return null;
175
                } catch (ProviderNotRegisteredException e) {
176
                        return null;
177
                }
178
                params.setURI(host);
179
                params.setSRS(srs);
180
                
181
                try {
182
                        return dataman.openStore(params.getDataStoreName(), params);
183
                } catch (ValidateDataParametersException e) {
184
                        throw new InitializeException(e);
185
                } catch (ProviderNotRegisteredException e) {
186
                        throw new InitializeException(e);
187
                }
188
        }
189

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

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

    
225
                return (String)formats.get(0);
226
        }
227

    
228

    
229
        @SuppressWarnings("unchecked")
230
        @Override
231
        public void loadFromState(PersistentState state)
232
        throws PersistenceException {
233
                super.loadFromState(state);
234

    
235
                this.fullEnvelope = (Envelope) state.get("fullExtent");
236

    
237
                // Host
238
                getParameters().setURI((String)state.get("host"));
239

    
240
                // Part of the query that is not the host, or the
241
                // layer names, or other not listed bellow
242
                getParameters().setInfoLayerQuery(state.getString("infoLayerQuery"));
243

    
244
                // Part of the query containing the layer names
245
                getParameters().setLayerQuery(state.getString("layerQuery"));
246

    
247
                // Format
248
                getParameters().setFormat(state.getString("format"));
249

    
250
                // SRS
251
                getParameters().setSRS(state.getString("srs"));
252

    
253
                // Transparency
254
                if (state.hasValue("wms_transparency")) {
255
                        getParameters().setWmsTransparency(state.getBoolean("wms_transparency"));
256
                }
257

    
258
                // Styles
259
                if (state.hasValue("styles")){
260
                        getParameters().setStyles(new Vector(state.getList("styles")));
261
                }
262

    
263
                // Dimensions
264
                if (state.hasValue("dimensions")){
265
                        getParameters().setDimensions(new Vector(state.getList("dimensions")));
266
                }
267

    
268
                // OnlineResources
269
                if (state.hasValue("onlineResources")) {
270
                        getParameters().setOnlineResources(new Hashtable(state.getMap("onlineResources")));
271
                }
272

    
273
                // Queryable
274
                if (state.hasValue("queryable")) {
275
                        getParameters().setQueryable(state.getBoolean("queryable"));
276
                }
277

    
278
                // fixedSize
279
                if (state.hasValue("fixedSize")) {
280
                        getParameters().setFixedSize((Dimension) state.get("fixedSize"));
281
                } else {
282
                        getParameters().setFixedSize(null);
283
                }
284
        }
285

    
286
        @Override
287
        public void saveToState(PersistentState state) throws PersistenceException {
288
                super.saveToState(state);
289

    
290
                state.set("fullEnvelope", this.fullEnvelope);
291

    
292
                // Host
293
                state.set("host", getParameters().getURI());
294

    
295
                // Part of the query that is not the host, or the
296
                // layer names, or other not listed bellow
297
                state.set("infoLayerQuery", getParameters().getInfoLayerQuery());
298

    
299
                // Part of the query containing the layer names
300
                state.set("layerQuery", getParameters().getLayerQuery());
301

    
302
                // Format
303
                state.set("format", getParameters().getFormat());
304

    
305
                // SRS
306
                state.set("srs", getParameters().getSRSCode());
307

    
308
                // Transparency
309
                state.set("wms_transparency", getParameters().isWmsTransparent());
310

    
311
                // Styles
312
                if (getParameters().getStyles() != null) {
313
                        state.set("styles", getParameters().getStyles());
314
                }
315

    
316
                // Dimensions
317
                if (getParameters().getDimensions() != null){
318
                        state.set("dimensions", getParameters().getDimensions());
319
                }
320

    
321
                // OnlineResources
322
                state.set("onlineResources", getParameters().getOnlineResource());
323

    
324
                // Queryable
325
                state.set("queryable", getParameters().isQueryable());
326

    
327
                // fixedSize
328
                if (getParameters().isSizeFixed()) {
329
                        state.set("fixedSize", getParameters().getFixedSize());
330
                }
331
        }
332

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

    
397
                if (isWithinScale(scale)) {
398

    
399
                        if(mustTileDraw) {
400
                                Point2D p = viewPort.getOffset();
401
                                Rectangle r = new Rectangle((int) p.getX(), (int) p.getY(), viewPort.getImageWidth(), viewPort.getImageHeight());
402
                                Tiling tiles = new Tiling(maxTileDrawWidth, maxTileDrawHeight, r);
403
                                tiles.setAffineTransform((AffineTransform) viewPort.getAffineTransform().clone());
404

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

    
446
                // 2. Compute extent to be requested.
447
                Rectangle2D bBox = new Rectangle2D.Double();
448
                Rectangle2D.intersect(getRectable2DFromEnvelope(vpEnv),
449
                                getRectable2DFromEnvelope(envelope), bBox);
450

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

    
457
                Dimension sz = new Dimension(wImg, hImg);
458

    
459
                if ((wImg <= 0) || (hImg <= 0)) {
460
                        return;
461
                }
462

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

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

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

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

    
545
        public void _print(Graphics2D g, ViewPort viewPort, Cancellable cancel,
546
                        double scale) throws ReadException {
547
                draw(null, g, viewPort, cancel,scale);
548
        }
549

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

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

    
575
                this.fullEnvelope = envelope;
576
                this.updateDrawVersion();
577
        }
578

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

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

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

    
637
                                // <OnlineResource>
638
                                xmlAttrs.put(WebMapContextTags.XLINK_TYPE, "simple");
639
                                xmlAttrs.put(WebMapContextTags.XLINK_HREF, getParameters().getURI().toString());
640
                                xml.writeTag(WebMapContextTags.ONLINE_RESOURCE, xmlAttrs);
641
                                xmlAttrs.clear();
642
                                // </OnlineResource>
643

    
644
                                xml.closeTag();
645
                                // </Server>
646

    
647
                                // <Name>
648
                                xml.writeTag(WebMapContextTags.NAME, layer.getName().trim());
649
                                // </Name>
650

    
651
                                // <Title>
652
                                xml.writeTag(WebMapContextTags.TITLE, layer.getTitle().trim());
653
                                //?xml.writeTag(WebMapContextTags.TITLE, getName().trim());
654
                                // </Title>
655

    
656
                                // <Abstract>
657
                                if (layer.getAbstract() != null) {
658
                                        xml.writeTag(WebMapContextTags.ABSTRACT, layer.getAbstract());
659
                                        // </Abstract>
660
                                }
661

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

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

    
687
                                // <StyleList>
688
                                xml.openTag(WebMapContextTags.STYLE_LIST);
689

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

    
700
                                                // <Name>
701
                                                xml.writeTag(WebMapContextTags.NAME, st.getName());
702
                                                // </Name>
703

    
704
                                                // <Title>
705
                                                xml.writeTag(WebMapContextTags.TITLE, st.getTitle());
706
                                                // </Title>
707

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

    
715
                                        }
716

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

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

    
750
        public String getTocImageIcon() {
751
                return "icon-layer-wms";
752
        }
753

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

    
763
        /*
764
         *  (non-Javadoc)
765
         * @see com.iver.cit.gvsig.fmap.layers.RasterOperations#isTiled()
766
         */
767
        public boolean isTiled() {
768
                return mustTileDraw;
769
        }
770

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

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

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

    
812
                /*
813
                 * from java.util.prefs import Preferences
814
                 * prefs = Preferences.userRoot().node("gvsig.wms")
815
                 * prefs.put("useComposedLayer","true")
816
                 */
817

    
818
                String str = prefs.get("useComposedLayer","false");
819
                Boolean useComposedLayer = Boolean.TRUE; // por defecto ya se usan
820
                try {
821
                        useComposedLayer = Boolean.valueOf(str);
822
                } catch (Exception e) {
823

    
824
                }
825
                if (useComposedLayer.booleanValue()) {
826
                        return new ComposedLayerWMS();
827
                } else {
828
                        return null;
829
                }
830
        }
831

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

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

    
860

    
861
                // isFixedSize es privado
862
                if ((getParameters().getFixedSize() != null) &&
863
                                (aLayer.getParameters().getFixedSize() != null)) {
864
                        if (getParameters().getFixedSize().equals(aLayer.getParameters().getFixedSize())) {
865
                                return false;
866
                        }
867
                } else if ((getParameters().getFixedSize() != null) != (aLayer.getParameters().getFixedSize() != null)) {
868
                        return false;
869
                }
870

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

    
885
                } else if ((params.getDimensions() != null) != (aLayer.getParameters().getDimensions() != null)) {
886
                        return false;
887
                }
888

    
889
                return true;
890
        }
891

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

    
915
                return super.isActionEnabled(action);
916
        }
917

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

    
934
        /*
935
         * (non-Javadoc)
936
         * @see org.gvsig.fmap.raster.layers.FLyrRasterSE#overviewsSupport()
937
         */
938
        public boolean overviewsSupport() {
939
                return false;
940
        }
941

    
942
        protected void updateDrawVersion() {
943
                if (this.disableUpdateDrawVersion != null){
944

    
945
                        Thread curThread = Thread.currentThread();
946

    
947
                        Thread aThread;
948

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

    
964
        protected void disableUpdateDrawVersion() {
965
                if (this.disableUpdateDrawVersion == null) {
966
                        this.disableUpdateDrawVersion = new ArrayList<WeakReference<Thread>>();
967
                }
968
                this.disableUpdateDrawVersion.add(new WeakReference<Thread>(Thread.currentThread()));
969
        }
970

    
971
        protected void enableUpdateDrawVersion() {
972
                if (this.disableUpdateDrawVersion == null){
973
                        return;
974
                }
975
                Thread curThread = Thread.currentThread();
976
                Thread aThread;
977

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

    
989
        }
990

    
991
        private Rectangle2D.Double getRectable2DFromEnvelope(Envelope env) {
992
                return new Rectangle2D.Double(env.getMinimum(0), env.getMinimum(1), env
993
                                .getLength(0), env.getLength(1));
994
        }
995

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

    
1044
        /**
1045
         * Devuelve el envelope en la proyeccion de la vista
1046
         */
1047
        public Envelope getFullEnvelope() {
1048
                Envelope rAux;
1049
                rAux = this.fullEnvelope;
1050

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

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

    
1099
        @SuppressWarnings("deprecation")
1100
        @Override
1101
        public DynObjectSet getInfo(Point p, double tolerance, Cancellable cancel,
1102
                        boolean fast) throws LoadLayerException, DataException {
1103

    
1104
                //try {
1105
                ViewPort viewPort = getMapContext().getViewPort();
1106

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

    
1113
                int col = (int) p.getX() / maxTilePrintWidth;
1114
                int row = (int) p.getY() / maxTilePrintHeight;
1115
                int tileIndex = (row * nCols) + col;
1116

    
1117
                ViewPort vp = null;
1118
                try {
1119
                        vp = tiles.getTileViewPort(viewPort, tileIndex);
1120
                } catch (NoninvertibleTransformException e1) {
1121
                        throw new LoadLayerException("", e1);
1122
                }
1123

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

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

    
1229
                //Asignamos el entorno
1230
                if(newLayer.getRender().getFilterList() == null)
1231
                        newLayer.getRender().setFilterList(RasterLocator.getManager().createEmptyFilterList(getRender().getFilterList().getInitDataType()));
1232
                newLayer.getRender().getFilterList().setEnv(getRender().getFilterList().getEnv());
1233
                newLayer.getRender().getFilterList().setStatus(filters);
1234

    
1235
                // Asignamos los valores noData del original
1236
                newLayer.setNoDataValue(getNoDataValue());
1237
                newLayer.setNoDataType(getNoDataType());
1238
                newLayer.applyNoData();
1239
                newLayer.enableOpen();
1240
                
1241
                return newLayer;
1242
        }
1243

    
1244
}