Statistics
| Revision:

gvsig-raster / org.gvsig.raster.wmts / trunk / org.gvsig.raster.wmts / org.gvsig.raster.wmts.app / org.gvsig.raster.wmts.app.wmtsclient / src / main / java / org / gvsig / raster / wmts / app / wmtsclient / layer / FLyrWMTS.java @ 600

History | View | Annotate | Download (22.5 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.wmts.app.wmtsclient.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.geom.Point2D;
30
import java.awt.geom.Rectangle2D;
31
import java.awt.image.BufferedImage;
32
import java.lang.ref.WeakReference;
33
import java.util.ArrayList;
34
import java.util.HashMap;
35
import java.util.Iterator;
36
import java.util.List;
37

    
38
import javax.print.attribute.PrintRequestAttributeSet;
39

    
40
import org.cresques.cts.ICoordTrans;
41
import org.cresques.cts.IProjection;
42
import org.gvsig.fmap.dal.DALLocator;
43
import org.gvsig.fmap.dal.DataManager;
44
import org.gvsig.fmap.dal.DataParameters;
45
import org.gvsig.fmap.dal.DataStore;
46
import org.gvsig.fmap.dal.DataStoreParameters;
47
import org.gvsig.fmap.dal.DataTypes;
48
import org.gvsig.fmap.dal.coverage.RasterLocator;
49
import org.gvsig.fmap.dal.coverage.RasterManager;
50
import org.gvsig.fmap.dal.coverage.datastruct.Extent;
51
import org.gvsig.fmap.dal.coverage.datastruct.ViewPortData;
52
import org.gvsig.fmap.dal.coverage.exception.FilePaletteException;
53
import org.gvsig.fmap.dal.coverage.exception.InvalidSetViewException;
54
import org.gvsig.fmap.dal.coverage.exception.ProcessInterruptedException;
55
import org.gvsig.fmap.dal.coverage.exception.RasterDriverException;
56
import org.gvsig.fmap.dal.coverage.exception.RemoteServiceException;
57
import org.gvsig.fmap.dal.coverage.grid.RasterFilter;
58
import org.gvsig.fmap.dal.coverage.store.RasterDataStore;
59
import org.gvsig.fmap.dal.coverage.store.parameter.RasterDataParameters;
60
import org.gvsig.fmap.dal.coverage.store.parameter.TileDataParameters;
61
import org.gvsig.fmap.dal.exception.DataException;
62
import org.gvsig.fmap.dal.exception.InitializeException;
63
import org.gvsig.fmap.dal.exception.ProviderNotRegisteredException;
64
import org.gvsig.fmap.dal.exception.ReadException;
65
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
66
import org.gvsig.fmap.dal.spi.DataManagerProviderServices;
67
import org.gvsig.fmap.geom.GeometryLocator;
68
import org.gvsig.fmap.geom.GeometryManager;
69
import org.gvsig.fmap.geom.Geometry.SUBTYPES;
70
import org.gvsig.fmap.geom.exception.CreateEnvelopeException;
71
import org.gvsig.fmap.geom.primitive.Envelope;
72
import org.gvsig.fmap.mapcontext.ViewPort;
73
import org.gvsig.fmap.mapcontext.exceptions.LoadLayerException;
74
import org.gvsig.fmap.mapcontext.layers.FLayer;
75
import org.gvsig.fmap.mapcontext.layers.operations.IHasImageLegend;
76
import org.gvsig.fmap.mapcontext.rendering.legend.ILegend;
77
import org.gvsig.raster.fmap.layers.DefaultFLyrRaster;
78
import org.gvsig.raster.fmap.layers.IRasterLayerActions;
79
import org.gvsig.raster.fmap.layers.NotAvailableStateException;
80
import org.gvsig.raster.util.CancelTaskImpl;
81
import org.gvsig.raster.wmts.io.WMTSDataParameters;
82
import org.gvsig.raster.wmts.io.WMTSServerExplorer;
83
import org.gvsig.raster.wmts.io.WMTSServerExplorerParameters;
84
import org.gvsig.tools.ToolsLocator;
85
import org.gvsig.tools.dynobject.DynClass;
86
import org.gvsig.tools.dynobject.DynObjectSet;
87
import org.gvsig.tools.dynobject.DynStruct;
88
import org.gvsig.tools.persistence.PersistenceManager;
89
import org.gvsig.tools.persistence.PersistentState;
90
import org.gvsig.tools.persistence.exception.PersistenceException;
91
import org.gvsig.tools.task.Cancellable;
92
import org.slf4j.Logger;
93
import org.slf4j.LoggerFactory;
94

    
95

    
96

    
97
/**
98
 * WMTS Layer class.
99
 *
100
 * @author Nacho Brodin (nachobrodin@gmail.com)
101
 *
102
 */
103
public class FLyrWMTS extends DefaultFLyrRaster implements IHasImageLegend {
104
        public static final String           PERSISTENT_NAME           = "FLyrWMTS_Persistent";
105
        public static final String           PERSISTENT_DESCRIPTION    = "FLyrWMTS Persistent Definition";
106
        
107
        private static final GeometryManager geomManager               = GeometryLocator.getGeometryManager();
108
        private static final Logger          logger                    = LoggerFactory.getLogger(FLyrWMTS.class);
109
        private List<WeakReference<Thread>>         disableUpdateDrawVersion;
110
        private Envelope                                         fullEnvelope              = null;
111
        private boolean                                                 firstLoad                 = false;
112
        private RasterManager                rManager                  = RasterLocator.getManager();
113
        private DataStoreParameters          params                    = null;
114
        private WMTSServerExplorer           explorer                  = null;
115
        private boolean                      deleteCache               = false;
116
        //Is useful to save the last ViewPort to know the last zoom level in the screen
117
        //private ViewPort                     lastViewPort              = null;
118

    
119
        public FLyrWMTS() {
120
                super();
121
                this.updateDrawVersion();
122
                try {
123
                        enableAwake();
124
                } catch (NotAvailableStateException e) {
125
                        logger.error("Fallo el estado de open. Closed=" + isClosed() + " Awake=" + isAwake(), this, e);
126
                }
127
        }
128
        
129
        public static DataStore createDataStore(String host, IProjection srs) throws InitializeException {
130
                DataManagerProviderServices dataman = (DataManagerProviderServices) DALLocator.getDataManager();
131
                RasterDataParameters params = null;
132
                try {
133
                        params = (RasterDataParameters)dataman.createServerExplorerParameters(WMTSServerExplorer.NAME);
134
                } catch (InitializeException e) {
135
                        return null;
136
                } catch (ProviderNotRegisteredException e) {
137
                        return null;
138
                }
139
                params.setURI(host);
140
                params.setSRS(srs);
141
                
142
                try {
143
                        return dataman.openStore(params.getDataStoreName(), params);
144
                } catch (ValidateDataParametersException e) {
145
                        throw new InitializeException(e);
146
                } catch (ProviderNotRegisteredException e) {
147
                        throw new InitializeException(e);
148
                }
149
        }
150

    
151
        /*
152
         * (non-Javadoc)
153
         * @see org.gvsig.fmap.mapcontext.layers.operations.SingleLayer#setDataStore(org.gvsig.fmap.dal.DataStore)
154
         */
155
        public void setDataStore(DataStore dataStore) throws LoadLayerException {
156
                this.dataStore = (RasterDataStore) dataStore;
157
                try {
158
                        enableOpen();
159
                } catch (NotAvailableStateException e) {
160
                        logger.error("Fallo el estado de open. Closed=" + isClosed() + " Awake=" + isAwake(), this, e);
161
                }
162
                setProjection(this.dataStore.getProjection());
163
                setFullExtent(this.dataStore.getExtent().toRectangle2D());
164
        }
165

    
166
        @Override
167
        public void loadFromState(PersistentState state)
168
        throws PersistenceException {
169
                super.loadFromState(state);
170

    
171
        }
172

    
173
        @Override
174
        public void saveToState(PersistentState state) throws PersistenceException {
175
                super.saveToState(state);
176

    
177
                
178
        }
179

    
180
        public static void registerPersistent() {
181
                PersistenceManager manager = ToolsLocator.getPersistenceManager();
182
                DynStruct definition = manager.getDefinition(PERSISTENT_NAME);
183
                if( definition == null ) {
184
                        DefaultFLyrRaster.registerPersistent();
185
                        definition = manager.addDefinition(
186
                                        FLyrWMTS.class,
187
                                        PERSISTENT_NAME,
188
                                        PERSISTENT_DESCRIPTION,
189
                                        null, 
190
                                        null
191
                        );
192
                        definition.extend(
193
                                        (DynClass)ToolsLocator.getPersistenceManager()
194
                                                .getDefinition(DefaultFLyrRaster.class)
195
                        );
196
        
197
                        definition.addDynFieldObject("fullExtent").setType(DataTypes.ENVELOPE).setMandatory(true);
198
                        definition.addDynFieldURL("host").setMandatory(true);
199
                        definition.addDynFieldString("infoLayerQuery").setMandatory(true);                
200
                        definition.addDynFieldString("layerQuery").setMandatory(true);
201
                        definition.addDynFieldString("imageformat").setMandatory(true);
202
                        definition.addDynFieldString("infoformat").setMandatory(true);
203
                        definition.addDynFieldString("srs").setMandatory(true);
204
                        //definition.addDynFieldList("styles").setClassOfItems(String.class).setMandatory(false);
205
                }
206
        }
207
        
208
        /*
209
         * (non-Javadoc)
210
         * @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)
211
         */
212
        @SuppressWarnings("deprecation")
213
        public void draw(BufferedImage image, Graphics2D g, ViewPort viewPort,
214
                        Cancellable cancel, double scale) throws ReadException {
215
                //CancelTaskImpl cancellable = new CancelTaskImpl(cancel);
216

    
217
                //Solo el zoom normal recalcula el nivel dependiendo de la escala. El zoom por niveles asigna
218
                //?l el nivel de zoom por lo que no habr? que recalcularlo.
219
                if(recalcLevel) {
220
                        double pixelSize = viewPort.getExtent().getWidth() / (double)viewPort.getImageWidth();
221
                        zoomLevel = dataStore.getNearestLevel(pixelSize);
222
                }
223
                recalcLevel = true;
224
                
225
                if(!firstLoad) {
226
                        try {
227
                                initFilters();
228
                        } catch (FilePaletteException e) {
229
                                throw new ReadException(e.getMessage(), e);
230
                        }
231
                        firstLoad = true;
232
                }
233
                
234
                enableStopped();
235

    
236
                if (isWithinScale(scale)) {
237
                        if (!viewPort.getAdjustedExtent().intersects(getFullEnvelope()))
238
                                return;
239
                        Envelope adjustedExtent = viewPort.getAdjustedEnvelope();
240
                        Extent ext = rManager.getDataStructFactory().createExtent(
241
                                        adjustedExtent.getLowerCorner().getX(),
242
                                        adjustedExtent.getUpperCorner().getY(), 
243
                                        adjustedExtent.getUpperCorner().getX(),
244
                                        adjustedExtent.getLowerCorner().getY());
245
                        Dimension imgSz = viewPort.getImageSize();
246
                        ViewPortData vp2 = rManager.createViewPortData(viewPort.getProjection(), ext, imgSz );
247
                        vp2.setMat(viewPort.getAffineTransform());
248
                        
249
                        try {
250
                                WMTSDataParameters par = getWMTSParameters(getParameters());
251
                                //getParameters().setExtent(ext.toRectangle2D());
252
                                par.setWidth((int)viewPort.getImageSize().getWidth());
253
                                par.setHeight((int)viewPort.getImageSize().getHeight());
254
                                if(getDataStore().getParameters() instanceof TileDataParameters) {
255
                                        ((TileDataParameters)getDataStore().getParameters()).deleteCache(deleteCache);
256
                                }
257
                                deleteCache = false;  //Se borra la cach? solo el primer dibujado si se ha solicitado
258
                                
259
                                getRender().drawTiledService(g, vp2);
260
                        } catch (RasterDriverException e) {
261
                                throw new ReadException("Problems drawing this layer: " + e.getMessage(), e);
262
                        } catch (InvalidSetViewException e) {
263
                                throw new ReadException("Problems drawing this layer: " + e.getMessage(), e);
264
                        } catch (ProcessInterruptedException e) {
265
                                throw new ReadException("Problems drawing this layer: " + e.getMessage(), e);
266
                        }                        
267
                }
268
                disableStopped();
269
        }
270
        
271

    
272
        /**
273
         * @see com.iver.cit.gvsig.fmap.layers.FLayer#print(java.awt.Graphics2D,
274
         *                 com.iver.cit.gvsig.fmap.ViewPort,
275
         *                 com.iver.cit.gvsig.fmap.operations.Cancellable)
276
         */
277
        public void print(Graphics2D g, ViewPort viewPort, Cancellable cancel, double scale, PrintRequestAttributeSet properties)
278
        throws ReadException {
279
                
280
        }
281

    
282
        public void _print(Graphics2D g, ViewPort viewPort, Cancellable cancel,
283
                        double scale) throws ReadException {
284
                draw(null, g, viewPort, cancel,scale);
285
        }
286

    
287
        /**
288
         * Inserta la extensi?n total de la capa.
289
         *
290
         * @param fullExtent
291
         *            Rectangulo.
292
         */
293
        public void setFullExtent(Rectangle2D fullExtent) {
294
                this.setFullEnvelope(this.getEnvelopeFromRectable2D(fullExtent));
295
        }
296

    
297
        /**
298
         * Inserta la extensi?n total de la capa en la proyeccion original.
299
         *
300
         * @param fullExtent
301
         *            Rect?ngulo.
302
         */
303
        public void setFullEnvelope(Envelope envelope) {
304
                Envelope cur = this.getFullEnvelope();
305
                if (cur == envelope) {
306
                        return;
307
                }
308
                if (cur != null && cur.equals(envelope)) {
309
                        return;
310
                }
311

    
312
                this.fullEnvelope = envelope;
313
                this.updateDrawVersion();
314
        }
315

    
316
        public HashMap<String, Object> getProperties() {
317
                HashMap<String, Object> info = new HashMap<String, Object>();
318
                WMTSDataParameters par = getWMTSParameters(getParameters());
319
                String layerName = par.getLayer().getTitle();
320
                try {
321
                        info.put("name", getName());
322
                        info.put("selectedLayer", layerName);
323
                        info.put("host", par.getURI());
324
                        info.put("srs", par.getSRSCode());
325
                        info.put("imageformat", par.getImageFormat());
326
                        info.put("infoformat", par.getInfoFormat());
327
                        //info.put("styles", getParameters().getStyles());
328
                        return info;
329
                } catch (Exception e) {
330
                        e.printStackTrace();
331
                }
332
                return null;
333
        }
334

    
335

    
336
        public String getTocImageIcon() {
337
                return "icon-layer-wms";
338
        }
339

    
340
        /*
341
         * (non-Javadoc)
342
         * @see org.gvsig.fmap.raster.layers.FLyrRasterSE#isActionEnabled(int)
343
         */
344
        public boolean isActionEnabled(int action) {
345
                switch (action) {
346
                case IRasterLayerActions.ZOOM_PIXEL_RESOLUTION:
347
                case IRasterLayerActions.FLYRASTER_BAR_TOOLS:
348
                case IRasterLayerActions.BANDS_FILE_LIST:
349
                case IRasterLayerActions.COLOR_TABLE:
350
                case IRasterLayerActions.GEOLOCATION:
351
                case IRasterLayerActions.PANSHARPENING:
352
                case IRasterLayerActions.SAVE_COLORINTERP:
353
                case IRasterLayerActions.SAVEAS:
354
                case IRasterLayerActions.BANDS_RGB:
355
                case IRasterLayerActions.CLIPPING:
356
                case IRasterLayerActions.ENHANCED:
357
                case IRasterLayerActions.STATS:
358
                case IRasterLayerActions.NODATA:
359
                case IRasterLayerActions.HISTOGRAM:
360
                        return false;
361
                case IRasterLayerActions.REMOTE_ACTIONS:
362
                        return true;
363
                }
364

    
365
                return super.isActionEnabled(action);
366
        }
367

    
368
        /*
369
         * (non-Javadoc)
370
         * @see org.gvsig.fmap.raster.layers.FLyrRasterSE#getLegend()
371
         */
372
        public ILegend getLegend() {
373
                return null;
374
        }
375
        
376
        /*
377
         * (non-Javadoc)
378
         * @see org.gvsig.raster.fmap.layers.FLyrRaster#isRemote()
379
         */
380
        public boolean isRemote() {
381
                return true;
382
        }
383

    
384
        /*
385
         * (non-Javadoc)
386
         * @see org.gvsig.fmap.raster.layers.FLyrRasterSE#overviewsSupport()
387
         */
388
        public boolean overviewsSupport() {
389
                return false;
390
        }
391

    
392
        protected void updateDrawVersion() {
393
                if (this.disableUpdateDrawVersion != null){
394

    
395
                        Thread curThread = Thread.currentThread();
396

    
397
                        Thread aThread;
398

    
399
                        Iterator<WeakReference<Thread>> iter = this.disableUpdateDrawVersion.iterator();
400
                        while (iter.hasNext()){
401
                                aThread = (Thread) ((WeakReference<?>)iter.next()).get();
402
                                if (aThread == null){
403
                                        iter.remove();
404
                                } else if(aThread.equals(curThread)){
405
                                        return;
406
                                }
407
                        }
408
                }
409
                super.updateDrawVersion();
410
        }
411

    
412
        protected void disableUpdateDrawVersion() {
413
                if (this.disableUpdateDrawVersion == null) {
414
                        this.disableUpdateDrawVersion = new ArrayList<WeakReference<Thread>>();
415
                }
416
                this.disableUpdateDrawVersion.add(new WeakReference<Thread>(Thread.currentThread()));
417
        }
418

    
419
        protected void enableUpdateDrawVersion() {
420
                if (this.disableUpdateDrawVersion == null) {
421
                        return;
422
                }
423
                Thread curThread = Thread.currentThread();
424
                Thread aThread;
425

    
426
                Iterator<WeakReference<Thread>> iter = this.disableUpdateDrawVersion.iterator();
427
                while (iter.hasNext()) {
428
                        aThread = (Thread) ((WeakReference<?>)iter.next()).get();
429
                        if (aThread == null) {
430
                                iter.remove();
431
                        } else if(aThread.equals(curThread)) {
432
                                iter.remove();
433
                                break;
434
                        }
435
                }
436

    
437
        }
438

    
439
        @SuppressWarnings("unused")
440
        private Rectangle2D.Double getRectable2DFromEnvelope(Envelope env) {
441
                return new Rectangle2D.Double(env.getMinimum(0), env.getMinimum(1), env
442
                                .getLength(0), env.getLength(1));
443
        }
444

    
445
        private Envelope getEnvelopeFromRectable2D(Rectangle2D rect) {
446
                try {
447
                        return geomManager.createEnvelope(rect.getMinX(), rect.getMinY(),
448
                                        rect.getMaxX(), rect.getMaxY(),
449
                                        SUBTYPES.GEOM2D);
450
                } catch (CreateEnvelopeException e) {
451
                        logger.error("Error creating the envelope", e);
452
                }
453
                return null;
454
        }
455
        
456
        /*
457
         * (non-Javadoc)
458
         * @see org.gvsig.raster.fmap.layers.FLyrRaster#getFileFormat()
459
         */
460
        @Override
461
        public String getFileFormat() {
462
                return "WMTS";
463
        }
464
        
465

    
466
        /**
467
         * Devuelve el envelope en la proyeccion de la vista
468
         */
469
        public Envelope getFullEnvelope() {
470
                Envelope rAux;
471
                rAux = this.fullEnvelope;
472

    
473
                // Esto es para cuando se crea una capa nueva con el fullExtent de ancho
474
                // y alto 0.
475
                if (rAux == null || rAux.getMaximum(0) - rAux.getMinimum(0) == 0
476
                                && rAux.getMaximum(1) - rAux.getMinimum(1) == 0) {
477
                        try {
478
                                rAux = geomManager.createEnvelope(0, 0, 100, 100, SUBTYPES.GEOM2D);
479
                        } catch (CreateEnvelopeException e) {
480
                                logger.error("Error creating the envelope", e);
481
                        }
482
                }
483
                // Si existe reproyecci?n, reproyectar el extent
484
                ICoordTrans ct = getCoordTrans();
485
                if (ct != null) {
486
                        Point2D pt1 = new Point2D.Double(rAux.getMinimum(0), rAux
487
                                        .getMinimum(1));
488
                        Point2D pt2 = new Point2D.Double(rAux.getMaximum(0), rAux
489
                                        .getMaximum(1));
490
                        pt1 = ct.convert(pt1, null);
491
                        pt2 = ct.convert(pt2, null);
492
                        try {
493
                                rAux = geomManager.createEnvelope(pt1.getX(), pt1.getY(), pt2
494
                                                .getX(), pt2.getY(), SUBTYPES.GEOM2D);
495
                        } catch (CreateEnvelopeException e) {
496
                                logger.error("Error creating the envelope", e);
497
                        }// new
498
                        // Rectangle2D.Double();
499
                }
500
                return rAux;
501

    
502
        }
503
        
504
        /*
505
         * (non-Javadoc)
506
         * @see org.gvsig.raster.fmap.layers.FLyrRaster#getFullRasterExtent()
507
         */
508
        public Extent getFullRasterExtent() {
509
                Envelope env = getFullEnvelope();
510
                double minx = env.getMinimum(0);
511
                double miny = env.getMinimum(1);
512
                double maxx = env.getMaximum(0);
513
                double maxy = env.getMaximum(1);
514
                Point2D ul = new Point2D.Double(minx, maxy);
515
                Point2D ur = new Point2D.Double(maxx, maxy);
516
                Point2D ll = new Point2D.Double(minx, miny);
517
                Point2D lr = new Point2D.Double(maxx, miny);
518
                return rManager.getDataStructFactory().createExtent(ul, lr, ur, ll);
519
        }
520

    
521
    public DynObjectSet getInfo(Point p, double tolerance, Cancellable cancel)
522
                throws LoadLayerException, DataException {
523
                
524
                return null;
525
        }
526
    
527
    public DynObjectSet getInfo(Point p, double tolerance, Cancellable cancel, boolean fast)
528
    throws LoadLayerException, DataException {
529

    
530
            Point2D pReal = getMapContext().getViewPort().toMapPoint(p);
531
            String fInfo = null;
532
            try {
533
                    fInfo = getDataStore().getInfoByPoint(pReal.getX(), pReal.getY(), new CancelTaskImpl(cancel));
534
            } catch (RemoteServiceException e) {
535
                    throw new LoadLayerException("Error in getInfoByPoint", e);
536
            }
537
            int type = DynObjectSetWMTSInfo.TYPE_TEXT;
538
            WMTSDataParameters wmtsParams = getWMTSParameters(params);
539

    
540
            if(wmtsParams.getInfoFormat() != null) {
541
                    if(wmtsParams.getInfoFormat().compareTo("text/html") == 0)
542
                            type = DynObjectSetWMTSInfo.TYPE_HTML;
543
                    if(wmtsParams.getInfoFormat().compareTo("application/vnd.ogc.gml") == 0)
544
                            type = DynObjectSetWMTSInfo.TYPE_XML;
545
            }
546
            return new DynObjectSetWMTSInfo(fInfo, type);
547
    }
548
    
549
    /**
550
     * Sets the data store parameters
551
     * @param params
552
     * @throws InitializeException
553
     */
554
    public void setParameters(DataStoreParameters params) throws InitializeException {
555
            this.params = params;
556
            DataManagerProviderServices dataman = (DataManagerProviderServices) DALLocator.getDataManager();
557
                try {
558
                        DataStore dStore = dataman.openStore(params.getDataStoreName(), params);
559
                        this.setDataStore(dStore);
560
                        
561
                        if(params instanceof WMTSDataParameters) {
562
                                this.setName(((WMTSDataParameters) params).getURI());
563
                        }
564
                        
565
                        if(params instanceof TileDataParameters) {
566
                                DataParameters p = ((TileDataParameters) params).getDataParameters();
567
                                if(p instanceof WMTSDataParameters) {
568
                                        this.setName(((WMTSDataParameters) p).getURI());
569
                                }
570
                        }
571
                        
572
                } catch (ValidateDataParametersException e) {
573
                        throw new InitializeException(e);
574
                } catch (ProviderNotRegisteredException e) {
575
                        throw new InitializeException(e);
576
                } catch (InitializeException e) {
577
                        throw new InitializeException(e);
578
                } catch (LoadLayerException e) {
579
                        throw new InitializeException(e);
580
                }
581
    }
582
    
583
    @SuppressWarnings("deprecation")
584
        public DataStoreParameters getParameters() {
585
            if(params == null) {
586
                    DataManager datamanager = DALLocator.getDataManager();
587
                        WMTSServerExplorerParameters explorerParams = null;
588
                        try {
589
                                explorerParams = (WMTSServerExplorerParameters) datamanager.createServerExplorerParameters(WMTSServerExplorer.NAME);
590
                                explorerParams.setHost("");
591
                                explorer = (WMTSServerExplorer) datamanager.createServerExplorer(explorerParams);
592
                                params = explorer.getStoreParameters();
593
                        } catch (InitializeException e) {
594
                        } catch (ProviderNotRegisteredException e) {
595
                        } catch (ValidateDataParametersException e) {
596
                        }
597
            }
598
            return getWMTSParameters(params);
599
    }
600
    
601
    /**
602
     * Gets <code>WMTSDataParameters</code>
603
     * @param parameters
604
     * @return
605
     */
606
    private WMTSDataParameters getWMTSParameters(DataStoreParameters parameters) {
607
            WMTSDataParameters params = null;
608
            if(parameters instanceof WMTSDataParameters) {
609
                        params = (WMTSDataParameters) parameters;
610
                }
611
                
612
                if(parameters instanceof TileDataParameters) {
613
                        DataParameters p = ((TileDataParameters) parameters).getDataParameters();
614
                        if(p instanceof WMTSDataParameters) {
615
                                params = (WMTSDataParameters) p;
616
                        }
617
                }
618
                return params;
619
    }
620
    
621
    /**
622
     * Sets the explorer
623
     * @param explorer
624
     */
625
    public void setExplorer(WMTSServerExplorer explorer) {
626
            this.explorer = explorer;
627
    }
628
    
629
    /**
630
     * Gets the explorer
631
     * @return
632
     */
633
    public WMTSServerExplorer getExplorer() {
634
            return this.explorer;
635
    }
636

    
637
        public Image getImageLegend() {
638
                return null;
639
        }
640

    
641
        public String getPathImage() {
642
                return null;
643
        }
644
        
645
        /*
646
         * (non-Javadoc)
647
         * @see org.gvsig.fmap.mapcontext.layers.FLyrDefault#cloneLayer()
648
         */
649
        public FLayer cloneLayer() throws Exception {
650
                RasterDataStore  ds = dataStore.cloneDataStore();
651
                FLyrWMTS newLayer = new FLyrWMTS();
652
                newLayer.setName(getName());
653
                newLayer.setOpenRasterStore(ds, RasterManager.TYPE_MULTIDATA);
654
                newLayer.fullEnvelope = fullEnvelope;
655
                newLayer.params = params;
656
                newLayer.firstLoad = firstLoad;
657
                newLayer.explorer = explorer;
658
                
659
                ArrayList<RasterFilter> filters = getRender().getFilterList().getStatusCloned();
660

    
661
                //Hacemos una copia de las bandas a renderizar
662
                if(getRender().getRenderBands() != null) {
663
                        int[] rb = new int[getRender().getRenderBands().length];
664
                        for (int i = 0; i < rb.length; i++)
665
                                rb[i] = getRender().getRenderBands()[i];
666
                        newLayer.getRender().setRenderBands(rb);
667
                }
668

    
669
                //Asignamos el entorno
670
                if(newLayer.getRender().getFilterList() == null)
671
                        newLayer.getRender().setFilterList(RasterLocator.getManager().createEmptyFilterList(getRender().getFilterList().getInitDataType()));
672
                newLayer.getRender().getFilterList().setEnv(getRender().getFilterList().getEnv());
673
                newLayer.getRender().getFilterList().setStatus(filters);
674

    
675
                // Asignamos los valores noData del original
676
                newLayer.setNoDataValue(getNoDataValue());
677
                newLayer.setNoDataType(getNoDataType());
678
                newLayer.applyNoData();
679
                newLayer.enableOpen();
680
                
681
                return newLayer;
682
        }
683

    
684
        /**
685
         * Assigns the flag to delete this layer from the cache
686
         * @param selected
687
         */
688
        public void deleteCache(boolean deleteCache) {
689
                this.deleteCache = deleteCache;
690
        }
691
}