Statistics
| Revision:

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

History | View | Annotate | Download (31.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.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.List;
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
import org.slf4j.Logger;
85
import org.slf4j.LoggerFactory;
86
/**
87
 * A data provider for a multiband image readed from different files
88
 *
89
 * @author Nacho Brodin (nachobrodin@gmail.com)
90
 */
91
public class MultiFileProvider extends DefaultRasterProvider {
92
        public static String                     NAME                     = "Multifile Raster";
93
        public static String                     DESCRIPTION              = "Multifile Raster Support";
94
        public final String                      METADATA_DEFINITION_NAME = NAME;
95
        private Extent                           viewRequest              = null;
96
        private TileServer                       tileServer               = null;
97
        private boolean                          open                     = false;
98

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

    
165
        /**
166
         * Build file references
167
         * @param proj Projection
168
         * @param param Load parameters
169
         * @throws NotSupportedExtensionException
170
         */
171
        public void init(MultiFileDataParameters params,
172
                        DataStoreProviderServices storeServices) throws NotSupportedExtensionException, OpenException {
173
                
174
                openFromMff();
175
                
176
                uri = getParameters().getURI();
177
                providerList = getParameters().getProviders();
178
                setParam(storeServices, params);
179
                
180
                try {
181
                        setFirstProviderToNotTiled();
182
                } catch (InvalidSourceException e1) {
183
                        throw new OpenException(e1.getMessage(), e1);
184
                }
185
                
186
                super.init();
187
                
188
                try {
189
                        loadFromRmf(getRmfBlocksManager());
190
                } catch (ParsingException e) {
191
                        logger.debug("Problems reading from RMF", e);
192
                }
193

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

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

    
282
                if(prov != null && prov instanceof RasterProvider) {
283
                        if(((RasterProvider)prov).isRotated())
284
                                throw new InitializeException("Rotation not supported tiling files", new Throwable());
285

    
286
                        return (RasterProvider)prov;
287
                }
288
                
289
                return null;
290
        }
291
        
292
        /**
293
         * Checks if the new file is compatible with the old one
294
         * @param file
295
         * @return
296
         * @throws LocatorException
297
         * @throws NotSupportedExtensionException
298
         * @throws RasterDriverException
299
         * @throws CloseException
300
         */
301
        private boolean checkNewProvider(RasterProvider p) {
302
                Rectangle2D extentOrigin = getExtent().toRectangle2D();
303
                
304
                Extent extentNewFile = p.getExtent();
305

    
306
                // Comprobamos que el extent y tama�o del fichero a�adido sea igual al
307
                // fichero original. Si no es as� no abrimos la capa y mostramos un aviso
308

    
309
                double widthNewFile = (extentNewFile.getMax().getX() - extentNewFile.getMin().getX());
310
                double heightNewFile = (extentNewFile.getMax().getY() - extentNewFile.getMin().getY());
311

    
312
                if ((widthNewFile - extentOrigin.getWidth()) > 1.0 || (widthNewFile - extentOrigin.getWidth()) < -1.0 || (heightNewFile - extentOrigin.getHeight()) > 1.0
313
                                || (heightNewFile - extentOrigin.getHeight()) < -1.0) {
314
                        return false;
315
                }
316

    
317
                if ((extentNewFile.getMax().getX() - extentNewFile.getMin().getX()) != extentOrigin.getWidth()
318
                                || (extentNewFile.getMax().getY() - extentNewFile.getMin().getY()) != extentOrigin.getHeight()) {
319
                        return false;
320
                }
321

    
322
                return true;
323
        }
324
        
325
        public MultiFileDataParameters getParameters() {
326
                try {
327
                        return (MultiFileDataParameters)parameters;
328
                } catch (ClassCastException e) {
329
                        return null;
330
                }
331
        }
332
        
333
        public RasterProvider load() {
334
                return this;
335
        }
336
        
337
        public int getBandCount() {
338
                providerList = getParameters().getProviders();
339
                int bandCount = 0;
340
                for (int i = 0; i < providerList.size(); i++) {
341
                        bandCount += providerList.get(i).getBandCount();
342
                }
343
                return bandCount;
344
        }
345
        
346
        public int[] getDataType() {
347
                providerList = getParameters().getProviders();
348
                int[] datatypes = new int[getBandCount()];
349
                int k = 0;
350
                for (int i = 0; i < providerList.size(); i++) {
351
                        int[] dtByProv = providerList.get(i).getDataType();
352
                        for (int j = 0; j < dtByProv.length; j++) {
353
                                datatypes[k] = dtByProv[j];
354
                                k++;
355
                        }
356
                }
357
                return datatypes;
358
        }
359
        
360
        public String[] getURIByProvider() {
361
                providerList = getParameters().getProviders();
362
                String[] uris = new String[providerList.size()];
363
                for (int i = 0; i < uris.length; i++) {
364
                        uris[i] = providerList.get(i).getURIOfFirstProvider();
365
                }
366
                return uris;
367
        }
368
        
369
        public int getBandPositionByProvider(int band) {
370
                return getSubBandByBandNumber(band)[1];
371
        }
372
        
373
        public String getURIOfFirstProvider() {
374
                providerList = getParameters().getProviders();
375
                return providerList.get(0).getURIOfFirstProvider();
376
        }
377
        
378
        
379
        public Extent getExtent() {
380
                providerList = getParameters().getProviders();
381
                if(providerList != null && providerList.size() > 0)
382
                        return providerList.get(0).getExtent();
383
                return null;
384
        }
385
        
386
        public AffineTransform getAffineTransform() {
387
                providerList = getParameters().getProviders();
388
                return providerList.get(0).getAffineTransform();
389
        }
390
        
391
        public void setAffineTransform(AffineTransform t) {
392
                providerList = getParameters().getProviders();
393
                for (int i = 0; i < providerList.size(); i++) {
394
                        providerList.get(i).setAffineTransform(t);
395
                }
396
        }
397
        
398
        public int getInternalProviderCount() {
399
                return providerList.size();
400
        }
401
        
402
        public RasterProvider getInternalProvider(int i) {
403
                return providerList.get(i);
404
        }
405
        
406
        public int[] getBandCountByProvider() {
407
                providerList = getParameters().getProviders();
408
                int[] bc = new int[providerList.size()];
409
                for (int i = 0; i < bc.length; i++) {
410
                        bc[i] = providerList.get(i).getBandCount();
411
                }
412
                return bc;
413
        }
414
        
415
        public long[] getFileSizeByProvider() {
416
                providerList = getParameters().getProviders();
417
                long[] fs = new long[providerList.size()];
418
                for (int i = 0; i < fs.length; i++) {
419
                        fs[i] = ((DefaultRasterProvider)providerList.get(i)).getFileSize();
420
                }
421
                return fs;
422
        }
423
        
424
        public Point2D rasterToWorld(Point2D pt) {
425
                providerList = getParameters().getProviders();
426
                return providerList.get(0).rasterToWorld(pt);
427
        }
428

    
429
        public Point2D worldToRaster(Point2D pt) {
430
                providerList = getParameters().getProviders();
431
                return providerList.get(0).worldToRaster(pt);
432
        }
433
        
434
        public boolean isInside(Point2D p){
435
                providerList = getParameters().getProviders();
436
                return providerList.get(0).isInside(p);
437
        }
438
        
439
        public double getCellSize() {
440
                providerList = getParameters().getProviders();
441
                return providerList.get(0).getCellSize();
442
        }
443
        
444
        public Statistics getStatistics() {
445
                if(stats == null || (stats instanceof MultiProviderStatistics && 
446
                                ((MultiProviderStatistics)stats).getNumberOfProviders() != providerList.size())) {
447
                        providerList = getParameters().getProviders();
448
                        stats = new MultiProviderStatistics(providerList);
449
                }
450
                
451
                return stats;
452
        }
453
        
454
        public HistogramComputer getHistogramComputer() {
455
                if(histogram == null || 
456
                        (histogram instanceof MultiProviderHistogramComputer && 
457
                        ((MultiProviderHistogramComputer)histogram).getNumberOfProviders() != providerList.size())) {
458
                        histogram = new MultiProviderHistogramComputer(this);
459
                }
460
                
461
                return histogram;
462
        }
463
        
464
        /**
465
         * A multiband provider doesn't have a color table because this will have
466
         * more than one band.
467
         */
468
        public ColorTable getColorTable() {
469
                return null;
470
        }
471
        
472
        /*
473
         * (non-Javadoc)
474
         * @see org.gvsig.raster.impl.provider.RasterProvider#isOpen()
475
         */
476
        public boolean isOpen() {
477
                return open;
478
        }
479

    
480
        /*
481
         * (non-Javadoc)
482
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#close()
483
         */
484
        public void close() {
485
        }
486

    
487
        /*
488
         * (non-Javadoc)
489
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#translateFileName(java.lang.String)
490
         */
491
        public String translateFileName(String fileName) {
492
                return fileName;
493
        }
494

    
495
        /**
496
         * Asigna el extent de la vista actual. existe un fichero .rmf debemos hacer una transformaci�n
497
         * de la vista asignada ya que la petici�n viene en coordenadas del fichero .rmf y la vista (v)
498
         * ha de estar en coordenadas del fichero.
499
         */
500
        public void setView(Extent e) {
501
                viewRequest = new ExtentImpl(e);
502
        }
503

    
504
        /*
505
         * (non-Javadoc)
506
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getView()
507
         */
508
        public Extent getView() {
509
                return viewRequest;
510
        }
511

    
512
        /*
513
         * (non-Javadoc)
514
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getWidth()
515
         */
516
        public double getWidth() {
517
                providerList = getParameters().getProviders();
518
                if(providerList != null && providerList.size() > 0) {
519
                        return providerList.get(0).getWidth();
520
                }
521
                return 0;
522
        }
523

    
524
        /*
525
         * (non-Javadoc)
526
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getHeight()
527
         */
528
        public double getHeight() {
529
                providerList = getParameters().getProviders();
530
                if(providerList != null && providerList.size() > 0) {
531
                        return providerList.get(0).getHeight();
532
                }
533
                return 0;
534

    
535
        }
536

    
537
        /*
538
         *  (non-Javadoc)
539
         * @see org.gvsig.raster.dataset.RasterDataset#readBlock(int, int, double)
540
         */
541
        public Object readBlock(int pos, int blockHeight, double scale)
542
                throws InvalidSetViewException, FileNotOpenException, RasterDriverException, ProcessInterruptedException {
543
                providerList = getParameters().getProviders();
544
                return null;
545
        }
546

    
547
        /**
548
         * Gets a number of provider and the band of this provider 
549
         * @param band
550
         * @return
551
         */
552
        private int[] getSubBandByBandNumber(int band) {
553
                providerList = getParameters().getProviders();
554
                int[] res = new int[2];
555
                int acum = 0;
556
                for (int i = 0; i < providerList.size(); i++) {
557
                        acum += providerList.get(i).getBandCount();
558
                        if(acum > band) {
559
                                res[0] = i;
560
                                int aux = (acum - providerList.get(i).getBandCount());
561
                                res[1] = band - aux;
562
                                return res;
563
                        }
564
                }
565
                return res;
566
        }
567
        
568
        /* 
569
         * (non-Javadoc)
570
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getData(int, int, int)
571
         */
572
        public Object getData(int x, int y, int band)throws InvalidSetViewException, FileNotOpenException, RasterDriverException {
573
                int[] sub = getSubBandByBandNumber(band);
574
                RasterProvider prov = providerList.get(sub[0]);
575
                return prov.getData(x, y, sub[1]);
576
        }
577

    
578
        /*
579
         * (non-Javadoc)
580
         * @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)
581
         */
582
        public void getWindow(Extent ex, int bufWidth, int bufHeight, 
583
                        BandList bandList, TileListener listener, TaskStatus status) throws ProcessInterruptedException, RasterDriverException {
584
        }
585

    
586
        /*
587
         * (non-Javadoc)
588
         * @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)
589
         */
590
        public Buffer getWindow(Extent extent, BandList bandList, Buffer rasterBuf, TaskStatus status) 
591
                throws ProcessInterruptedException, RasterDriverException {
592
                providerList = getParameters().getProviders();
593
                
594
                DefaultRasterQuery q = (DefaultRasterQuery)RasterLocator.getManager().createQuery();
595
                q.setAreaOfInterest(extent);
596
                q.setBandList(bandList);
597
                q.setBuffer(rasterBuf);
598
                
599
                for (int i = 0; i < providerList.size(); i++) {
600
                        rasterBuf = ((DefaultRasterProvider)providerList.get(i)).getDataSet(q);
601
                }
602
                return rasterBuf;
603
        }
604
        
605
        
606

    
607
        /*
608
         * (non-Javadoc)
609
         * @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)
610
         */
611
        public Buffer getWindow(double ulx, double uly, double w, double h, 
612
                        BandList bandList, Buffer rasterBuf, boolean adjustToExtent, TaskStatus status) throws ProcessInterruptedException, RasterDriverException {
613
                providerList = getParameters().getProviders();
614
                
615
                DefaultRasterQuery q = (DefaultRasterQuery)RasterLocator.getManager().createQuery();
616
                q.setAreaOfInterest(ulx, uly, w, h);
617
                q.setBandList(bandList);
618
                q.setBuffer(rasterBuf);
619
                q.setAdjustToExtent(adjustToExtent);
620
                
621
                for (int i = 0; i < providerList.size(); i++) {
622
                        rasterBuf = ((DefaultRasterProvider)providerList.get(i)).getDataSet(q);
623
                }
624
                return rasterBuf;
625
        }
626

    
627
        /*
628
         * (non-Javadoc)
629
         * @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)
630
         */
631
        public Buffer getWindow(Extent extent, int bufWidth, int bufHeight, 
632
                        BandList bandList, Buffer rasterBuf, boolean adjustToExtent, TaskStatus status) throws ProcessInterruptedException, RasterDriverException {
633
                providerList = getParameters().getProviders();
634
                
635
                DefaultRasterQuery q = (DefaultRasterQuery)RasterLocator.getManager().createQuery();
636
                q.setAreaOfInterest(extent, bufWidth, bufHeight);
637
                q.setBuffer(rasterBuf);
638
                q.setAdjustToExtent(adjustToExtent);
639
                
640
                for (int i = 0; i < providerList.size(); i++) {
641
                        BandList bandListByFile = createBandListByProvider(bandList, providerList.get(i));
642
                        if(bandListByFile != null) {
643
                                q.setBandList(bandListByFile);
644
                                rasterBuf = ((DefaultRasterProvider)providerList.get(i)).getDataSet(q);
645
                        }
646
                }
647
                return rasterBuf;
648
        }
649
        
650
        /**
651
         * Creates a <code>BandList</code> for each provider of this <code>MultiFileProvider</code>.
652
         * When a request is made, the <code>BandList</code> is global for all files. A specific 
653
         * <code>BandList</code> has to be built for each provider. 
654
         * @param globalBandList
655
         * @param provider
656
         * @return
657
         */
658
        private BandList createBandListByProvider(BandList globalBandList, RasterProvider provider) {
659
                if(provider.isTiled()) { 
660
                        //Si los proveedores que hay por debajo son tileados estos crear�n su propio buffer para escribir
661
                        //cada tile. Por ello no usar� el buffer que viene del store. Esto quiere decir que el BandList ha
662
                        //de ser distinto para que escriba bien en su buffer
663
                        
664
                        //TODO: De momento no se permiten MultiFiles con proveedores tileados. Esto es porque
665
                        //los tiles crean su propio buffer y no escriben en el buffer creado en el Store
666

    
667
                } else {
668
                        BandList bandListByFile = new BandListImpl();
669
                        for (int i = 0; i < provider.getBandCount(); i++) {
670
                                try {
671
                                        bandListByFile.addBand(new DatasetBandImpl(provider.getURI(), i, provider.getDataType()[0], provider.getBandCount()));
672
                                } catch (BandNotFoundInListException e1) {
673
                                }
674
                        }
675

    
676
                        boolean areThereBandsToDraw = false;
677
                        for (int i = 0; i < provider.getBandCount(); i++) {
678
                                int[] bandsToDrawByProviderBand = globalBandList.getBufferBandToDraw(provider.getURI(), i);
679
                                if(bandsToDrawByProviderBand != null) {
680
                                        areThereBandsToDraw = true;
681
                                        for (int j = 0; j < bandsToDrawByProviderBand.length; j++) {
682
                                                bandListByFile.getBand(i).addPositionToDrawInBuffer(bandsToDrawByProviderBand[j]);                                
683
                                        }
684
                                }
685
                        }
686

    
687
                        if(areThereBandsToDraw)
688
                                return bandListByFile;
689
                }
690
                return null;
691
        }
692

    
693
        /*
694
         * (non-Javadoc)
695
         * @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)
696
         */
697
        public Buffer getWindow(int x, int y, int w, int h, 
698
                        BandList bandList, Buffer rasterBuf, TaskStatus status) throws ProcessInterruptedException, RasterDriverException {
699
                providerList = getParameters().getProviders();
700
                DefaultRasterQuery q = (DefaultRasterQuery)RasterLocator.getManager().createQuery();
701
                q.setAreaOfInterest(x, y, w, h);
702
                q.setBandList(bandList);
703
                q.setBuffer(rasterBuf);
704
                for (int i = 0; i < providerList.size(); i++) {
705
                        rasterBuf = ((DefaultRasterProvider)providerList.get(i)).getDataSet(q);
706
                }
707
                return rasterBuf;
708
        }
709

    
710
        /*
711
         * (non-Javadoc)
712
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getBlockSize()
713
         */
714
        public int getBlockSize() {
715
                return 0;
716
        }
717

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

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

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

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

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

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

    
793
        /*
794
         * (non-Javadoc)
795
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#isOverviewsSupported()
796
         */
797
        public boolean isOverviewsSupported() {
798
                return true;
799
        }
800

    
801
        /*
802
         * (non-Javadoc)
803
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#isReproyectable()
804
         */
805
        public boolean isReproyectable() {
806
                return true;
807
        }
808

    
809
        /*
810
         * (non-Javadoc)
811
         * @see org.gvsig.fmap.dal.spi.DataStoreProvider#getName()
812
         */
813
        public String getName() {
814
                return NAME;
815
        }
816
        
817
        /*
818
         * (non-Javadoc)
819
         * @see org.gvsig.raster.impl.provider.RasterProvider#setStatus(org.gvsig.raster.impl.provider.RasterProvider)
820
         */
821
        public void setStatus(RasterProvider provider) {
822
                if(provider instanceof MultiFileProvider) {
823
                        //Not implemented yet
824
                }
825
        }
826
        
827
        /*
828
         * (non-Javadoc)
829
         * @see org.gvsig.raster.impl.provider.RasterProvider#isTimeSupported()
830
         */
831
        public boolean isTimeSupported() {
832
                return true;
833
        }
834
        
835
        /*
836
         * (non-Javadoc)
837
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getURIByBand(int)
838
         */
839
        public String getURIByBand(int band) {
840
                int[] sub = getSubBandByBandNumber(band);
841
                RasterProvider prov = providerList.get(sub[0]);
842
                return prov.getURIOfFirstProvider();
843
        }
844
        
845
        /*
846
         * (non-Javadoc)
847
         * @see org.gvsig.raster.impl.provider.RasterProvider#addFile(java.lang.String)
848
         */
849
        public void addFile(String file) throws InvalidSourceException {
850
                ProviderServices provServ = RasterLocator.getManager().getProviderServices();
851
                DataManagerProviderServices dataManager = (DataManagerProviderServices)DALLocator.getDataManager();
852
                        
853
//                if(providerList.size() > 0 && providerList.get(0).isTiled()) {
854
//                        //Comentado hasta que se puedan incorporar fuentes tileadas a aun MultiFile
855
//                        //en su lugar se sustituye el primer proveedor tileado por uno sin tilear
856
//                        
857
//                        RasterDataParameters storeParameters = provServ.createParametersForTiledFiled(file);
858
//                        
859
//                        try {
860
//                                RasterProvider newFileProv = (RasterProvider)dataManager.createProvider(storeServices, storeParameters);
861
//                                if(checkNewProvider(newFileProv)) {
862
//                                        getParameters().addProvider(newFileProv);
863
//                                }
864
//                        } catch (InitializeException e) {
865
//                                throw new InvalidSourceException("", e);
866
//                        } catch (ProviderNotRegisteredException e) {
867
//                                throw new InvalidSourceException("", e);
868
//                        }
869
//                } 
870
                
871
                setFirstProviderToNotTiled();
872
                
873
                List<RasterDataParameters> storeParametersList = provServ.createParametersList(file);        
874

    
875
                for (int j = 0; j < storeParametersList.size(); j++) {
876
                        RasterProvider newFileProv;
877
                        try {
878
                                newFileProv = (RasterProvider)dataManager.createProvider(storeServices, storeParametersList.get(j));
879
                                if(!newFileProv.isTiled() && checkNewProvider(newFileProv)) {
880
                                        getParameters().addProvider(newFileProv);
881
                                }
882
                        } catch (InitializeException e) {
883
                                throw new InvalidSourceException("", e);
884
                        } catch (ProviderNotRegisteredException e) {
885
                                throw new InvalidSourceException("", e);
886
                        }
887
                }
888
        }
889
        
890
        private void setFirstProviderToNotTiled() throws InvalidSourceException {
891
                if(providerList == null || providerList.size() <= 0 || !providerList.get(0).isTiled()) 
892
                        return;
893
                
894
                //Si el primer proveedor es tileado se cambia a no tileado
895
                DataManagerProviderServices dataManager = (DataManagerProviderServices)DALLocator.getDataManager();
896
                ProviderServices provServ = RasterLocator.getManager().getProviderServices();
897
                
898
                RasterDataParameters firstDataParameters = providerList.get(0).getDataParameters();
899
                String uri = firstDataParameters.getURI();
900
                
901
                List<RasterDataParameters> storeParametersList = provServ.createParametersList(uri);        
902

    
903
                for (int j = 0; j < storeParametersList.size(); j++) {
904
                        RasterProvider newFileProv;
905
                        try {
906
                                newFileProv = (RasterProvider)dataManager.createProvider(storeServices, storeParametersList.get(j));
907
                                if(!newFileProv.isTiled() && checkNewProvider(newFileProv)) {
908
                                        getParameters().setFirstProvider(newFileProv);
909
                                }
910
                        } catch (InitializeException e) {
911
                                throw new InvalidSourceException("Error replacing the first provider", e);
912
                        } catch (ProviderNotRegisteredException e) {
913
                                throw new InvalidSourceException("Error replacing the first provider", e);
914
                        }
915
                }
916
        }
917
        
918
        /*
919
         * (non-Javadoc)
920
         * @see org.gvsig.raster.impl.provider.RasterProvider#removeFile(java.lang.String)
921
         */
922
        public void removeFile(String file) {
923
                getParameters().removeProvider(file);
924
        }
925
        
926
        /*
927
         * (non-Javadoc)
928
         * @see org.gvsig.raster.impl.provider.RasterProvider#getTileServer()
929
         */
930
        public TileServer getTileServer() {
931
                if(tileServer == null)
932
                        tileServer = new FileTileServer(this);
933
                return tileServer;
934
        }
935
}