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

History | View | Annotate | Download (27.3 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.coverage.RasterLocator;
48
import org.gvsig.fmap.dal.coverage.RasterManager;
49
import org.gvsig.fmap.dal.coverage.datastruct.BandList;
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.grid.RasterFilterList;
59
import org.gvsig.fmap.dal.coverage.grid.render.Render;
60
import org.gvsig.fmap.dal.coverage.store.RasterDataStore;
61
import org.gvsig.fmap.dal.coverage.store.parameter.RasterDataParameters;
62
import org.gvsig.fmap.dal.coverage.store.parameter.TileDataParameters;
63
import org.gvsig.fmap.dal.coverage.store.props.Metadata;
64
import org.gvsig.fmap.dal.exception.DataException;
65
import org.gvsig.fmap.dal.exception.InitializeException;
66
import org.gvsig.fmap.dal.exception.ProviderNotRegisteredException;
67
import org.gvsig.fmap.dal.exception.ReadException;
68
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
69
import org.gvsig.fmap.dal.spi.DataManagerProviderServices;
70
import org.gvsig.fmap.geom.GeometryLocator;
71
import org.gvsig.fmap.geom.GeometryManager;
72
import org.gvsig.fmap.geom.Geometry.SUBTYPES;
73
import org.gvsig.fmap.geom.exception.CreateEnvelopeException;
74
import org.gvsig.fmap.geom.primitive.Envelope;
75
import org.gvsig.fmap.mapcontext.ViewPort;
76
import org.gvsig.fmap.mapcontext.exceptions.LoadLayerException;
77
import org.gvsig.fmap.mapcontext.layers.FLayer;
78
import org.gvsig.fmap.mapcontext.layers.FLyrDefault;
79
import org.gvsig.fmap.mapcontext.layers.operations.IHasImageLegend;
80
import org.gvsig.fmap.mapcontext.rendering.legend.ILegend;
81
import org.gvsig.raster.fmap.layers.DefaultFLyrRaster;
82
import org.gvsig.raster.fmap.layers.IRasterLayerActions;
83
import org.gvsig.raster.fmap.layers.NotAvailableStateException;
84
import org.gvsig.raster.util.CancelTaskImpl;
85
import org.gvsig.raster.util.persistence.PersistencyFilterParam;
86
import org.gvsig.raster.wmts.io.WMTSDataParameters;
87
import org.gvsig.raster.wmts.io.WMTSServerExplorer;
88
import org.gvsig.raster.wmts.io.WMTSServerExplorerParameters;
89
import org.gvsig.tools.ToolsLocator;
90
import org.gvsig.tools.dynobject.DynObjectSet;
91
import org.gvsig.tools.dynobject.DynStruct;
92
import org.gvsig.tools.persistence.PersistenceManager;
93
import org.gvsig.tools.persistence.PersistentState;
94
import org.gvsig.tools.persistence.exception.PersistenceException;
95
import org.gvsig.tools.task.Cancellable;
96
import org.gvsig.tools.task.SimpleTaskStatus;
97
import org.gvsig.tools.task.TaskStatusManager;
98
import org.slf4j.Logger;
99
import org.slf4j.LoggerFactory;
100

    
101

    
102

    
103
/**
104
 * WMTS Layer class.
105
 *
106
 * @author Nacho Brodin (nachobrodin@gmail.com)
107
 *
108
 */
109
public class FLyrWMTS extends DefaultFLyrRaster implements IHasImageLegend {
110
        public static final String           PERSISTENT_NAME           = "FLyrWMTS_Persistent";
111
        public static final String           PERSISTENT_DESCRIPTION    = "FLyrWMTS Persistent Definition";
112
        
113
        private static final GeometryManager geomManager               = GeometryLocator.getGeometryManager();
114
        private static final Logger          logger                    = LoggerFactory.getLogger(FLyrWMTS.class);
115
        private List<WeakReference<Thread>>         disableUpdateDrawVersion;
116
        private Envelope                                         fullEnvelope              = null;
117
        private boolean                                                 firstLoad                 = false;
118
        private RasterManager                rManager                  = RasterLocator.getManager();
119
        private DataStoreParameters          params                    = null;
120
        private WMTSServerExplorer           explorer                  = null;
121
        private boolean                      deleteCache               = false;
122
        //Is useful to save the last ViewPort to know the last zoom level in the screen
123
        //private ViewPort                     lastViewPort              = null;
124
        
125
        /*
126
         * (non-Javadoc)
127
         * @see org.gvsig.raster.fmap.layers.DefaultFLyrRaster#loadFromState(org.gvsig.tools.persistence.PersistentState)
128
         */
129
        @Override
130
        public void loadFromState(PersistentState state) throws PersistenceException {
131
                String host = state.getString("host");
132
                Object obj = state.get("parameters");
133
                WMTSDataParameters storedParams = null;
134
                if(obj instanceof WMTSDataParameters) {
135
                        storedParams = (WMTSDataParameters) obj;
136
                }
137
                if(obj instanceof TileDataParameters) {
138
                        DataParameters p = ((TileDataParameters) obj).getDataParameters();
139
                        if(p instanceof WMTSDataParameters)
140
                                storedParams = (WMTSDataParameters) p;
141
                }
142
                
143
                try {
144
                        DataManager datamanager = DALLocator.getDataManager();
145
                        WMTSServerExplorerParameters explorerParams = null;
146
                        explorerParams = (WMTSServerExplorerParameters) datamanager.createServerExplorerParameters(WMTSServerExplorer.NAME);
147
                        explorerParams.setHost("");
148
                        explorerParams.setLongitudeFirst(new Boolean(false));
149
                        explorer = (WMTSServerExplorer) datamanager.createServerExplorer(explorerParams);
150
                        WMTSServerExplorerParameters params = (WMTSServerExplorerParameters)explorer.getParameters();
151
                        params.setHost(host);
152
                        explorer.connect(new CancelTaskImpl());
153
                } catch (Exception e) {
154
                        throw new PersistenceException("Server comunication error", e);
155
                }
156

    
157
                DataStoreParameters paramsFromExplorer = explorer.getStoreParameters();
158
                WMTSDataParameters wmtsParamsFromExplorer = null;
159
                if(paramsFromExplorer instanceof WMTSDataParameters) {
160
                        wmtsParamsFromExplorer = (WMTSDataParameters) paramsFromExplorer;
161
                }
162
                if(paramsFromExplorer instanceof TileDataParameters) {
163
                        DataParameters p = ((TileDataParameters) paramsFromExplorer).getDataParameters();
164
                        if(p instanceof WMTSDataParameters)
165
                                wmtsParamsFromExplorer = (WMTSDataParameters) p;
166
                }
167
                
168
                String layerName = state.getString("layername");
169
                setName(layerName);
170
                wmtsParamsFromExplorer.setLayer(explorer.getLayer(layerName));
171
                wmtsParamsFromExplorer.assignFields(storedParams);
172
                /*wmtsParamsFromExplorer.setImageFormat(state.getString(WMTSDataParameters.FIELD_IMAGE_FORMAT));
173
                wmtsParamsFromExplorer.setInfoFormat(state.getString(WMTSDataParameters.FIELD_INFO_FORMAT));
174
                wmtsParamsFromExplorer.setName(state.getString(WMTSDataParameters.FIELD_NAME));
175
                wmtsParamsFromExplorer.setSRS(state.getString(WMTSDataParameters.FIELD_SRSSTR));
176
                wmtsParamsFromExplorer.setOverrideHost(state.getBoolean(WMTSDataParameters.FIELD_OVERRIDE));
177
                wmtsParamsFromExplorer.setExtent((Rectangle2D)state.get(WMTSDataParameters.FIELD_EXTENT));*/
178
                params = wmtsParamsFromExplorer;
179
                
180
                dataStore = RasterLocator.getManager().getDataStructFactory().createDataStore();
181
                getDataStore().setParameters(wmtsParamsFromExplorer);
182
                getDataStore().loadFromState(state);
183
                
184
                super.loadFromState(state);
185
                this.fullEnvelope = (Envelope) state.get("fullEnvelope");
186
        }
187

    
188
        /*
189
         * (non-Javadoc)
190
         * @see org.gvsig.raster.fmap.layers.DefaultFLyrRaster#saveToState(org.gvsig.tools.persistence.PersistentState)
191
         */
192
        @Override
193
        public void saveToState(PersistentState state) throws PersistenceException {
194
                super.saveToState(state);
195
                WMTSDataParameters p = getWMTSParameters(params);
196
                
197
                state.set("fullEnvelope", this.fullEnvelope);
198
                state.set("host", p.getURI());
199
                state.set("layername", p.getLayer().getTitle());
200
                state.set("parameters", getParameters());
201
                /*state.set(WMTSDataParameters.FIELD_EXTENT, p.getExtent());
202
                state.set(WMTSDataParameters.FIELD_IMAGE_FORMAT, p.getImageFormat());
203
                state.set(WMTSDataParameters.FIELD_INFO_FORMAT, p.getInfoFormat());
204
                state.set(WMTSDataParameters.FIELD_NAME, p.getName());
205
                state.set(WMTSDataParameters.FIELD_SRSSTR, p.getSRSCode());
206
                state.set(WMTSDataParameters.FIELD_OVERRIDE, p.isOverridingHost());*/
207
                
208
                getDataStore().saveToState(state);
209
        }
210

    
211
        public static void registerPersistent() {
212
                PersistenceManager manager = ToolsLocator.getPersistenceManager();
213
                DynStruct definition = manager.getDefinition(PERSISTENT_NAME);
214
                if( definition == null ) {
215
                        if (manager.getDefinition(FLyrDefault.class) == null) {
216
                                FLyrDefault.registerPersistent();
217
                        }
218

    
219
                        definition = manager.addDefinition(
220
                                        FLyrWMTS.class,
221
                                        PERSISTENT_NAME,
222
                                        PERSISTENT_DESCRIPTION,
223
                                        null, 
224
                                        null
225
                        );
226
                        
227
                        definition.extend(PersistenceManager.PERSISTENCE_NAMESPACE, "FLyrDefault");
228
                }
229

    
230
                DefaultFLyrRaster.registerPersistence(definition);
231
                definition.addDynFieldObject("fullEnvelope").setClassOfValue(Envelope.class).setMandatory(false);
232
                definition.addDynFieldString("host").setMandatory(false);
233
                definition.addDynFieldString("layername").setMandatory(false);
234
                
235
                /*definition.addDynFieldObject(WMTSDataParameters.FIELD_EXTENT).setClassOfValue(Rectangle2D.class).setMandatory(false);
236
                definition.addDynFieldString(WMTSDataParameters.FIELD_IMAGE_FORMAT).setMandatory(false);
237
                definition.addDynFieldString(WMTSDataParameters.FIELD_INFO_FORMAT).setMandatory(false);
238
                definition.addDynFieldString(WMTSDataParameters.FIELD_NAME).setMandatory(false);                        
239
                definition.addDynFieldString(WMTSDataParameters.FIELD_SRSSTR).setMandatory(false);
240
                definition.addDynFieldBoolean(WMTSDataParameters.FIELD_OVERRIDE).setMandatory(false);*/
241
                
242
                definition.addDynFieldObject("parameters").setClassOfValue(RasterDataParameters.class).setMandatory(true);
243
                definition.addDynFieldObject("bandList").setClassOfValue(BandList.class).setMandatory(false);
244
                definition.addDynFieldObject("metadata").setClassOfValue(Metadata.class).setMandatory(false);
245
                definition.addDynFieldObject("render").setClassOfValue(Render.class).setMandatory(true);
246
                definition.addDynFieldObject("filterList").setClassOfValue(RasterFilterList.class).setMandatory(false);
247
                definition.addDynFieldList("paramlist").setClassOfItems(PersistencyFilterParam.class).setMandatory(false);
248
        }
249

    
250
        public FLyrWMTS() {
251
                super();
252
                this.updateDrawVersion();
253
                try {
254
                        enableAwake();
255
                } catch (NotAvailableStateException e) {
256
                        logger.error("Fallo el estado de open. Closed=" + isClosed() + " Awake=" + isAwake(), this, e);
257
                }
258
        }
259
        
260
        public static DataStore createDataStore(String host, IProjection srs) throws InitializeException {
261
                DataManagerProviderServices dataman = (DataManagerProviderServices) DALLocator.getDataManager();
262
                RasterDataParameters params = null;
263
                try {
264
                        params = (RasterDataParameters)dataman.createServerExplorerParameters(WMTSServerExplorer.NAME);
265
                } catch (InitializeException e) {
266
                        return null;
267
                } catch (ProviderNotRegisteredException e) {
268
                        return null;
269
                }
270
                params.setURI(host);
271
                params.setSRS(srs);
272
                
273
                try {
274
                        return dataman.openStore(params.getDataStoreName(), params);
275
                } catch (ValidateDataParametersException e) {
276
                        throw new InitializeException(e);
277
                } catch (ProviderNotRegisteredException e) {
278
                        throw new InitializeException(e);
279
                }
280
        }
281

    
282
        /*
283
         * (non-Javadoc)
284
         * @see org.gvsig.fmap.mapcontext.layers.operations.SingleLayer#setDataStore(org.gvsig.fmap.dal.DataStore)
285
         */
286
        public void setDataStore(DataStore dataStore) throws LoadLayerException {
287
                this.dataStore = (RasterDataStore) dataStore;
288
                try {
289
                        enableOpen();
290
                } catch (NotAvailableStateException e) {
291
                        logger.error("Fallo el estado de open. Closed=" + isClosed() + " Awake=" + isAwake(), this, e);
292
                }
293
                setProjection(this.dataStore.getProjection());
294
                setFullExtent(this.dataStore.getExtent().toRectangle2D());
295
        }
296
        
297
        /*
298
         * (non-Javadoc)
299
         * @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)
300
         */
301
        @SuppressWarnings("deprecation")
302
        public void draw(BufferedImage image, Graphics2D g, ViewPort viewPort,
303
                        Cancellable cancel, double scale) throws ReadException {
304
                //CancelTaskImpl cancellable = new CancelTaskImpl(cancel);
305

    
306
                //Solo el zoom normal recalcula el nivel dependiendo de la escala. El zoom por niveles asigna
307
                //?l el nivel de zoom por lo que no habr? que recalcularlo.
308
                if(recalcLevel) {
309
                        double pixelSize = viewPort.getExtent().getWidth() / (double)viewPort.getImageWidth();
310
                        zoomLevel = dataStore.getNearestLevel(pixelSize);
311
                }
312
                recalcLevel = true;
313
                
314
                if(!firstLoad) {
315
                        try {
316
                                initFilters();
317
                        } catch (FilePaletteException e) {
318
                                throw new ReadException(e.getMessage(), e);
319
                        }
320
                        firstLoad = true;
321
                }
322
                
323
                enableStopped();
324

    
325
                if (isWithinScale(scale)) {
326
                        if (!viewPort.getAdjustedExtent().intersects(getFullEnvelope()))
327
                                return;
328
                        Envelope adjustedExtent = viewPort.getAdjustedEnvelope();
329
                        Extent ext = rManager.getDataStructFactory().createExtent(
330
                                        adjustedExtent.getLowerCorner().getX(),
331
                                        adjustedExtent.getUpperCorner().getY(), 
332
                                        adjustedExtent.getUpperCorner().getX(),
333
                                        adjustedExtent.getLowerCorner().getY());
334
                        Dimension imgSz = viewPort.getImageSize();
335
                        ViewPortData vp2 = rManager.createViewPortData(viewPort.getProjection(), ext, imgSz );
336
                        vp2.setMat(viewPort.getAffineTransform());
337
                        
338
                        try {
339
                                WMTSDataParameters par = getWMTSParameters(getParameters());
340
                                //getParameters().setExtent(ext.toRectangle2D());
341
                                par.setWidth((int)viewPort.getImageSize().getWidth());
342
                                par.setHeight((int)viewPort.getImageSize().getHeight());
343
                                
344
                                TaskStatusManager manager = ToolsLocator.getTaskStatusManager();
345
                                SimpleTaskStatus taskStatus = manager.createDefaultSimpleTaskStatus("Drawing " + getName() + "...");
346
                                manager.add(taskStatus);
347
                                
348
                                getRender().setCancel(cancel);
349
                                getRender().drawTiledService(g, vp2, viewPort.getImageSize(), taskStatus);
350
                        } catch (RasterDriverException e) {
351
                                throw new ReadException("Problems drawing this layer: " + e.getMessage(), e);
352
                        } catch (InvalidSetViewException e) {
353
                                throw new ReadException("Problems drawing this layer: " + e.getMessage(), e);
354
                        } catch (ProcessInterruptedException e) {
355
                                throw new ReadException("Problems drawing this layer: " + e.getMessage(), e);
356
                        }                        
357
                }
358
                disableStopped();
359
        }
360
        
361

    
362
        /**
363
         * @see com.iver.cit.gvsig.fmap.layers.FLayer#print(java.awt.Graphics2D,
364
         *                 com.iver.cit.gvsig.fmap.ViewPort,
365
         *                 com.iver.cit.gvsig.fmap.operations.Cancellable)
366
         */
367
        public void print(Graphics2D g, ViewPort viewPort, Cancellable cancel, double scale, PrintRequestAttributeSet properties)
368
        throws ReadException {
369
                
370
        }
371

    
372
        public void _print(Graphics2D g, ViewPort viewPort, Cancellable cancel,
373
                        double scale) throws ReadException {
374
                draw(null, g, viewPort, cancel,scale);
375
        }
376

    
377
        /**
378
         * Inserta la extensi?n total de la capa.
379
         *
380
         * @param fullExtent
381
         *            Rectangulo.
382
         */
383
        public void setFullExtent(Rectangle2D fullExtent) {
384
                this.setFullEnvelope(this.getEnvelopeFromRectable2D(fullExtent));
385
        }
386

    
387
        /**
388
         * Inserta la extensi?n total de la capa en la proyeccion original.
389
         *
390
         * @param fullExtent
391
         *            Rect?ngulo.
392
         */
393
        public void setFullEnvelope(Envelope envelope) {
394
                Envelope cur = this.getFullEnvelope();
395
                if (cur == envelope) {
396
                        return;
397
                }
398
                if (cur != null && cur.equals(envelope)) {
399
                        return;
400
                }
401

    
402
                this.fullEnvelope = envelope;
403
                this.updateDrawVersion();
404
        }
405

    
406
        public HashMap<String, Object> getProperties() {
407
                HashMap<String, Object> info = new HashMap<String, Object>();
408
                WMTSDataParameters par = getWMTSParameters(getParameters());
409
                String layerName = par.getLayer().getTitle();
410
                try {
411
                        info.put("name", getName());
412
                        info.put("selectedLayer", layerName);
413
                        info.put("host", par.getURI());
414
                        info.put("srs", par.getSRSCode());
415
                        info.put("imageformat", par.getImageFormat());
416
                        info.put("infoformat", par.getInfoFormat());
417
                        //info.put("styles", getParameters().getStyles());
418
                        return info;
419
                } catch (Exception e) {
420
                        e.printStackTrace();
421
                }
422
                return null;
423
        }
424

    
425

    
426
        public String getTocImageIcon() {
427
                return "icon-layer-wms";
428
        }
429

    
430
        /*
431
         * (non-Javadoc)
432
         * @see org.gvsig.fmap.raster.layers.FLyrRasterSE#isActionEnabled(int)
433
         */
434
        public boolean isActionEnabled(int action) {
435
                switch (action) {
436
                case IRasterLayerActions.ZOOM_PIXEL_RESOLUTION:
437
                case IRasterLayerActions.FLYRASTER_BAR_TOOLS:
438
                case IRasterLayerActions.BANDS_FILE_LIST:
439
                case IRasterLayerActions.COLOR_TABLE:
440
                case IRasterLayerActions.GEOLOCATION:
441
                case IRasterLayerActions.PANSHARPENING:
442
                case IRasterLayerActions.SAVE_COLORINTERP:
443
                case IRasterLayerActions.SAVEAS:
444
                case IRasterLayerActions.BANDS_RGB:
445
                case IRasterLayerActions.CLIPPING:
446
                case IRasterLayerActions.ENHANCED:
447
                case IRasterLayerActions.STATS:
448
                case IRasterLayerActions.NODATA:
449
                case IRasterLayerActions.HISTOGRAM:
450
                        return false;
451
                case IRasterLayerActions.REMOTE_ACTIONS:
452
                        return true;
453
                }
454

    
455
                return super.isActionEnabled(action);
456
        }
457

    
458
        /*
459
         * (non-Javadoc)
460
         * @see org.gvsig.fmap.raster.layers.FLyrRasterSE#getLegend()
461
         */
462
        public ILegend getLegend() {
463
                return null;
464
        }
465
        
466
        /*
467
         * (non-Javadoc)
468
         * @see org.gvsig.raster.fmap.layers.FLyrRaster#isRemote()
469
         */
470
        public boolean isRemote() {
471
                return true;
472
        }
473

    
474
        /*
475
         * (non-Javadoc)
476
         * @see org.gvsig.fmap.raster.layers.FLyrRasterSE#overviewsSupport()
477
         */
478
        public boolean overviewsSupport() {
479
                return false;
480
        }
481

    
482
        protected void updateDrawVersion() {
483
                if (this.disableUpdateDrawVersion != null){
484

    
485
                        Thread curThread = Thread.currentThread();
486

    
487
                        Thread aThread;
488

    
489
                        Iterator<WeakReference<Thread>> iter = this.disableUpdateDrawVersion.iterator();
490
                        while (iter.hasNext()){
491
                                aThread = (Thread) ((WeakReference<?>)iter.next()).get();
492
                                if (aThread == null){
493
                                        iter.remove();
494
                                } else if(aThread.equals(curThread)){
495
                                        return;
496
                                }
497
                        }
498
                }
499
                super.updateDrawVersion();
500
        }
501

    
502
        protected void disableUpdateDrawVersion() {
503
                if (this.disableUpdateDrawVersion == null) {
504
                        this.disableUpdateDrawVersion = new ArrayList<WeakReference<Thread>>();
505
                }
506
                this.disableUpdateDrawVersion.add(new WeakReference<Thread>(Thread.currentThread()));
507
        }
508

    
509
        protected void enableUpdateDrawVersion() {
510
                if (this.disableUpdateDrawVersion == null) {
511
                        return;
512
                }
513
                Thread curThread = Thread.currentThread();
514
                Thread aThread;
515

    
516
                Iterator<WeakReference<Thread>> iter = this.disableUpdateDrawVersion.iterator();
517
                while (iter.hasNext()) {
518
                        aThread = (Thread) ((WeakReference<?>)iter.next()).get();
519
                        if (aThread == null) {
520
                                iter.remove();
521
                        } else if(aThread.equals(curThread)) {
522
                                iter.remove();
523
                                break;
524
                        }
525
                }
526

    
527
        }
528

    
529
        @SuppressWarnings("unused")
530
        private Rectangle2D.Double getRectable2DFromEnvelope(Envelope env) {
531
                return new Rectangle2D.Double(env.getMinimum(0), env.getMinimum(1), env
532
                                .getLength(0), env.getLength(1));
533
        }
534

    
535
        private Envelope getEnvelopeFromRectable2D(Rectangle2D rect) {
536
                try {
537
                        return geomManager.createEnvelope(rect.getMinX(), rect.getMinY(),
538
                                        rect.getMaxX(), rect.getMaxY(),
539
                                        SUBTYPES.GEOM2D);
540
                } catch (CreateEnvelopeException e) {
541
                        logger.error("Error creating the envelope", e);
542
                }
543
                return null;
544
        }
545
        
546
        /*
547
         * (non-Javadoc)
548
         * @see org.gvsig.raster.fmap.layers.FLyrRaster#getFileFormat()
549
         */
550
        @Override
551
        public String getFileFormat() {
552
                return "WMTS";
553
        }
554
        
555

    
556
        /**
557
         * Devuelve el envelope en la proyeccion de la vista
558
         */
559
        public Envelope getFullEnvelope() {
560
                Envelope rAux;
561
                rAux = this.fullEnvelope;
562

    
563
                // Esto es para cuando se crea una capa nueva con el fullExtent de ancho
564
                // y alto 0.
565
                if (rAux == null || rAux.getMaximum(0) - rAux.getMinimum(0) == 0
566
                                && rAux.getMaximum(1) - rAux.getMinimum(1) == 0) {
567
                        try {
568
                                rAux = geomManager.createEnvelope(0, 0, 100, 100, SUBTYPES.GEOM2D);
569
                        } catch (CreateEnvelopeException e) {
570
                                logger.error("Error creating the envelope", e);
571
                        }
572
                }
573
                // Si existe reproyecci?n, reproyectar el extent
574
                ICoordTrans ct = getCoordTrans();
575
                if (ct != null) {
576
                        Point2D pt1 = new Point2D.Double(rAux.getMinimum(0), rAux
577
                                        .getMinimum(1));
578
                        Point2D pt2 = new Point2D.Double(rAux.getMaximum(0), rAux
579
                                        .getMaximum(1));
580
                        pt1 = ct.convert(pt1, null);
581
                        pt2 = ct.convert(pt2, null);
582
                        try {
583
                                rAux = geomManager.createEnvelope(pt1.getX(), pt1.getY(), pt2
584
                                                .getX(), pt2.getY(), SUBTYPES.GEOM2D);
585
                        } catch (CreateEnvelopeException e) {
586
                                logger.error("Error creating the envelope", e);
587
                        }// new
588
                        // Rectangle2D.Double();
589
                }
590
                return rAux;
591

    
592
        }
593
        
594
        /*
595
         * (non-Javadoc)
596
         * @see org.gvsig.raster.fmap.layers.FLyrRaster#getFullRasterExtent()
597
         */
598
        public Extent getFullRasterExtent() {
599
                Envelope env = getFullEnvelope();
600
                double minx = env.getMinimum(0);
601
                double miny = env.getMinimum(1);
602
                double maxx = env.getMaximum(0);
603
                double maxy = env.getMaximum(1);
604
                Point2D ul = new Point2D.Double(minx, maxy);
605
                Point2D ur = new Point2D.Double(maxx, maxy);
606
                Point2D ll = new Point2D.Double(minx, miny);
607
                Point2D lr = new Point2D.Double(maxx, miny);
608
                return rManager.getDataStructFactory().createExtent(ul, lr, ur, ll);
609
        }
610

    
611
    public DynObjectSet getInfo(Point p, double tolerance, Cancellable cancel)
612
                throws LoadLayerException, DataException {
613
                
614
                return null;
615
        }
616
    
617
    public DynObjectSet getInfo(Point p, double tolerance, Cancellable cancel, boolean fast)
618
    throws LoadLayerException, DataException {
619

    
620
            Point2D pReal = getMapContext().getViewPort().toMapPoint(p);
621
            String fInfo = null;
622
            try {
623
                    fInfo = getDataStore().getInfoByPoint(pReal.getX(), pReal.getY(), new CancelTaskImpl(cancel));
624
            } catch (RemoteServiceException e) {
625
                    throw new LoadLayerException("Error in getInfoByPoint", e);
626
            }
627
            int type = DynObjectSetWMTSInfo.TYPE_TEXT;
628
            WMTSDataParameters wmtsParams = getWMTSParameters(params);
629

    
630
            if(wmtsParams.getInfoFormat() != null) {
631
                    if(wmtsParams.getInfoFormat().compareTo("text/html") == 0)
632
                            type = DynObjectSetWMTSInfo.TYPE_HTML;
633
                    if(wmtsParams.getInfoFormat().compareTo("application/vnd.ogc.gml") == 0)
634
                            type = DynObjectSetWMTSInfo.TYPE_XML;
635
            }
636
            return new DynObjectSetWMTSInfo(fInfo, type);
637
    }
638
    
639
    /**
640
     * Sets the data store parameters
641
     * @param params
642
     * @throws InitializeException
643
     */
644
    public void setParameters(DataStoreParameters params) throws InitializeException {
645
            this.params = params;
646

    
647
                if(params instanceof TileDataParameters) {
648
                        ((TileDataParameters)params).deleteCache(deleteCache);
649
                }
650
                
651
            DataManagerProviderServices dataman = (DataManagerProviderServices) DALLocator.getDataManager();
652
                try {
653
                        DataStore dStore = dataman.openStore(params.getDataStoreName(), params);
654
                        this.setDataStore(dStore);
655
                        
656
                        if(params instanceof WMTSDataParameters) {
657
                                this.setName(((WMTSDataParameters) params).getURI());
658
                        }
659
                        
660
                        if(params instanceof TileDataParameters) {
661
                                DataParameters p = ((TileDataParameters) params).getDataParameters();
662
                                if(p instanceof WMTSDataParameters) {
663
                                        this.setName(((WMTSDataParameters) p).getURI());
664
                                }
665
                        }
666
                        
667
                } catch (ValidateDataParametersException e) {
668
                        throw new InitializeException(e);
669
                } catch (ProviderNotRegisteredException e) {
670
                        throw new InitializeException(e);
671
                } catch (InitializeException e) {
672
                        throw new InitializeException(e);
673
                } catch (LoadLayerException e) {
674
                        throw new InitializeException(e);
675
                }
676
    }
677
    
678
    @SuppressWarnings("deprecation")
679
        public DataStoreParameters getParameters() {
680
            if(params == null) {
681
                    DataManager datamanager = DALLocator.getDataManager();
682
                        WMTSServerExplorerParameters explorerParams = null;
683
                        try {
684
                                explorerParams = (WMTSServerExplorerParameters) datamanager.createServerExplorerParameters(WMTSServerExplorer.NAME);
685
                                explorerParams.setHost("");
686
                                explorer = (WMTSServerExplorer) datamanager.createServerExplorer(explorerParams);
687
                                params = explorer.getStoreParameters();
688
                        } catch (InitializeException e) {
689
                        } catch (ProviderNotRegisteredException e) {
690
                        } catch (ValidateDataParametersException e) {
691
                        }
692
            }
693
            return getWMTSParameters(params);
694
    }
695
    
696
    /**
697
     * Gets <code>WMTSDataParameters</code>
698
     * @param parameters
699
     * @return
700
     */
701
    private WMTSDataParameters getWMTSParameters(DataStoreParameters parameters) {
702
            WMTSDataParameters params = null;
703
            if(parameters instanceof WMTSDataParameters) {
704
                        params = (WMTSDataParameters) parameters;
705
                }
706
                
707
                if(parameters instanceof TileDataParameters) {
708
                        DataParameters p = ((TileDataParameters) parameters).getDataParameters();
709
                        if(p instanceof WMTSDataParameters) {
710
                                params = (WMTSDataParameters) p;
711
                        }
712
                }
713
                return params;
714
    }
715
    
716
    /**
717
     * Sets the explorer
718
     * @param explorer
719
     */
720
    public void setExplorer(WMTSServerExplorer explorer) {
721
            this.explorer = explorer;
722
    }
723
    
724
    /**
725
     * Gets the explorer
726
     * @return
727
     */
728
    public WMTSServerExplorer getExplorer() {
729
            return this.explorer;
730
    }
731

    
732
        public Image getImageLegend() {
733
                return null;
734
        }
735

    
736
        public String getPathImage() {
737
                return null;
738
        }
739
        
740
        /*
741
         * (non-Javadoc)
742
         * @see org.gvsig.fmap.mapcontext.layers.FLyrDefault#cloneLayer()
743
         */
744
        public FLayer cloneLayer() throws Exception {
745
                RasterDataStore  ds = dataStore.cloneDataStore();
746
                FLyrWMTS newLayer = new FLyrWMTS();
747
                newLayer.setName(getName());
748
                newLayer.setOpenRasterStore(ds);
749
                newLayer.fullEnvelope = fullEnvelope;
750
                newLayer.params = params;
751
                newLayer.firstLoad = firstLoad;
752
                newLayer.explorer = explorer;
753
                
754
                ArrayList<RasterFilter> filters = getRender().getFilterList().getStatusCloned();
755

    
756
                //Hacemos una copia de las bandas a renderizar
757
                if(getRender().getRenderBands() != null) {
758
                        int[] rb = new int[getRender().getRenderBands().length];
759
                        for (int i = 0; i < rb.length; i++)
760
                                rb[i] = getRender().getRenderBands()[i];
761
                        newLayer.getRender().setRenderBands(rb);
762
                }
763

    
764
                //Asignamos el entorno
765
                if(newLayer.getRender().getFilterList() == null)
766
                        newLayer.getRender().setFilterList(RasterLocator.getManager().createEmptyFilterList(getRender().getFilterList().getInitDataType()));
767
                newLayer.getRender().getFilterList().setEnv(getRender().getFilterList().getEnv());
768
                newLayer.getRender().getFilterList().setStatus(filters);
769

    
770
                // Asignamos los valores noData del original
771
                newLayer.setNoDataValue(getNoDataValue());
772
                if(dataStore.getNoDataValue().isDefined())
773
                        newLayer.setNoDataTransparent(true);
774
                newLayer.enableOpen();
775
                
776
                return newLayer;
777
        }
778

    
779
        /**
780
         * Assigns the flag to delete this layer from the cache
781
         * @param selected
782
         */
783
        public void deleteCache(boolean deleteCache) {
784
                this.deleteCache = deleteCache;
785
        }
786
}