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

History | View | Annotate | Download (37.5 KB)

1
/* gvSIG. Geographic Information System of the Valencian Government
2
 *
3
 * Copyright (C) 2007-2008 Infrastructures and Transports Department
4
 * of the Valencian Government (CIT)
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 2
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 */
22
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.datastruct.BandListImpl;
85
import org.gvsig.raster.impl.datastruct.DatasetBandImpl;
86
import org.gvsig.raster.impl.datastruct.ExtentImpl;
87
import org.gvsig.raster.impl.provider.DefaultRasterProvider;
88
import org.gvsig.raster.impl.provider.MemoryMatrixBuffer;
89
import org.gvsig.raster.impl.provider.RasterProvider;
90
import org.gvsig.raster.impl.provider.RemoteRasterProvider;
91
import org.gvsig.raster.impl.provider.TiledRasterProvider;
92
import org.gvsig.raster.impl.store.DefaultStoreFactory;
93
import org.gvsig.raster.impl.store.properties.RemoteDataStoreStatistics;
94
import org.gvsig.tools.ToolsLocator;
95
import org.gvsig.tools.locator.LocatorException;
96
import org.slf4j.Logger;
97
import org.slf4j.LoggerFactory;
98

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

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

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

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

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

    
530
        /*
531
         * (non-Javadoc)
532
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#setView(org.gvsig.fmap.dal.coverage.datastruct.Extent)
533
         */
534
        public void setView(Extent e) {
535
                viewRequest = e;
536
        }
537

    
538
        /*
539
         * (non-Javadoc)
540
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getView()
541
         */
542
        public Extent getView() {
543
                return viewRequest;
544
        }
545

    
546
        /*
547
         * (non-Javadoc)
548
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getWidth()
549
         */
550
        public double getWidth() {
551
                return provider.getWidth();
552
        }
553

    
554
        /*
555
         * (non-Javadoc)
556
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getHeight()
557
         */
558
        public double getHeight() {
559
                return provider.getHeight();
560
        }
561

    
562
        /*
563
         * (non-Javadoc)
564
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#readCompleteLine(int, int)
565
         */
566
        public Object readCompleteLine(int line, int band)
567
                throws InvalidSetViewException, FileNotOpenException, RasterDriverException {
568
                return null;
569
        }
570
        
571
        /**
572
         * When the remote layer has fixed size this method downloads the file and return its reference. 
573
         * File layer has in the long side FIXED_SIZE pixels and the bounding box is complete. This file could be
574
         * useful to build an histogram or calculate statistics. This represents a sample of data.
575
         * @return
576
         * @throws RasterDriverException
577
         */
578
        public File getFileLayer() throws RasterDriverException {
579
                return null;
580
        }
581

    
582
        /**
583
         * Reads a complete block of data and returns an tridimensional array of the right type. This function is useful
584
         * to read a file very fast without setting a view. In a Web Map Service when the size is fixed then it will read the
585
         * entire image but when the source hasn't pixel size it will read a sample of data. This set of data will have
586
         * the size defined in FIXED_SIZE. 
587
         * 
588
         * @param pos Posici?n donde se empieza  a leer
589
         * @param blockHeight Altura m?xima del bloque leido
590
         * @return Object que es un array tridimendional del tipo de datos del raster. (Bandas X Filas X Columnas)
591
         * @throws InvalidSetViewException
592
         * @throws FileNotOpenException
593
         * @throws RasterDriverException
594
         */
595
        public Object readBlock(int pos, int blockHeight, double scale) 
596
        throws InvalidSetViewException, FileNotOpenException, RasterDriverException, ProcessInterruptedException {
597
                return provider.readBlock(pos, blockHeight, scale);
598
        }
599

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

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

    
772
        /*
773
         * (non-Javadoc)
774
         * @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)
775
         */
776
        public Buffer getWindow(Extent ex, BandList bandList, Buffer rasterBuf) 
777
                throws ProcessInterruptedException, RasterDriverException {
778
                //return ((DefaultRasterProvider)provider).getWindow(ex, bandList, rasterBuf);
779
                return null;
780
        }
781

    
782
        /*
783
         * (non-Javadoc)
784
         * @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)
785
         */
786
        public Buffer getWindow(double ulx, double uly, double w, double h, 
787
                        BandList bandList, Buffer rasterBuf, boolean adjustToExtent) throws ProcessInterruptedException, RasterDriverException {
788
                Extent extent = new ExtentImpl(ulx, uly, ulx + w, uly - h);
789
                ArrayList<Tile> tileList = null;
790
                try {
791
                        tileList = getTileList(extent, bandList, rasterBuf.getWidth(), rasterBuf.getHeight());
792
                        for (int i = 0; i < tileList.size(); i++) {
793
                                tiledLayer.getTile(tileList.get(i));
794
                        }
795
                } catch (TileGettingException e) {
796
                        throw new RasterDriverException("Error getting the tile list", e);
797
                } catch (TileBuildException e) {
798
                        throw new RasterDriverException("Error building the tile list", e);
799
                }
800
                MemoryMatrixBuffer matrixBuffer = new MemoryMatrixBuffer(tileList);
801
                return matrixBuffer.getWindow(extent, rasterBuf);
802
        }
803

    
804
        /*
805
         * (non-Javadoc)
806
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getWindowRaster(int, int, int, int, org.gvsig.fmap.dal.coverage.datastruct.BandList, org.gvsig.fmap.dal.coverage.dataset.Buffer)
807
         */
808
        public Buffer getWindow(int x, int y, BandList bandList, Buffer rasterBuf) throws ProcessInterruptedException, RasterDriverException {
809
                Buffer b = ((DefaultRasterProvider)provider).getWindow(x, y, bandList, rasterBuf); //Para proveedores de fichero esto va
810
                if(b != null)
811
                        return b;
812
                else {
813
                        //TODO
814
                }
815
                return null;
816
        }
817

    
818
        /*
819
         * (non-Javadoc)
820
         * @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)
821
         */
822
        public Buffer getWindow(int x, int y, int w, int h, int bufWidth, int bufHeight, BandList bandList, Buffer rasterBuf) throws ProcessInterruptedException, RasterDriverException {
823
                Buffer b = ((DefaultRasterProvider)provider).getWindow(x, y, w, h, bufWidth, bufHeight, bandList, rasterBuf); //Para proveedores de fichero esto va
824
                if(b != null)
825
                        return b;
826
                else {
827
                        //TODO
828
                }
829
                return null;
830
        }
831

    
832
        /*
833
         * (non-Javadoc)
834
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getBlockSize()
835
         */
836
        public int getBlockSize() {
837
                return 0;
838
        }
839

    
840
        /*
841
         * (non-Javadoc)
842
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#setAffineTransform(java.awt.geom.AffineTransform)
843
         */
844
        public void setAffineTransform(AffineTransform t){
845
                
846
        }
847

    
848
        /*
849
         * (non-Javadoc)
850
         * @see org.gvsig.raster.impl.provider.RasterProvider#getOverviewCount(int)
851
         */
852
        public int getOverviewCount(int band) throws BandAccessException, RasterDriverException {
853
                return getZoomLevels();
854
        }
855

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

    
864
        /*
865
         * (non-Javadoc)
866
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getOverviewHeight(int, int)
867
         */
868
        public int getOverviewHeight(int band, int overview) throws BandAccessException, RasterDriverException {
869
                return 0;
870
        }
871

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

    
880
        /*
881
         * (non-Javadoc)
882
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#isReproyectable()
883
         */
884
        public boolean isReproyectable() {
885
                return false;
886
        }
887

    
888
        /*
889
         * (non-Javadoc)
890
         * @see org.gvsig.fmap.dal.raster.spi.CoverageStoreProvider#getName()
891
         */
892
        public String getName() {
893
                return NAME;
894
        }
895
        
896
        /**
897
         * Convierte un punto desde coordenadas pixel a coordenadas del mundo.
898
         * @param pt Punto a transformar
899
         * @return punto transformado en coordenadas del mundo
900
         */
901
        public Point2D rasterToWorld(Point2D pt) {
902
                Point2D p = new Point2D.Double();
903
                getAffineTransform().transform(pt, p);
904
                return p;
905
        }
906

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

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