Statistics
| Revision:

gvsig-raster / org.gvsig.raster.tilecache / trunk / org.gvsig.raster.tilecache / org.gvsig.raster.tilecache.io / src / main / java / org / gvsig / raster / tilecache / io / TileProvider.java @ 1057

History | View | Annotate | Download (37.2 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
package org.gvsig.raster.tilecache.io;
23

    
24
import java.awt.geom.AffineTransform;
25
import java.awt.geom.NoninvertibleTransformException;
26
import java.awt.geom.Point2D;
27
import java.io.File;
28
import java.io.FileNotFoundException;
29
import java.io.IOException;
30
import java.lang.reflect.Constructor;
31
import java.lang.reflect.InvocationTargetException;
32
import java.util.ArrayList;
33

    
34
import org.gvsig.compat.net.ICancellable;
35
import org.gvsig.fmap.dal.DALLocator;
36
import org.gvsig.fmap.dal.DataStore;
37
import org.gvsig.fmap.dal.DataStoreParameters;
38
import org.gvsig.fmap.dal.coverage.RasterLibrary;
39
import org.gvsig.fmap.dal.coverage.RasterLocator;
40
import org.gvsig.fmap.dal.coverage.dataset.Buffer;
41
import org.gvsig.fmap.dal.coverage.datastruct.BandList;
42
import org.gvsig.fmap.dal.coverage.datastruct.DatasetBand;
43
import org.gvsig.fmap.dal.coverage.datastruct.Extent;
44
import org.gvsig.fmap.dal.coverage.exception.BandAccessException;
45
import org.gvsig.fmap.dal.coverage.exception.BandNotFoundInListException;
46
import org.gvsig.fmap.dal.coverage.exception.FileNotOpenException;
47
import org.gvsig.fmap.dal.coverage.exception.FileNotSupportedException;
48
import org.gvsig.fmap.dal.coverage.exception.InvalidSetViewException;
49
import org.gvsig.fmap.dal.coverage.exception.NotSupportedExtensionException;
50
import org.gvsig.fmap.dal.coverage.exception.ProcessInterruptedException;
51
import org.gvsig.fmap.dal.coverage.exception.RasterDriverException;
52
import org.gvsig.fmap.dal.coverage.exception.RemoteServiceException;
53
import org.gvsig.fmap.dal.coverage.exception.RmfSerializerException;
54
import org.gvsig.fmap.dal.coverage.store.parameter.MultiDimensionalStoreParameters;
55
import org.gvsig.fmap.dal.coverage.store.parameter.RasterDataParameters;
56
import org.gvsig.fmap.dal.coverage.store.parameter.RemoteStoreParameters;
57
import org.gvsig.fmap.dal.coverage.store.parameter.TileDataParameters;
58
import org.gvsig.fmap.dal.coverage.store.props.ColorInterpretation;
59
import org.gvsig.fmap.dal.coverage.store.props.ColorTable;
60
import org.gvsig.fmap.dal.coverage.store.props.Transparency;
61
import org.gvsig.fmap.dal.coverage.util.MathUtils;
62
import org.gvsig.fmap.dal.coverage.util.RasterUtils;
63
import org.gvsig.fmap.dal.exception.InitializeException;
64
import org.gvsig.fmap.dal.exception.ProviderNotRegisteredException;
65
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
66
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorer;
67
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorerParameters;
68
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemStoreParameters;
69
import org.gvsig.fmap.dal.spi.DataManagerProviderServices;
70
import org.gvsig.fmap.dal.spi.DataStoreProvider;
71
import org.gvsig.fmap.dal.spi.DataStoreProviderServices;
72
import org.gvsig.metadata.MetadataLocator;
73
import org.gvsig.raster.cache.tile.Tile;
74
import org.gvsig.raster.cache.tile.TileCache;
75
import org.gvsig.raster.cache.tile.TileCacheLibrary;
76
import org.gvsig.raster.cache.tile.TileCacheLocator;
77
import org.gvsig.raster.cache.tile.TileCacheManager;
78
import org.gvsig.raster.cache.tile.exception.TileBuildException;
79
import org.gvsig.raster.cache.tile.exception.TileGettingException;
80
import org.gvsig.raster.cache.tile.layer.TiledLayer;
81
import org.gvsig.raster.cache.tile.provider.CacheStruct;
82
import org.gvsig.raster.cache.tile.provider.TileListener;
83
import org.gvsig.raster.cache.tile.provider.TileServer;
84
import org.gvsig.raster.impl.buffer.DefaultRasterQuery;
85
import org.gvsig.raster.impl.datastruct.BandListImpl;
86
import org.gvsig.raster.impl.datastruct.DatasetBandImpl;
87
import org.gvsig.raster.impl.datastruct.ExtentImpl;
88
import org.gvsig.raster.impl.provider.DefaultRasterProvider;
89
import org.gvsig.raster.impl.provider.MemoryMatrixBuffer;
90
import org.gvsig.raster.impl.provider.RasterProvider;
91
import org.gvsig.raster.impl.provider.RemoteRasterProvider;
92
import org.gvsig.raster.impl.provider.TiledRasterProvider;
93
import org.gvsig.raster.impl.store.DefaultStoreFactory;
94
import org.gvsig.raster.impl.store.properties.RemoteDataStoreStatistics;
95
import org.gvsig.tools.ToolsLocator;
96
import org.gvsig.tools.locator.LocatorException;
97
import org.gvsig.tools.task.Cancellable;
98
import org.gvsig.tools.task.TaskStatus;
99
import org.slf4j.Logger;
100
import org.slf4j.LoggerFactory;
101

    
102
/**
103
 * Provider for WMTS service
104
 *
105
 * @author Nacho Brodin (nachobrodin@gmail.com)
106
 */
107
public class TileProvider extends DefaultRasterProvider implements TiledRasterProvider {
108
        public static String                NAME                     = "Tile Store";
109
        public static String                DESCRIPTION              = "Raster Tiled Source";
110
        public static final String          METADATA_DEFINITION_NAME = "TileStore";
111
        private static final Logger         logger                   = LoggerFactory.getLogger(TileProvider.class);
112
        private RasterProvider              provider                 = null;
113
        private boolean                     open                     = false;
114
        private Extent                      viewRequest              = null;
115
        private TiledLayer                  tiledLayer               = null;
116
        private RasterUtils                 util                     = RasterLocator.getManager().getRasterUtils();
117
        private MathUtils                   math                     = RasterLocator.getManager().getMathUtils();
118
        private TileServer                  secondLevelTileServer    = null;
119
         
120
        public static void register() {                
121
                DataManagerProviderServices dataman = (DataManagerProviderServices) DALLocator.getDataManager();
122
                if (dataman != null && !dataman.getStoreProviders().contains(NAME)) {
123
                        dataman.registerStoreProvider(NAME,
124
                                        TileProvider.class, TileDataParametersImpl.class);
125
                }
126

    
127
                /*if(DALFileLocator.getFilesystemServerExplorerManager() != null)
128
                        DALFileLocator.getFilesystemServerExplorerManager().registerProvider(
129
                                        NAME, DESCRIPTION,
130
                                        TileServerExplorer.class);*/
131
                
132
                if (!dataman.getExplorerProviders().contains(TileServerExplorer.NAME)) {
133
                        dataman.registerExplorerProvider(TileServerExplorer.NAME, TileServerExplorer.class, TileServerExplorerParameters.class);
134
                }
135
                dataman.registerStoreFactory(NAME, DefaultStoreFactory.class);
136
        }
137
        
138
        /**
139
         * Loads the specific provider to download data
140
         * @param file
141
         * @return
142
         * @throws NotSupportedExtensionException
143
         * @throws FileNotSupportedException 
144
         */
145
        private RasterProvider loadProvider(TileDataParametersImpl params, DataStoreProviderServices storeServices) throws ProviderNotRegisteredException, InitializeException {
146
                Object obj = params.getDataParameters();
147
                DataManagerProviderServices dataManager = (DataManagerProviderServices)DALLocator.getDataManager();
148
                DataStoreProvider prov = null;
149
                
150
                if(obj != null && obj instanceof DataStoreParameters) //Remote 
151
                        prov = dataManager.createProvider(storeServices, (DataStoreParameters)obj);
152
                else { //File
153
                        if(params.getFile() != null) {
154
                                //We have to locate a provider's name which manages the selected file
155
                                //A FilesystemServerExplorer will give a getProviderNames service
156
                                FilesystemServerExplorerParameters paramsExplorer = (FilesystemServerExplorerParameters)dataManager.createServerExplorerParameters(FilesystemServerExplorer.NAME);
157
                                FilesystemServerExplorer serverExplorer = null;
158
                                try {
159
                                        paramsExplorer.setRoot(File.separator);
160
                                        serverExplorer = (FilesystemServerExplorer)dataManager.openServerExplorer(FilesystemServerExplorer.NAME, paramsExplorer);
161
                                } catch (ValidateDataParametersException e) {
162
                                        throw new InitializeException(e);
163
                                }
164
                                
165
                                //Gets the list of provider's name to manage the file
166
                                ArrayList<String> provName = serverExplorer.getProviderNameList(params.getFile());
167
                                if(provName.size() > 0) {
168
                                        for (int i = 0; i < provName.size(); i++) {
169
                                                //Gets the first provider what is not a TileProvider
170
                                                if(provName.get(i).compareTo(NAME) != 0) {
171
                                                        DataStoreParameters newparams = dataManager.createStoreParameters(provName.get(i));
172
                                                        ((FilesystemStoreParameters)newparams).setFile(params.getFile()); 
173
                                                        prov = dataManager.createProvider(storeServices, newparams);
174
                                                }
175
                                        }
176
                                }
177
                        }
178
                }
179
                
180
                if(prov != null && prov instanceof RasterProvider) {
181
                        if(((RasterProvider)prov).isRotated())
182
                                throw new InitializeException("Rotation not supported tiling files", new Throwable());
183

    
184
                        return (RasterProvider)prov;
185
                }
186
                
187
                return null;
188
        }
189
        
190
        /**
191
         * Gets the internal provider used to feed the TileProvider
192
         * @return
193
         */
194
        public RasterProvider getInternalProvider() {
195
                return provider;
196
        }
197
        
198
        /*
199
         * (non-Javadoc)
200
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getFileSuffix()
201
         */
202
        public String getFileSuffix() {
203
                try {
204
                        return provider instanceof RemoteRasterProvider ? provider.getFileSuffix() : "tif";
205
                } catch(Throwable e) {
206
                        //if wmts doesn't exists in the classpath
207
                        return "tif";
208
                }
209
        }
210
        
211
        /*
212
         * (non-Javadoc)
213
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getRMFFile()
214
         */
215
        public String getRMFFile() {
216
                TileCacheManager  manager = TileCacheLocator.getManager();
217
                TileCache tileCache = manager.getTileCache(RasterLibrary.pathTileCache);
218
                
219
                String path = tiledLayer.getBaseLayerDirectory().substring(0, tiledLayer.getBaseLayerDirectory().lastIndexOf(File.separator) + 1) + 
220
                                          tileCache.getConfigurationDirectory() + File.separator + 
221
                                          tiledLayer.getID() + ".rmf";
222
                
223
                try {
224
                        if(!new File(path).exists() && 
225
                                provider != null && 
226
                                provider.getRMFFile() != null &&
227
                                new File(provider.getRMFFile()).exists()) 
228
                                RasterLocator.getManager().getFileUtils().copyFile(provider.getRMFFile(), path);
229
                        
230
                        if(provider != null && provider.getColorTable() != null) {        
231
                                ColorTable colorTable = provider.getColorTable();
232
                                RasterLocator.getManager().getProviderServices().saveObjectToRmfFile(path, ColorTable.class, colorTable);
233
                        }
234
                } catch (LocatorException e) {
235
                        logger.info("No se ha podido copiar el fichero RMF a la capa tileada", e);
236
                } catch (FileNotFoundException e) {
237
                        logger.info("No se ha podido copiar el fichero RMF a la capa tileada", e);
238
                } catch (IOException e) {
239
                        logger.info("No se ha podido copiar el fichero RMF a la capa tileada", e);
240
                } catch (RmfSerializerException e) {
241
                        logger.info("No se ha podido copiar la tabla de color a la capa tileada", e);
242
                }
243
                return path;
244
        }
245
        
246
        public TileProvider() throws NotSupportedExtensionException {
247
                super();
248
        }
249
        
250
        /*
251
         * (non-Javadoc)
252
         * @see org.gvsig.raster.impl.provider.RasterProvider#registerTileProviderFormats(java.lang.Class)
253
         */
254
        public void registerTileProviderFormats(Class<RasterProvider> c) {
255
                
256
        }
257
        
258
        /**
259
         * Assigns the provider associated to this tile server
260
         * @param prov
261
         * @throws NotSupportedExtensionException 
262
         */
263
        public void setProvider(RasterProvider prov) throws NotSupportedExtensionException {
264
                this.provider = prov;
265
                init(getDataStoreParameters(), getStoreServices());
266
        }
267
        
268
        public TileProvider(TileDataParametersImpl params,
269
                        DataStoreProviderServices storeServices) throws NotSupportedExtensionException, FileNotSupportedException {
270
                super(params, storeServices, ToolsLocator.getDynObjectManager()
271
                                .createDynObject(
272
                                                MetadataLocator.getMetadataManager().getDefinition(
273
                                                                DataStore.METADATA_DEFINITION_NAME)));
274
                if(!params.isSecondLevelCache()) {
275
                        try {
276
                                provider = loadProvider(params, storeServices);
277
                        } catch (ProviderNotRegisteredException e) {
278
                                throw new FileNotSupportedException("Provider not registered", e);
279
                        } catch (InitializeException e) {
280
                                throw new FileNotSupportedException("Initialize exception", e);
281
                        }
282
                        init(params, storeServices);
283
                }
284
        }
285
        
286
        /**
287
         * Creates the second level cache if the client has set a <code>TileServer</code> and the
288
         * <code>CacheStruct</code> is different that the old one. 
289
         * <UL>
290
         * <LI>First level cache without TileServer from the client: do nothing</LI>
291
         * <LI>First level cache with TileServer from the client and the structure is 
292
         * different to the old one: Builds a second level TileProvider</LI>
293
         * <LI>First level cache with TileServer from the client and the structure is 
294
         * equal to the old one: do nothing</LI>
295
         * <LI>Second level cache: sets the TileServer</LI>
296
         * </UL>
297
         * @param params
298
         * @param storeServices
299
         * @throws NotSupportedExtensionException
300
         */
301
        /*private void createsSecondLevelCache(TileDataParametersImpl params) throws NotSupportedExtensionException {
302
                //Se obtiene el TileServer que haya pasado el cliente en los par?metros si ha pasado alguno.
303
                TileServer tileServer = params.getTileServer();
304
                //Se obtiene el CacheStruct y se compara con el del provider
305
                CacheStruct cacheStruct = null;
306
                if(tileServer != null)
307
                        cacheStruct = tileServer.getStruct();
308
                
309
                if(params.isSecondLevelCache()) { //Cache de segundo nivel
310
                        this.secondLevelTileServer = tileServer;
311
                } else if(cacheStruct != null && !provider.getTileServer().getStruct().compare(cacheStruct)) { //Cache de primer nivel
312
                        //Si son distintos habr? que crear una cach? de segundo nivel por lo que creamos un nuevo TileProvider
313
                        //que tenga como par?metro el provider viejo
314
                        TileDataParametersImpl par = new TileDataParametersImpl();
315
                        par.setDataParameters(provider.getDataParameters());
316
                        par.setTileServer(tileServer);
317
                        par.setSecondLevelCache(true);
318
                        TileProvider newProvider = new TileProvider(par, null);
319
                        newProvider.setProvider(this.provider);
320
                        //Al TileProvider actual se le asigna como provider el TileProvider creado
321
                        this.provider = newProvider;
322
                }
323
        }*/
324
        
325
        /**
326
         * Crea las referencias al fichero y carga
327
         * las estructuras con la informaci?n y los metadatos.
328
         * @param proj Proyecci?n
329
         * @param param Parametros de carga
330
         * @throws NotSupportedExtensionException
331
         */
332
        public void init (DataStoreParameters params,
333
                        DataStoreProviderServices storeServices) throws NotSupportedExtensionException {
334
                setParam(storeServices, params);
335
                open = true;
336
                setDataType(provider.getDataType());
337
                bandCount = provider.getBandCount();
338
                //if(getColorInterpretation() == null)
339
                        setColorInterpretation(provider.getColorInterpretation());
340
                /*else
341
                        getColorInterpretation().addColorInterpretation(provider.getColorInterpretation());*/
342
                setColorTable(provider.getColorTable());
343
                noData = provider.getNoDataValue();
344
                setFName(provider.getURIOfFirstProvider());
345
                try {
346
                        wktProjection = provider.getWktProjection();
347
                } catch (RasterDriverException e) {
348
                }
349
                ownTransformation = provider.getAffineTransform();
350
                externalTransformation = (AffineTransform)ownTransformation.clone();
351
                
352
                createTiledLayer();
353
                
354
                //Force to deletes the layer if the flag is to true
355
                if(tiledLayer != null) {
356
                        if(param instanceof TileDataParameters) {
357
                                if(((TileDataParameters)param).isDeletingCache()) {
358
                                        TileCacheManager  manager = TileCacheLocator.getManager();
359
                                        TileCache tileCache = manager.getTileCache(RasterLibrary.pathTileCache);
360
                                        tileCache.removeLayer(tiledLayer);
361
                                        ((TileDataParameters)param).deleteCache(false);
362
                                }
363
                        }
364
                }
365
                
366
                if(provider instanceof RemoteRasterProvider)
367
                        stats = new RemoteDataStoreStatistics(provider);
368
        }
369
        
370
        /**
371
         * Creates a new tiled layer if this hasn't been created yet or the ID has changed. 
372
         * An ID could changed because the file type has changed when the user uses WMTS properties.
373
         */
374
        private void createTiledLayer() {
375
                TileCacheManager  manager = TileCacheLocator.getManager();
376
                TileCache tileCache = manager.getTileCache(RasterLibrary.pathTileCache);
377
                TiledLayer newLayer = tileCache.createLayer(provider.getTileServer(), TileCacheLibrary.DEFAULT_STRUCTURE);
378
                if(tiledLayer == null || newLayer.getID().compareTo(tiledLayer.getID()) != 0)
379
                        tiledLayer = newLayer;
380
        }
381
        
382
        /*
383
         * (non-Javadoc)
384
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getZoomLevels()
385
         */
386
        public int getZoomLevels() {
387
                if(provider.getTileServer() != null)
388
                        return provider.getTileServer().getStruct().getNumberOfLevels();
389
                return 0;
390
        }
391
        
392
        /*
393
         * (non-Javadoc)
394
         * @see org.gvsig.raster.impl.provider.RasterProvider#getNearestLevel(double)
395
         */
396
        public int getNearestLevel(double pixelSize) {
397
                double[] pixelSizes = getPixelSizeByLevel();
398
                for (int i = 0; i < pixelSizes.length - 1; i++) {
399
                        if(pixelSize <= pixelSizes[i] && pixelSize > pixelSizes[i + 1]) {
400
                                return i;
401
                        }
402
                }
403
                if(pixelSize < pixelSizes[getZoomLevels() - 1])
404
                        return getZoomLevels() - 1;
405
                return 0;
406
        }
407
        
408
        /**
409
         * Returns a list of pixel sizes by level
410
         * @return
411
         */
412
        public double[] getPixelSizeByLevel() {
413
                double[] list = new double[getZoomLevels()];
414
                CacheStruct struct = provider.getTileServer().getStruct();
415
                for (int i = 0; i < struct.getNumberOfLevels(); i++) {
416
                        list[i] = math.adjustDouble(struct.getPixelSizeByLevel(i));
417
                }
418
                return list;
419
        }
420
        
421
        /*
422
         * (non-Javadoc)
423
         * @see org.gvsig.raster.impl.provider.RasterProvider#getCoordsInTheNearestLevel(org.gvsig.fmap.dal.coverage.datastruct.Extent, int, int)
424
         */
425
        public Extent getCoordsInTheNearestLevel(Extent extent, int w, int h) {
426
                double[] pixelSizes = getPixelSizeByLevel();
427
                double currentPixelSize = extent.width() / (double)w;
428
                
429
                int level = 0;
430
                for (int i = 0; i < (pixelSizes.length - 1); i++) {
431
                        if(currentPixelSize < pixelSizes[i] && currentPixelSize >= pixelSizes[i + 1]) {
432
                                level = i + 1;
433
                                break;
434
                        }
435
                }
436
                
437
                return getZoomLevelCoordinates(level, extent, w, h);
438
        }
439
        
440
        /*
441
         * (non-Javadoc)
442
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getCoordsInLevel(java.awt.geom.Point2D, int, int, int)
443
         */
444
        public Extent getCoordsInLevel(Point2D viewCenter, int level, int w, int h) {
445
                level = adjustLevel(level);
446
                double pixelSize = provider.getTileServer().getStruct().getPixelSizeByLevel(level);
447
                
448
                double ulx = viewCenter.getX() - ((w / 2) * pixelSize);
449
                double uly = viewCenter.getY() - ((h / 2) * pixelSize);
450
                double lrx = ulx + (w * pixelSize);
451
                double lry = uly + (h * pixelSize);
452
                return new ExtentImpl(ulx, uly, lrx, lry);
453
        }
454
        
455
        /**
456
         * Adjust de level to the range
457
         * @param level
458
         * @return
459
         */
460
        private int adjustLevel(int level) {
461
                if(level < 0)
462
                        level = 0;
463
                if(level > getZoomLevels())
464
                        level = getZoomLevels();
465
                return level;
466
        }
467
        
468
        /*
469
         * (non-Javadoc)
470
         * @see org.gvsig.fmap.dal.coverage.dataset.RasterDataSet#getAffineTransform()
471
         */
472
        public AffineTransform getAffineTransform() {
473
                return provider.getAffineTransform();
474
        }
475
        
476
        /**
477
         * Obtiene el objeto que contiene el estado de la transparencia
478
         */
479
        public Transparency getTransparency() {
480
                return provider.getTransparency();
481
        }
482
        
483
        /**
484
         * Gets the bounding box in world coordinates. If the layer has grid subsets (TileMatrixLimits) then
485
         * this will have a only extent but if the layer doesn't have grid subsets then this will have a different
486
         * extent in each level resolution. In this case we need to know the extent for each level.
487
         * @return Extent
488
         */
489
        public Extent getExtent() {
490
                return provider.getExtent();
491
        }
492

    
493
        /*
494
         * (non-Javadoc)
495
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#load()
496
         */
497
        public RasterProvider load() {
498
                return this;
499
        }
500
        
501
        /*
502
         * (non-Javadoc)
503
         * @see org.gvsig.raster.impl.provider.RasterProvider#isOpen()
504
         */
505
        public boolean isOpen() {
506
                return open;
507
        }
508

    
509
        /*
510
         * (non-Javadoc)
511
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#isTiled()
512
         */
513
        public boolean isTiled() {
514
                return true;
515
        }
516
        
517
        /*
518
         * (non-Javadoc)
519
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#close()
520
         */
521
        public void close() {
522
                open = false;
523
                if(provider != null)
524
                        provider.close();
525
        }
526
        
527
        /*
528
         * (non-Javadoc)
529
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#translateFileName(java.lang.String)
530
         */
531
        public String translateFileName(String fileName) {
532
                return fileName;
533
        }
534

    
535
        /*
536
         * (non-Javadoc)
537
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#setView(org.gvsig.fmap.dal.coverage.datastruct.Extent)
538
         */
539
        public void setView(Extent e) {
540
                viewRequest = e;
541
        }
542

    
543
        /*
544
         * (non-Javadoc)
545
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getView()
546
         */
547
        public Extent getView() {
548
                return viewRequest;
549
        }
550

    
551
        /*
552
         * (non-Javadoc)
553
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getWidth()
554
         */
555
        public double getWidth() {
556
                return provider.getWidth();
557
        }
558

    
559
        /*
560
         * (non-Javadoc)
561
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getHeight()
562
         */
563
        public double getHeight() {
564
                return provider.getHeight();
565
        }
566

    
567
        /*
568
         * (non-Javadoc)
569
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#readCompleteLine(int, int)
570
         */
571
        public Object readCompleteLine(int line, int band)
572
                throws InvalidSetViewException, FileNotOpenException, RasterDriverException {
573
                return null;
574
        }
575
        
576
        public File getFileLayer() throws RasterDriverException {
577
                return null;
578
        }
579

    
580
        /**
581
         * Reads a complete block of data and returns an tridimensional array of the right type. This function is useful
582
         * to read a file very fast without setting a view. 
583
         * 
584
         * @param pos Posici?n donde se empieza  a leer
585
         * @param blockHeight Altura m?xima del bloque leido
586
         * @return Object que es un array tridimendional del tipo de datos del raster. (Bandas X Filas X Columnas)
587
         * @throws InvalidSetViewException
588
         * @throws FileNotOpenException
589
         * @throws RasterDriverException
590
         */
591
        public Object readBlock(int pos, int blockHeight, double scale) 
592
        throws InvalidSetViewException, FileNotOpenException, RasterDriverException, ProcessInterruptedException {
593
                return provider.readBlock(pos, blockHeight, scale);
594
        }
595

    
596
        /*
597
         * (non-Javadoc)
598
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getData(int, int, int)
599
         */
600
        public Object getData(int x, int y, int band)
601
                throws InvalidSetViewException, FileNotOpenException, RasterDriverException {
602
                return provider.getData(x, y, band);
603
        }
604
        
605
        /**
606
         * Assigns the list of bands RGB and read a window of data
607
         * @param rasterBuf
608
         * @param bandList
609
         * @param lastFile
610
         * @param ulx
611
         * @param uly
612
         * @param lrx
613
         * @param lry
614
         * @return
615
         * @throws RasterDriverException
616
         * @throws ProcessInterruptedException
617
         */
618
        public Buffer getBuffer(Buffer rasterBuf, BandList bandList, File lastFile, 
619
                        double ulx, double uly, double lrx, double lry) throws RasterDriverException, ProcessInterruptedException {
620
                return null;
621
        }
622
        
623
        /**
624
         * Calculates the extent of a zoom level using other extent as a reference. The new extent is 
625
         * calculated with the same coordinate at the center. 
626
         * @param level
627
         * @param extent
628
         * @param w
629
         * @param h
630
         * @return
631
         */
632
        public Extent getZoomLevelCoordinates(int level, Extent extent, int w, int h) {
633
                double centerX = extent.getCenterX();
634
                double centerY = extent.getCenterY();
635
                return getCoordsInLevel(new Point2D.Double(centerX, centerY), level, w, h);
636
        }
637
        
638
        /**
639
         * Gets the tile list in a selected extent
640
         * @param ex
641
         * @param bandList
642
         * @param bufWidth
643
         * @param bufHeight
644
         * @return
645
         * @throws TileBuildException 
646
         */
647
        private ArrayList<Tile> getTileList(Extent ex, BandList bandList, int bufWidth, int bufHeight) throws TileBuildException {
648
                TileServer tileServer = provider.getTileServer();
649
                CacheStruct struct = tileServer.getStruct();
650
                tileServer.setFileSuffix(getFileSuffix());
651
                
652
                createTiledLayer(); //Creates a new layer when the file type changes
653
                
654
                Extent adjustedExtent = util.intersection(provider.getExtent(), ex);
655
                double newBufWidth = (adjustedExtent.width() * bufWidth) / ex.width();
656
                double pixelSizeRequest = adjustedExtent.width() / newBufWidth; 
657
                
658
                ArrayList<Tile> tileList = struct.getTileList(new Point2D.Double(adjustedExtent.getULX(), adjustedExtent.getULY()), 
659
                                new Point2D.Double(adjustedExtent.getLRX(), adjustedExtent.getLRY()), 
660
                                pixelSizeRequest);
661
                
662
                for (int i = 0; i < tileList.size(); i++) {
663
                        loadTileTimeParameters(tileList.get(i));
664
                }
665
                
666
                for (int i = 0; i < tileList.size(); i++) {
667
                        tileList.get(i).setDownloaderParams("BandList", bandList.clone());
668
                }
669
                return tileList;
670
        }
671
        
672
        /**
673
         * Loads the multidimensional parameters in a tile 
674
         * @param tile
675
         */
676
        private void loadTileTimeParameters(Tile tile) {
677
                if(provider.getDataParameters() instanceof MultiDimensionalStoreParameters) {
678
                        MultiDimensionalStoreParameters par = (MultiDimensionalStoreParameters)provider.getDataParameters();
679
                        tile.setVariable(par.getStringVariable());
680
                        tile.setZ(par.getStringLevel());
681
                        tile.setTimeInstant(par.getStringTime());
682
                }
683
        }
684
        
685
        /*
686
         * (non-Javadoc)
687
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#needEnhanced()
688
         */
689
        public boolean needEnhanced() {
690
                return provider.needEnhanced();
691
        }
692
        
693
        /*
694
         * (non-Javadoc)
695
         * @see org.gvsig.raster.impl.provider.TiledRasterProvider#getTile(int, int, int, org.gvsig.fmap.dal.coverage.datastruct.Extent, org.gvsig.raster.cache.tile.provider.CacheStruct)
696
         */
697
        public Tile getTile(DefaultRasterQuery q) throws TileGettingException {
698
                //q.getResolutionLevel(), q.getTileCol(), q.getTileRow(), q.getBBox(), q.getCacheStruct()
699
                if(q.getCacheStruct() == null)
700
                        q.setCacheStruct(provider.getTileServer().getStruct());
701
                else
702
                        provider.getTileServer().setStruct(q.getCacheStruct());
703
                
704
                Tile tile = null;
705
                try {
706
                        tile = q.getCacheStruct().getTileStructure(
707
                                        q.getResolutionLevel(), q.getTileCol(), q.getTileRow(), 
708
                                        new Point2D.Double(q.getBBox().getULX(), q.getBBox().getULY()), 
709
                                        new Point2D.Double(q.getBBox().getLRX(), q.getBBox().getLRY()));
710
                } catch (TileBuildException e1) {
711
                        throw new TileGettingException(e1);
712
                }
713
                
714
                loadTileTimeParameters(tile);
715
                
716
                //Creamos un BandList con todas las bandas del fichero
717
                BandList bandList = new BandListImpl();
718
                for(int i = 0; i < provider.getBandCount(); i++) {
719
                        try {
720
                                DatasetBand band = new DatasetBandImpl(provider.getURIOfFirstProvider(), i, provider.getDataType()[i], provider.getBandCount());
721
                                bandList.addBand(band, i);
722
                        } catch(BandNotFoundInListException e) {
723
                                //No a?adimos la banda
724
                        }
725
                }
726
                bandList.setDrawableBands(new int[]{0, 1, 2});
727
                
728
                tile.setDownloaderParams("BandList", bandList);
729
                createTiledLayer();
730
                return tiledLayer.getTile(tile);
731
        }
732

    
733
        /*
734
         * (non-Javadoc)
735
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getWindowRaster(org.gvsig.fmap.dal.coverage.datastruct.Extent, int, int, org.gvsig.fmap.dal.coverage.datastruct.BandList, org.gvsig.raster.cache.tile.provider.TileListener)
736
         */
737
        public void getWindow(Extent ex, int bufWidth, int bufHeight, 
738
                        BandList bandList, TileListener listener, Cancellable status) throws ProcessInterruptedException, RasterDriverException {
739
                try {
740
                        ArrayList<Tile> tileList = getTileList(ex, bandList, bufWidth, bufHeight);
741
                        tiledLayer.getTiles(tileList, listener, status);
742
                } catch (TileGettingException e) {
743
                        throw new RasterDriverException("Error getting the tile list", e);
744
                } catch (TileBuildException e) {
745
                        throw new RasterDriverException("Error building the tile list", e);
746
                }
747
        }
748
        
749
        /*
750
         * (non-Javadoc)
751
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getWindowRaster(org.gvsig.fmap.dal.coverage.datastruct.Extent, int, int, org.gvsig.fmap.dal.coverage.datastruct.BandList, org.gvsig.fmap.dal.coverage.dataset.Buffer, boolean)
752
         */
753
        public Buffer getWindow(Extent extent, int bufWidth, int bufHeight, 
754
                        BandList bandList, Buffer rasterBuf, boolean adjustToExtent, TaskStatus status) throws ProcessInterruptedException, RasterDriverException {
755
                //draw method
756
                ArrayList<Tile> tileList = null;
757
                try {
758
                        tileList = getTileList(extent, bandList, bufWidth, bufHeight);
759
                        for (int i = 0; i < tileList.size(); i++) {
760
                                tiledLayer.getTile(tileList.get(i));
761
                        }
762
                } catch (TileGettingException e) {
763
                        throw new RasterDriverException("Error getting the tile list", e);
764
                } catch (TileBuildException e) {
765
                        throw new RasterDriverException("Error building the tile list", e);
766
                }
767
                MemoryMatrixBuffer matrixBuffer = new MemoryMatrixBuffer(tileList);
768
                return matrixBuffer.getWindow(extent, rasterBuf);
769
        }
770

    
771
        /*
772
         * (non-Javadoc)
773
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getWindowRaster(org.gvsig.fmap.dal.coverage.datastruct.Extent, org.gvsig.fmap.dal.coverage.datastruct.BandList, org.gvsig.fmap.dal.coverage.dataset.Buffer)
774
         */
775
        public Buffer getWindow(Extent ex, BandList bandList, Buffer rasterBuf, TaskStatus status) 
776
                throws ProcessInterruptedException, RasterDriverException {
777
                //return ((DefaultRasterProvider)provider).getWindow(ex, bandList, rasterBuf);
778
                return null;
779
        }
780

    
781
        /*
782
         * (non-Javadoc)
783
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getWindowRaster(double, double, double, double, org.gvsig.fmap.dal.coverage.datastruct.BandList, org.gvsig.fmap.dal.coverage.dataset.Buffer, boolean)
784
         */
785
        public Buffer getWindow(double ulx, double uly, double w, double h, 
786
                        BandList bandList, Buffer rasterBuf, boolean adjustToExtent, TaskStatus status) throws ProcessInterruptedException, RasterDriverException {
787
                Extent extent = new ExtentImpl(ulx, uly, ulx + w, uly - h);
788
                ArrayList<Tile> tileList = null;
789
                try {
790
                        tileList = getTileList(extent, bandList, rasterBuf.getWidth(), rasterBuf.getHeight());
791
                        for (int i = 0; i < tileList.size(); i++) {
792
                                tiledLayer.getTile(tileList.get(i));
793
                        }
794
                } catch (TileGettingException e) {
795
                        throw new RasterDriverException("Error getting the tile list", e);
796
                } catch (TileBuildException e) {
797
                        throw new RasterDriverException("Error building the tile list", e);
798
                }
799
                MemoryMatrixBuffer matrixBuffer = new MemoryMatrixBuffer(tileList);
800
                return matrixBuffer.getWindow(extent, rasterBuf);
801
        }
802

    
803
        /*
804
         * (non-Javadoc)
805
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getWindowRaster(int, int, int, int, int, int, org.gvsig.fmap.dal.coverage.datastruct.BandList, org.gvsig.fmap.dal.coverage.dataset.Buffer)
806
         */
807
        public Buffer getWindow(int x, int y, int w, int h, 
808
                        BandList bandList, Buffer rasterBuf, TaskStatus status) throws ProcessInterruptedException, RasterDriverException {
809
                DefaultRasterQuery q = (DefaultRasterQuery)RasterLocator.getManager().createQuery();
810
                q.setAreaOfInterest(x, y, w, h);
811
                q.setBandList(bandList);
812
                q.setBuffer(rasterBuf);
813
                Buffer b = ((DefaultRasterProvider)provider).getDataSet(q);
814
                if(b != null)
815
                        return b;
816
                else {
817
                        //TODO
818
                }
819
                return null;
820
        }
821

    
822
        /*
823
         * (non-Javadoc)
824
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getBlockSize()
825
         */
826
        public int getBlockSize() {
827
                return 0;
828
        }
829

    
830
        /*
831
         * (non-Javadoc)
832
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#setAffineTransform(java.awt.geom.AffineTransform)
833
         */
834
        public void setAffineTransform(AffineTransform t){
835
                
836
        }
837

    
838
        /*
839
         * (non-Javadoc)
840
         * @see org.gvsig.raster.impl.provider.RasterProvider#getOverviewCount(int)
841
         */
842
        public int getOverviewCount(int band) throws BandAccessException, RasterDriverException {
843
                return getZoomLevels();
844
        }
845

    
846
        /*
847
         * (non-Javadoc)
848
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getOverviewWidth(int, int)
849
         */
850
        public int getOverviewWidth(int band, int overview) throws BandAccessException, RasterDriverException {
851
                return provider.getTileServer().getStruct().getLayerWidthOfTileMatrixByLevel(overview) * 
852
                                provider.getTileServer().getStruct().getTileSizeByLevel(overview)[0];
853
        }
854

    
855
        /*
856
         * (non-Javadoc)
857
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getOverviewHeight(int, int)
858
         */
859
        public int getOverviewHeight(int band, int overview) throws BandAccessException, RasterDriverException {
860
                return provider.getTileServer().getStruct().getLayerHeightOfTileMatrixByLevel(overview) * 
861
                                provider.getTileServer().getStruct().getTileSizeByLevel(overview)[0];
862
        }
863

    
864
        /*
865
         * (non-Javadoc)
866
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#isOverviewsSupported()
867
         */
868
        public boolean isOverviewsSupported() {
869
                return false;
870
        }
871

    
872
        /*
873
         * (non-Javadoc)
874
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#isReproyectable()
875
         */
876
        public boolean isReproyectable() {
877
                return false;
878
        }
879

    
880
        /*
881
         * (non-Javadoc)
882
         * @see org.gvsig.fmap.dal.raster.spi.CoverageStoreProvider#getName()
883
         */
884
        public String getName() {
885
                return NAME;
886
        }
887
        
888
        /**
889
         * Convierte un punto desde coordenadas pixel a coordenadas del mundo.
890
         * @param pt Punto a transformar
891
         * @return punto transformado en coordenadas del mundo
892
         */
893
        public Point2D rasterToWorld(Point2D pt) {
894
                Point2D p = new Point2D.Double();
895
                getAffineTransform().transform(pt, p);
896
                return p;
897
        }
898

    
899
        /**
900
         * Convierte un punto desde del mundo a coordenadas pixel.
901
         * @param pt Punto a transformar
902
         * @return punto transformado en coordenadas pixel
903
         */
904
        public Point2D worldToRaster(Point2D pt) {
905
                Point2D p = new Point2D.Double();
906
                try {
907
                        getAffineTransform().inverseTransform(pt, p);
908
                } catch (NoninvertibleTransformException e) {
909
                        return pt;
910
                }
911
                return p;
912
        }
913
        
914
        /*
915
         * (non-Javadoc)
916
         * @see org.gvsig.raster.impl.provider.RasterProvider#setStatus(org.gvsig.raster.impl.provider.RasterProvider)
917
         */
918
        public void setStatus(RasterProvider provider) {
919
                if(provider instanceof TileProvider) {
920
                }
921
        }
922
        
923
        /**
924
         * ASigna el par?metro de inicializaci?n del driver.
925
         */
926
        @Override
927
        public void setParam(DataStoreProviderServices storeServices, DataStoreParameters param) {
928
                if(param instanceof RemoteStoreParameters)
929
                        this.uri = ((RasterDataParameters)param).getURI();
930
                this.param = param;
931
                this.storeServices = storeServices;
932
        }
933
        
934
        /*
935
         * (non-Javadoc)
936
         * @see org.gvsig.raster.impl.provider.RasterProvider#getInfoByPoint(double, double)
937
         */
938
        public String getInfoByPoint(double x, double y, ICancellable cancellable) throws RemoteServiceException {
939
                return null;
940
        }
941
        
942
        /**
943
         * A tiled provider can't return a color table because each tile could have a different table. 
944
         * Besides, the table is not available when le provider is loaded. There could be to load 
945
         * the table from one tile because this is a property of a tile. The color table is sent to
946
         * the render with the data in a tile. 
947
         */
948
        /*public ColorTable getColorTable() {
949
                return null;
950
        }*/
951
        
952
        /*
953
         * (non-Javadoc)
954
         * @see org.gvsig.raster.impl.dataset.RasterProvider#getColorInterpretation()
955
         */
956
        public ColorInterpretation getColorInterpretation() {
957
                return provider.getColorInterpretation();
958
        }
959

    
960
        /**
961
         * Asigna el objeto que contiene que contiene la interpretaci?n de
962
         * color por banda
963
         * @param DataStoreColorInterpretation
964
         */
965
        public void setColorInterpretation(ColorInterpretation colorInterpretation) {
966
                provider.setColorInterpretation(colorInterpretation);
967
        }
968
        
969
        /*
970
         * (non-Javadoc)
971
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getTileSize(int)
972
         */
973
        public int[] getTileSize(int level) {
974
                return provider.getTileServer().getStruct().getTileSizeByLevel(level);
975
        }
976
        
977
        /*
978
         * (non-Javadoc)
979
         * @see org.gvsig.raster.impl.provider.RasterProvider#deleteLayerFromCache()
980
         */
981
        public void deleteLayerFromCache() {
982
                TileCacheManager  manager = TileCacheLocator.getManager();
983
                TileCache tileCache = manager.getTileCache(RasterLibrary.pathTileCache);
984
                if(tiledLayer != null)
985
                        tileCache.removeLayer(tiledLayer);
986
        }
987
        
988
        /*
989
         * (non-Javadoc)
990
         * @see org.gvsig.raster.impl.provider.RasterProvider#getTileServer()
991
         */
992
        public TileServer getTileServer() {
993
                return secondLevelTileServer;
994
        }
995
        
996
        public void setSecondLevelTileServer(TileServer tileServer) {
997
                this.secondLevelTileServer = tileServer;
998
        }
999
        
1000
        /*
1001
         * (non-Javadoc)
1002
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#setTileServer(java.lang.Class)
1003
         */
1004
        public void setTileServer(Class<?> tileServer) {
1005
                //TODO:Manejar excepciones
1006
                //Crear par?metros
1007
                TileDataParametersImpl par = new TileDataParametersImpl();
1008
                par.setDataParameters(getDataParameters());
1009
                par.setSecondLevelCache(true); //No crea un nuevo provider
1010
                
1011
                //Crea el proveedor de tiles de segundo nivel
1012
                TileProvider newProvider = null;
1013
                try {
1014
                        newProvider = new TileProvider(par, null);
1015
                        newProvider.setProvider(this.provider);
1016
                } catch (NotSupportedExtensionException e1) {
1017
                        e1.printStackTrace();
1018
                } catch (FileNotSupportedException e) {
1019
                        //No se puede dar. Si el padre es soportado este tambi?n
1020
                        e.printStackTrace();
1021
                }
1022
                
1023
                //Instancia el TileServer pasado por el cliente con el TileProvider de segundo nivel
1024
                Constructor<?> constructor;
1025
                TileServer tServer = null;
1026
                try {
1027
                        constructor = tileServer.getConstructor(new Class<?>[]{DefaultRasterProvider.class});
1028
                        Object [] args2 = {newProvider};
1029
                        tServer = (TileServer)constructor.newInstance(args2);
1030
                } catch (SecurityException e) {
1031
                        e.printStackTrace();
1032
                } catch (NoSuchMethodException e) {
1033
                        e.printStackTrace();
1034
                } catch (IllegalArgumentException e) {
1035
                        e.printStackTrace();
1036
                } catch (InstantiationException e) {
1037
                        e.printStackTrace();
1038
                } catch (IllegalAccessException e) {
1039
                        e.printStackTrace();
1040
                } catch (InvocationTargetException e) {
1041
                        e.printStackTrace();
1042
                }
1043
                
1044
                //Asigna el TileServer al nuevo provider de segundo nivel
1045
                newProvider.setSecondLevelTileServer(tServer);
1046
                
1047
                //Asigna al provider de tiles de primer nivel el de segundo. 
1048
                //Solo si las estructuras de cach? son diferentes
1049
                try {
1050
                        if(!provider.getTileServer().getStruct().compare(tServer.getStruct())) {
1051
                                this.setProvider(newProvider);
1052
                                tiledLayer = null;
1053
                        }
1054
                } catch (NotSupportedExtensionException e) {
1055
                        e.printStackTrace();
1056
                }
1057
        }
1058
        
1059
}