Statistics
| Revision:

gvsig-raster / org.gvsig.raster / branches / org.gvsig.raster_dataaccess_refactoring / org.gvsig.raster.lib / org.gvsig.raster.lib.impl / src / main / java / org / gvsig / raster / impl / store / DefaultRasterStore.java @ 2328

History | View | Annotate | Download (32.6 KB)

1
package org.gvsig.raster.impl.store;
2

    
3
import java.awt.Image;
4
import java.awt.geom.AffineTransform;
5
import java.awt.geom.Point2D;
6
import java.awt.geom.Rectangle2D;
7
import java.io.File;
8
import java.util.ArrayList;
9
import java.util.Collection;
10
import java.util.List;
11

    
12
import org.cresques.cts.IProjection;
13
import org.gvsig.compat.net.ICancellable;
14
import org.gvsig.fmap.crs.CRSFactory;
15
import org.gvsig.fmap.dal.DALLocator;
16
import org.gvsig.fmap.dal.DataManager;
17
import org.gvsig.fmap.dal.DataServerExplorer;
18
import org.gvsig.fmap.dal.DataServerExplorerParameters;
19
import org.gvsig.fmap.dal.DataStoreParameters;
20
import org.gvsig.fmap.dal.coverage.RasterLocator;
21
import org.gvsig.fmap.dal.coverage.RasterManager;
22
import org.gvsig.fmap.dal.coverage.datastruct.BandList;
23
import org.gvsig.fmap.dal.coverage.datastruct.Extent;
24
import org.gvsig.fmap.dal.coverage.datastruct.GeoPointList;
25
import org.gvsig.fmap.dal.coverage.datastruct.NoData;
26
import org.gvsig.fmap.dal.coverage.exception.BandAccessException;
27
import org.gvsig.fmap.dal.coverage.exception.CloneException;
28
import org.gvsig.fmap.dal.coverage.exception.ConnectException;
29
import org.gvsig.fmap.dal.coverage.exception.FileNotOpenException;
30
import org.gvsig.fmap.dal.coverage.exception.InfoByPointException;
31
import org.gvsig.fmap.dal.coverage.exception.InvalidSetViewException;
32
import org.gvsig.fmap.dal.coverage.exception.InvalidSourceException;
33
import org.gvsig.fmap.dal.coverage.exception.NotSupportedExtensionException;
34
import org.gvsig.fmap.dal.coverage.exception.OperationNotSupportedException;
35
import org.gvsig.fmap.dal.coverage.exception.ROIException;
36
import org.gvsig.fmap.dal.coverage.exception.RasterDriverException;
37
import org.gvsig.fmap.dal.coverage.exception.RmfSerializerException;
38
import org.gvsig.fmap.dal.coverage.exception.TimeException;
39
import org.gvsig.fmap.dal.coverage.grid.render.Render;
40
import org.gvsig.fmap.dal.coverage.store.RasterDataServerExplorer;
41
import org.gvsig.fmap.dal.coverage.store.RasterDataStore;
42
import org.gvsig.fmap.dal.coverage.store.parameter.MultiDimensionalStoreParameters;
43
import org.gvsig.fmap.dal.coverage.store.parameter.RasterDataParameters;
44
import org.gvsig.fmap.dal.coverage.store.parameter.RemoteStoreParameters;
45
import org.gvsig.fmap.dal.coverage.store.parameter.TileDataParameters;
46
import org.gvsig.fmap.dal.coverage.store.props.ColorInterpretation;
47
import org.gvsig.fmap.dal.coverage.store.props.ColorTable;
48
import org.gvsig.fmap.dal.coverage.store.props.HistogramComputer;
49
import org.gvsig.fmap.dal.coverage.store.props.Metadata;
50
import org.gvsig.fmap.dal.coverage.store.props.Statistics;
51
import org.gvsig.fmap.dal.coverage.store.props.TimeSeries;
52
import org.gvsig.fmap.dal.coverage.store.props.Transparency;
53
import org.gvsig.fmap.dal.exception.InitializeException;
54
import org.gvsig.fmap.dal.exception.ProviderNotRegisteredException;
55
import org.gvsig.fmap.dal.raster.spi.CoverageStoreProvider;
56
import org.gvsig.fmap.dal.spi.DataManagerProviderServices;
57
import org.gvsig.fmap.geom.Geometry.SUBTYPES;
58
import org.gvsig.fmap.geom.GeometryLocator;
59
import org.gvsig.fmap.geom.exception.CreateEnvelopeException;
60
import org.gvsig.fmap.geom.primitive.Envelope;
61
import org.gvsig.raster.cache.tile.Tile;
62
import org.gvsig.raster.cache.tile.exception.TileGettingException;
63
import org.gvsig.raster.impl.DefaultRasterManager;
64
import org.gvsig.raster.impl.buffer.SpiRasterQuery;
65
import org.gvsig.raster.impl.datastruct.BandListImpl;
66
import org.gvsig.raster.impl.grid.render.DefaultRender;
67
import org.gvsig.raster.impl.grid.roi.VectorialROIsReader;
68
import org.gvsig.raster.impl.provider.AbstractRasterProvider;
69
import org.gvsig.raster.impl.provider.RasterProvider;
70
import org.gvsig.raster.impl.provider.TiledRasterProvider;
71
import org.gvsig.raster.impl.store.properties.MultiDataStoreMetadata;
72
import org.gvsig.raster.roi.ROI;
73
import org.gvsig.raster.roi.ROIReader;
74
import org.gvsig.timesupport.Interval;
75
import org.gvsig.timesupport.Time;
76
import org.gvsig.tools.ToolsLocator;
77
import org.gvsig.tools.dynobject.DynStruct;
78
import org.gvsig.tools.persistence.PersistenceManager;
79
import org.gvsig.tools.persistence.PersistentState;
80
import org.gvsig.tools.persistence.exception.PersistenceException;
81
import org.slf4j.Logger;
82
import org.slf4j.LoggerFactory;
83

    
84
/**
85
 * Default data store for raster
86
 *
87
 * @author Nacho Brodin (nachobrodin@gmail.com)
88
 */
89
public class DefaultRasterStore extends AbstractRasterDataStore {
90
        public static final String              PERSISTENT_NAME        = "DefaultRasterStore_Persistent";
91
    public static final String              PERSISTENT_DESCRIPTION = "DefaultRasterStore Persistent";
92
    private static final Logger             logger                 = LoggerFactory.getLogger(DefaultRasterStore.class);
93
        
94
        /*
95
         * TODO: Refactoring de ROIS 
96
         * Una capa r?ster deber?a poder tener ROIs de tipo r?ster y de tipo vectorial asociados. Adem?s
97
         * debe poder tener una lista de estos por lo que ser?a necesario un interfaz en la que se pueda
98
         * seleccionar la capa de ROIs a utilizar.
99
         * 
100
         * Por otro lado, las ROIs deben ser del proveedor de datos. Este con tendr? una lista de estos.
101
         * Las ROIs deber?an modelarse como proveedores de datos de tipo r?ster o de tipo vectorial, ya que 
102
         * tener una lista de geometr?as en memoria como hasta ahora puede ser muy poco eficiente en caso
103
         * de que la lista de ROIs sea muy grande. Adem?s deber?a optimizarse el acceso isInside para que las
104
         * operaciones con ROIs asociados sean lo m?s r?pidas posible.
105
         */
106
        private List<ROI>                        rois                           = null;
107
        
108
        public DefaultRasterStore() {
109
                super();
110
        }
111
        
112
        public void reload() {
113
                provider.reload();
114
        }
115

    
116
        public void setProvider(RasterProvider provider) {
117
                this.provider = provider;
118
                parameters = (DataStoreParameters)provider.getDataParameters();
119
                initializeBandList();
120
        }
121
        
122
        public void setParameters(DataStoreParameters p) {
123
                this.parameters = p;
124
        }
125
        
126
        public void setProvider(CoverageStoreProvider prov) {
127
                if(prov instanceof RasterProvider)
128
                        setProvider((RasterProvider)prov);
129
        }
130
        
131
        public String getName() {
132
                if(provider != null)
133
                        return provider.getURI();
134
                return null;
135
        }
136
        
137
        public boolean needEnhanced() {
138
                if(provider != null)
139
                        return provider.needEnhanced();
140
                return false;
141
        }
142

    
143
        public boolean isTiled() {
144
                return provider.isTiled();
145
        }
146
        
147
        public boolean isMosaic() {
148
                return provider.isMosaic();
149
        }
150
        
151
        public Tile getTile(SpiRasterQuery q) throws TileGettingException {
152
                TiledRasterProvider tiledProv = ((TiledRasterProvider)provider);
153
                return tiledProv.getTile(q);
154
        }
155

    
156
        //******************************
157
        //Setters and Getters
158
        //******************************
159

    
160
        /**
161
         * Calcula el tama?o de los ficheros en disco
162
         * @return tama?o en bytes de todos los ficheros de la lista
163
         */
164
        public long getFileSize() {
165
                if(provider != null) {
166
                        long size = 0;
167
                        long[] fSize = provider.getFileSizeByProvider();
168
                        if(fSize != null && fSize.length > 0) {
169
                                for (int j = 0; j < fSize.length; j++) {
170
                                        size += fSize[j];        
171
                                }
172
                        }
173
                        return size;
174
                }
175
                return 0;
176
        }
177

    
178
        public double getHeight() {
179
                return provider.getHeight();
180
        }
181

    
182
        public double getWidth() {
183
                return provider.getWidth();
184
        }
185

    
186
        public double getCellSize() {
187
                try {
188
                        Extent e = getExtent();
189
                        double dCellsize = (e.getMax().getX() - e.getMin().getX() ) / getWidth();
190
                        return dCellsize;
191
                } catch (NullPointerException e) {
192
                        return 1;
193
                }
194
        }
195

    
196
        public int getBandCount() {
197
                return provider.getBandCount();
198
        }
199

    
200
        public int[] getDataType() {
201
                return provider.getDataType();
202
        }
203

    
204
        public BandList getBands() {
205
                return storeBandList;
206
        }
207

    
208
        /**
209
         * Obtiene la coordenada X m?nima de toda la lista
210
         * @return Coordenada X m?nima
211
         */
212
        public double getMinX() {
213
                return provider.getExtent().getMin().getX();
214
        }
215

    
216
        /**
217
         * Obtiene la coordenada Y m?nima de toda la lista
218
         * @return Coordenada Y m?nima
219
         */
220
        public double getMinY() {
221
                return provider.getExtent().getMin().getY();
222
        }
223

    
224
        /**
225
         * Obtiene la coordenada Y m?xima de toda la lista
226
         * @return Coordenada Y m?xima
227
         */
228
        public double getMaxX() {
229
                return provider.getExtent().getMax().getX();        }
230

    
231
        /**
232
         * Obtiene la coordenada Y m?xima de toda la lista
233
         * @return Coordenada Y m?xima
234
         */
235
        public double getMaxY() {
236
                return provider.getExtent().getMax().getY();
237
        }
238

    
239
        public NoData getNoDataValue() {
240
                if(provider != null)
241
                        return provider.getNoDataValue();
242
                return null;
243
        }
244

    
245
        public void setNoDataValue(NoData value) {
246
                provider.setNoDataValue(value);
247
        }
248

    
249
        public Extent getExtent() {
250
                Extent e = provider.getExtent();
251
                if (coordTrans != null) {
252
                        e = e.convert(coordTrans);
253
                }
254
                return e;
255
        }
256

    
257
        /**
258
         * Este es el extent sobre el que se ajusta una petici?n para que esta no exceda el
259
         * extent m?ximo del raster. Para un raster sin rotar ser? igual al extent
260
         * pero para un raster rotado ser? igual al extent del raster como si no
261
         * tuviera rotaci?n. Esto ha de ser as? ya que la rotaci?n solo se hace sobre la
262
         * vista y las peticiones han de hacerse en coordenadas de la imagen sin shearing
263
         * aplicado.
264
         * @return Extent
265
         */
266
        public Extent getExtentForRequest() {
267
                return provider.getExtentWithoutRot();
268
        }
269

    
270
        public Extent getLastSelectedView(){
271
                return provider.getView();
272
        }
273

    
274
        public ColorTable getColorTable(int i){
275
                return provider.getColorTable();
276
        }
277

    
278
        /**
279
         * Obtiene la lista de paletas correspondiente a todos los ficheros que forman el GeoMultiRasterFile
280
         * @return Paleta asociada a este o null si no tiene. Una posici?n null en el array tambi?n indica que
281
         * para ese fichero no hay paletas asociadas.
282
         */
283
        public ColorTable getColorTables() {
284
                return provider.getColorTable();
285
        }
286
        
287
        public ColorTable getColorTable() {
288
                //Solo tiene sentido si tiene un fichero y ese fichero tiene una sola banda
289
                if(provider != null)
290
                        return provider.getColorTable();
291
                return null;
292
        }
293
        
294
        /**
295
         * Sets the color table
296
         * @param colorTable
297
         */
298
        public void setColorTable(ColorTable colorTable) {
299
                provider.setColorTable(colorTable);
300
        }
301

    
302
        public ColorTable getColorTable(String fileName){
303
                return provider.getColorTable();
304
        }
305

    
306
        public Point2D rasterToWorld(Point2D pt) {
307
                return provider.rasterToWorld(pt);
308
        }
309

    
310
        public Point2D worldToRaster(Point2D pt) {
311
                return provider.worldToRaster(pt);
312
        }
313

    
314
        public boolean isGeoreferenced() {
315
                return provider.isGeoreferenced();
316
        }
317

    
318
        public double getPixelSizeX() {
319
                return provider.getPixelSizeX();
320
        }
321

    
322
        public double getPixelSizeY() {
323
                return provider.getPixelSizeY();
324
        }
325

    
326
        public Object getData(int x, int y, int band)throws InvalidSetViewException, FileNotOpenException, RasterDriverException {
327
                return provider.getData(x, y, band);
328
        }
329

    
330
        public String getWktProjection() throws RasterDriverException {
331
                if(provider != null)
332
                        return provider.getWktProjection();
333
                return null;
334
        }
335

    
336
        public boolean isInside(Point2D p) {
337
                if(provider != null)
338
                        return provider.isInside(p);
339
                return false;
340
        }
341
        
342
        public RasterDataStore getDataStore() {
343
                return this;
344
        }
345

    
346
        public AffineTransform getAffineTransform(int band){
347
                return provider.getAffineTransform();
348
        }
349

    
350
        public void setAffineTransform(AffineTransform transf) {
351
                provider.setAffineTransform(transf);
352
        }
353

    
354
        /**
355
         * Obtiene la matriz de transformaci?n del propio raster. Esta matriz es la encargada
356
         * de convertir las coordenadas de la petici?n en coordenadas a las que se pide a la libreria.
357
         * En gdal, por ejemplo, se piden las coordenadas a la libreria en coordenadas pixel por lo que
358
         * esta matriz tendr? la georreferenciaci?n asociada en el worldfile o cabecera. Otras librerias como
359
         * ermapper la petici?n a la libreria se hace en coordenadas geograficas que son las mismas en las
360
         * que pide el usuario de gvSIG por lo que esta matriz en este caso se inicializa con la identidad.
361
         * @return
362
         */
363
        public AffineTransform getOwnTransformation() {
364
                return provider.getOwnAffineTransform();
365
        }
366

    
367
        public boolean isRotated() {
368
                if(provider != null)
369
                        return provider.isRotated();
370
                return false;
371
        }
372

    
373
        public void setDrawableBands(int[] db) {
374
                getBands().setDrawableBands(db);
375
        }
376
        
377
        public int[] getDrawableBands() {
378
                return getBands().getDrawableBands();
379
        }
380

    
381
        public void clearDrawableBands() {
382
                getBands().clearDrawableBands();
383
        }
384

    
385
        public void addDrawableBand(int posRasterBuf, int imageBand) {
386
                getBands().addDrawableBand(posRasterBuf, imageBand);
387
        }
388

    
389
        public void deleteLayerFromCache() {
390
                provider.deleteLayerFromCache();
391
        }
392
        
393
        public boolean isMultiFile() {
394
                return provider.isMultiFile();
395
        }
396
        
397
        public int getOverviewWidth(int band, int overview) throws BandAccessException, RasterDriverException {
398
                return provider.getOverviewWidth(band, overview);
399
        }
400

    
401
        public int getOverviewHeight(int band, int overview) throws BandAccessException, RasterDriverException {
402
                return provider.getOverviewHeight(band, overview);
403
        }
404

    
405
        public int getOverviewCount(int band) throws BandAccessException, RasterDriverException {
406
                if(band >= getBandCount())
407
                        throw new BandAccessException("Wrong band");
408
                return provider.getOverviewCount(band);
409
        }
410

    
411
        public boolean overviewsSupport() {
412
                if(provider != null)
413
                        return provider.isOverviewsSupported();
414
                return false;
415
        }
416
        
417
        public void saveGeoreferencingToRmf() throws RmfSerializerException {
418
                provider.saveObjectToRmf(AbstractRasterProvider.class, provider);
419
        }
420
        
421
        public void saveSerialInfoToRmf(TimeSeries serialInfo) throws RmfSerializerException {
422
                provider.saveObjectToRmf(TimeSeries.class, serialInfo);
423
        }
424

    
425
        public void saveColorTableToRmf(ColorTable table) throws RmfSerializerException {
426
                provider.saveObjectToRmf(ColorTable.class, table);
427
        }
428
        
429
        public void saveGeoPointListToRmf(GeoPointList pointList) throws RmfSerializerException {
430
                provider.saveObjectToRmf(GeoPointList.class, pointList);
431
        }
432
        
433
        public void saveROIFileListToRmf(List<File> fileList) throws RmfSerializerException {
434
                provider.saveObjectToRmf(List.class, fileList);
435
        }
436
        
437
        public List<File> getROIFileListFromRmf() {
438
                try {
439
                        List<File> fileList = new ArrayList<File>();
440
                        provider.loadObjectFromRmf(List.class, fileList);
441
                        return fileList;
442
                } catch (RmfSerializerException e) {
443
                }
444
                return null;
445
        }
446
        
447
        public boolean loadSerialInfoFromRmf(TimeSeries serialInfo) {
448
                try {
449
                        provider.loadObjectFromRmf(TimeSeries.class, serialInfo);
450
                        return true;
451
                } catch (RmfSerializerException e) {
452
                        //Prueba hasta que alguno tiene la informaci?n
453
                }
454
                return false;
455
        }
456

    
457
        public Extent getView() {
458
                if(provider != null)
459
                        return provider.getView();
460
                return null;
461
        }
462
        
463
        public Extent getExtentWithoutRot() {
464
                if(provider != null)
465
                        return provider.getExtentWithoutRot();
466
                return null;
467
        }
468
        
469
        public AffineTransform getOwnAffineTransform() {
470
                if(provider != null)
471
                        return provider.getOwnAffineTransform();
472
                return null;
473
        }
474
        
475
        public AffineTransform getAffineTransform() {
476
                if(provider != null) {
477
                        AffineTransform at = provider.getAffineTransform();
478
                        /*if (coordTrans != null) {
479
                                Point2D scale = new Point2D.Double(at.getTranslateX() + at.getScaleX(), at.getTranslateY() + at.getScaleY());
480
                                Point2D translate = new Point2D.Double(at.getTranslateX(), at.getTranslateY());
481
                                scale = coordTrans.convert(scale, scale);
482
                                translate = coordTrans.convert(translate, translate);
483
                                double sX = scale.getX() - translate.getX();
484
                                double sY = scale.getY() - translate.getY();
485
                                at = new AffineTransform(
486
                                                sX, 
487
                                                at.getShearY(), 
488
                                                at.getShearX(), 
489
                                                sY, 
490
                                                translate.getX(), 
491
                                                translate.getY());
492
                        }*/
493
                        return at;
494
                }
495
                return null;
496
        }
497
        
498
        public IProjection getProjection() {
499
                if(provider != null)
500
                        return provider.getProjection();
501
                return null;
502
        }
503
        
504
        public void setProjection(IProjection proj, boolean persist) throws RmfSerializerException {
505
                if(provider != null)
506
                        provider.setProjection(proj, persist);
507
        }
508
        
509
        public Statistics getStatistics() {
510
                if(provider != null)
511
                        return provider.getStatistics();
512
                return null;
513
        }
514
        
515
        public void setStatistics(Statistics stats) throws RmfSerializerException {
516
                if(provider != null)
517
                        provider.setStatistics(stats);
518
        }
519
        
520
        public HistogramComputer getHistogramComputer() {
521
                if(provider != null)
522
                        return provider.getHistogramComputer();
523
                return null;
524
        }
525
        
526
        public Metadata getMetadata() {
527
                if(provider != null)
528
                        return provider.getMetadata();
529
                return null;
530
        }
531
        
532
        public Transparency getTransparency() {
533
                if(provider != null) {
534
                        provider.getTransparency().setNoData(getNoDataValue());
535
                        return provider.getTransparency();
536
                }
537
                return null;
538
        }
539
        
540
        public ColorInterpretation getColorInterpretation() {
541
                return provider.getColorInterpretation();
542
        }
543

    
544
        public boolean isReproyectable() {
545
                if(provider != null)
546
                        return (provider.isReproyectable());
547
                return false;
548
        }
549
        
550
        public String getMetadataName() {
551
                if(provider != null)
552
                        return provider.getName();
553
                return null;
554
        }
555
        
556
        public RasterDataStore cloneDataStore() throws CloneException {
557
                DefaultRasterStore ds = new DefaultRasterStore();
558
                ds.parameters = getParameters();
559
                ds.provider = provider.cloneProvider();
560
                
561
                int[] bands = new int[1];
562
                bands[0] = provider.getBandCount();
563
                ds.metadata = new MultiDataStoreMetadata(bands);
564
                ((MultiDataStoreMetadata)ds.metadata).add(provider.getMetadata());
565
                
566
                ds.storeBandList = (BandListImpl)storeBandList.clone();
567
                return ds;
568
        }
569
        
570
        public boolean isOpen() {
571
                if(provider == null)
572
                        return false;
573
                return provider.isOpen();
574
        }
575

    
576
        public CoverageStoreProvider getProvider() {
577
                return provider;
578
        }
579
        
580
        public String getInfoByPoint(double x, double y, ICancellable cancellable) throws InfoByPointException {
581
                return ((RasterProvider)getProvider()).getInfoByPoint(x, y, cancellable);
582
        }
583
        
584
        public String getInfoByPoint(double x, double y, Extent bbox, int w, int h, ICancellable cancellable) throws InfoByPointException {
585
                return ((RasterProvider)getProvider()).getInfoByPoint((int)x, (int)y, bbox, w, h, cancellable);
586
        }
587

    
588
        public void goTo(int position) throws OperationNotSupportedException {
589
                if(!isTimeSupportedByTheProvider())
590
                        throw new OperationNotSupportedException("Not supported for a RasterDataset");
591
                if(getParameters() instanceof MultiDimensionalStoreParameters) {
592
                        ((MultiDimensionalStoreParameters)getParameters()).goTo(position);
593
                }
594
        }
595

    
596
        public void selectNext() throws OperationNotSupportedException {
597
                if(!isTimeSupportedByTheProvider())
598
                        throw new OperationNotSupportedException("Not supported for a RasterDataset");
599
                if(getParameters() instanceof MultiDimensionalStoreParameters) {
600
                        ((MultiDimensionalStoreParameters)getParameters()).selectNextInstant();
601
                }
602
        }
603

    
604
        public void selectPrev() throws OperationNotSupportedException {
605
                if(!isTimeSupportedByTheProvider())
606
                        throw new OperationNotSupportedException("Not supported for a RasterDataset");
607
                if(getParameters() instanceof MultiDimensionalStoreParameters) {
608
                        ((MultiDimensionalStoreParameters)getParameters()).selectPrevInstant();
609
                }
610
        }
611
        
612
        public void setTime(Time time) throws TimeException, OperationNotSupportedException {
613
                if(!isTimeSupportedByTheProvider())
614
                        throw new OperationNotSupportedException("Not supported for a RasterDataset");
615
                
616
        }
617
        
618
        /**
619
         * Returns true whether all providers support time
620
         * @return
621
         */
622
        private boolean isTimeSupportedByTheProvider() {
623
                if(provider != null)
624
                        return provider.isTimeSupported();
625
                return false;
626
        }
627
        
628
        public boolean isRasterEnclosed() {
629
                if(provider != null)
630
                        return provider.isRasterEnclosed();
631
                return false;
632
        }
633

    
634
        public Extent getCoordsInLevel(Point2D viewCenter, int level, int w, int h) {
635
                try {
636
                        return ((TiledRasterProvider)provider).getCoordsInLevel(viewCenter, level, w, h);
637
                } catch (ClassCastException e) {
638
                        return null;
639
                }
640
        }
641

    
642
        public Extent getCoordsInTheNearestLevel(Extent extent, int w, int h) {
643
                try {
644
                        return ((TiledRasterProvider)provider).getCoordsInTheNearestLevel(extent, w, h);
645
                } catch (ClassCastException e) {
646
                        return null;
647
                }
648
        }
649

    
650
        public int getZoomLevels() {
651
                try {
652
                        return ((TiledRasterProvider)provider).getZoomLevels();
653
                } catch (ClassCastException e) {
654
                        return -1;
655
                }
656
        }
657

    
658
        public int getNearestLevel(double pixelSize) {
659
                try {
660
                        return ((TiledRasterProvider)provider).getNearestLevel(pixelSize);
661
                } catch (ClassCastException e) {
662
                        return -1;
663
                }
664
        }
665
        
666
        public void setTileServer(Class<?> tileServer) throws InitializeException {
667
                if(provider instanceof TiledRasterProvider) {
668
                        ((TiledRasterProvider)provider).setTileServer(tileServer);
669
                }
670
        }
671

    
672
        public RasterDataParameters getInternalParameters() {
673
                if(provider instanceof TiledRasterProvider) {
674
                        AbstractRasterProvider prov = (AbstractRasterProvider)((TiledRasterProvider)provider).getInternalProvider();
675
                        return prov.getDataParameters();
676
                }
677
                return (RasterDataParameters)getParameters();
678
        }
679

    
680
        public RasterDataStore newDataStore() {
681
                if(provider != null) {
682
                        RasterManager manager = (DefaultRasterManager)RasterLocator.getManager();
683
                        RasterDataStore newDataStore = null;
684
                        try {
685
                                newDataStore = manager.getProviderServices().open((DataStoreParameters)parameters);
686
                                if(newDataStore instanceof DefaultRasterStore) {
687
                                        ((DefaultRasterStore)newDataStore).setStatistics(getStatistics());
688
                                }
689
                                return newDataStore;
690
                        } catch (NotSupportedExtensionException e) {
691
                                return null;
692
                        } catch (RasterDriverException e) {
693
                                return null;
694
                        } catch (RmfSerializerException e) {
695
                                return newDataStore;
696
                        }
697
                }
698
                return null;
699
        }
700
        
701
        public RasterDataStore newNotTiledDataStore() {
702
                if(provider != null) {
703
                        RasterManager manager = (DefaultRasterManager)RasterLocator.getManager();
704
                        RasterDataStore newDataStore = null;
705
                        try {
706
                                DataStoreParameters newParams = (DataStoreParameters)parameters;
707
                                if(this.isTiled()) {
708
                                        newParams = ((TiledRasterProvider)getProvider()).getInternalProvider().getDataParameters();
709
                                } 
710
                                
711
                                newDataStore = manager.getProviderServices().open(newParams);
712
                                if(newDataStore instanceof DefaultRasterStore) {
713
                                        ((DefaultRasterStore)newDataStore).setStatistics(getStatistics());
714
                                }
715
                                return newDataStore;
716
                        } catch (NotSupportedExtensionException e) {
717
                                return null;
718
                        } catch (RasterDriverException e) {
719
                                return null;
720
                        } catch (RmfSerializerException e) {
721
                                return newDataStore;
722
                        }
723
                }
724
                return null;
725
        }
726

    
727
        public String[] getURIByProvider() {
728
                return provider.getURIByProvider();
729
        }
730

    
731
        public long[] getFileSizeByProvider() {
732
                return provider.getFileSizeByProvider();
733
        }
734

    
735
        public int getProviderCount() {
736
                return provider.getInternalProviderCount();
737
        }
738
        
739
        public int[] getBandCountByProvider() {
740
                return provider.getBandCountByProvider();
741
        }
742
        
743
        public RasterDataParameters[] getDataParametersByProvider() {
744
                RasterDataParameters[] res = new RasterDataParameters[getProviderCount()];
745
                for (int i = 0; i < res.length; i++) {
746
                        res[i] = (RasterDataParameters)provider.getInternalProvider(i).getDataParameters();                        
747
                }
748
                return res;
749
        }
750
        
751
        public Metadata[] getMetadataByProvider() {
752
                Metadata[] res = new Metadata[getProviderCount()];
753
                for (int i = 0; i < res.length; i++) {
754
                        res[i] = provider.getInternalProvider(i).getMetadata();                        
755
                }
756
                return res;
757
        }
758
        
759
        public int[] getOverviewCountByProvider(int band) throws BandAccessException {
760
                int[] res = new int[getProviderCount()];
761
                for (int i = 0; i < res.length; i++) {
762
                        try {
763
                                res[i] = provider.getInternalProvider(i).getOverviewCount(band);
764
                        } catch (RasterDriverException e) {
765
                                throw new BandAccessException("", e);
766
                        }                        
767
                }
768
                return res;
769
        }
770
        
771
        public String[] getOverviewSizeByProvider(int band, int overview) throws BandAccessException {
772
                String[] res = new String[getProviderCount()];
773
                for (int i = 0; i < res.length; i++) {
774
                        try {
775
                                res[i] = provider.getInternalProvider(i).getOverviewWidth(band, overview) + 
776
                                                 "x" + 
777
                                                 provider.getInternalProvider(i).getOverviewHeight(band, overview);
778
                        } catch (RasterDriverException e) {
779
                                throw new BandAccessException("", e);
780
                        }                        
781
                }
782
                return res;
783
        }
784
        
785
        public AffineTransform[] getAffineTransformByProvider() {
786
                AffineTransform[] res = new AffineTransform[getProviderCount()];
787
                for (int i = 0; i < res.length; i++) {
788
                        res[i] = provider.getInternalProvider(i).getAffineTransform();
789
                }
790
                return res;
791
        }
792
        
793
        public double[] getHeightByProvider() {
794
                double[] res = new double[getProviderCount()];
795
                for (int i = 0; i < res.length; i++) {
796
                        res[i] = provider.getInternalProvider(i).getHeight();
797
                }
798
                return res;
799
        }
800
        
801
        public double[] getWidthByProvider() {
802
                double[] res = new double[getProviderCount()];
803
                for (int i = 0; i < res.length; i++) {
804
                        res[i] = provider.getInternalProvider(i).getWidth();
805
                }
806
                return res;
807
        }
808
        
809
        public void addFile(String file) throws InvalidSourceException {
810
                provider.addFile(file);
811
        }
812
        
813
        public void removeFile(String file) {
814
                provider.removeFile(file);
815
                storeBandList.removeBands(file);
816
        }
817
        
818
        public String getURIByBand(int band) {
819
                return provider.getURIByBand(band);
820
        }
821
        
822
        /**
823
         * Gets the {@link Interval} of the store, that means the temporal
824
         * interval where the store has valid data.
825
         * In raster this method has sense in a mosaic. Therefore this has to be implemented 
826
         * by the provider.
827
         * @return
828
         *         a time interval or null if there is not time support
829
         */
830
        public Interval getInterval() {
831
                return provider.getInterval();
832
        }
833
        
834
        /**
835
         * Gets all the possible values of time for which the store has data.  
836
         * In raster this method has sense in a mosaic. Therefore this has to be implemented 
837
         * by the provider.
838
         * @return
839
         *         a collection of {@link Time} objects.
840
         */
841
        public Collection<?> getTimes() {
842
                return provider.getTimes();
843
        }
844
        
845
        /**
846
         * Gets all the possible values of time for which the store has data
847
         * and intersects with an interval.
848
         * In raster this method has sense in a mosaic. Therefore this has to be implemented 
849
         * by the provider.
850
         * @param interval
851
         *         the interval of time
852
         * @return
853
         *         a collection of {@link Time} objects.
854
         */
855
        public Collection<?> getTimes(Interval interval) {
856
                return provider.getTimes(interval);
857
        }
858
        
859
        public Image getImageLegend() {
860
                if(provider != null)
861
                        return provider.getImageLegend();
862
                return null;
863
        }
864
        
865
        /**
866
         * Gets the list of geo points associated to this provider
867
         * @return
868
         */
869
        public GeoPointList getGeoPointList() {
870
                return provider.getGeoPointList();
871
        }
872
        
873
        /**
874
         * Sets the list of geo points associated to this provider
875
         */
876
        public void setGeoPointList(GeoPointList geoPointList) {
877
                provider.setGeoPointList(geoPointList);
878
        }
879
        
880
        public Envelope getFullEnvelope() {
881
                Rectangle2D e = getExtent().toRectangle2D();
882
                try {
883
                        return GeometryLocator.getGeometryManager().createEnvelope(e.getX(), e.getY(), e.getMaxX(), e
884
                                        .getMaxY(), SUBTYPES.GEOM2D);
885
                } catch (CreateEnvelopeException e1) {
886
                        logger.error("Error creating the envelope", e);
887
                        return null;
888
                }
889
        }
890
        
891
        public List<ROI> getRois(String epsg) throws ROIException {
892
                IProjection proj = CRSFactory.getCRS(epsg);
893
                return getRois(proj);
894
        }
895
        
896
        public List<ROI> getRois(IProjection defaultProjection) throws ROIException {
897
                if(rois == null) {
898
                        try {
899
                                List<File> fileList = getDataStore().getROIFileListFromRmf();
900
                                if(fileList != null && fileList.size() > 0 && fileList.get(0) != null) {
901
                                        File f = fileList.get(0);
902
                                        IProjection proj = getProjection();
903
                                        if(proj == null) {
904
                                                proj = defaultProjection;
905
                                        }
906
                                        ROIReader reader = new VectorialROIsReader(
907
                                                        f.getPath(), 
908
                                                        getDataStore(),
909
                                                        proj,
910
                                                        getFullEnvelope());
911
                                        rois = new ArrayList<ROI>();
912
                                        rois = reader.read(rois);
913
                                }
914
                        } catch (Exception e) {
915
                                throw new ROIException("error_getting_ROIS", e);
916
                        }
917
                }
918
                return rois;
919
        }
920

    
921
        public void setRois(List<ROI> rois) {
922
                this.rois = rois;
923
        }
924
        
925
        public void setROIsFiles(List<File> file) throws RmfSerializerException {
926
                getDataStore().saveROIFileListToRmf(file);
927
        }
928
        
929
        public List<File> getROIsFiles() throws RmfSerializerException {
930
                return getDataStore().getROIFileListFromRmf();
931
        }
932
        
933
        public void close() {
934
                if(provider != null)
935
                        provider.close();
936
                if(storeBandList != null)
937
                        storeBandList.clear();
938
                provider = null;
939
                storeBandList = null;
940
                super.close();
941
                try {
942
                        finalize();
943
                } catch (Throwable e) {
944
                }
945
        }
946
        
947
        protected void finalize() throws Throwable {
948
                provider               = null;
949
                storeBandList               = null;
950
                metadata               = null;
951
                if(rois != null) {
952
                        rois.clear();
953
                        rois = null;
954
                }
955
                super.finalize();
956
        }
957
        
958
        //******************************
959
        //Persistence
960
        //******************************
961
        
962
        public static void registerPersistence() {
963
                PersistenceManager manager = ToolsLocator.getPersistenceManager();
964
                DynStruct definition = manager.getDefinition(PERSISTENT_NAME);
965
                if( definition == null ) {
966
                        definition = manager.addDefinition(
967
                                        DefaultRasterStore.class,
968
                                        PERSISTENT_NAME,
969
                                        PERSISTENT_DESCRIPTION,
970
                                        null, 
971
                                        null
972
                        );
973
                        
974
                        definition.addDynFieldObject("parameters")
975
                        .setClassOfValue(RasterDataParameters.class)
976
                        .setMandatory(true);
977
                        
978
                        definition.addDynFieldString("explorername")
979
                        .setMandatory(false);
980
                        
981
                        definition.addDynFieldObject("bandList")
982
                        .setClassOfValue(BandList.class)
983
                        .setMandatory(false);
984
                        
985
                        definition.addDynFieldObject("metadata")
986
                        .setClassOfValue(Metadata.class)
987
                        .setMandatory(false);
988
                        
989
                        definition.addDynFieldObject("render")
990
                        .setClassOfValue(Render.class)
991
                        .setMandatory(false);
992
                }
993
        }
994
        
995
        public void loadFromState(PersistentState state)
996
                        throws PersistenceException {
997
                this.parameters = (RasterDataParameters)state.get("parameters");
998
                
999
                String explorerName = (String)state.get("explorername");
1000
                if(explorerName != null) {
1001
                        if(initializePersistentParameters((RasterDataParameters)this.parameters, explorerName) == null) {
1002
                                throw new PersistenceException();
1003
                        }
1004
                }
1005
                
1006
                try {
1007
                        DataManagerProviderServices dataManager = (DataManagerProviderServices)DALLocator.getDataManager();
1008
                        this.provider = (AbstractRasterProvider)dataManager.createProvider(this, this.parameters);
1009
                } catch (InitializeException e) {
1010
                        throw new PersistenceException(e);
1011
                } catch (ProviderNotRegisteredException e) {
1012
                        throw new PersistenceException(e);
1013
                }
1014
                
1015
                this.storeBandList = (BandListImpl)state.get("bandList");
1016
                if(parameters instanceof AbstractRasterFileDataParameters && !this.provider.isMultiFile()) {
1017
                        //Esto solo es por si al cargar un proyecto se ha cambiado el fichero de sitio y el usuario
1018
                        //lo introduce manualmente. En ese caso el bandList debe contener la misma ruta al fichero que el 
1019
                        //provider y no la que se grab? inicialmente
1020
                        for (int i = 0; i < storeBandList.getBandCount(); i++) {
1021
                                storeBandList.getBand(i).setFileName(provider.getURI());                                
1022
                        }
1023
                }
1024
                this.metadata = (Metadata)state.get("metadata");
1025
                
1026
                DefaultRender render = (DefaultRender)state.get("render");
1027
                if(render == null)
1028
                        throw new PersistenceException();
1029
                setRender(render);
1030
                render.setDataStore(this);
1031
                render.buildFiltersFromPersistencyFilterParam(getStatistics());
1032
                if(getRender().getRenderingTransparency() != null)
1033
                        getRender().getRenderingTransparency().setNoData(getNoDataValue());
1034
        }
1035
        
1036
        public void saveToState(PersistentState state) throws PersistenceException {
1037
                state.set("parameters", provider.getDataParameters());        
1038
                RasterDataParameters provParams = getInternalDataParameterFromState(provider.getDataParameters());
1039
                state.set("explorername", provParams.getDataStoreName());
1040
                state.set("bandList", storeBandList);
1041
                state.set("metadata", metadata);
1042
                state.set("render", getRender());
1043
        }        
1044
        
1045
        /**
1046
         * Actions to initialize parameters before loaded more parts of the project
1047
         * @param providerParams
1048
         * @param explorerName
1049
         * @return
1050
         */
1051
        private RasterDataParameters initializePersistentParameters(RasterDataParameters providerParams, String explorerName) {
1052
                try {
1053
                        if(!(getInternalDataParameterFromState(providerParams) instanceof RemoteStoreParameters))
1054
                                return providerParams;
1055
                        
1056
                        DataManager datamanager = DALLocator.getDataManager();
1057
                        DataServerExplorerParameters explorerParams = null;
1058
                        explorerParams = datamanager.createServerExplorerParameters(explorerName);
1059
                        explorerParams.setDynValue("host", "");
1060
                        explorerParams.setDynValue("axisorder", new Boolean(false));
1061
                        DataServerExplorer e = datamanager.openServerExplorer(explorerName, explorerParams);
1062
                        if(e instanceof RasterDataServerExplorer) {
1063
                                RasterDataServerExplorer explorer = (RasterDataServerExplorer)e;
1064
                                
1065
                                explorerParams = explorer.getParameters();
1066
                                explorerParams.setDynValue("host", providerParams.getURI());
1067
                                
1068
                                if(!explorer.isHostReachable()) {
1069
                                        return null;
1070
                                }
1071
                                
1072
                                try {
1073
                                        explorer.connect(null);
1074
                                } catch (ConnectException exc) {
1075
                                        return null;
1076
                                }
1077
                                
1078
                                RasterDataParameters newParameters = getInternalDataParameterFromState(explorer.getStoredParameters());
1079
                                newParameters.assignFields(getInternalDataParameterFromState(providerParams), explorer);
1080
                                if(providerParams instanceof TileDataParameters)
1081
                                        ((TileDataParameters)providerParams).setDataParameters(newParameters);
1082
                                return providerParams;
1083
                        }
1084
                } catch (Exception e) {
1085
                        return null;
1086
                }
1087
                return null;
1088
        }
1089
        
1090
        private RasterDataParameters getInternalDataParameterFromState(Object obj) {
1091
                if(obj instanceof TileDataParameters) {
1092
                        return (RasterDataParameters)((TileDataParameters) obj).getDataParameters();
1093
                } else {
1094
                        return (RasterDataParameters)obj;
1095
                }
1096
        }
1097
}