Statistics
| Revision:

gvsig-raster / org.gvsig.raster / trunk / org.gvsig.raster / org.gvsig.raster.lib / org.gvsig.raster.lib.impl / src / main / java / org / gvsig / raster / impl / store / DefaultRasterStore.java @ 969

History | View | Annotate | Download (55.2 KB)

1
/* gvSIG. Geographic Information System of the Valencian Government
2
 *
3
 * Copyright (C) 2007-2008 Infrastructures and Transports Department
4
 * of the Valencian Government (CIT)
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 2
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 */
22
package org.gvsig.raster.impl.store;
23

    
24
import java.awt.geom.AffineTransform;
25
import java.awt.geom.Point2D;
26
import java.awt.geom.Rectangle2D;
27
import java.util.ArrayList;
28
import java.util.Collection;
29
import java.util.List;
30

    
31
import org.cresques.cts.IProjection;
32
import org.gvsig.compat.net.ICancellable;
33
import org.gvsig.fmap.dal.DALLocator;
34
import org.gvsig.fmap.dal.DataStoreParameters;
35
import org.gvsig.fmap.dal.coverage.RasterLibrary;
36
import org.gvsig.fmap.dal.coverage.RasterLocator;
37
import org.gvsig.fmap.dal.coverage.RasterManager;
38
import org.gvsig.fmap.dal.coverage.dataset.Buffer;
39
import org.gvsig.fmap.dal.coverage.datastruct.BandList;
40
import org.gvsig.fmap.dal.coverage.datastruct.DatasetBand;
41
import org.gvsig.fmap.dal.coverage.datastruct.Extent;
42
import org.gvsig.fmap.dal.coverage.datastruct.NoData;
43
import org.gvsig.fmap.dal.coverage.datastruct.Params;
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.CloneException;
47
import org.gvsig.fmap.dal.coverage.exception.FileNotExistsException;
48
import org.gvsig.fmap.dal.coverage.exception.FileNotOpenException;
49
import org.gvsig.fmap.dal.coverage.exception.FilterManagerException;
50
import org.gvsig.fmap.dal.coverage.exception.FilterTypeException;
51
import org.gvsig.fmap.dal.coverage.exception.HistogramException;
52
import org.gvsig.fmap.dal.coverage.exception.InvalidSetViewException;
53
import org.gvsig.fmap.dal.coverage.exception.InvalidSourceException;
54
import org.gvsig.fmap.dal.coverage.exception.NotSupportedExtensionException;
55
import org.gvsig.fmap.dal.coverage.exception.OperationNotSupportedException;
56
import org.gvsig.fmap.dal.coverage.exception.ProcessInterruptedException;
57
import org.gvsig.fmap.dal.coverage.exception.RasterDriverException;
58
import org.gvsig.fmap.dal.coverage.exception.RemoteServiceException;
59
import org.gvsig.fmap.dal.coverage.exception.RmfSerializerException;
60
import org.gvsig.fmap.dal.coverage.exception.TimeException;
61
import org.gvsig.fmap.dal.coverage.grid.RasterFilter;
62
import org.gvsig.fmap.dal.coverage.grid.RasterFilterList;
63
import org.gvsig.fmap.dal.coverage.grid.RasterFilterListManager;
64
import org.gvsig.fmap.dal.coverage.grid.render.Render;
65
import org.gvsig.fmap.dal.coverage.store.RasterDataStore;
66
import org.gvsig.fmap.dal.coverage.store.parameter.MultiDimensionalStoreParameters;
67
import org.gvsig.fmap.dal.coverage.store.parameter.RasterDataParameters;
68
import org.gvsig.fmap.dal.coverage.store.props.ColorInterpretation;
69
import org.gvsig.fmap.dal.coverage.store.props.ColorTable;
70
import org.gvsig.fmap.dal.coverage.store.props.HistogramComputer;
71
import org.gvsig.fmap.dal.coverage.store.props.Metadata;
72
import org.gvsig.fmap.dal.coverage.store.props.Statistics;
73
import org.gvsig.fmap.dal.coverage.store.props.TimeSeries;
74
import org.gvsig.fmap.dal.coverage.store.props.Transparency;
75
import org.gvsig.fmap.dal.exception.InitializeException;
76
import org.gvsig.fmap.dal.exception.ProviderNotRegisteredException;
77
import org.gvsig.fmap.dal.raster.spi.CoverageStoreProvider;
78
import org.gvsig.fmap.dal.spi.DataManagerProviderServices;
79
import org.gvsig.fmap.dal.spi.DataStoreProvider;
80
import org.gvsig.raster.cache.tile.Tile;
81
import org.gvsig.raster.cache.tile.TileCacheLocator;
82
import org.gvsig.raster.cache.tile.TileCacheManager;
83
import org.gvsig.raster.cache.tile.exception.TileGettingException;
84
import org.gvsig.raster.cache.tile.provider.CacheStruct;
85
import org.gvsig.raster.cache.tile.provider.TileListener;
86
import org.gvsig.raster.impl.DefaultRasterManager;
87
import org.gvsig.raster.impl.buffer.cache.RasterReadOnlyBuffer;
88
import org.gvsig.raster.impl.datastruct.BandListImpl;
89
import org.gvsig.raster.impl.datastruct.DatasetBandImpl;
90
import org.gvsig.raster.impl.datastruct.ExtentImpl;
91
import org.gvsig.raster.impl.provider.DefaultRasterProvider;
92
import org.gvsig.raster.impl.provider.RasterProvider;
93
import org.gvsig.raster.impl.provider.TiledRasterProvider;
94
import org.gvsig.raster.impl.store.properties.MultiDataStoreMetadata;
95
import org.gvsig.raster.util.persistence.PersistencyFilterParam;
96
import org.gvsig.timesupport.Interval;
97
import org.gvsig.timesupport.Time;
98
import org.gvsig.tools.ToolsLocator;
99
import org.gvsig.tools.dynobject.DynStruct;
100
import org.gvsig.tools.persistence.PersistenceManager;
101
import org.gvsig.tools.persistence.PersistentState;
102
import org.gvsig.tools.persistence.exception.PersistenceException;
103

    
104
/**
105
 * Default data store for raster
106
 *
107
 * @author Nacho Brodin (nachobrodin@gmail.com)
108
 */
109
public class DefaultRasterStore extends AbstractRasterDataStore {
110
        public static final String              PERSISTENT_NAME        = "DefaultRasterStore_Persistent";
111
    public static final String              PERSISTENT_DESCRIPTION = "DefaultRasterStore Persistent";
112
    
113
        protected RasterProvider                provider               = null;
114
        protected BandListImpl                  bandList               = new BandListImpl();
115
        protected Metadata                      metadata               = null;
116
        private RasterManager                   rManager               = RasterLocator.getManager();
117
        
118
        /**
119
         * Flag que fuerza al buffer de solo lectura
120
         */
121
        protected boolean                       readOnly      = false;
122
        /**
123
         * Flag que fuerza al buffer en memoria
124
         */
125
        protected boolean                       forceToMemory = false;
126
        
127
        public DefaultRasterStore() {
128
                super();
129
        }
130

    
131
        public void setProvider(RasterProvider provider) {
132
                this.provider = provider;
133
                parameters = (DataStoreParameters)provider.getDataParameters();
134
                bandList.clear();
135
                for(int i = 0; i < provider.getBandCount(); i++) {
136
                        try {
137
                                int dataType = provider.getDataType()[i];
138
                                DatasetBand band = new DatasetBandImpl(provider.getURIByBand(i), 
139
                                                                                                        provider.getBandPositionByProvider(i), 
140
                                                                                                        dataType, 
141
                                                                                                        provider.getBandCount());
142
                                bandList.addBand(band, i);
143
                        } catch(BandNotFoundInListException ex) {
144
                                //No a?adimos la banda
145
                        }
146
                }
147
        }
148
        
149
        /*
150
         * (non-Javadoc)
151
         * @see org.gvsig.fmap.dal.impl.DataStoreImplementation#intializePhase2(org.gvsig.fmap.dal.spi.DataStoreProvider)
152
         */
153
        public void intializePhase2(DataStoreProvider provider)
154
                        throws InitializeException {
155
                setProvider((RasterProvider)provider);
156
        }
157
        
158
        /*
159
         * (non-Javadoc)
160
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#setParameters(org.gvsig.fmap.dal.DataStoreParameters)
161
         */
162
        public void setParameters(DataStoreParameters p) {
163
                this.parameters = p;
164
        }
165
        
166
        /*
167
         * (non-Javadoc)
168
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#setProvider(org.gvsig.fmap.dal.raster.spi.CoverageStoreProvider)
169
         */
170
        public void setProvider(CoverageStoreProvider prov) {
171
                if(prov instanceof RasterProvider)
172
                        setProvider((RasterProvider)prov);
173
        }
174
        
175
        /*
176
         * (non-Javadoc)
177
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getName()
178
         */
179
        public String getName() {
180
                if(provider != null)
181
                        return provider.getURI();
182
                return null;
183
        }
184
        
185
        /*
186
         * (non-Javadoc)
187
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#needEnhanced()
188
         */
189
        public boolean needEnhanced() {
190
                if(provider != null)
191
                        return provider.needEnhanced();
192
                return false;
193
        }
194

    
195
        /*
196
         * (non-Javadoc)
197
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#close()
198
         */
199
        public void close() {
200
                if(provider != null)
201
                        provider.close();
202
                if(bandList != null)
203
                        bandList.clear();
204
        }
205

    
206
        /**
207
         * Inicializa el buffer a valores NoData
208
         * @param raster Buffer a inicializar
209
         * @param bandList Lista de bandas
210
         */
211
        private void initBufferToNoData(Buffer buf, BandList bandList) {
212
                for(int i = 0; i < bandList.getDrawableBandsCount(); i++) {
213
                        switch(getDataType()[0]) {
214
                        case Buffer.TYPE_BYTE:buf.assign(i, 
215
                                        buf.getNoDataValue().isDefined() ? buf.getNoDataValue().getValue().byteValue() : RasterLibrary.defaultByteNoDataValue);
216
                        break;
217
                        case Buffer.TYPE_SHORT:buf.assign(i, 
218
                                        buf.getNoDataValue().isDefined() ? buf.getNoDataValue().getValue().shortValue() : RasterLibrary.defaultShortNoDataValue);
219
                        break;
220
                        case Buffer.TYPE_INT:buf.assign(i, 
221
                                        buf.getNoDataValue().isDefined() ? buf.getNoDataValue().getValue().intValue() : RasterLibrary.defaultIntegerNoDataValue);
222
                        break;
223
                        case Buffer.TYPE_FLOAT:buf.assign(i, 
224
                                        buf.getNoDataValue().isDefined() ? buf.getNoDataValue().getValue().floatValue() : RasterLibrary.defaultFloatNoDataValue);
225
                        break;
226
                        case Buffer.TYPE_DOUBLE:buf.assign(i, 
227
                                        buf.getNoDataValue().isDefined() ? buf.getNoDataValue().getValue().doubleValue() : RasterLibrary.defaultDoubleNoDataValue);
228
                        break;
229
                        }
230
                }
231
        }
232
        
233
        /*
234
         * (non-Javadoc)
235
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#isTiled()
236
         */
237
        public boolean isTiled() {
238
                return provider.isTiled();
239
        }
240
        
241
        /*
242
         * (non-Javadoc)
243
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#isMosaic()
244
         */
245
        public boolean isMosaic() {
246
                return provider.isMosaic();
247
        }
248

    
249
        /*
250
         * (non-Javadoc)
251
         * @see org.gvsig.raster.impl.store.QueryableRaster#getWindowRaster(double, double, double, double)
252
         */
253
        public Buffer getWindow(double ulx, double uly, double lrx, double lry)
254
                throws InvalidSetViewException, ProcessInterruptedException, RasterDriverException {
255
                //Extent selectedExtent = new Extent(ulx, uly, lrx, lry);
256

    
257
                //Leemos pixels completos aunque el valor obtenido sea decimal. Esto se consigue redondeando
258
                //por arriba el m?s alto y por abajo el menor y luego restandolos
259

    
260
                Point2D p1 = provider.worldToRaster(new Point2D.Double(ulx, uly));
261
                Point2D p2 = provider.worldToRaster(new Point2D.Double(lrx, lry));
262

    
263
                //Para el valor mayor redondeamos por arriba. Para el valor menor redondeamos por abajo.
264
                double p1X = (p1.getX() > p2.getX()) ? Math.ceil(p1.getX()) : Math.floor(p1.getX());
265
                double p1Y = (p1.getY() > p2.getY()) ? Math.ceil(p1.getY()) : Math.floor(p1.getY());
266
                double p2X = (p2.getX() > p1.getX()) ? Math.ceil(p2.getX()) : Math.floor(p2.getX());
267
                double p2Y = (p2.getY() > p1.getY()) ? Math.ceil(p2.getY()) : Math.floor(p2.getY());
268

    
269
                int width = (int)Math.abs(p1X - p2X);
270
                int height = (int)Math.abs(p1Y - p2Y);
271

    
272
                //Ajustamos por si nos hemos salido del raster
273
                if(((int)(Math.min(p1X, p2X) + width)) > getWidth())
274
                        width = (int)(getWidth() - Math.min(p1X, p2X));
275
                if(((int)(Math.min(p1Y, p2Y) + height)) > getHeight())
276
                        height = (int)(getHeight() - Math.min(p1Y, p2Y));
277

    
278
                if (p1X < 0)
279
                        p1X = 0;
280
                if (p1Y < 0)
281
                        p1Y = 0;
282
                if (p2X > getWidth())
283
                        p2X = getWidth();
284
                if (p2Y > getHeight())
285
                        p2Y = getHeight();
286

    
287
                int mallocNBands = 0;
288
                if(bandList.getDrawableBands() != null)
289
                        mallocNBands = bandList.getDrawableBands().length;
290
                else
291
                        mallocNBands = bandList.getDrawableBandsCount();
292

    
293
                //Buffer ReadOnly
294

    
295
                if(isReadOnly()) {
296
                        Buffer rb = DefaultRasterManager.getInstance().createReadOnlyBuffer(getDataType()[0], width, height, getBandCount());
297
                        if(rb instanceof RasterReadOnlyBuffer) {
298
                                try {
299
                                        ((RasterReadOnlyBuffer)rb).setBufferParams(this, (int)p1.getX(), (int)p1.getY(), (int)p2.getX(), (int)p2.getY(), bandList);
300
                                } catch (FileNotExistsException e) {
301
                                        //Esto no debe darse ya que se comprueba al hacer el open.
302
                                        return null;
303
                                } catch (NotSupportedExtensionException e) {
304
                                        //Esto no debe darse ya que se comprueba al hacer el open
305
                                        return null;
306
                                }
307
                                return rb;
308
                        }
309
                }
310

    
311
                //Buffer RW
312
                Buffer raster = null;
313
                
314
                //Si hemos redondeado los pixeles de la petici?n (p1 y p2) por arriba y por abajo deberemos calcular un extent mayor
315
                //equivalente a los pixeles redondeados.
316
                Point2D wc1 = provider.rasterToWorld(new Point2D.Double(p1X, p1Y));
317
                Point2D wc2 = provider.rasterToWorld(new Point2D.Double(p2X, p2Y));
318
                
319
                if(forceToMemory) //Fuerza siempre buffer en memoria
320
                        raster = DefaultRasterManager.getInstance().createMemoryBuffer(getDataType()[0], width, height, mallocNBands, true);
321
                else
322
                        raster = DefaultRasterManager.getInstance().createBuffer(getDataType()[0], width, height, mallocNBands, true);
323
                
324
                Extent ex = rManager.getDataStructFactory().createExtent(wc1.getX(), wc1.getY(), wc2.getX(), wc2.getY());
325
                raster = ((DefaultRasterProvider)provider).getWindow(ex, bandList, raster);
326

    
327
                return raster;
328
        }
329

    
330
        /*
331
         * (non-Javadoc)
332
         * @see org.gvsig.raster.impl.store.QueryableRaster#getWindowRaster(double, double, double, double, boolean)
333
         */
334
        public Buffer getWindow(double ulx, double uly, double w, double h, boolean adjustToExtent)
335
                throws InvalidSetViewException, ProcessInterruptedException, RasterDriverException {
336
                //El incremento o decremento de las X e Y depende de los signos de rotaci?n y escala en la matriz de transformaci?n. Por esto
337
                //tenemos que averiguar si lrx es x + w o x -w, asi como si lry es y + h o y - h
338
                Extent ext = getExtent();
339
                Point2D pInit = provider.rasterToWorld(new Point2D.Double(0, 0));
340
                Point2D pEnd = provider.rasterToWorld(new Point2D.Double((int)getWidth(), (int)getHeight()));
341
                double wRaster = Math.abs(pEnd.getX() - pInit.getX());
342
                double hRaster = Math.abs(pEnd.getY() - pInit.getY());
343
                double lrx = (((int)(ext.getULX() - wRaster)) == ((int)ext.getLRX())) ? (ulx - w) : (ulx + w);
344
                double lry = (((int)(ext.getULY() - hRaster)) == ((int)ext.getLRY())) ? (uly - h) : (uly + h);
345

    
346
                //Extent selectedExtent = new Extent(ulx, uly, lrx, lry);
347

    
348
                //Leemos pixels completos aunque el valor obtenido sea decimal. Esto se consigue redondeando
349
                //por arriba el m?s alto y por abajo el menor y luego restandolos
350

    
351
                Point2D p1 = provider.worldToRaster(new Point2D.Double(ulx, uly));
352
                Point2D p2 = provider.worldToRaster(new Point2D.Double(lrx, lry));
353
                int width = (int)Math.abs(Math.ceil(p2.getX()) - Math.floor(p1.getX()));
354
                int height = (int)Math.abs(Math.floor(p1.getY()) - Math.ceil(p2.getY()));
355

    
356
                //Ajustamos por si nos hemos salido del raster
357
                if(((int)(p1.getX() + width)) > getWidth())
358
                        width = (int)(getWidth() - p1.getX());
359
                if(((int)(p1.getY() + height)) > getHeight())
360
                        height = (int)(getHeight() - p1.getY());
361

    
362
                if (p1.getX() < 0)
363
                        p1.setLocation(0, p1.getY());
364
                if (p1.getY() < 0)
365
                        p1.setLocation(p1.getX(), 0);
366
                if (p2.getX() > getWidth())
367
                        p2.setLocation(getWidth(), p2.getY());
368
                if (p2.getY() > getHeight())
369
                        p2.setLocation(p2.getX(), getHeight());
370

    
371
                int mallocNBands = 0;
372
                if(bandList.getDrawableBands() != null)
373
                        mallocNBands = bandList.getDrawableBands().length;
374
                else
375
                        mallocNBands = bandList.getDrawableBandsCount();
376

    
377
                //Buffer ReadOnly
378

    
379
                if(isReadOnly()) {
380
                        Buffer rb = DefaultRasterManager.getInstance().createReadOnlyBuffer(getDataType()[0], width, height, getBandCount());
381
                        if(rb instanceof RasterReadOnlyBuffer) {
382
                                try {
383
                                        ((RasterReadOnlyBuffer)rb).setBufferParams(this, (int)p1.getX(), (int)p1.getY(), (int)p2.getX(), (int)p2.getY(), bandList);
384
                                } catch (FileNotExistsException e) {
385
                                        //Esto no debe darse ya que se comprueba al hacer el open.
386
                                        return null;
387
                                } catch (NotSupportedExtensionException e) {
388
                                        //Esto no debe darse ya que se comprueba al hacer el open
389
                                        return null;
390
                                }
391
                                return rb;
392
                        }
393
                }
394
                
395
                //Si hemos redondeado los pixeles de la petici?n (p1 y p2) por arriba y por abajo deberemos calcular un extent mayor
396
                //equivalente a los pixeles redondeados.
397
                Point2D wc1 = provider.rasterToWorld(new Point2D.Double(Math.floor(p1.getX()), Math.floor(p1.getY())));
398
                Point2D wc2 = provider.rasterToWorld(new Point2D.Double(Math.ceil(p2.getX()), Math.ceil(p2.getY())));
399

    
400
                //Buffer RW
401
                Buffer raster = null;
402
                
403
                if(forceToMemory) //Fuerza siempre buffer en memoria
404
                        raster = DefaultRasterManager.getInstance().createMemoryBuffer(getDataType()[0], width, height, mallocNBands, true);
405
                else
406
                        raster = DefaultRasterManager.getInstance().createBuffer(getDataType()[0], width, height, mallocNBands, true);
407

    
408
                if(!adjustToExtent)
409
                         initBufferToNoData(raster, bandList);
410
                
411
                raster = ((DefaultRasterProvider)provider).getWindow(wc1.getX(), wc1.getY(), Math.abs(wc2.getX() - wc1.getX()), Math.abs(wc2.getY() - wc1.getY()), bandList, raster, adjustToExtent);
412

    
413
                return raster;
414
        }
415
        
416
        /*
417
         * (non-Javadoc)
418
         * @see org.gvsig.raster.impl.store.QueryableRaster#getWindowRaster(double, double, double, double, int, int, org.gvsig.fmap.dal.coverage.grid.render.TileListener, int)
419
         */
420
        public void getWindow(double ulx, double uly, double lrx, double lry, 
421
                int bufWidth, int bufHeight, TileListener listener)
422
                throws InvalidSetViewException, ProcessInterruptedException, RasterDriverException {
423
                if(isTiled()) { 
424
                        Extent ex = new ExtentImpl(ulx, uly, lrx, lry);
425
                        ((DefaultRasterProvider)provider).getWindow(ex, bufWidth, bufHeight, bandList, listener);
426
                        return;
427
                }
428
                                
429
                double[] step = null;
430
                Buffer buf = null;
431
                
432
                //Esta secci?n es para que no supersamplee el driver y pueda hacerse en el cliente
433
                if(!currentQuery.isSupersamplingLoadingBuffer()) {
434
                        //nWidth = ((adjustedDataExtent.width() * mDataset.getDataset(0).getWidth()) / mDataset.getExtentForRequest().width());
435
                        //nHeight = ((adjustedDataExtent.height() * mDataset.getDataset(0).getHeight()) / mDataset.getExtentForRequest().height());
436
                        Point2D p1 = worldToRaster(new Point2D.Double(ulx, uly));
437
                        Point2D p2 = worldToRaster(new Point2D.Double(lrx, lry));
438
                        nWidth = Math.abs(p1.getX() - p2.getX());
439
                        nHeight = Math.abs(p1.getY() - p2.getY());
440

    
441
                        if(bufWidth > Math.ceil(nWidth) && bufHeight > Math.ceil(nHeight)) {
442
                                step = calcSteps(ulx, uly, lrx, lry, nWidth, nHeight, bufWidth, bufHeight);
443
                                buf = getWindow(ulx, uly, lrx, lry);
444
                        }
445
                } 
446
                
447
                if(buf == null)
448
                        buf = getWindow(ulx, uly, lrx, lry, bufWidth, bufHeight, true);
449
                
450
                buf.setDataExtent(new Rectangle2D.Double(ulx, uly, Math.abs(ulx - lrx), Math.abs(uly - lry)));
451
                
452
                Buffer alphaBand = null;
453
                if(currentQuery.getAlphaBandNumber() != -1) {
454
                        int[] drawableBands = bandList.getDrawableBands();
455
                        bandList.setDrawableBands(new int[]{currentQuery.getAlphaBandNumber(), -1, -1});
456
                        for(int i = 0; i < provider.getInternalProviderCount(); i++)
457
                                ((AbstractRasterDataParameters)((DefaultRasterProvider)provider.getInternalProvider(i)).getDataParameters()).setAlphaBand(currentQuery.getAlphaBandNumber());
458
                        alphaBand = getWindow(ulx, uly, lrx, lry, bufWidth, bufHeight, true);
459
                        bandList.setDrawableBands(drawableBands);
460
                }
461
                
462
                TileCacheManager m = TileCacheLocator.getManager();
463
                org.gvsig.raster.cache.tile.Tile t = m.createTile(-1, 0, 0);
464
                t.setData(new Object[]{buf, alphaBand});
465
                t.setUl(new Point2D.Double(ulx, uly));
466
                t.setLr(new Point2D.Double(lrx, lry));
467
                if(provider.getDataParameters() instanceof MultiDimensionalStoreParameters) {
468
                        MultiDimensionalStoreParameters par = (MultiDimensionalStoreParameters)provider.getDataParameters();
469
                        t.setVariable(par.getStringVariable());
470
                        t.setZ(par.getStringLevel());
471
                        t.setTimeInstant(par.getStringTime());
472
                }
473
                t.setDownloaderParams("AffineTransform", getAffineTransform());
474
                t.setDownloaderParams("Tiling", new Boolean(true));
475
                t.setDownloaderParams("Step", step);
476
                try {
477
                        listener.tileReady(t);
478
                } catch (TileGettingException e) {
479
                        throw new RasterDriverException("Error getting a tile", e);
480
                }
481
                
482
                //listener.nextBuffer(buf, alphaBand, new ExtentImpl(ulx, uly, lrx, lry), this.getAffineTransform(), step, false);
483
                listener.endReading();
484
        }
485
        
486
        /*
487
         * (non-Javadoc)
488
         * @see org.gvsig.raster.impl.store.QueryableRaster#getTile(int, int, int, org.gvsig.fmap.dal.coverage.datastruct.Extent)
489
         */
490
        public Tile getTile(int level, int col, int row, Extent bbox, CacheStruct cacheStruct) throws TileGettingException {
491
                TiledRasterProvider tiledProv = ((TiledRasterProvider)provider);
492
                return tiledProv.getTile(level, col, row, bbox, cacheStruct);
493
        }
494

    
495
        /*
496
         * (non-Javadoc)
497
         * @see org.gvsig.raster.impl.store.QueryableRaster#getWindowRaster(double, double, double, double, int, int, boolean)
498
         */
499
        public Buffer getWindow(double ulx, double uly, double lrx, double lry, int bufWidth, int bufHeight, boolean adjustToExtent)
500
                throws InvalidSetViewException, ProcessInterruptedException, RasterDriverException {
501

    
502
                Point2D p1 = worldToRaster(new Point2D.Double(ulx, uly));
503
                Point2D p2 = worldToRaster(new Point2D.Double(lrx, lry));
504
                
505
                if(p1.getX() > p2.getX())
506
                        p1.setLocation(p1.getX() - 1, p1.getY());
507
                else
508
                        p2.setLocation(p2.getX() - 1, p2.getY());
509
                
510
                if(p1.getY() > p2.getY())
511
                        p1.setLocation(p1.getX(), p1.getY() - 1);
512
                else
513
                        p2.setLocation(p2.getX(), p2.getY() - 1);
514
                
515
                if(        ((int)p1.getX()) < 0 || ((int)p2.getX()) > getWidth() ||
516
                                ((int)p2.getY()) > getHeight() || ((int)p2.getY()) < 0)
517
                                throw new InvalidSetViewException("");
518

    
519
                int mallocNBands = 0;
520
                if(bandList.getDrawableBands() != null)
521
                        mallocNBands = bandList.getDrawableBands().length;
522
                else
523
                        mallocNBands = bandList.getDrawableBandsCount();
524

    
525
                //Buffer ReadOnly
526

    
527
                if(isReadOnly()) {
528
                        Buffer rb = DefaultRasterManager.getInstance().createReadOnlyBuffer(getDataType()[0], bufWidth, bufHeight, getBandCount());
529
                        if(rb instanceof RasterReadOnlyBuffer) {
530
                                try {
531
                                        ((RasterReadOnlyBuffer)rb).setBufferParams(this, (int)p1.getX(), (int)p1.getY(), (int)p2.getX(), (int)p2.getY(), bandList);
532
                                } catch (FileNotExistsException e) {
533
                                        //Esto no debe darse ya que se comprueba al hacer el open.
534
                                        return null;
535
                                } catch (NotSupportedExtensionException e) {
536
                                        //Esto no debe darse ya que se comprueba al hacer el open
537
                                        return null;
538
                                }
539
                                return rb;
540
                        }
541
                }
542

    
543
                //Buffer RW
544
                Buffer raster = null;
545
                
546
                if(forceToMemory) //Fuerza siempre buffer en memoria
547
                        raster = DefaultRasterManager.getInstance().createMemoryBuffer(getDataType()[0], bufWidth, bufHeight, mallocNBands, true);
548
                else
549
                        raster = DefaultRasterManager.getInstance().createBuffer(getDataType()[0], bufWidth, bufHeight, mallocNBands, true);
550
                
551
                Extent ex = rManager.getDataStructFactory().createExtent(ulx, uly, lrx, lry);
552
                 
553
                raster = ((DefaultRasterProvider)provider).getWindow(ex, bufWidth, bufHeight, bandList, raster, adjustToExtent);
554

    
555
                return raster;
556
        }
557

    
558
        /*
559
         * (non-Javadoc)
560
         * @see org.gvsig.raster.impl.store.QueryableRaster#getWindowRaster(int, int, int, int)
561
         */
562
        public Buffer getWindow(int x, int y, int w, int h)
563
                throws InvalidSetViewException, ProcessInterruptedException, RasterDriverException {
564
                if(x < 0 || y < 0 || w > provider.getWidth() || h > provider.getHeight())
565
                        throw new InvalidSetViewException("Out of image");
566

    
567
                //Buffer ReadOnly
568

    
569
                if(isReadOnly()) {
570
                        Buffer rb = DefaultRasterManager.getInstance().createReadOnlyBuffer(getDataType()[0], w, h, getBandCount());
571
                        if(rb instanceof RasterReadOnlyBuffer) {
572
                                try {
573
                                        ((RasterReadOnlyBuffer)rb).setBufferParams(this, x, y, x + w, y + h, bandList);
574
                                } catch (FileNotExistsException e) {
575
                                        //Esto no debe darse ya que se comprueba al hacer el open.
576
                                        return null;
577
                                } catch (NotSupportedExtensionException e) {
578
                                        //Esto no debe darse ya que se comprueba al hacer el open
579
                                        return null;
580
                                }
581
                                return rb;
582
                        }
583
                }
584

    
585
                //Buffer RW
586
                Buffer raster = null;
587
                
588
                if(forceToMemory) //Fuerza siempre buffer en memoria
589
                        raster = DefaultRasterManager.getInstance().createMemoryBuffer(getDataType()[0], w, h, bandList.getDrawableBandsCount(), true);
590
                else
591
                        raster = DefaultRasterManager.getInstance().createBuffer(getDataType()[0], w, h, bandList.getDrawableBandsCount(), true);
592
                
593
                ((DefaultRasterProvider)provider).getWindow(x, y, bandList, raster);
594
        
595
                return raster;
596
        }
597

    
598
        /*
599
         * (non-Javadoc)
600
         * @see org.gvsig.raster.impl.store.QueryableRaster#getWindowRaster(int, int, int, int, int, int)
601
         */
602
        public Buffer getWindow(int x, int y, int w, int h, int bufWidth, int bufHeight)
603
                throws InvalidSetViewException, ProcessInterruptedException, RasterDriverException {
604
                if(x < 0 || y < 0 || w > provider.getWidth() || h > provider.getHeight())
605
                        throw new InvalidSetViewException("Out of image");
606

    
607
                //Buffer ReadOnly
608

    
609
                if(isReadOnly()) {
610
                        Buffer rb = DefaultRasterManager.getInstance().createReadOnlyBuffer(getDataType()[0], bufWidth, bufHeight, getBandCount());
611
                        if(rb instanceof RasterReadOnlyBuffer) {
612
                                try {
613
                                        ((RasterReadOnlyBuffer)rb).setBufferParams((QueryableRaster)this, x, y, x + w, y + h, bandList);
614
                                } catch (FileNotExistsException e) {
615
                                        //Esto no debe darse ya que se comprueba al hacer el open.
616
                                        return null;
617
                                } catch (NotSupportedExtensionException e) {
618
                                        //Esto no debe darse ya que se comprueba al hacer el open
619
                                        return null;
620
                                }
621
                                return rb;
622
                        }
623
                }
624

    
625
                //Buffer RW
626
                Buffer raster = null;
627
                
628
                if(forceToMemory) //Fuerza siempre buffer en memoria
629
                        raster = DefaultRasterManager.getInstance().createMemoryBuffer(getDataType()[0], bufWidth, bufHeight, bandList.getDrawableBandsCount(), true);
630
                else
631
                        raster = DefaultRasterManager.getInstance().createBuffer(getDataType()[0], bufWidth, bufHeight, bandList.getDrawableBandsCount(), true);
632
                
633
                raster = ((DefaultRasterProvider)provider).getWindow(x, y, w, h, bufWidth, bufHeight, bandList, raster);
634

    
635
                return raster;
636
        }
637

    
638
        //******************************
639
        //Setters and Getters
640
        //******************************
641

    
642
        /**
643
         * Calcula el tama?o de los ficheros en disco
644
         * @return tama?o en bytes de todos los ficheros de la lista
645
         */
646
        public long getFileSize() {
647
                if(provider != null) {
648
                        long size = 0;
649
                        long[] fSize = provider.getFileSizeByProvider();
650
                        if(fSize != null && fSize.length > 0) {
651
                                for (int j = 0; j < fSize.length; j++) {
652
                                        size += fSize[j];        
653
                                }
654
                        }
655
                        return size;
656
                }
657
                return 0;
658
        }
659

    
660
        /*
661
         * (non-Javadoc)
662
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getHeight()
663
         */
664
        public double getHeight() {
665
                return provider.getHeight();
666
        }
667

    
668
        /*
669
         * (non-Javadoc)
670
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getWidth()
671
         */
672
        public double getWidth() {
673
                return provider.getWidth();
674
        }
675

    
676
        /*
677
         * (non-Javadoc)
678
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getCellSize()
679
         */
680
        public double getCellSize() {
681
                try {
682
                        Extent e = getExtent();
683
                        double dCellsize = (e.getMax().getX() - e.getMin().getX() ) / getWidth();
684
                        return dCellsize;
685
                } catch (NullPointerException e) {
686
                        return 1;
687
                }
688
        }
689

    
690
        /*
691
         * (non-Javadoc)
692
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getBandCount()
693
         */
694
        public int getBandCount() {
695
                return provider.getBandCount();
696
        }
697

    
698
        /*
699
         * (non-Javadoc)
700
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getDataType()
701
         */
702
        public int[] getDataType() {
703
                return provider.getDataType();
704
        }
705

    
706
        /*
707
         * (non-Javadoc)
708
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getBands()
709
         */
710
        public BandList getBands() {
711
                return bandList;
712
        }
713

    
714
        /**
715
         * Obtiene la coordenada X m?nima de toda la lista
716
         * @return Coordenada X m?nima
717
         */
718
        public double getMinX() {
719
                return provider.getExtent().getMin().getX();
720
        }
721

    
722
        /**
723
         * Obtiene la coordenada Y m?nima de toda la lista
724
         * @return Coordenada Y m?nima
725
         */
726
        public double getMinY() {
727
                return provider.getExtent().getMin().getY();
728
        }
729

    
730
        /**
731
         * Obtiene la coordenada Y m?xima de toda la lista
732
         * @return Coordenada Y m?xima
733
         */
734
        public double getMaxX() {
735
                return provider.getExtent().getMax().getX();        }
736

    
737
        /**
738
         * Obtiene la coordenada Y m?xima de toda la lista
739
         * @return Coordenada Y m?xima
740
         */
741
        public double getMaxY() {
742
                return provider.getExtent().getMax().getY();
743
        }
744

    
745
        /*
746
         * (non-Javadoc)
747
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getNoDataValue()
748
         */
749
        public NoData getNoDataValue() {
750
                return provider.getNoDataValue();
751
        }
752

    
753
        /*
754
         * (non-Javadoc)
755
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#setNoDataValue(double)
756
         */
757
        public void setNoDataValue(NoData value) {
758
                provider.setNoDataValue(value);
759
        }
760

    
761
        /*
762
         * (non-Javadoc)
763
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getExtent()
764
         */
765
        public Extent getExtent() {
766
                return provider.getExtent();
767
        }
768

    
769
        /**
770
         * Este es el extent sobre el que se ajusta una petici?n para que esta no exceda el
771
         * extent m?ximo del raster. Para un raster sin rotar ser? igual al extent
772
         * pero para un raster rotado ser? igual al extent del raster como si no
773
         * tuviera rotaci?n. Esto ha de ser as? ya que la rotaci?n solo se hace sobre la
774
         * vista y las peticiones han de hacerse en coordenadas de la imagen sin shearing
775
         * aplicado.
776
         * @return Extent
777
         */
778
        public Extent getExtentForRequest() {
779
                return provider.getExtentWithoutRot();
780
        }
781

    
782
        /**
783
         * 
784
         * @return
785
         */
786
        public Extent getLastSelectedView(){
787
                return provider.getView();
788
        }
789

    
790
        /*
791
         * (non-Javadoc)
792
         * @see org.gvsig.raster.impl.store.QueryableRaster#getColorTable(int)
793
         */
794
        public ColorTable getColorTable(int i){
795
                return provider.getColorTable();
796
        }
797

    
798
        /**
799
         * Obtiene la lista de paletas correspondiente a todos los ficheros que forman el GeoMultiRasterFile
800
         * @return Paleta asociada a este o null si no tiene. Una posici?n null en el array tambi?n indica que
801
         * para ese fichero no hay paletas asociadas.
802
         */
803
        public ColorTable getColorTables() {
804
                return provider.getColorTable();
805
        }
806
        
807
        /*
808
         * (non-Javadoc)
809
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getColorTable()
810
         */
811
        public ColorTable getColorTable() {
812
                //Solo tiene sentido si tiene un fichero y ese fichero tiene una sola banda
813
                if(provider != null)
814
                        return provider.getColorTable();
815
                return null;
816
        }
817
        
818
        /**
819
         * Sets the color table
820
         * @param colorTable
821
         */
822
        public void setColorTable(ColorTable colorTable) {
823
                provider.setColorTable(colorTable);
824
        }
825

    
826
        /*
827
         * (non-Javadoc)
828
         * @see org.gvsig.raster.impl.store.QueryableRaster#getColorTable(java.lang.String)
829
         */
830
        public ColorTable getColorTable(String fileName){
831
                return provider.getColorTable();
832
        }
833

    
834
        /*
835
         * (non-Javadoc)
836
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#rasterToWorld(java.awt.geom.Point2D)
837
         */
838
        public Point2D rasterToWorld(Point2D pt) {
839
                return provider.rasterToWorld(pt);
840
        }
841

    
842
        /*
843
         * (non-Javadoc)
844
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#worldToRaster(java.awt.geom.Point2D)
845
         */
846
        public Point2D worldToRaster(Point2D pt) {
847
                return provider.worldToRaster(pt);
848
        }
849

    
850
        /*
851
         * (non-Javadoc)
852
         * @see org.gvsig.raster.impl.store.QueryableRaster#calcSteps(double, double, double, double, double, double, int, int)
853
         */
854
        public double[] calcSteps(double dWorldTLX, double dWorldTLY, double dWorldBRX, double dWorldBRY,
855
                        double nWidth, double nHeight, int bufWidth, int bufHeight){
856
                return provider.calcSteps(dWorldTLX, dWorldTLY, dWorldBRX, dWorldBRY, nWidth, nHeight, bufWidth, bufHeight);
857
        }
858

    
859
        /*
860
         * (non-Javadoc)
861
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#isGeoreferenced()
862
         */
863
        public boolean isGeoreferenced() {
864
                return provider.isGeoreferenced();
865
        }
866

    
867
        /*
868
         * (non-Javadoc)
869
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getPixelSizeX()
870
         */
871
        public double getPixelSizeX() {
872
                return provider.getPixelSizeX();
873
        }
874

    
875
        /*
876
         * (non-Javadoc)
877
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getPixelSizeY()
878
         */
879
        public double getPixelSizeY() {
880
                return provider.getPixelSizeY();
881
        }
882

    
883
        /*
884
         * (non-Javadoc)
885
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getData(int, int, int)
886
         */
887
        public Object getData(int x, int y, int band)throws InvalidSetViewException, FileNotOpenException, RasterDriverException {
888
                return provider.getData(x, y, band);
889
        }
890

    
891
        /*
892
         * (non-Javadoc)
893
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getWktProjection()
894
         */
895
        public String getWktProjection() throws RasterDriverException {
896
                if(provider != null)
897
                        return provider.getWktProjection();
898
                return null;
899
        }
900

    
901
        /*
902
         * (non-Javadoc)
903
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#isInside(java.awt.geom.Point2D)
904
         */
905
        public boolean isInside(Point2D p) {
906
                if(provider != null)
907
                        return provider.isInside(p);
908
                return false;
909
        }
910
        
911
        /*
912
         * (non-Javadoc)
913
         * @see org.gvsig.raster.impl.store.QueryableRaster#getDataStore()
914
         */
915
        public RasterDataStore getDataStore() {
916
                return this;
917
        }
918

    
919
        /**
920
         * 
921
         * @param band
922
         * @return
923
         */
924
        public AffineTransform getAffineTransform(int band){
925
                return provider.getAffineTransform();
926
        }
927

    
928

    
929
        /*
930
         * (non-Javadoc)
931
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#setAffineTransform(java.awt.geom.AffineTransform)
932
         */
933
        public void setAffineTransform(AffineTransform transf) {
934
                provider.setAffineTransform(transf);
935
        }
936

    
937
        /**
938
         * Obtiene la matriz de transformaci?n del propio raster. Esta matriz es la encargada
939
         * de convertir las coordenadas de la petici?n en coordenadas a las que se pide a la libreria.
940
         * En gdal, por ejemplo, se piden las coordenadas a la libreria en coordenadas pixel por lo que
941
         * esta matriz tendr? la georreferenciaci?n asociada en el worldfile o cabecera. Otras librerias como
942
         * ermapper la petici?n a la libreria se hace en coordenadas geograficas que son las mismas en las
943
         * que pide el usuario de gvSIG por lo que esta matriz en este caso se inicializa con la identidad.
944
         * @return
945
         */
946
        public AffineTransform getOwnTransformation() {
947
                return provider.getOwnAffineTransform();
948
        }
949

    
950
        /*
951
         * (non-Javadoc)
952
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#isRotated()
953
         */
954
        public boolean isRotated() {
955
                if(provider != null)
956
                        return provider.isRotated();
957
                return false;
958
        }
959

    
960
        /*
961
         * (non-Javadoc)
962
         * @see org.gvsig.raster.impl.store.QueryableRaster#setDrawableBands(int[])
963
         */
964
        public void setDrawableBands(int[] db) {
965
                getBands().setDrawableBands(db);
966
        }
967
        
968
        /*
969
         * (non-Javadoc)
970
         * @see org.gvsig.raster.impl.store.QueryableRaster#getDrawableBands()
971
         */
972
        public int[] getDrawableBands() {
973
                return getBands().getDrawableBands();
974
        }
975

    
976
        /*
977
         * (non-Javadoc)
978
         * @see org.gvsig.raster.impl.store.QueryableRaster#clearDrawableBands()
979
         */
980
        public void clearDrawableBands() {
981
                getBands().clearDrawableBands();
982
        }
983

    
984
        /*
985
         * (non-Javadoc)
986
         * @see org.gvsig.raster.impl.store.QueryableRaster#addDrawableBand(int, int)
987
         */
988
        public void addDrawableBand(int posRasterBuf, int imageBand) {
989
                getBands().addDrawableBand(posRasterBuf, imageBand);
990
        }
991

    
992
        /**
993
         * 
994
         * @return
995
         */
996
        public boolean isReadOnly() {
997
                return readOnly;
998
        }
999

    
1000
        /**
1001
         * 
1002
         * @param readOnly
1003
         */
1004
        public void setReadOnly(boolean readOnly) {
1005
                this.readOnly = readOnly;
1006
                if(readOnly)
1007
                        this.forceToMemory = false;
1008
        }
1009

    
1010
        /*
1011
         * (non-Javadoc)
1012
         * @see org.gvsig.raster.impl.store.QueryableRaster#setMemoryBuffer(boolean)
1013
         */
1014
        public void setMemoryBuffer(boolean memory) {
1015
                this.forceToMemory = memory;
1016
                if(memory)
1017
                        this.readOnly = false;
1018
        }
1019

    
1020
        /**
1021
         * 
1022
         * @return
1023
         */
1024
        public boolean isMemoryBuffer() {
1025
                return forceToMemory;
1026
        }
1027
        
1028
        /*
1029
         * (non-Javadoc)
1030
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#deleteLayerFromCache()
1031
         */
1032
        public void deleteLayerFromCache() {
1033
                provider.deleteLayerFromCache();
1034
        }
1035
        
1036
        /*
1037
         * (non-Javadoc)
1038
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#isMultiFile()
1039
         */
1040
        public boolean isMultiFile() {
1041
                return provider.isMultiFile();
1042
        }
1043
        
1044
        /*
1045
         * (non-Javadoc)
1046
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getOverviewWidth(int, int)
1047
         */
1048
        public int getOverviewWidth(int band, int overview) throws BandAccessException, RasterDriverException {
1049
                return provider.getOverviewWidth(band, overview);
1050
        }
1051

    
1052
        /*
1053
         * (non-Javadoc)
1054
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getOverviewHeight(int, int)
1055
         */
1056
        public int getOverviewHeight(int band, int overview) throws BandAccessException, RasterDriverException {
1057
                return provider.getOverviewHeight(band, overview);
1058
        }
1059

    
1060
        /*
1061
         * (non-Javadoc)
1062
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getOverviewCount(int)
1063
         */
1064
        public int getOverviewCount(int band) throws BandAccessException, RasterDriverException {
1065
                if(band >= getBandCount())
1066
                        throw new BandAccessException("Wrong band");
1067
                return provider.getOverviewCount(band);
1068
        }
1069

    
1070
        /*
1071
         * (non-Javadoc)
1072
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#overviewsSupport()
1073
         */
1074
        public boolean overviewsSupport() {
1075
                if(provider != null)
1076
                        return provider.isOverviewsSupported();
1077
                return false;
1078
        }
1079
        
1080
        /*
1081
         * (non-Javadoc)
1082
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#saveGeoreferencingToRmf()
1083
         */
1084
        public void saveGeoreferencingToRmf() throws RmfSerializerException {
1085
                provider.saveObjectToRmf(DefaultRasterProvider.class, provider);
1086
        }
1087
        
1088
        /*
1089
         * (non-Javadoc)
1090
         * @see org.gvsig.raster.impl.store.AbstractRasterDataStore#saveSerialInfoToRmf(org.gvsig.fmap.dal.coverage.store.props.SerialInfo)
1091
         */
1092
        public void saveSerialInfoToRmf(TimeSeries serialInfo) throws RmfSerializerException {
1093
                provider.saveObjectToRmf(TimeSeries.class, serialInfo);
1094
        }
1095
        
1096
        /*
1097
         * (non-Javadoc)
1098
         * @see org.gvsig.raster.impl.store.AbstractRasterDataStore#saveColorTableToRmf(org.gvsig.fmap.dal.coverage.store.props.ColorTable)
1099
         */
1100
        public void saveColorTableToRmf(ColorTable table) throws RmfSerializerException {
1101
                provider.saveObjectToRmf(ColorTable.class, table);
1102
        }
1103
        
1104
        /*
1105
         * (non-Javadoc)
1106
         * @see org.gvsig.raster.impl.store.AbstractRasterDataStore#loadSerialInfoFromRmf(org.gvsig.fmap.dal.coverage.store.props.SerialInfo)
1107
         */
1108
        public boolean loadSerialInfoFromRmf(TimeSeries serialInfo) {
1109
                try {
1110
                        provider.loadObjectFromRmf(TimeSeries.class, serialInfo);
1111
                        return true;
1112
                } catch (RmfSerializerException e) {
1113
                        //Prueba hasta que alguno tiene la informaci?n
1114
                }
1115
                return false;
1116
        }
1117

    
1118
        /*
1119
         * (non-Javadoc)
1120
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getView()
1121
         */
1122
        public Extent getView() {
1123
                if(provider != null)
1124
                        return provider.getView();
1125
                return null;
1126
        }
1127
        
1128
        /*
1129
         * (non-Javadoc)
1130
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getExtentWithoutRot()
1131
         */
1132
        public Extent getExtentWithoutRot() {
1133
                if(provider != null)
1134
                        return provider.getExtentWithoutRot();
1135
                return null;
1136
        }
1137
        
1138
        /*
1139
         * (non-Javadoc)
1140
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getOwnAffineTransform()
1141
         */
1142
        public AffineTransform getOwnAffineTransform() {
1143
                if(provider != null)
1144
                        return provider.getOwnAffineTransform();
1145
                return null;
1146
        }
1147
        
1148
        /*
1149
         * (non-Javadoc)
1150
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getAffineTransform()
1151
         */
1152
        public AffineTransform getAffineTransform() {
1153
                if(provider != null)
1154
                        return provider.getAffineTransform();
1155
                return null;
1156
        }
1157
        
1158
        /*
1159
         * (non-Javadoc)
1160
         * @see org.gvsig.fmap.dal.coverage.store.RasterStoreProperties#getProjection()
1161
         */
1162
        public IProjection getProjection() {
1163
                if(provider != null)
1164
                        return provider.getProjection();
1165
                return null;
1166
        }
1167
        
1168
        /*
1169
         * (non-Javadoc)
1170
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getStatistics()
1171
         */
1172
        public Statistics getStatistics() {
1173
                if(provider != null)
1174
                        return provider.getStatistics();
1175
                return null;
1176
        }
1177
        
1178
        private void setStatistics(Statistics stats) {
1179
                if(provider != null)
1180
                        provider.setStatistics(stats);
1181
        }
1182
        
1183
        /*
1184
         * (non-Javadoc)
1185
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getHistogram()
1186
         */
1187
        public HistogramComputer getHistogramComputer() throws HistogramException, InterruptedException {
1188
                if(provider != null)
1189
                        return provider.getHistogramComputer();
1190
                return null;
1191
        }
1192
        
1193
        /*
1194
         * (non-Javadoc)
1195
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getMetadata()
1196
         */
1197
        public Metadata getMetadata() {
1198
                if(provider != null)
1199
                        return provider.getMetadata();
1200
                return null;
1201
        }
1202
        
1203
        /*
1204
         * (non-Javadoc)
1205
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getTransparency()
1206
         */
1207
        public Transparency getTransparency() {
1208
                if(provider != null) {
1209
                        provider.getTransparency().setNoData(getNoDataValue());
1210
                        return provider.getTransparency();
1211
                }
1212
                return null;
1213
        }
1214
        
1215
        /*
1216
         * (non-Javadoc)
1217
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getColorInterpretation()
1218
         */
1219
        public ColorInterpretation getColorInterpretation() {
1220
                return provider.getColorInterpretation();
1221
        }
1222

    
1223
        /*
1224
         * (non-Javadoc)
1225
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#isReproyectable()
1226
         */
1227
        public boolean isReproyectable() {
1228
                if(provider != null)
1229
                        return (provider.isReproyectable());
1230
                return false;
1231
        }
1232
        
1233
        /*
1234
         * (non-Javadoc)
1235
         * @see org.gvsig.metadata.Metadata#getMetadataName()
1236
         */
1237
        public String getMetadataName() {
1238
                if(provider != null)
1239
                        return provider.getName();
1240
                return null;
1241
        }
1242
        
1243
        /*
1244
         * (non-Javadoc)
1245
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#cloneDataStore()
1246
         */
1247
        public RasterDataStore cloneDataStore() throws CloneException {
1248
                DefaultRasterStore ds = new DefaultRasterStore();
1249
                ds.parameters = getParameters();
1250
                ds.provider = provider.cloneProvider();
1251
                
1252
                int[] bands = new int[1];
1253
                bands[0] = provider.getBandCount();
1254
                ds.metadata = new MultiDataStoreMetadata(bands);
1255
                ((MultiDataStoreMetadata)ds.metadata).add(provider.getMetadata());
1256
                
1257
                ds.bandList = (BandListImpl)bandList.clone();
1258
                return ds;
1259
        }
1260
        
1261
        /*
1262
         * (non-Javadoc)
1263
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#isOpen()
1264
         */
1265
        public boolean isOpen() {
1266
                if(provider == null)
1267
                        return false;
1268
                return provider.isOpen();
1269
        }
1270

    
1271
        /*
1272
         * (non-Javadoc)
1273
         * @see org.gvsig.raster.impl.store.AbstractRasterDataStore#getProvider()
1274
         */
1275
        public CoverageStoreProvider getProvider() {
1276
                return provider;
1277
        }
1278
        
1279
        /*
1280
         * (non-Javadoc)
1281
         * @see org.gvsig.fmap.dal.coverage.store.RemoteRasterStore#getInfoByPoint(double, double)
1282
         */
1283
        public String getInfoByPoint(double x, double y, ICancellable cancellable) throws RemoteServiceException {
1284
                return null;
1285
        }
1286

    
1287
        /*
1288
         * (non-Javadoc)
1289
         * @see org.gvsig.fmap.dal.coverage.store.TRasterStore#goTo(int)
1290
         */
1291
        public void goTo(int position) throws OperationNotSupportedException {
1292
                if(!isTimeSupportedByTheProvider())
1293
                        throw new OperationNotSupportedException("Not supported for a MultiRasterDataset");
1294
                if(getParameters() instanceof MultiDimensionalStoreParameters) {
1295
                        ((MultiDimensionalStoreParameters)getParameters()).goTo(position);
1296
                }
1297
        }
1298

    
1299
        /*
1300
         * (non-Javadoc)
1301
         * @see org.gvsig.fmap.dal.coverage.store.TRasterStore#selectNext()
1302
         */
1303
        public void selectNext() throws OperationNotSupportedException {
1304
                if(!isTimeSupportedByTheProvider())
1305
                        throw new OperationNotSupportedException("Not supported for a MultiRasterDataset");
1306
                if(getParameters() instanceof MultiDimensionalStoreParameters) {
1307
                        ((MultiDimensionalStoreParameters)getParameters()).selectNextInstant();
1308
                }
1309
        }
1310

    
1311
        /*
1312
         * (non-Javadoc)
1313
         * @see org.gvsig.fmap.dal.coverage.store.TRasterStore#selectPrev()
1314
         */
1315
        public void selectPrev() throws OperationNotSupportedException {
1316
                if(!isTimeSupportedByTheProvider())
1317
                        throw new OperationNotSupportedException("Not supported for a MultiRasterDataset");
1318
                if(getParameters() instanceof MultiDimensionalStoreParameters) {
1319
                        ((MultiDimensionalStoreParameters)getParameters()).selectPrevInstant();
1320
                }
1321
        }
1322
        
1323
        /*
1324
         * (non-Javadoc)
1325
         * @see org.gvsig.fmap.dal.coverage.store.TRasterStore#setTime(org.gvsig.timesupport.Time)
1326
         */
1327
        public void setTime(Time time) throws TimeException, OperationNotSupportedException {
1328
                if(!isTimeSupportedByTheProvider())
1329
                        throw new OperationNotSupportedException("Not supported for a MultiRasterDataset");
1330
                
1331
        }
1332
        
1333
        /**
1334
         * Returns true whether all providers support time
1335
         * @return
1336
         */
1337
        private boolean isTimeSupportedByTheProvider() {
1338
                if(provider != null)
1339
                        return provider.isTimeSupported();
1340
                return false;
1341
        }
1342
        
1343
        /*
1344
         * (non-Javadoc)
1345
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#isRasterEnclosed()
1346
         */
1347
        public boolean isRasterEnclosed() {
1348
                if(provider != null)
1349
                        return provider.isRasterEnclosed();
1350
                return false;
1351
        }
1352

    
1353
        /*
1354
         * (non-Javadoc)
1355
         * @see org.gvsig.fmap.dal.coverage.store.RemoteRasterStore#getCoordsInLevel(java.awt.geom.Point2D, int, int, int)
1356
         */
1357
        public Extent getCoordsInLevel(Point2D viewCenter, int level, int w, int h) {
1358
                try {
1359
                        return ((TiledRasterProvider)provider).getCoordsInLevel(viewCenter, level, w, h);
1360
                } catch (ClassCastException e) {
1361
                        return null;
1362
                }
1363
        }
1364

    
1365
        /*
1366
         * (non-Javadoc)
1367
         * @see org.gvsig.fmap.dal.coverage.store.RemoteRasterStore#getCoordsInTheNearestLevel(org.gvsig.fmap.dal.coverage.datastruct.Extent, int, int)
1368
         */
1369
        public Extent getCoordsInTheNearestLevel(Extent extent, int w, int h) {
1370
                try {
1371
                        return ((TiledRasterProvider)provider).getCoordsInTheNearestLevel(extent, w, h);
1372
                } catch (ClassCastException e) {
1373
                        return null;
1374
                }
1375
        }
1376

    
1377
        /*
1378
         * (non-Javadoc)
1379
         * @see org.gvsig.fmap.dal.coverage.store.RemoteRasterStore#getZoomLevels()
1380
         */
1381
        public int getZoomLevels() {
1382
                try {
1383
                        return ((TiledRasterProvider)provider).getZoomLevels();
1384
                } catch (ClassCastException e) {
1385
                        return -1;
1386
                }
1387
        }
1388

    
1389
        /*
1390
         * (non-Javadoc)
1391
         * @see org.gvsig.fmap.dal.coverage.store.RemoteRasterStore#getNearestLevel(double)
1392
         */
1393
        public int getNearestLevel(double pixelSize) {
1394
                try {
1395
                        return ((TiledRasterProvider)provider).getNearestLevel(pixelSize);
1396
                } catch (ClassCastException e) {
1397
                        return -1;
1398
                }
1399
        }
1400
        
1401
        /*
1402
         * (non-Javadoc)
1403
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#setTileServer(java.lang.Class)
1404
         */
1405
        public void setTileServer(Class<?> tileServer) {
1406
                if(provider instanceof TiledRasterProvider) {
1407
                        try {
1408
                                ((TiledRasterProvider)provider).setTileServer(tileServer);
1409
                        } catch (ClassCastException e) {
1410
                        }
1411
                }
1412
        }
1413

    
1414
        /*
1415
         * (non-Javadoc)
1416
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getInternalParameters()
1417
         */
1418
        public RasterDataParameters getInternalParameters() {
1419
                if(provider instanceof TiledRasterProvider) {
1420
                        DefaultRasterProvider prov = (DefaultRasterProvider)((TiledRasterProvider)provider).getInternalProvider();
1421
                        return prov.getDataParameters();
1422
                }
1423
                return (RasterDataParameters)getParameters();
1424
        }
1425

    
1426
        /*
1427
         * (non-Javadoc)
1428
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#newDataStore()
1429
         */
1430
        public RasterDataStore newDataStore() {
1431
                if(provider != null) {
1432
                        RasterManager manager = (DefaultRasterManager)RasterLocator.getManager();
1433
                        try {
1434
                                RasterDataStore newDataStore = manager.open((DataStoreParameters)parameters);
1435
                                if(newDataStore instanceof DefaultRasterStore) {
1436
                                        ((DefaultRasterStore)newDataStore).setStatistics(getStatistics());
1437
                                }
1438
                                return newDataStore;
1439
                        } catch (NotSupportedExtensionException e) {
1440
                                return null;
1441
                        } catch (RasterDriverException e) {
1442
                                return null;
1443
                        }
1444
                }
1445
                return null;
1446
        }
1447

    
1448
        /*
1449
         * (non-Javadoc)
1450
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getFileNameByProvider()
1451
         */
1452
        public String[] getURIByProvider() {
1453
                return provider.getURIByProvider();
1454
        }
1455

    
1456
        /*
1457
         * (non-Javadoc)
1458
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getFileSizeByProvider()
1459
         */
1460
        public long[] getFileSizeByProvider() {
1461
                return provider.getFileSizeByProvider();
1462
        }
1463

    
1464
        /*
1465
         * (non-Javadoc)
1466
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getProviderCount()
1467
         */
1468
        public int getProviderCount() {
1469
                return provider.getInternalProviderCount();
1470
        }
1471
        
1472
        /*
1473
         * (non-Javadoc)
1474
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getBandCountByProvider()
1475
         */
1476
        public int[] getBandCountByProvider() {
1477
                return provider.getBandCountByProvider();
1478
        }
1479
        
1480
        /*
1481
         * (non-Javadoc)
1482
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getDataParametersByProvider()
1483
         */
1484
        public RasterDataParameters[] getDataParametersByProvider() {
1485
                RasterDataParameters[] res = new RasterDataParameters[getProviderCount()];
1486
                for (int i = 0; i < res.length; i++) {
1487
                        res[i] = (RasterDataParameters)provider.getInternalProvider(i).getDataParameters();                        
1488
                }
1489
                return res;
1490
        }
1491
        
1492
        /*
1493
         * (non-Javadoc)
1494
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getMetadataByProvider()
1495
         */
1496
        public Metadata[] getMetadataByProvider() {
1497
                Metadata[] res = new Metadata[getProviderCount()];
1498
                for (int i = 0; i < res.length; i++) {
1499
                        res[i] = provider.getInternalProvider(i).getMetadata();                        
1500
                }
1501
                return res;
1502
        }
1503
        
1504
        /*
1505
         * (non-Javadoc)
1506
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getOverviewCountByProvider()
1507
         */
1508
        public int[] getOverviewCountByProvider(int band) throws BandAccessException {
1509
                int[] res = new int[getProviderCount()];
1510
                for (int i = 0; i < res.length; i++) {
1511
                        try {
1512
                                res[i] = provider.getInternalProvider(i).getOverviewCount(band);
1513
                        } catch (RasterDriverException e) {
1514
                                throw new BandAccessException("", e);
1515
                        }                        
1516
                }
1517
                return res;
1518
        }
1519
        
1520
        /*
1521
         * (non-Javadoc)
1522
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getOverviewSizeByProvider(int, int)
1523
         */
1524
        public String[] getOverviewSizeByProvider(int band, int overview) throws BandAccessException {
1525
                String[] res = new String[getProviderCount()];
1526
                for (int i = 0; i < res.length; i++) {
1527
                        try {
1528
                                res[i] = provider.getInternalProvider(i).getOverviewWidth(band, overview) + 
1529
                                                 "x" + 
1530
                                                 provider.getInternalProvider(i).getOverviewHeight(band, overview);
1531
                        } catch (RasterDriverException e) {
1532
                                throw new BandAccessException("", e);
1533
                        }                        
1534
                }
1535
                return res;
1536
        }
1537
        
1538
        /*
1539
         * (non-Javadoc)
1540
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getAffineTransformByProvider()
1541
         */
1542
        public AffineTransform[] getAffineTransformByProvider() {
1543
                AffineTransform[] res = new AffineTransform[getProviderCount()];
1544
                for (int i = 0; i < res.length; i++) {
1545
                        res[i] = provider.getInternalProvider(i).getAffineTransform();
1546
                }
1547
                return res;
1548
        }
1549
        
1550
        /*
1551
         * (non-Javadoc)
1552
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getHeightByProvider()
1553
         */
1554
        public double[] getHeightByProvider() {
1555
                double[] res = new double[getProviderCount()];
1556
                for (int i = 0; i < res.length; i++) {
1557
                        res[i] = provider.getInternalProvider(i).getHeight();
1558
                }
1559
                return res;
1560
        }
1561
        
1562
        /*
1563
         * (non-Javadoc)
1564
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getWidthByProvider()
1565
         */
1566
        public double[] getWidthByProvider() {
1567
                double[] res = new double[getProviderCount()];
1568
                for (int i = 0; i < res.length; i++) {
1569
                        res[i] = provider.getInternalProvider(i).getWidth();
1570
                }
1571
                return res;
1572
        }
1573
        
1574
        /*
1575
         * (non-Javadoc)
1576
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#addFile(java.lang.String)
1577
         */
1578
        public void addFile(String file) throws InvalidSourceException {
1579
                provider.addFile(file);
1580
        }
1581
        
1582
        /*
1583
         * (non-Javadoc)
1584
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#removeFile(java.lang.String)
1585
         */
1586
        public void removeFile(String file) {
1587
                provider.removeFile(file);
1588
                bandList.removeBands(file);
1589
        }
1590
        
1591
        /*
1592
         * (non-Javadoc)
1593
         * @see org.gvsig.fmap.dal.coverage.store.RasterDataStore#getURIByBand(int)
1594
         */
1595
        public String getURIByBand(int band) {
1596
                return provider.getURIByBand(band);
1597
        }
1598
        
1599
        /**
1600
         * Gets the {@link Interval} of the store, that means the temporal
1601
         * interval where the store has valid data.
1602
         * In raster this method has sense in a mosaic. Therefore this has to be implemented 
1603
         * by the provider.
1604
         * @return
1605
         *         a time interval or null if there is not time support
1606
         */
1607
        public Interval getInterval() {
1608
                return provider.getInterval();
1609
        }
1610
        
1611
        /**
1612
         * Gets all the possible values of time for which the store has data.  
1613
         * In raster this method has sense in a mosaic. Therefore this has to be implemented 
1614
         * by the provider.
1615
         * @return
1616
         *         a collection of {@link Time} objects.
1617
         */
1618
        @SuppressWarnings("unchecked")
1619
        public Collection getTimes() {
1620
                return provider.getTimes();
1621
        }
1622
        
1623
        /**
1624
         * Gets all the possible values of time for which the store has data
1625
         * and intersects with an interval.
1626
         * In raster this method has sense in a mosaic. Therefore this has to be implemented 
1627
         * by the provider.
1628
         * @param interval
1629
         *         the interval of time
1630
         * @return
1631
         *         a collection of {@link Time} objects.
1632
         */
1633
        @SuppressWarnings("unchecked")
1634
        public Collection getTimes(Interval interval) {
1635
                return provider.getTimes(interval);
1636
        }
1637

    
1638
        /*
1639
         * (non-Javadoc)
1640
         * @see org.gvsig.raster.impl.store.AbstractRasterDataStore#loadFromState(org.gvsig.tools.persistence.PersistentState)
1641
         */
1642
        @SuppressWarnings("unchecked")
1643
        public void loadFromState(PersistentState state)
1644
                        throws PersistenceException {
1645
                if(parameters == null)
1646
                        this.parameters = (RasterDataParameters)state.get("parameters");
1647
                DataManagerProviderServices dataManager = (DataManagerProviderServices)DALLocator.getDataManager();
1648
                try {
1649
                        this.provider = (DefaultRasterProvider)dataManager.createProvider(this, this.parameters);
1650
                } catch (InitializeException e) {
1651
                        //throw new PersistenceException(e);
1652
                } catch (ProviderNotRegisteredException e) {
1653
                        throw new PersistenceException(e);
1654
                }
1655
                this.bandList = (BandListImpl)state.get("bandList");
1656
                this.metadata = (Metadata)state.get("metadata");
1657
                setRender((Render)state.get("render"));
1658
                int[] rb = getRender().getRenderBands(); //Evitamos que las bandas que fueron cargadas se machaquen ahora
1659
                getRender().setDataStore(this);
1660
                getRender().setRenderBands(rb);
1661
                if(getRender().getLastTransparency() != null)
1662
                        getRender().getLastTransparency().setNoData(getNoDataValue());
1663
                
1664
                RasterFilterList fList = (RasterFilterList)state.get("filterList");
1665
                fList.addEnvParam("IStatistics", getStatistics());
1666
                fList.addEnvParam("MultiRasterDataset", this);
1667
                getRender().setFilterList(fList);
1668
                
1669
                //Gets the filter parameters and loads the filters
1670
                List<PersistencyFilterParam> listFilterUsed = state.getList("paramlist");
1671
                
1672
                ArrayList<Exception> exc = new ArrayList<Exception>();
1673
                for (int i = 0; i < listFilterUsed.size(); i++) {
1674
                        try {
1675
                                PersistencyFilterParam pfp = (PersistencyFilterParam) listFilterUsed.get(i);
1676
                                if(pfp != null && pfp.getFilterClass() != null && pfp.getFilterParam() != null) {
1677
                                        RasterFilterListManager filterManager = fList.getManagerByFilterClass(pfp.getFilterClass());
1678
                                        filterManager.setFilterList(fList);
1679
                                        if(filterManager != null)
1680
                                                filterManager.addFilter(pfp.getFilterClass(), pfp.getFilterParam());
1681
                                }
1682
                        } catch (FilterTypeException e) {
1683
                                exc.add(e);
1684
                        } catch (FilterManagerException e) {
1685
                                exc.add(e);
1686
                        }
1687
                }
1688
                
1689
                if(exc.size() != 0) {
1690
                        throw new PersistenceException("error_adding_filters", exc.get(0));
1691
                }
1692
        }
1693

    
1694
        /*
1695
         * (non-Javadoc)
1696
         * @see org.gvsig.raster.impl.store.AbstractRasterDataStore#saveToState(org.gvsig.tools.persistence.PersistentState)
1697
         */
1698
        public void saveToState(PersistentState state) throws PersistenceException {
1699
                state.set("parameters", provider.getDataParameters());                
1700
                state.set("bandList", bandList);
1701
                state.set("metadata", metadata);
1702
                state.set("render", getRender());
1703
                state.set("filterList", getRender().getFilterList());
1704
                
1705
                RasterFilterList list = getRender().getFilterList();
1706
                ArrayList<PersistencyFilterParam> filters = new ArrayList<PersistencyFilterParam>();
1707
                for (int i = 0; i < list.lenght(); i++) {
1708
                        RasterFilter f = list.get(i);
1709
                        Params uipar = f.getUIParams(f.getName());
1710
                        PersistencyFilterParam param = new PersistencyFilterParam();
1711
                        param.setFilterParam(uipar);
1712
                        param.setFilterClass(f.getClass());
1713
                        param.setFilterName(f.getName());
1714
                        filters.add(param);
1715
                }
1716
                state.set("paramlist", filters);
1717
                
1718
        }        
1719
        
1720
        public static void registerPersistence() {
1721
                PersistenceManager manager = ToolsLocator.getPersistenceManager();
1722
                DynStruct definition = manager.getDefinition(PERSISTENT_NAME);
1723
                if( definition == null ) {
1724
                        definition = manager.addDefinition(
1725
                                        DefaultRasterStore.class,
1726
                                        PERSISTENT_NAME,
1727
                                        PERSISTENT_DESCRIPTION,
1728
                                        null, 
1729
                                        null
1730
                        );
1731
                        
1732
                        definition.addDynFieldObject("parameters").setClassOfValue(RasterDataParameters.class).setMandatory(true);
1733
                        definition.addDynFieldObject("bandList").setClassOfValue(BandList.class).setMandatory(false);
1734
                        definition.addDynFieldObject("metadata").setClassOfValue(Metadata.class).setMandatory(false);
1735
                        definition.addDynFieldObject("render").setClassOfValue(Render.class).setMandatory(true);
1736
                        
1737
                        definition.addDynFieldObject("filterList").setClassOfValue(RasterFilterList.class).setMandatory(false);
1738
                        definition.addDynFieldList("paramlist").setClassOfItems(PersistencyFilterParam.class).setMandatory(false);
1739
                }
1740
        }
1741
}