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

History | View | Annotate | Download (31.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.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.BandNotFoundInListException;
41
import org.gvsig.fmap.dal.coverage.exception.FileNotOpenException;
42
import org.gvsig.fmap.dal.coverage.exception.FileNotSupportedException;
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.BandListImpl;
71
import org.gvsig.raster.impl.datastruct.DatasetBandImpl;
72
import org.gvsig.raster.impl.datastruct.ExtentImpl;
73
import org.gvsig.raster.impl.provider.DefaultRasterProvider;
74
import org.gvsig.raster.impl.provider.RasterProvider;
75
import org.gvsig.raster.impl.provider.tile.FileTileServer;
76
import org.gvsig.raster.impl.store.DefaultStoreFactory;
77
import org.gvsig.raster.impl.store.properties.DataStoreColorInterpretation;
78
import org.gvsig.raster.impl.store.properties.DataStoreTransparency;
79
import org.gvsig.raster.impl.store.properties.MultiProviderHistogramComputer;
80
import org.gvsig.raster.impl.store.properties.MultiProviderStatistics;
81
import org.gvsig.tools.ToolsLocator;
82
import org.gvsig.tools.locator.LocatorException;
83
import org.gvsig.tools.task.TaskStatus;
84
/**
85
 * A data provider for a multiband image readed from different files
86
 *
87
 * @author Nacho Brodin (nachobrodin@gmail.com)
88
 */
89
public class MultiFileProvider extends DefaultRasterProvider {
90
        public static String                     NAME                     = "Multifile Raster";
91
        public static String                     DESCRIPTION              = "Multifile Raster Support";
92
        public final String                      METADATA_DEFINITION_NAME = NAME;
93
        private Extent                           viewRequest              = null;
94
        private TileServer                       tileServer               = null;
95
        private boolean                          open                     = false;
96

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

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

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

    
184
                open = true;
185
        }
186
        
187
        /**
188
         * Open from a .mff file. 
189
         * This method loads all providers and adds these to the parameters
190
         * @throws OpenException
191
         */
192
        private void openFromMff() throws OpenException {
193
                if(getParameters().getURI() != null && new File(getParameters().getURI()).exists()) {
194
                        boolean loadedProviders = true;
195
                        if(getParameters().getProviders() != null) {
196
                                //solo se considera que est?n todos los providers cargados si existen y est?n open,
197
                                //sino se leeran de disco
198
                                for (int i = 0; i < getParameters().getProviders().size(); i++) {
199
                                        if(!getParameters().getProviders().get(i).isOpen()) 
200
                                                loadedProviders = false;
201
                                }
202
                        } else
203
                                loadedProviders = false;
204
                        
205
                        if(loadedProviders)
206
                                return;
207
                        
208
                        try {
209
                                if(getParameters().getProviders() != null)
210
                                        getParameters().getProviders().clear();
211
                                MultiFileFormat multiFileFormat = new MultiFileFormat();
212
                                multiFileFormat = MultiFileFormatSerializer.read(multiFileFormat, getParameters().getURI());
213
                                for (int i = 0; i < multiFileFormat.getNumberOfFiles(); i++) {
214
                                        try {
215
                                                File file = new File(multiFileFormat.getPathToFile(i));
216
                                                if(file.exists()) {
217
                                                        RasterProvider prov = loadProvider(multiFileFormat.getPathToFile(i), storeServices);
218
                                                        getParameters().addProvider(prov);
219
                                                }
220
                                        } catch (ProviderNotRegisteredException e) {
221
                                                throw new OpenException("A provider can't be loaded", e);
222
                                        } catch (InitializeException e) {
223
                                                throw new OpenException("A provider can't be initialized", e);
224
                                        }
225
                                }
226
                        } catch (IOException e1) {
227
                                throw new OpenException("File .mff can't be read", e1);
228
                        } catch (ParsingException e1) {
229
                                throw new OpenException("File .mff can't be parsed", e1);
230
                        }
231
                } 
232
        }
233
        
234
        /**
235
         * Loads the specific provider
236
         * @param file
237
         * @return
238
         * @throws NotSupportedExtensionException
239
         * @throws FileNotSupportedException 
240
         */
241
        private RasterProvider loadProvider(String file, DataStoreProviderServices storeServices) throws ProviderNotRegisteredException, InitializeException {
242
                DataManagerProviderServices dataManager = (DataManagerProviderServices)DALLocator.getDataManager();
243
                DataStoreProvider prov = null;
244

    
245
                if(file != null) {
246
                        //We have to locate a provider's name which manages the selected file
247
                        //A FilesystemServerExplorer will give a getProviderNames service
248
                        FilesystemServerExplorerParameters paramsExplorer = (FilesystemServerExplorerParameters)dataManager.createServerExplorerParameters(FilesystemServerExplorer.NAME);
249
                        FilesystemServerExplorer serverExplorer = null;
250
                        try {
251
                                paramsExplorer.setRoot(File.separator);
252
                                serverExplorer = (FilesystemServerExplorer)dataManager.openServerExplorer(FilesystemServerExplorer.NAME, paramsExplorer);
253
                        } catch (ValidateDataParametersException e) {
254
                                throw new InitializeException(e);
255
                        }
256
                        File f = new File(file);
257
                        //Gets the list of provider's name to manage the file
258
                        ArrayList<String> provName = serverExplorer.getProviderNameList(f);
259
                        if(provName.size() > 0) {
260
                                for (int i = 0; i < provName.size(); i++) {
261
                                        //Gets the first provider what is not a TileProvider
262
                                        if(provName.get(i).compareTo("Tile Store") != 0) {
263
                                                DataStoreParameters newparams = dataManager.createStoreParameters(provName.get(i));
264
                                                ((FilesystemStoreParameters)newparams).setFile(f); 
265
                                                prov = dataManager.createProvider(storeServices, newparams);
266
                                        }
267
                                }
268
                        }
269
                }
270

    
271
                if(prov != null && prov instanceof RasterProvider) {
272
                        if(((RasterProvider)prov).isRotated())
273
                                throw new InitializeException("Rotation not supported tiling files", new Throwable());
274

    
275
                        return (RasterProvider)prov;
276
                }
277
                
278
                return null;
279
        }
280
        
281
        /**
282
         * Checks if the new file is compatible with the old one
283
         * @param file
284
         * @return
285
         * @throws LocatorException
286
         * @throws NotSupportedExtensionException
287
         * @throws RasterDriverException
288
         * @throws CloseException
289
         */
290
        private boolean checkNewProvider(RasterProvider p) {
291
                Rectangle2D extentOrigin = getExtent().toRectangle2D();
292
                
293
                Extent extentNewFile = p.getExtent();
294

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

    
298
                double widthNewFile = (extentNewFile.getMax().getX() - extentNewFile.getMin().getX());
299
                double heightNewFile = (extentNewFile.getMax().getY() - extentNewFile.getMin().getY());
300

    
301
                if ((widthNewFile - extentOrigin.getWidth()) > 1.0 || (widthNewFile - extentOrigin.getWidth()) < -1.0 || (heightNewFile - extentOrigin.getHeight()) > 1.0
302
                                || (heightNewFile - extentOrigin.getHeight()) < -1.0) {
303
                        return false;
304
                }
305

    
306
                if ((extentNewFile.getMax().getX() - extentNewFile.getMin().getX()) != extentOrigin.getWidth()
307
                                || (extentNewFile.getMax().getY() - extentNewFile.getMin().getY()) != extentOrigin.getHeight()) {
308
                        return false;
309
                }
310

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

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

    
545
        /*
546
         * (non-Javadoc)
547
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#close()
548
         */
549
        public void close() {
550
        }
551

    
552
        /*
553
         * (non-Javadoc)
554
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#translateFileName(java.lang.String)
555
         */
556
        public String translateFileName(String fileName) {
557
                return fileName;
558
        }
559

    
560
        /**
561
         * Asigna el extent de la vista actual. existe un fichero .rmf debemos hacer una transformaci?n
562
         * de la vista asignada ya que la petici?n viene en coordenadas del fichero .rmf y la vista (v)
563
         * ha de estar en coordenadas del fichero.
564
         */
565
        public void setView(Extent e) {
566
                viewRequest = new ExtentImpl(e);
567
        }
568

    
569
        /*
570
         * (non-Javadoc)
571
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getView()
572
         */
573
        public Extent getView() {
574
                return viewRequest;
575
        }
576

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

    
589
        /*
590
         * (non-Javadoc)
591
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getHeight()
592
         */
593
        public double getHeight() {
594
                providerList = getParameters().getProviders();
595
                if(providerList != null && providerList.size() > 0) {
596
                        return providerList.get(0).getHeight();
597
                }
598
                return 0;
599

    
600
        }
601

    
602
        /*
603
         *  (non-Javadoc)
604
         * @see org.gvsig.raster.dataset.RasterDataset#readBlock(int, int, double)
605
         */
606
        public Object readBlock(int pos, int blockHeight, double scale)
607
                throws InvalidSetViewException, FileNotOpenException, RasterDriverException, ProcessInterruptedException {
608
                providerList = getParameters().getProviders();
609
                return null;
610
        }
611

    
612
        /**
613
         * Gets a number of provider and the band of this provider 
614
         * @param band
615
         * @return
616
         */
617
        private int[] getSubBandByBandNumber(int band) {
618
                providerList = getParameters().getProviders();
619
                int[] res = new int[2];
620
                int acum = 0;
621
                for (int i = 0; i < providerList.size(); i++) {
622
                        acum += providerList.get(i).getBandCount();
623
                        if(acum > band) {
624
                                res[0] = i;
625
                                int aux = (acum - providerList.get(i).getBandCount());
626
                                res[1] = band - aux;
627
                                return res;
628
                        }
629
                }
630
                return res;
631
        }
632
        
633
        /* 
634
         * (non-Javadoc)
635
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getData(int, int, int)
636
         */
637
        public Object getData(int x, int y, int band)throws InvalidSetViewException, FileNotOpenException, RasterDriverException {
638
                int[] sub = getSubBandByBandNumber(band);
639
                RasterProvider prov = providerList.get(sub[0]);
640
                return prov.getData(x, y, sub[1]);
641
        }
642

    
643
        /*
644
         * (non-Javadoc)
645
         * @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)
646
         */
647
        public void getWindow(Extent ex, int bufWidth, int bufHeight, 
648
                        BandList bandList, TileListener listener, TaskStatus status) throws ProcessInterruptedException, RasterDriverException {
649
        }
650

    
651
        /*
652
         * (non-Javadoc)
653
         * @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)
654
         */
655
        public Buffer getWindow(Extent extent, BandList bandList, Buffer rasterBuf, TaskStatus status) 
656
                throws ProcessInterruptedException, RasterDriverException {
657
                providerList = getParameters().getProviders();
658
                
659
                DefaultRasterQuery q = (DefaultRasterQuery)RasterLocator.getManager().createQuery();
660
                q.setAreaOfInterest(extent);
661
                q.setBandList(bandList);
662
                q.setBuffer(rasterBuf);
663
                
664
                for (int i = 0; i < providerList.size(); i++) {
665
                        rasterBuf = ((DefaultRasterProvider)providerList.get(i)).getDataSet(q);
666
                }
667
                return rasterBuf;
668
        }
669
        
670
        
671

    
672
        /*
673
         * (non-Javadoc)
674
         * @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)
675
         */
676
        public Buffer getWindow(double ulx, double uly, double w, double h, 
677
                        BandList bandList, Buffer rasterBuf, boolean adjustToExtent, TaskStatus status) throws ProcessInterruptedException, RasterDriverException {
678
                providerList = getParameters().getProviders();
679
                
680
                DefaultRasterQuery q = (DefaultRasterQuery)RasterLocator.getManager().createQuery();
681
                q.setAreaOfInterest(ulx, uly, w, h);
682
                q.setBandList(bandList);
683
                q.setBuffer(rasterBuf);
684
                q.setAdjustToExtent(adjustToExtent);
685
                
686
                for (int i = 0; i < providerList.size(); i++) {
687
                        rasterBuf = ((DefaultRasterProvider)providerList.get(i)).getDataSet(q);
688
                }
689
                return rasterBuf;
690
        }
691

    
692
        /*
693
         * (non-Javadoc)
694
         * @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)
695
         */
696
        public Buffer getWindow(Extent extent, int bufWidth, int bufHeight, 
697
                        BandList bandList, Buffer rasterBuf, boolean adjustToExtent, TaskStatus status) throws ProcessInterruptedException, RasterDriverException {
698
                providerList = getParameters().getProviders();
699
                
700
                DefaultRasterQuery q = (DefaultRasterQuery)RasterLocator.getManager().createQuery();
701
                q.setAreaOfInterest(extent, bufWidth, bufHeight);
702
                q.setBuffer(rasterBuf);
703
                q.setAdjustToExtent(adjustToExtent);
704
                
705
                for (int i = 0; i < providerList.size(); i++) {
706
                        BandList bandListByFile = createBandListByProvider(bandList, providerList.get(i));
707
                        if(bandListByFile != null) {
708
                                q.setBandList(bandListByFile);
709
                                rasterBuf = ((DefaultRasterProvider)providerList.get(i)).getDataSet(q);
710
                        }
711
                }
712
                return rasterBuf;
713
        }
714
        
715
        /**
716
         * Creates a <code>BandList</code> for each provider of this <code>MultiFileProvider</code>.
717
         * When a request is made, the <code>BandList</code> is global for all files. A specific 
718
         * <code>BandList</code> has to be built for each provider. 
719
         * @param globalBandList
720
         * @param provider
721
         * @return
722
         */
723
        private BandList createBandListByProvider(BandList globalBandList, RasterProvider provider) {
724
                BandList bandListByFile = new BandListImpl();
725
                for (int i = 0; i < provider.getBandCount(); i++) {
726
                        try {
727
                                bandListByFile.addBand(new DatasetBandImpl(provider.getURI(), i, provider.getDataType()[0], provider.getBandCount()));
728
                        } catch (BandNotFoundInListException e1) {
729
                        }
730
                }
731
                
732
                boolean areThereBandsToDraw = false;
733
                for (int i = 0; i < provider.getBandCount(); i++) {
734
                        int[] bandsToDrawByProviderBand = globalBandList.getBufferBandToDraw(provider.getURI(), i);
735
                        if(bandsToDrawByProviderBand != null) {
736
                                areThereBandsToDraw = true;
737
                                for (int j = 0; j < bandsToDrawByProviderBand.length; j++) {
738
                                        bandListByFile.getBand(i).addPositionToDrawInBuffer(bandsToDrawByProviderBand[j]);                                
739
                                }
740
                        }
741
                }
742
                
743
                if(areThereBandsToDraw)
744
                        return bandListByFile;
745
                return null;
746
        }
747

    
748
        /*
749
         * (non-Javadoc)
750
         * @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)
751
         */
752
        public Buffer getWindow(int x, int y, int w, int h, 
753
                        BandList bandList, Buffer rasterBuf, TaskStatus status) throws ProcessInterruptedException, RasterDriverException {
754
                providerList = getParameters().getProviders();
755
                DefaultRasterQuery q = (DefaultRasterQuery)RasterLocator.getManager().createQuery();
756
                q.setAreaOfInterest(x, y, w, h);
757
                q.setBandList(bandList);
758
                q.setBuffer(rasterBuf);
759
                for (int i = 0; i < providerList.size(); i++) {
760
                        rasterBuf = ((DefaultRasterProvider)providerList.get(i)).getDataSet(q);
761
                }
762
                return rasterBuf;
763
        }
764

    
765
        /*
766
         * (non-Javadoc)
767
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getBlockSize()
768
         */
769
        public int getBlockSize() {
770
                return 0;
771
        }
772

    
773
        /*
774
         * (non-Javadoc)
775
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getColorInterpretation()
776
         */
777
        public ColorInterpretation getColorInterpretation() {
778
                if(super.getColorInterpretation() == null) {
779
                        String[] cis = new String[getBandCount()];
780
                        for (int i = 0; i < cis.length; i++) {
781
                                if(i == 0)
782
                                        cis[i] = ColorInterpretation.GRAY_BAND;
783
                                else
784
                                        cis[i] = ColorInterpretation.UNDEF_BAND;
785
                        }
786
                        setColorInterpretation(new DataStoreColorInterpretation(cis));
787
                }
788
                return super.getColorInterpretation();
789
        }
790

    
791
        /*
792
         * (non-Javadoc)
793
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getTransparency()
794
         */
795
        public DataStoreTransparency getTransparency() {
796
                if(fileTransparency == null)
797
                        fileTransparency = new DataStoreTransparency();
798
                return fileTransparency;
799
        }
800

    
801
        /**
802
         * Informa de si el driver ha supersampleado en el ?ltimo dibujado. Es el driver el que colocar?
803
         * el valor de esta variable cada vez que dibuja.
804
         * @return true si se ha supersampleado y false si no se ha hecho.
805
         */
806
        public boolean isSupersampling() {
807
                return false;
808
        }
809

    
810
        /*
811
         * (non-Javadoc)
812
         * @see org.gvsig.raster.impl.provider.RasterProvider#getOverviewCount(int)
813
         */
814
        public int getOverviewCount(int band) throws BandAccessException, RasterDriverException {
815
                if(band >= getBandCount())
816
                        throw new BandAccessException("Wrong band");
817
                return 0;
818
        }
819

    
820
        /*
821
         * (non-Javadoc)
822
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getOverviewWidth(int, int)
823
         */
824
        public int getOverviewWidth(int band, int overview) throws BandAccessException, RasterDriverException {
825
                if (band >= getBandCount())
826
                        throw new BandAccessException("Wrong band");
827
                return 0;
828
        }
829

    
830
        /*
831
         * (non-Javadoc)
832
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getOverviewHeight(int, int)
833
         */
834
        public int getOverviewHeight(int band, int overview) throws BandAccessException, RasterDriverException {
835
                if (band >= getBandCount())
836
                        throw new BandAccessException("Wrong band");
837
                return 0;
838
        }
839
        
840
        /*
841
         * (non-Javadoc)
842
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#isMultiFile()
843
         */
844
        public boolean isMultiFile() {
845
                return true;
846
        }
847

    
848
        /*
849
         * (non-Javadoc)
850
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#isOverviewsSupported()
851
         */
852
        public boolean isOverviewsSupported() {
853
                return true;
854
        }
855

    
856
        /*
857
         * (non-Javadoc)
858
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#isReproyectable()
859
         */
860
        public boolean isReproyectable() {
861
                return true;
862
        }
863

    
864
        /*
865
         * (non-Javadoc)
866
         * @see org.gvsig.fmap.dal.spi.DataStoreProvider#getName()
867
         */
868
        public String getName() {
869
                return NAME;
870
        }
871
        
872
        /*
873
         * (non-Javadoc)
874
         * @see org.gvsig.raster.impl.provider.RasterProvider#setStatus(org.gvsig.raster.impl.provider.RasterProvider)
875
         */
876
        public void setStatus(RasterProvider provider) {
877
                if(provider instanceof MultiFileProvider) {
878
                        //Not implemented yet
879
                }
880
        }
881
        
882
        /*
883
         * (non-Javadoc)
884
         * @see org.gvsig.raster.impl.provider.RasterProvider#isTimeSupported()
885
         */
886
        public boolean isTimeSupported() {
887
                return true;
888
        }
889
        
890
        /*
891
         * (non-Javadoc)
892
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getURIByBand(int)
893
         */
894
        public String getURIByBand(int band) {
895
                int[] sub = getSubBandByBandNumber(band);
896
                RasterProvider prov = providerList.get(sub[0]);
897
                return prov.getURIOfFirstProvider();
898
        }
899
        
900
        /*
901
         * (non-Javadoc)
902
         * @see org.gvsig.raster.impl.provider.RasterProvider#addFile(java.lang.String)
903
         */
904
        public void addFile(String file) throws InvalidSourceException {
905
                /*try {
906
                        RasterProvider provider = loadProvider(file, storeServices);
907
                        if(checkNewProvider(provider)) {
908
                                getParameters().addProvider(provider);
909
                        } else {
910
                                provider.close();
911
                        }
912
                } catch (ProviderNotRegisteredException e) {
913
                        throw new InvalidSourceException("Provider not registered", e);
914
                } catch (InitializeException e) {
915
                        throw new InvalidSourceException("Initialize exception", e);
916
                }*/
917
                ProviderServices provServ = RasterLocator.getManager().getProviderServices();
918
                DataManagerProviderServices dataManager = (DataManagerProviderServices)DALLocator.getDataManager();
919
                
920
                ArrayList<RasterDataParameters> storeParametersList = provServ.createParametersList(file);
921
                for (int j = 0; j < storeParametersList.size(); j++) {
922
                        RasterProvider newFileProv;
923
                        try {
924
                                newFileProv = (RasterProvider)dataManager.createProvider(storeServices, storeParametersList.get(j));
925
                                if(!newFileProv.isTiled() && checkNewProvider(newFileProv)) {
926
                                        getParameters().addProvider(newFileProv);
927
                                }
928
                        } catch (InitializeException e) {
929
                                throw new InvalidSourceException("", e);
930
                        } catch (ProviderNotRegisteredException e) {
931
                                throw new InvalidSourceException("", e);
932
                        }
933
                }
934
        }
935
        
936
        /*
937
         * (non-Javadoc)
938
         * @see org.gvsig.raster.impl.provider.RasterProvider#removeFile(java.lang.String)
939
         */
940
        public void removeFile(String file) {
941
                getParameters().removeProvider(file);
942
        }
943
        
944
        /*
945
         * (non-Javadoc)
946
         * @see org.gvsig.raster.impl.provider.RasterProvider#getTileServer()
947
         */
948
        public TileServer getTileServer() {
949
                if(tileServer == null)
950
                        tileServer = new FileTileServer(this);
951
                return tileServer;
952
        }
953
}