Statistics
| Revision:

gvsig-raster / org.gvsig.raster.tools / trunk / org.gvsig.raster.tools / org.gvsig.raster.tools.multifile.io / src / main / java / org / gvsig / raster / tools / multifile / io / MultiFileProvider.java @ 1057

History | View | Annotate | Download (29.5 KB)

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

    
24
import java.awt.geom.AffineTransform;
25
import java.awt.geom.Point2D;
26
import java.awt.geom.Rectangle2D;
27
import java.io.File;
28
import java.io.IOException;
29
import java.util.ArrayList;
30

    
31
import org.gvsig.fmap.dal.DALFileLocator;
32
import org.gvsig.fmap.dal.DALLocator;
33
import org.gvsig.fmap.dal.DataStore;
34
import org.gvsig.fmap.dal.DataStoreParameters;
35
import org.gvsig.fmap.dal.coverage.RasterLocator;
36
import org.gvsig.fmap.dal.coverage.dataset.Buffer;
37
import org.gvsig.fmap.dal.coverage.datastruct.BandList;
38
import org.gvsig.fmap.dal.coverage.datastruct.Extent;
39
import org.gvsig.fmap.dal.coverage.exception.BandAccessException;
40
import org.gvsig.fmap.dal.coverage.exception.FileNotOpenException;
41
import org.gvsig.fmap.dal.coverage.exception.FileNotSupportedException;
42
import org.gvsig.fmap.dal.coverage.exception.HistogramException;
43
import org.gvsig.fmap.dal.coverage.exception.InvalidSetViewException;
44
import org.gvsig.fmap.dal.coverage.exception.InvalidSourceException;
45
import org.gvsig.fmap.dal.coverage.exception.NotSupportedExtensionException;
46
import org.gvsig.fmap.dal.coverage.exception.ParsingException;
47
import org.gvsig.fmap.dal.coverage.exception.ProcessInterruptedException;
48
import org.gvsig.fmap.dal.coverage.exception.RasterDriverException;
49
import org.gvsig.fmap.dal.coverage.store.parameter.RasterDataParameters;
50
import org.gvsig.fmap.dal.coverage.store.props.ColorInterpretation;
51
import org.gvsig.fmap.dal.coverage.store.props.ColorTable;
52
import org.gvsig.fmap.dal.coverage.store.props.HistogramComputer;
53
import org.gvsig.fmap.dal.coverage.store.props.Statistics;
54
import org.gvsig.fmap.dal.coverage.util.ProviderServices;
55
import org.gvsig.fmap.dal.exception.CloseException;
56
import org.gvsig.fmap.dal.exception.InitializeException;
57
import org.gvsig.fmap.dal.exception.OpenException;
58
import org.gvsig.fmap.dal.exception.ProviderNotRegisteredException;
59
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
60
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorer;
61
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorerParameters;
62
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemStoreParameters;
63
import org.gvsig.fmap.dal.spi.DataManagerProviderServices;
64
import org.gvsig.fmap.dal.spi.DataStoreProvider;
65
import org.gvsig.fmap.dal.spi.DataStoreProviderServices;
66
import org.gvsig.metadata.MetadataLocator;
67
import org.gvsig.raster.cache.tile.provider.TileListener;
68
import org.gvsig.raster.cache.tile.provider.TileServer;
69
import org.gvsig.raster.impl.buffer.DefaultRasterQuery;
70
import org.gvsig.raster.impl.datastruct.ExtentImpl;
71
import org.gvsig.raster.impl.provider.DefaultRasterProvider;
72
import org.gvsig.raster.impl.provider.RasterProvider;
73
import org.gvsig.raster.impl.provider.tile.FileTileServer;
74
import org.gvsig.raster.impl.store.DefaultStoreFactory;
75
import org.gvsig.raster.impl.store.properties.DataStoreColorInterpretation;
76
import org.gvsig.raster.impl.store.properties.DataStoreTransparency;
77
import org.gvsig.raster.impl.store.properties.MultiProviderHistogramComputer;
78
import org.gvsig.raster.impl.store.properties.MultiProviderStatistics;
79
import org.gvsig.tools.ToolsLocator;
80
import org.gvsig.tools.locator.LocatorException;
81
import org.gvsig.tools.task.Cancellable;
82
import org.gvsig.tools.task.TaskStatus;
83
/**
84
 * A data provider for a multiband image readed from different files
85
 *
86
 * @author Nacho Brodin (nachobrodin@gmail.com)
87
 */
88
public class MultiFileProvider extends DefaultRasterProvider {
89
        public static String                     NAME                     = "Multifile Raster";
90
        public static String                     DESCRIPTION              = "Multifile Raster Support";
91
        public final String                      METADATA_DEFINITION_NAME = NAME;
92
        private Extent                           viewRequest              = null;
93
        private TileServer                       tileServer               = null;
94
        private boolean                          open                     = false;
95

    
96
    private DataStoreTransparency            fileTransparency         = null;
97
    //private static final Logger              logger                   = LoggerFactory.getLogger(MultifileProvider.class);
98
    protected static String[]                formatList               = null;
99
    private ArrayList<RasterProvider>        providerList             = null;
100
    
101
        public static void register() {
102
                DataManagerProviderServices dataman = (DataManagerProviderServices) DALLocator.getDataManager();
103
                registerFormats();
104
                
105
                if (dataman != null && !dataman.getStoreProviders().contains(NAME)) {
106
                        dataman.registerStoreProvider(NAME,
107
                                        MultiFileProvider.class, MultiFileDataParametersImpl.class);
108
                }                
109
                
110
                if(DALFileLocator.getFilesystemServerExplorerManager() != null)
111
                        DALFileLocator.getFilesystemServerExplorerManager().registerProvider(
112
                                        NAME, DESCRIPTION,
113
                                        MultiFileServerExplorer.class);
114
                
115
                if (!dataman.getExplorerProviders().contains(NAME)) {
116
                        dataman.registerExplorerProvider(NAME, MultiFileServerExplorer.class, MultiFileServerExplorerParameters.class);
117
                }
118
                
119
                dataman.registerStoreFactory(NAME, DefaultStoreFactory.class);
120
        }
121
        
122
        private static void registerFormats() {
123
                formatList      = new String[] {
124
                                "mff"};
125
                for (int i = 0; i < formatList.length; i++) 
126
                        RasterLocator.getManager().addFormat(formatList[i], MultiFileProvider.class);
127
        }
128
        
129
        public MultiFileProvider() {
130
        }
131
        
132
        /**
133
         * Opens the dataset.
134
         * @param proj Projection
135
         * @param fName File name
136
         * @throws NotSupportedExtensionException
137
         */
138
        public MultiFileProvider(String params) throws NotSupportedExtensionException, OpenException {
139
                super(params);
140
                if(params instanceof String) {
141
                        MultiFileDataParameters p = new MultiFileDataParametersImpl();
142
                        p.setURI((String)params);
143
                        super.init(p, null, ToolsLocator.getDynObjectManager()
144
                                        .createDynObject(
145
                                                        MetadataLocator.getMetadataManager().getDefinition(
146
                                                                        DataStore.METADATA_DEFINITION_NAME)));
147
                        init(p, null);
148
                }
149
        }
150
        
151
        public MultiFileProvider(MultiFileDataParametersImpl params,
152
                        DataStoreProviderServices storeServices) throws NotSupportedExtensionException, OpenException {
153
                super(params, storeServices, ToolsLocator.getDynObjectManager()
154
                                .createDynObject(
155
                                                MetadataLocator.getMetadataManager().getDefinition(
156
                                                                DataStore.METADATA_DEFINITION_NAME)));
157
                init(params, storeServices);
158
        }
159

    
160
        /**
161
         * Build file references
162
         * @param proj Projection
163
         * @param param Load parameters
164
         * @throws NotSupportedExtensionException
165
         */
166
        public void init(MultiFileDataParameters params,
167
                        DataStoreProviderServices storeServices) throws NotSupportedExtensionException, OpenException {
168
                
169
                openFromMff();
170

    
171
                uri = getParameters().getURI();
172
                providerList = getParameters().getProviders();
173
                setParam(storeServices, params);
174
                
175
                super.init();
176
                
177
                try {
178
                        loadFromRmf(getRmfBlocksManager());
179
                } catch (ParsingException e) {
180
                        //No lee desde rmf
181
                }
182

    
183
                open = true;
184
        }
185
        
186
        /**
187
         * Open from a .mff file. 
188
         * This method loads all providers and adds these to the parameters
189
         * @throws OpenException
190
         */
191
        private void openFromMff() throws OpenException {
192
                if(getParameters().getURI() != null && new File(getParameters().getURI()).exists()) {
193
                        try {
194
                                if(getParameters().getProviders() != null)
195
                                        getParameters().getProviders().clear();
196
                                MultiFileFormat multiFileFormat = new MultiFileFormat();
197
                                multiFileFormat = MultiFileFormatSerializer.read(multiFileFormat, getParameters().getURI());
198
                                for (int i = 0; i < multiFileFormat.getNumberOfFiles(); i++) {
199
                                        try {
200
                                                File file = new File(multiFileFormat.getPathToFile(i));
201
                                                if(file.exists()) {
202
                                                        RasterProvider prov = loadProvider(multiFileFormat.getPathToFile(i), storeServices);
203
                                                        getParameters().addProvider(prov);
204
                                                }
205
                                        } catch (ProviderNotRegisteredException e) {
206
                                                throw new OpenException("A provider can't be loaded", e);
207
                                        } catch (InitializeException e) {
208
                                                throw new OpenException("A provider can't be initialized", e);
209
                                        }
210
                                }
211
                        } catch (IOException e1) {
212
                                throw new OpenException("File .mff can't be read", e1);
213
                        } catch (ParsingException e1) {
214
                                throw new OpenException("File .mff can't be parsed", e1);
215
                        }
216
                } 
217
        }
218
        
219
        /**
220
         * Loads the specific provider
221
         * @param file
222
         * @return
223
         * @throws NotSupportedExtensionException
224
         * @throws FileNotSupportedException 
225
         */
226
        private RasterProvider loadProvider(String file, DataStoreProviderServices storeServices) throws ProviderNotRegisteredException, InitializeException {
227
                DataManagerProviderServices dataManager = (DataManagerProviderServices)DALLocator.getDataManager();
228
                DataStoreProvider prov = null;
229

    
230
                if(file != null) {
231
                        //We have to locate a provider's name which manages the selected file
232
                        //A FilesystemServerExplorer will give a getProviderNames service
233
                        FilesystemServerExplorerParameters paramsExplorer = (FilesystemServerExplorerParameters)dataManager.createServerExplorerParameters(FilesystemServerExplorer.NAME);
234
                        FilesystemServerExplorer serverExplorer = null;
235
                        try {
236
                                paramsExplorer.setRoot(File.separator);
237
                                serverExplorer = (FilesystemServerExplorer)dataManager.openServerExplorer(FilesystemServerExplorer.NAME, paramsExplorer);
238
                        } catch (ValidateDataParametersException e) {
239
                                throw new InitializeException(e);
240
                        }
241
                        File f = new File(file);
242
                        //Gets the list of provider's name to manage the file
243
                        ArrayList<String> provName = serverExplorer.getProviderNameList(f);
244
                        if(provName.size() > 0) {
245
                                for (int i = 0; i < provName.size(); i++) {
246
                                        //Gets the first provider what is not a TileProvider
247
                                        if(provName.get(i).compareTo("Tile Store") != 0) {
248
                                                DataStoreParameters newparams = dataManager.createStoreParameters(provName.get(i));
249
                                                ((FilesystemStoreParameters)newparams).setFile(f); 
250
                                                prov = dataManager.createProvider(storeServices, newparams);
251
                                        }
252
                                }
253
                        }
254
                }
255

    
256
                if(prov != null && prov instanceof RasterProvider) {
257
                        if(((RasterProvider)prov).isRotated())
258
                                throw new InitializeException("Rotation not supported tiling files", new Throwable());
259

    
260
                        return (RasterProvider)prov;
261
                }
262
                
263
                return null;
264
        }
265
        
266
        /**
267
         * Checks if the new file is compatible with the old one
268
         * @param file
269
         * @return
270
         * @throws LocatorException
271
         * @throws NotSupportedExtensionException
272
         * @throws RasterDriverException
273
         * @throws CloseException
274
         */
275
        private boolean checkNewProvider(RasterProvider p) {
276
                Rectangle2D extentOrigin = getExtent().toRectangle2D();
277
                
278
                Extent extentNewFile = p.getExtent();
279

    
280
                // Comprobamos que el extent y tama?o del fichero a?adido sea igual al
281
                // fichero original. Si no es as? no abrimos la capa y mostramos un aviso
282

    
283
                double widthNewFile = (extentNewFile.getMax().getX() - extentNewFile.getMin().getX());
284
                double heightNewFile = (extentNewFile.getMax().getY() - extentNewFile.getMin().getY());
285

    
286
                if ((widthNewFile - extentOrigin.getWidth()) > 1.0 || (widthNewFile - extentOrigin.getWidth()) < -1.0 || (heightNewFile - extentOrigin.getHeight()) > 1.0
287
                                || (heightNewFile - extentOrigin.getHeight()) < -1.0) {
288
                        return false;
289
                }
290

    
291
                if ((extentNewFile.getMax().getX() - extentNewFile.getMin().getX()) != extentOrigin.getWidth()
292
                                || (extentNewFile.getMax().getY() - extentNewFile.getMin().getY()) != extentOrigin.getHeight()) {
293
                        return false;
294
                }
295

    
296
                return true;
297
        }
298
        
299
        public MultiFileDataParameters getParameters() {
300
                try {
301
                        return (MultiFileDataParameters)parameters;
302
                } catch (ClassCastException e) {
303
                        return null;
304
                }
305
        }
306
        
307
        /*
308
         * (non-Javadoc)
309
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#load()
310
         */
311
        public RasterProvider load() {
312
                return this;
313
        }
314
        
315
        /*
316
         * (non-Javadoc)
317
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getBandCount()
318
         */
319
        public int getBandCount() {
320
                providerList = getParameters().getProviders();
321
                int bandCount = 0;
322
                for (int i = 0; i < providerList.size(); i++) {
323
                        bandCount += providerList.get(i).getBandCount();
324
                }
325
                return bandCount;
326
        }
327
        
328
        /*
329
         * (non-Javadoc)
330
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getDataType()
331
         */
332
        public int[] getDataType() {
333
                providerList = getParameters().getProviders();
334
                int[] datatypes = new int[getBandCount()];
335
                int k = 0;
336
                for (int i = 0; i < providerList.size(); i++) {
337
                        int[] dtByProv = providerList.get(i).getDataType();
338
                        for (int j = 0; j < dtByProv.length; j++) {
339
                                datatypes[k] = dtByProv[j];
340
                                k++;
341
                        }
342
                }
343
                return datatypes;
344
        }
345
        
346
        /*
347
         * (non-Javadoc)
348
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getURIByProvider()
349
         */
350
        public String[] getURIByProvider() {
351
                providerList = getParameters().getProviders();
352
                String[] uris = new String[providerList.size()];
353
                for (int i = 0; i < uris.length; i++) {
354
                        uris[i] = providerList.get(i).getURIOfFirstProvider();
355
                }
356
                return uris;
357
        }
358
        
359
        /*
360
         * (non-Javadoc)
361
         * @see org.gvsig.raster.impl.provider.RasterProvider#getBandPositionByProvider(int)
362
         */
363
        public int getBandPositionByProvider(int band) {
364
                return getSubBandByBandNumber(band)[1];
365
        }
366
        
367
        /*
368
         * (non-Javadoc)
369
         * @see org.gvsig.raster.impl.provider.RasterProvider#getURIOfFirstProvider()
370
         */
371
        public String getURIOfFirstProvider() {
372
                providerList = getParameters().getProviders();
373
                return providerList.get(0).getURIOfFirstProvider();
374
        }
375
        
376
        
377
        /*
378
         * (non-Javadoc)
379
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getExtent()
380
         */
381
        public Extent getExtent() {
382
                providerList = getParameters().getProviders();
383
                if(providerList != null && providerList.size() > 0)
384
                        return providerList.get(0).getExtent();
385
                return null;
386
        }
387
        
388
        /*
389
         * (non-Javadoc)
390
         * @see org.gvsig.fmap.dal.coverage.dataset.RasterDataSet#getAffineTransform()
391
         */
392
        public AffineTransform getAffineTransform() {
393
                providerList = getParameters().getProviders();
394
                return providerList.get(0).getAffineTransform();
395
        }
396
        
397
        /*
398
         * (non-Javadoc)
399
         * @see org.gvsig.fmap.dal.coverage.dataset.RasterDataSet#setAffineTransform(java.awt.geom.AffineTransform)
400
         */
401
        public void setAffineTransform(AffineTransform t) {
402
                providerList = getParameters().getProviders();
403
                for (int i = 0; i < providerList.size(); i++) {
404
                        providerList.get(i).setAffineTransform(t);
405
                }
406
        }
407
        
408
        /*
409
         * (non-Javadoc)
410
         * @see org.gvsig.raster.impl.provider.RasterProvider#getInternalProviderCount()
411
         */
412
        public int getInternalProviderCount() {
413
                return providerList.size();
414
        }
415
        
416
        /*
417
         * (non-Javadoc)
418
         * @see org.gvsig.raster.impl.provider.RasterProvider#getInternalProvider(int)
419
         */
420
        public RasterProvider getInternalProvider(int i) {
421
                return providerList.get(i);
422
        }
423
        
424
        /*
425
         * (non-Javadoc)
426
         * @see org.gvsig.raster.impl.provider.RasterProvider#getBandCountByProvider()
427
         */
428
        public int[] getBandCountByProvider() {
429
                providerList = getParameters().getProviders();
430
                int[] bc = new int[providerList.size()];
431
                for (int i = 0; i < bc.length; i++) {
432
                        bc[i] = providerList.get(i).getBandCount();
433
                }
434
                return bc;
435
        }
436
        
437
        /*
438
         * (non-Javadoc)
439
         * @see org.gvsig.raster.impl.provider.RasterProvider#getFileSizeByProvider()
440
         */
441
        public long[] getFileSizeByProvider() {
442
                providerList = getParameters().getProviders();
443
                long[] fs = new long[providerList.size()];
444
                for (int i = 0; i < fs.length; i++) {
445
                        fs[i] = ((DefaultRasterProvider)providerList.get(i)).getFileSize();
446
                }
447
                return fs;
448
        }
449
        
450
        /*
451
         * (non-Javadoc)
452
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#rasterToWorld(java.awt.geom.Point2D)
453
         */
454
        public Point2D rasterToWorld(Point2D pt) {
455
                providerList = getParameters().getProviders();
456
                return providerList.get(0).rasterToWorld(pt);
457
        }
458

    
459
        /*
460
         * (non-Javadoc)
461
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#worldToRaster(java.awt.geom.Point2D)
462
         */
463
        public Point2D worldToRaster(Point2D pt) {
464
                providerList = getParameters().getProviders();
465
                return providerList.get(0).worldToRaster(pt);
466
        }
467
        
468
        /*
469
         * (non-Javadoc)
470
         * @see org.gvsig.raster.impl.provider.RasterProvider#isInside(java.awt.geom.Point2D)
471
         */
472
        public boolean isInside(Point2D p){
473
                providerList = getParameters().getProviders();
474
                return providerList.get(0).isInside(p);
475
        }
476
        
477
        /*
478
         * (non-Javadoc)
479
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getCellSize()
480
         */
481
        public double getCellSize() {
482
                providerList = getParameters().getProviders();
483
                return providerList.get(0).getCellSize();
484
        }
485
        
486
        /*
487
         * (non-Javadoc)
488
         * @see org.gvsig.raster.impl.dataset.RasterProvider#getStatistics()
489
         */
490
        public Statistics getStatistics() {
491
                if(stats == null || (stats instanceof MultiProviderStatistics && 
492
                                ((MultiProviderStatistics)stats).getNumberOfProviders() != providerList.size())) {
493
                        providerList = getParameters().getProviders();
494
                        stats = new MultiProviderStatistics(providerList);
495
                }
496
                
497
                return stats;
498
        }
499
        
500
        /*
501
         * (non-Javadoc)
502
         * @see org.gvsig.fmap.dal.coverage.store.props.Histogramable#getHistogramComputer()
503
         */
504
        public HistogramComputer getHistogramComputer() throws HistogramException, InterruptedException {
505
                if(histogram == null || 
506
                        (histogram instanceof MultiProviderHistogramComputer && 
507
                        ((MultiProviderHistogramComputer)histogram).getNumberOfProviders() != providerList.size())) {
508
                        histogram = new MultiProviderHistogramComputer(this);
509
                }
510
                
511
                return histogram;
512
        }
513
        
514
        /**
515
         * A multiband provider doesn't have a color table because this will have
516
         * more than one band.
517
         */
518
        public ColorTable getColorTable() {
519
                return null;
520
        }
521
        
522
        /*
523
         * (non-Javadoc)
524
         * @see org.gvsig.raster.impl.provider.RasterProvider#isOpen()
525
         */
526
        public boolean isOpen() {
527
                return open;
528
        }
529

    
530
        /*
531
         * (non-Javadoc)
532
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#close()
533
         */
534
        public void close() {
535
        }
536

    
537
        /*
538
         * (non-Javadoc)
539
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#translateFileName(java.lang.String)
540
         */
541
        public String translateFileName(String fileName) {
542
                return fileName;
543
        }
544

    
545
        /**
546
         * Asigna el extent de la vista actual. existe un fichero .rmf debemos hacer una transformaci?n
547
         * de la vista asignada ya que la petici?n viene en coordenadas del fichero .rmf y la vista (v)
548
         * ha de estar en coordenadas del fichero.
549
         */
550
        public void setView(Extent e) {
551
                viewRequest = new ExtentImpl(e);
552
        }
553

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

    
562
        /*
563
         * (non-Javadoc)
564
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getWidth()
565
         */
566
        public double getWidth() {
567
                providerList = getParameters().getProviders();
568
                if(providerList != null && providerList.size() > 0) {
569
                        return providerList.get(0).getWidth();
570
                }
571
                return 0;
572
        }
573

    
574
        /*
575
         * (non-Javadoc)
576
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getHeight()
577
         */
578
        public double getHeight() {
579
                providerList = getParameters().getProviders();
580
                if(providerList != null && providerList.size() > 0) {
581
                        return providerList.get(0).getHeight();
582
                }
583
                return 0;
584

    
585
        }
586

    
587
        /*
588
         *  (non-Javadoc)
589
         * @see org.gvsig.raster.dataset.RasterDataset#readBlock(int, int, double)
590
         */
591
        public Object readBlock(int pos, int blockHeight, double scale)
592
                throws InvalidSetViewException, FileNotOpenException, RasterDriverException, ProcessInterruptedException {
593
                providerList = getParameters().getProviders();
594
                return null;
595
        }
596

    
597
        /**
598
         * Gets a number of provider and the band of this provider 
599
         * @param band
600
         * @return
601
         */
602
        private int[] getSubBandByBandNumber(int band) {
603
                providerList = getParameters().getProviders();
604
                int[] res = new int[2];
605
                int acum = 0;
606
                for (int i = 0; i < providerList.size(); i++) {
607
                        acum += providerList.get(i).getBandCount();
608
                        if(acum > band) {
609
                                res[0] = i;
610
                                int aux = (acum - providerList.get(i).getBandCount());
611
                                res[1] = band - aux;
612
                                return res;
613
                        }
614
                }
615
                return res;
616
        }
617
        
618
        /* 
619
         * (non-Javadoc)
620
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getData(int, int, int)
621
         */
622
        public Object getData(int x, int y, int band)throws InvalidSetViewException, FileNotOpenException, RasterDriverException {
623
                int[] sub = getSubBandByBandNumber(band);
624
                RasterProvider prov = providerList.get(sub[0]);
625
                return prov.getData(x, y, sub[1]);
626
        }
627

    
628
        /*
629
         * (non-Javadoc)
630
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getWindowRaster(double, double, double, double, int, int, org.gvsig.fmap.dal.coverage.datastruct.BandList, org.gvsig.raster.cache.tile.provider.TileListener)
631
         */
632
        public void getWindow(Extent ex, int bufWidth, int bufHeight, 
633
                        BandList bandList, TileListener listener, Cancellable status) throws ProcessInterruptedException, RasterDriverException {
634
        }
635

    
636
        /*
637
         * (non-Javadoc)
638
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getWindowRaster(org.gvsig.fmap.dal.coverage.datastruct.Extent, org.gvsig.fmap.dal.coverage.datastruct.BandList, org.gvsig.fmap.dal.coverage.dataset.Buffer)
639
         */
640
        public Buffer getWindow(Extent extent, BandList bandList, Buffer rasterBuf, TaskStatus status) 
641
                throws ProcessInterruptedException, RasterDriverException {
642
                providerList = getParameters().getProviders();
643
                
644
                DefaultRasterQuery q = (DefaultRasterQuery)RasterLocator.getManager().createQuery();
645
                q.setAreaOfInterest(extent);
646
                q.setBandList(bandList);
647
                q.setBuffer(rasterBuf);
648
                
649
                for (int i = 0; i < providerList.size(); i++) {
650
                        rasterBuf = ((DefaultRasterProvider)providerList.get(i)).getDataSet(q);
651
                }
652
                return rasterBuf;
653
        }
654
        
655
        
656

    
657
        /*
658
         * (non-Javadoc)
659
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getWindowRaster(double, double, double, double, org.gvsig.fmap.dal.coverage.datastruct.BandList, org.gvsig.fmap.dal.coverage.dataset.Buffer, boolean)
660
         */
661
        public Buffer getWindow(double ulx, double uly, double w, double h, 
662
                        BandList bandList, Buffer rasterBuf, boolean adjustToExtent, TaskStatus status) throws ProcessInterruptedException, RasterDriverException {
663
                providerList = getParameters().getProviders();
664
                
665
                DefaultRasterQuery q = (DefaultRasterQuery)RasterLocator.getManager().createQuery();
666
                q.setAreaOfInterest(ulx, uly, w, h);
667
                q.setBandList(bandList);
668
                q.setBuffer(rasterBuf);
669
                q.setAdjustToExtent(adjustToExtent);
670
                
671
                for (int i = 0; i < providerList.size(); i++) {
672
                        rasterBuf = ((DefaultRasterProvider)providerList.get(i)).getDataSet(q);
673
                }
674
                return rasterBuf;
675
        }
676

    
677
        /*
678
         * (non-Javadoc)
679
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getWindowRaster(double, double, double, double, int, int, org.gvsig.fmap.dal.coverage.datastruct.BandList, org.gvsig.fmap.dal.coverage.dataset.Buffer, boolean)
680
         */
681
        public Buffer getWindow(Extent extent, int bufWidth, int bufHeight, 
682
                        BandList bandList, Buffer rasterBuf, boolean adjustToExtent, TaskStatus status) throws ProcessInterruptedException, RasterDriverException {
683
                providerList = getParameters().getProviders();
684
                
685
                DefaultRasterQuery q = (DefaultRasterQuery)RasterLocator.getManager().createQuery();
686
                q.setAreaOfInterest(extent, bufWidth, bufHeight);
687
                q.setBandList(bandList);
688
                q.setBuffer(rasterBuf);
689
                q.setAdjustToExtent(adjustToExtent);
690
                
691
                for (int i = 0; i < providerList.size(); i++) {
692
                        rasterBuf = ((DefaultRasterProvider)providerList.get(i)).getDataSet(q);
693
                }
694
                return rasterBuf;
695
        }
696

    
697
        /*
698
         * (non-Javadoc)
699
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getWindowRaster(int, int, int, int, int, int, org.gvsig.fmap.dal.coverage.datastruct.BandList, org.gvsig.fmap.dal.coverage.dataset.Buffer)
700
         */
701
        public Buffer getWindow(int x, int y, int w, int h, 
702
                        BandList bandList, Buffer rasterBuf, TaskStatus status) throws ProcessInterruptedException, RasterDriverException {
703
                providerList = getParameters().getProviders();
704
                DefaultRasterQuery q = (DefaultRasterQuery)RasterLocator.getManager().createQuery();
705
                q.setAreaOfInterest(x, y, w, h);
706
                q.setBandList(bandList);
707
                q.setBuffer(rasterBuf);
708
                for (int i = 0; i < providerList.size(); i++) {
709
                        rasterBuf = ((DefaultRasterProvider)providerList.get(i)).getDataSet(q);
710
                }
711
                return rasterBuf;
712
        }
713

    
714
        /*
715
         * (non-Javadoc)
716
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getBlockSize()
717
         */
718
        public int getBlockSize() {
719
                return 0;
720
        }
721

    
722
        /*
723
         * (non-Javadoc)
724
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getColorInterpretation()
725
         */
726
        public ColorInterpretation getColorInterpretation() {
727
                if(super.getColorInterpretation() == null) {
728
                        String[] cis = new String[getBandCount()];
729
                        for (int i = 0; i < cis.length; i++) {
730
                                if(i == 0)
731
                                        cis[i] = ColorInterpretation.GRAY_BAND;
732
                                else
733
                                        cis[i] = ColorInterpretation.UNDEF_BAND;
734
                        }
735
                        setColorInterpretation(new DataStoreColorInterpretation(cis));
736
                }
737
                return super.getColorInterpretation();
738
        }
739

    
740
        /*
741
         * (non-Javadoc)
742
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getTransparency()
743
         */
744
        public DataStoreTransparency getTransparency() {
745
                if(fileTransparency == null)
746
                        fileTransparency = new DataStoreTransparency();
747
                return fileTransparency;
748
        }
749

    
750
        /**
751
         * Informa de si el driver ha supersampleado en el ?ltimo dibujado. Es el driver el que colocar?
752
         * el valor de esta variable cada vez que dibuja.
753
         * @return true si se ha supersampleado y false si no se ha hecho.
754
         */
755
        public boolean isSupersampling() {
756
                return false;
757
        }
758

    
759
        /*
760
         * (non-Javadoc)
761
         * @see org.gvsig.raster.impl.provider.RasterProvider#getOverviewCount(int)
762
         */
763
        public int getOverviewCount(int band) throws BandAccessException, RasterDriverException {
764
                if(band >= getBandCount())
765
                        throw new BandAccessException("Wrong band");
766
                return 0;
767
        }
768

    
769
        /*
770
         * (non-Javadoc)
771
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getOverviewWidth(int, int)
772
         */
773
        public int getOverviewWidth(int band, int overview) throws BandAccessException, RasterDriverException {
774
                if (band >= getBandCount())
775
                        throw new BandAccessException("Wrong band");
776
                return 0;
777
        }
778

    
779
        /*
780
         * (non-Javadoc)
781
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getOverviewHeight(int, int)
782
         */
783
        public int getOverviewHeight(int band, int overview) throws BandAccessException, RasterDriverException {
784
                if (band >= getBandCount())
785
                        throw new BandAccessException("Wrong band");
786
                return 0;
787
        }
788
        
789
        /*
790
         * (non-Javadoc)
791
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#isMultiFile()
792
         */
793
        public boolean isMultiFile() {
794
                return true;
795
        }
796

    
797
        /*
798
         * (non-Javadoc)
799
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#isOverviewsSupported()
800
         */
801
        public boolean isOverviewsSupported() {
802
                return true;
803
        }
804

    
805
        /*
806
         * (non-Javadoc)
807
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#isReproyectable()
808
         */
809
        public boolean isReproyectable() {
810
                return true;
811
        }
812

    
813
        /*
814
         * (non-Javadoc)
815
         * @see org.gvsig.fmap.dal.spi.DataStoreProvider#getName()
816
         */
817
        public String getName() {
818
                return NAME;
819
        }
820
        
821
        /*
822
         * (non-Javadoc)
823
         * @see org.gvsig.raster.impl.provider.RasterProvider#setStatus(org.gvsig.raster.impl.provider.RasterProvider)
824
         */
825
        public void setStatus(RasterProvider provider) {
826
                if(provider instanceof MultiFileProvider) {
827
                        //Not implemented yet
828
                }
829
        }
830
        
831
        /*
832
         * (non-Javadoc)
833
         * @see org.gvsig.raster.impl.provider.RasterProvider#isTimeSupported()
834
         */
835
        public boolean isTimeSupported() {
836
                return true;
837
        }
838
        
839
        /*
840
         * (non-Javadoc)
841
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getURIByBand(int)
842
         */
843
        public String getURIByBand(int band) {
844
                int[] sub = getSubBandByBandNumber(band);
845
                RasterProvider prov = providerList.get(sub[0]);
846
                return prov.getURIOfFirstProvider();
847
        }
848
        
849
        /*
850
         * (non-Javadoc)
851
         * @see org.gvsig.raster.impl.provider.RasterProvider#addFile(java.lang.String)
852
         */
853
        public void addFile(String file) throws InvalidSourceException {
854
                /*try {
855
                        RasterProvider provider = loadProvider(file, storeServices);
856
                        if(checkNewProvider(provider)) {
857
                                getParameters().addProvider(provider);
858
                        } else {
859
                                provider.close();
860
                        }
861
                } catch (ProviderNotRegisteredException e) {
862
                        throw new InvalidSourceException("Provider not registered", e);
863
                } catch (InitializeException e) {
864
                        throw new InvalidSourceException("Initialize exception", e);
865
                }*/
866
                ProviderServices provServ = RasterLocator.getManager().getProviderServices();
867
                DataManagerProviderServices dataManager = (DataManagerProviderServices)DALLocator.getDataManager();
868
                
869
                ArrayList<RasterDataParameters> storeParametersList = provServ.createParametersList(file);
870
                for (int j = 0; j < storeParametersList.size(); j++) {
871
                        RasterProvider newFileProv;
872
                        try {
873
                                newFileProv = (RasterProvider)dataManager.createProvider(storeServices, storeParametersList.get(j));
874
                                if(!newFileProv.isTiled() && checkNewProvider(newFileProv)) {
875
                                        getParameters().addProvider(newFileProv);
876
                                }
877
                        } catch (InitializeException e) {
878
                                throw new InvalidSourceException("", e);
879
                        } catch (ProviderNotRegisteredException e) {
880
                                throw new InvalidSourceException("", e);
881
                        }
882
                }
883
        }
884
        
885
        /*
886
         * (non-Javadoc)
887
         * @see org.gvsig.raster.impl.provider.RasterProvider#removeFile(java.lang.String)
888
         */
889
        public void removeFile(String file) {
890
                getParameters().removeProvider(file);
891
        }
892
        
893
        /*
894
         * (non-Javadoc)
895
         * @see org.gvsig.raster.impl.provider.RasterProvider#getTileServer()
896
         */
897
        public TileServer getTileServer() {
898
                if(tileServer == null)
899
                        tileServer = new FileTileServer(this);
900
                return tileServer;
901
        }
902
}