Statistics
| Revision:

gvsig-raster / org.gvsig.raster / trunk / org.gvsig.raster / org.gvsig.raster.lib / org.gvsig.raster.lib.impl / src / main / java / org / gvsig / raster / util / DefaultProviderServices.java @ 4181

History | View | Annotate | Download (25.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.util;
23

    
24
import java.awt.geom.AffineTransform;
25
import java.io.File;
26
import java.io.IOException;
27
import java.lang.reflect.Constructor;
28
import java.lang.reflect.InvocationTargetException;
29
import java.util.ArrayList;
30
import java.util.HashMap;
31
import java.util.Iterator;
32
import java.util.List;
33
import java.util.Map;
34
import java.util.Set;
35
import java.util.TreeMap;
36

    
37
import org.gvsig.fmap.dal.DALFileLocator;
38
import org.gvsig.fmap.dal.DALLocator;
39
import org.gvsig.fmap.dal.DataManager;
40
import org.gvsig.fmap.dal.DataStoreParameters;
41
import org.gvsig.fmap.dal.coverage.RasterLocator;
42
import org.gvsig.fmap.dal.coverage.RasterManager;
43
import org.gvsig.fmap.dal.coverage.dataset.Buffer;
44
import org.gvsig.fmap.dal.coverage.datastruct.Extent;
45
import org.gvsig.fmap.dal.coverage.datastruct.Params;
46
import org.gvsig.fmap.dal.coverage.exception.FileNotSupportedException;
47
import org.gvsig.fmap.dal.coverage.exception.NotSupportedExtensionException;
48
import org.gvsig.fmap.dal.coverage.exception.ProcessInterruptedException;
49
import org.gvsig.fmap.dal.coverage.exception.RasterDriverException;
50
import org.gvsig.fmap.dal.coverage.exception.RmfSerializerException;
51
import org.gvsig.fmap.dal.coverage.process.overview.OverviewBuilder;
52
import org.gvsig.fmap.dal.coverage.store.DataServerWriter;
53
import org.gvsig.fmap.dal.coverage.store.RasterDataStore;
54
import org.gvsig.fmap.dal.coverage.store.RasterWriter;
55
import org.gvsig.fmap.dal.coverage.store.parameter.RasterDataParameters;
56
import org.gvsig.fmap.dal.coverage.store.parameter.RasterFileStoreParameters;
57
import org.gvsig.fmap.dal.coverage.store.props.ColorInterpretation;
58
import org.gvsig.fmap.dal.coverage.util.CRSUtils;
59
import org.gvsig.fmap.dal.coverage.util.ProviderServices;
60
import org.gvsig.fmap.dal.exception.InitializeException;
61
import org.gvsig.fmap.dal.exception.ProviderNotRegisteredException;
62
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
63
import org.gvsig.fmap.dal.raster.spi.CoverageStoreProvider;
64
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorer;
65
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorerParameters;
66
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemStoreParameters;
67
import org.gvsig.fmap.dal.serverexplorer.filesystem.spi.FilesystemServerExplorerProvider;
68
import org.gvsig.fmap.dal.spi.DataManagerProviderServices;
69
import org.gvsig.fmap.dal.spi.DataStoreProvider;
70
import org.gvsig.fmap.dal.spi.DataStoreProviderServices;
71
import org.gvsig.raster.impl.DefaultRasterManager;
72
import org.gvsig.raster.impl.provider.AbstractRasterProvider;
73
import org.gvsig.raster.impl.provider.RasterProvider;
74
import org.gvsig.raster.impl.store.AbstractRasterDataParameters;
75
import org.gvsig.raster.impl.store.DefaultRasterStore;
76
import org.gvsig.raster.impl.store.WriteFileFormatFeatures;
77
import org.gvsig.raster.impl.store.rmf.ClassSerializer;
78
import org.gvsig.raster.impl.store.rmf.RmfBlocksManager;
79
import org.gvsig.tools.ToolsLocator;
80
import org.gvsig.tools.extensionpoint.ExtensionPoint;
81
import org.gvsig.tools.extensionpoint.ExtensionPoint.Extension;
82
import org.gvsig.tools.extensionpoint.ExtensionPointManager;
83
import org.slf4j.Logger;
84
import org.slf4j.LoggerFactory;
85

    
86
/**
87
 *
88
 * 31/10/2007
89
 * @author Nacho Brodin nachobrodin@gmail.com
90
 */
91
public class DefaultProviderServices implements ProviderServices {
92
        public TreeMap<String, WriteFileFormatFeatures>
93
                                          fileFeature       = new TreeMap<String, WriteFileFormatFeatures>();
94
        private Logger                        log               = LoggerFactory.getLogger(DefaultProviderServices.class);
95
        private static List<Class<?>>         tiledProviders    = new ArrayList<Class<?>>();
96
        private static Class<?>               tileclass         = null;
97
        private static HashMap<String, ArrayList<Class<?>>>
98
                                          formatsRegistry   = new HashMap<String, ArrayList<Class<?>>>();
99

    
100
        public DefaultRasterManager getManager() {
101
                return (DefaultRasterManager)RasterLocator.getManager();
102
        }
103

    
104
        public TreeMap<String, WriteFileFormatFeatures> getFileFeature() {
105
                return fileFeature;
106
        }
107

    
108
        public RasterDataStore open(CoverageStoreProvider prov, DataStoreParameters params) throws NotSupportedExtensionException, RasterDriverException {
109
                if(prov instanceof RasterProvider) {
110
                        DefaultRasterStore store = new DefaultRasterStore();
111
                        store.setProvider((RasterProvider)prov);
112
                        try {
113
                                store.intializePhase1(null, params);
114
                        } catch (InitializeException e) {
115
                                throw new RasterDriverException(e.getMessage());
116
                        }
117
                        return store;
118
                }
119
                return null;
120
        }
121

    
122
        /**
123
         * Abre un dataset pasando como par?metros la proyecci?n y un objeto identificador del dataset. Este
124
         * objeto puede ser una ruta a un fichero en disco. En este caso la extensi?n del fichero servir? para
125
         * buscar el driver que lo gestiona. Si proporcionamos un array de cadenas se tratar?n como la ruta a N ficheros
126
         * de disco. Tambi?n puede ser un buffer de datos en memoria o cualquier otro objeto
127
         * que pueda aceptar un driver.
128
         * @param param Par?metros al driver
129
         * @return RasterMultiDatset
130
         * @throws NotSupportedExtensionException
131
         * @throws RasterDriverException
132
         */
133
        public RasterDataStore open(DataStoreParameters params) throws NotSupportedExtensionException, RasterDriverException {
134
                if(params == null || !(params instanceof AbstractRasterDataParameters))
135
                        return null;
136
                DefaultRasterStore dSet = new DefaultRasterStore();
137
                DataManagerProviderServices dataManager = (DataManagerProviderServices)DALLocator.getDataManager();
138
                try {
139
                        AbstractRasterProvider provider = (AbstractRasterProvider)dataManager.createProvider(dSet, (AbstractRasterDataParameters)params);
140
                        dSet.setProvider(provider);
141
                } catch (InitializeException e) {
142
                        throw new RasterDriverException("Error initializing provider", e);
143
                } catch (ProviderNotRegisteredException e) {
144
                        throw new RasterDriverException("Provider not register error", e);
145
                }
146
                return dSet;
147
        }
148

    
149
        public RasterDataStore open(Object datasetOpenParam) throws NotSupportedExtensionException, RasterDriverException {
150
                DefaultRasterStore dSet = new DefaultRasterStore();
151

    
152
                if (datasetOpenParam instanceof String) {
153
                        AbstractRasterProvider provider = AbstractRasterProvider.singleDatasetInstance(dSet, (String)datasetOpenParam);
154
                        dSet.setProvider(provider);
155
                        return dSet;
156
                }
157

    
158
                return null;
159
        }
160

    
161
        public RasterDataStore open(String file) throws NotSupportedExtensionException, RasterDriverException, InitializeException, ProviderNotRegisteredException {
162
                RasterDataParameters params = createNotTiledParameters(file);
163
                return open(params);
164
        }
165

    
166

    
167
        /**
168
         * Loads the specific provider to download data
169
         * @param file
170
         * @return
171
         * @throws NotSupportedExtensionException
172
         * @throws FileNotSupportedException
173
         */
174
        @SuppressWarnings("unchecked")
175
        public static AbstractRasterProvider loadProvider(File file) throws ProviderNotRegisteredException, InitializeException {
176
                DataManagerProviderServices dataManager = (DataManagerProviderServices)DALLocator.getDataManager();
177
                DataStoreProviderServices storeServices = null;
178
                DataStoreProvider prov = null;
179

    
180
                if(file != null) {
181
                        //We have to locate a provider's name which manages the selected file
182
                        //A FilesystemServerExplorer will give a getProviderNames service
183
                        FilesystemServerExplorerParameters paramsExplorer = (FilesystemServerExplorerParameters)dataManager.createServerExplorerParameters(FilesystemServerExplorer.NAME);
184
                        FilesystemServerExplorer serverExplorer = null;
185
                        try {
186
                                paramsExplorer.setRoot(File.separator);
187
                                serverExplorer = (FilesystemServerExplorer)dataManager.openServerExplorer(FilesystemServerExplorer.NAME, paramsExplorer);
188
                        } catch (ValidateDataParametersException e) {
189
                                throw new InitializeException(e);
190
                        }
191

    
192
                        //Gets the list of provider's name to manage the file
193
                        List<String> provNameList = serverExplorer.getProviderNameList(file);
194
                        if(provNameList.size() > 0) {
195
                                for (int i = 0; i < provNameList.size(); i++) {
196
                                        //Gets the first provider what is not a TileProvider
197
                                        if(provNameList.get(i).compareTo("Tile Store") != 0) {
198
                                                DataStoreParameters newparams = dataManager.createStoreParameters(provNameList.get(i));
199
                                                ((FilesystemStoreParameters)newparams).setFile(file);
200
                                                prov = dataManager.createProvider(storeServices, newparams);
201
                                        }
202
                                }
203
                        } else { //Default provider. This should be Gdal
204
                                ExtensionPointManager extensionPoints = ToolsLocator.getExtensionPointManager();
205
                                ExtensionPoint point = extensionPoints.get("DefaultRasterProvider");
206
                                Extension ext = point.get("reader");
207
                                String provName = ext.getDescription();
208
                                DataStoreParameters newparams = dataManager.createStoreParameters(provName);
209
                                ((FilesystemStoreParameters)newparams).setFile(file);
210
                                prov = dataManager.createProvider(storeServices, newparams);
211
                        }
212
                }
213

    
214
                if(prov != null && prov instanceof RasterProvider) {
215
                        if(((RasterProvider)prov).isRotated())
216
                                throw new InitializeException("Rotation not supported tiling files", new Throwable());
217

    
218
                        return (AbstractRasterProvider)prov;
219
                }
220

    
221
                return null;
222
        }
223

    
224
        public RasterDataParameters createNotTiledParameters(String id) throws InitializeException, ProviderNotRegisteredException {
225
                DataManagerProviderServices dataManager = (DataManagerProviderServices)DALLocator.getDataManager();
226
                ArrayList<RasterDataParameters> parametersList = createParametersList(id);
227
                for (int i = 0; i < parametersList.size(); i++) {
228
                        DataStoreProvider p = dataManager.createProvider(null, parametersList.get(i));
229
                        if(p instanceof RasterProvider) {
230
                                if(!((RasterProvider)p).isTiled())
231
                                        return parametersList.get(i);
232
                        }
233
                }
234
                return null;
235
        }
236

    
237
        public RasterDataParameters createParameters(String id) {
238
                Iterator<?> it = DALFileLocator.getFilesystemServerExplorerManager().getRegisteredProviders();
239
                while (it.hasNext()) {
240
                        ExtensionPoint.Extension o = (ExtensionPoint.Extension)it.next();
241
                        Class<?> c = o.getExtension();
242
                        try {
243
                                Constructor<?> hazNuevo = c.getConstructor();
244
                                Object [] args2 = {};
245
                                Object obj = hazNuevo.newInstance(args2);
246
                                if(obj instanceof FilesystemServerExplorerProvider) {
247
                                        FilesystemServerExplorerProvider prov = (FilesystemServerExplorerProvider)obj;
248
                                        File file = new File(id);
249
                                        if(prov.accept(file)) {
250
                                                DataManager manager = DALLocator.getDataManager();
251
                                                RasterFileStoreParameters params = null;
252
                                                try {
253
                                                        params = (RasterFileStoreParameters) manager
254
                                                                        .createStoreParameters(prov.getDataStoreProviderName());
255
                                                } catch (InitializeException e) {
256
                                                } catch (ProviderNotRegisteredException e) {
257
                                                }
258
                                                params.setFile(file);
259
                                                return params;
260
                                        }
261
                                }
262
                        } catch (SecurityException e) {
263
                                log.debug("Error SecurityException in open", e);
264
                        } catch (NoSuchMethodException e) {
265
                                log.debug("Error NoSuchMethodException in open", e);
266
                        } catch (IllegalArgumentException e) {
267
                                log.debug("Error IllegalArgumentException in open", e);
268
                        } catch (InstantiationException e) {
269
                                log.debug("Error InstantiationException in open", e);
270
                        } catch (IllegalAccessException e) {
271
                                log.debug("Error IllegalAccessException in open", e);
272
                        } catch (InvocationTargetException e) {
273
                                log.debug("Error opening this image with ", e);
274
                        }
275
                }
276
                return null;
277
        }
278

    
279
        public ArrayList<RasterDataParameters> createParametersList(String id) {
280
        return createParametersList(new File(id));
281
        }
282

    
283
    public ArrayList<RasterDataParameters> createParametersList(File file) {
284
        ArrayList<RasterDataParameters> list = new ArrayList<RasterDataParameters>();
285

    
286
        Iterator<?> it = DALFileLocator.getFilesystemServerExplorerManager().getRegisteredProviders();
287
        while (it.hasNext()) {
288
            ExtensionPoint.Extension o = (ExtensionPoint.Extension) it.next();
289
            Class<?> c = o.getExtension();
290
            try {
291
                Constructor<?> hazNuevo = c.getConstructor();
292
                Object[] args2 = {};
293
                Object obj = hazNuevo.newInstance(args2);
294
                if (obj instanceof FilesystemServerExplorerProvider) {
295
                    FilesystemServerExplorerProvider prov = (FilesystemServerExplorerProvider) obj;
296
                    if (prov.accept(file)) {
297
                        DataManager manager = DALLocator.getDataManager();
298
                        RasterFileStoreParameters params = null;
299
                        try {
300
                            params =
301
                                (RasterFileStoreParameters) manager.createStoreParameters(prov
302
                                    .getDataStoreProviderName());
303
                        } catch (InitializeException e) {
304
                        } catch (ProviderNotRegisteredException e) {
305
                        }
306
                        params.setFile(file);
307
                        list.add(params);
308
                    }
309
                }
310
            } catch (SecurityException e) {
311
                log.debug("Error SecurityException in open", e);
312
            } catch (NoSuchMethodException e) {
313
                log.debug("Error NoSuchMethodException in open", e);
314
            } catch (IllegalArgumentException e) {
315
                log.debug("Error IllegalArgumentException in open", e);
316
            } catch (InstantiationException e) {
317
                log.debug("Error InstantiationException in open", e);
318
            } catch (IllegalAccessException e) {
319
                log.debug("Error IllegalAccessException in open", e);
320
            } catch (InvocationTargetException e) {
321
                log.debug("Error opening this image with", e);
322
            }
323
        }
324
        return list;
325
    }
326

    
327
        public RasterDataParameters createParametersForTiledFiled(String id) {
328
                DataManager manager = DALLocator.getDataManager();
329
                RasterFileStoreParameters params = null;
330
                try {
331
                        params = (RasterFileStoreParameters) manager.createStoreParameters("Tile Store");
332
                } catch (InitializeException e) {
333
                } catch (ProviderNotRegisteredException e) {
334
                }
335
                File file = new File(id);
336
                params.setFile(file);
337
                return params;
338
        }
339

    
340
        @SuppressWarnings("unchecked")
341
        public String[] getDriversExtensions() {
342
                ExtensionPointManager extensionPoints = ToolsLocator.getExtensionPointManager();
343
                ExtensionPoint point = extensionPoints.get("RasterWriter");
344
                return (String[])point.getNames().toArray(new String[0]);
345
        }
346

    
347
        public String[] getRODriversExtensions() {
348
                return getReadOnlyFormatList();
349
        }
350

    
351
        public ArrayList<String> getExtensionsSupported(int dataType, int bands) throws RasterDriverException {
352
                ExtensionPointManager extensionPoints = ToolsLocator.getExtensionPointManager();
353
                ExtensionPoint point = extensionPoints.get("RasterWriter");
354
                Iterator<?> iterator = point.iterator();
355
                ArrayList<String> result = new ArrayList<String>();
356
                while (iterator.hasNext()) {
357
                        ExtensionPoint.Extension extension = (ExtensionPoint.Extension) iterator.next();
358
                        String ext = extension.getName();
359
                        try {
360
                                if (isSupportedThisFileToWrite(ext, dataType, bands))
361
                                        result.add(ext);
362
                        } catch (SecurityException e) {
363
                                throw new RasterDriverException("Error SecurityException in open");
364
                        }  catch (IllegalArgumentException e) {
365
                                throw new RasterDriverException("Error IllegalArgumentException in open");
366
                        }
367
                }
368
                return result;
369
        }
370

    
371
        @SuppressWarnings("rawtypes")
372
        public String[] getWriteDriversType() {
373
                if (fileFeature.size() == 0)
374
                        return null;
375
                String[] list = new String[fileFeature.size()];
376
                Set<?> values = fileFeature.entrySet();
377
                int i = 0;
378
                for (Iterator<?> it = values.iterator(); it.hasNext();) {
379
                        list[i] = ((WriteFileFormatFeatures) ((Map.Entry) it.next()).getValue()).getDriverName();
380
                        i++;
381
                }
382

    
383
                return list;
384
        }
385

    
386
        public String getWriteDriverType(String ext) {
387
                return ((WriteFileFormatFeatures) fileFeature.get(ext)).getDriverName();
388
        }
389

    
390
        public int getWriteNDrivers() {
391
                ExtensionPointManager extensionPoints = ToolsLocator.getExtensionPointManager();
392
                ExtensionPoint point = extensionPoints.get("RasterWriter");
393
                return point.getCount();
394
        }
395

    
396
        public int getWriteNTypes() {
397
                return fileFeature.size();
398
        }
399

    
400
        public boolean isSupportedThisFileToWrite(String ext, int dataType, int bands) {
401
                WriteFileFormatFeatures features = (WriteFileFormatFeatures) fileFeature.get(ext);
402
                if (features == null)
403
                        return false;
404
                int[] bandsSupported = features.getNBandsSupported();
405
                if (bandsSupported[0] != -1 && bandsSupported[0] < bands)
406
                        return false;
407
                int[] dt = features.getDataTypesSupported();
408
                for (int i = 0; i < dt.length; i++)
409
                        if (dataType == dt[i])
410
                                return true;
411
                return false;
412
        }
413

    
414
        /**
415
         * Guarda en el RMF que trata el BlocksManager el valor value usando el serializador que soporta
416
         * la clase class1.
417
         *
418
         * @param blocksManager
419
         * @param class1
420
         * @param value
421
         * @throws RmfSerializerException
422
         */
423
        public void saveObjectToRmfFile(RmfBlocksManager blocksManager, Class<?> class1, Object value) throws RmfSerializerException {
424
                ClassSerializer serializerObject = getSerializerObject(class1, value);
425

    
426
                if (serializerObject == null)
427
                        throw new RmfSerializerException("No se ha podido encontrar el serializador para el Rmf");
428

    
429
                if (!blocksManager.checkRmf()) {
430
                        log.info("Error al comprobar el fichero Rmf");
431
                }
432

    
433
                blocksManager.addClient(serializerObject);
434
                try {
435
                        blocksManager.write(true);
436
                } catch (IOException e) {
437
                        log.info("Error al escribir el fichero Rmf", e);
438
                }
439
                blocksManager.removeAllClients();
440
        }
441

    
442
        public void saveObjectToRmfFile(String file, Class<?> class1, Object value) throws RmfSerializerException {
443
                String fileRMF = RasterLocator.getManager().getFileUtils().getNameWithoutExtension(file) + ".rmf";
444
                RmfBlocksManager blocksManager = new RmfBlocksManager(fileRMF);
445
                saveObjectToRmfFile(blocksManager, class1, value);
446
        }
447

    
448
        public void saveObjectToRmfFile(String file, Object value) throws RmfSerializerException {
449
                saveObjectToRmfFile(file, value.getClass(), value);
450
        }
451

    
452
        /**
453
         * Construye un serializador que soporte la clase class1. El constructor se invoca
454
         * con el parametro value.
455
         *
456
         * @param class1
457
         * @param value
458
         * @return
459
         * @throws RmfSerializerException
460
         */
461
        public ClassSerializer getSerializerObject(Class<?> class1, Object value) throws RmfSerializerException {
462
                try {
463
                        Class<?>[] args = { class1 };
464
                        Constructor<?> constructor = getSerializerClass(class1).getConstructor(args);
465
                        Object[] args2 = { value };
466
                        return (ClassSerializer) constructor.newInstance(args2);
467
                } catch (Exception e) {
468
                        throw new RmfSerializerException("No se ha podido crear el serializador para el Rmf", e);
469
                }
470
        }
471

    
472
        /**
473
         * Gets the serializer which has a constructor with the class selected in the
474
         * parameters of this function
475
         * @throws RmfSerializerException
476
         */
477
        private Class<?> getSerializerClass(Class<?> class1)
478
                        throws RmfSerializerException {
479
                ExtensionPointManager extensionPoints = ToolsLocator.getExtensionPointManager();
480
                ExtensionPoint point = extensionPoints.get("Serializer");
481
                Iterator<?> iterator = point.iterator();
482
                while (iterator.hasNext()) {
483
                        ExtensionPoint.Extension extension = (ExtensionPoint.Extension) iterator.next();
484
                        if (extension != null) {
485
                                Class<?>[] args = { class1 };
486
                                Class<?> clase = extension.getExtension();
487
                                try {
488
                                        clase.getConstructor(args);
489
                                        return clase;
490
                                } catch (Exception e) {
491
                                        // Si no encuentra un constructor para esta clase, seguir? buscando en los dem?s elementos
492
                                }
493
                        }
494
                }
495
                throw new RmfSerializerException("No se ha encontrado la clase para el serializador");
496
        }
497

    
498
        @SuppressWarnings("deprecation")
499
        public void exportBufferToFile(Buffer bufResult,
500
                        double pixelSize,
501
                        String extension,
502
                        boolean alphaBand,
503
                        File file,
504
                        Extent extent,
505
                        ColorInterpretation colorInterpretation) throws NotSupportedExtensionException, RasterDriverException, ProcessInterruptedException, IOException {
506
                //Escritura en disco del tile
507
                RasterManager rManager = RasterLocator.getManager();
508
                DataServerWriter dataWriter = RasterLocator.getManager().createDataServerWriter();
509
                dataWriter.setBuffer(bufResult, -1);
510
                Params params = rManager.createWriter("_." + extension).getParams();
511
                AffineTransform affineTransform = new AffineTransform(pixelSize, 0, 0, -pixelSize,
512
                                extent.getULX(),
513
                                extent.getULY());
514
                RasterWriter rw = rManager.createWriter(dataWriter, file.getAbsolutePath(),
515
                                bufResult.getBandCount(), affineTransform, bufResult.getWidth(),
516
                                bufResult.getHeight(), bufResult.getDataType(), params, null);
517

    
518
                if(colorInterpretation != null) {
519
                        String[] values = colorInterpretation.getValues();
520
                        if(alphaBand) {
521
                                String[] newValues = values;
522
                                boolean exists = false;
523
                                for (int i = 0; i < values.length; i++) {
524
                                        if(values[i] != null && values[i].compareTo("Alpha") == 0)
525
                                                exists = true;
526
                                }
527
                                if(!exists) {
528
                                        newValues = new String[values.length + 1];
529
                                        for (int i = 0; i < values.length; i++) {
530
                                                newValues[i] = values[i];
531
                                        }
532
                                        newValues[newValues.length - 1] = "Alpha";
533
                                }
534
                                rw.setColorBandsInterpretation(newValues);
535
                        }
536

    
537
                } else {
538
                        if(alphaBand) {
539
                                String[] ci = new String[bufResult.getBandCount()];
540
                                if(bufResult.getBandCount() == 4) {
541
                                        ci[0] = "Red";
542
                                        ci[1] = "Green";
543
                                        ci[2] = "Blue";
544
                                        ci[3] = "Alpha";
545
                                } else {
546
                                        for (int i = 0; i < bufResult.getBandCount(); i++) {
547
                                                ci[i] = "Gray";
548
                                        }
549
                                }
550
                                rw.setColorBandsInterpretation(ci);
551
                        }
552
                }
553
                rw.dataWrite();
554
                rw.writeClose();
555
        }
556

    
557
        public void addFormat(String ext, Class<?> c) {
558
                ArrayList<Class<?>> list = formatsRegistry.get(ext);
559
                if(list == null) {
560
                        list = new ArrayList<Class<?>>();
561
                        list.add(c);
562
                        formatsRegistry.put(ext, list);
563
                } else {
564
                        if(!list.contains(c))
565
                                list.add(c);
566
                }
567
        }
568

    
569
        public boolean isExtensionSupported(String ext, Class<?> c) {
570
                String extension = getManager().getFileUtils().getExtensionFromFileName(ext);
571

    
572
                ArrayList<Class<?>> list = formatsRegistry.get(extension);
573
                if(list == null) {
574
                        return false;
575
                } else {
576
                        for (int i = 0; i < list.size(); i++) {
577
                                if(c == list.get(i))
578
                                        return true;
579
                        }
580
                }
581
                return false;
582
        }
583

    
584
        public boolean isExtensionSupported(String ext) {
585
                String extension = getManager().getFileUtils().getExtensionFromFileName(ext);
586

    
587
                ArrayList<Class<?>> list = formatsRegistry.get(extension);
588
                if(list == null) {
589
                        return false;
590
                }
591

    
592
                return true;
593
        }
594

    
595
        public String[] getReadOnlyFormatList() {
596
                return formatsRegistry.keySet().toArray(new String[0]);
597
        }
598

    
599
        public void registerFileProvidersTiled(Class<?> provider) {
600
                if(!tiledProviders.contains(provider))
601
                        tiledProviders.add(provider);
602
        }
603

    
604
        public void registerTileProviderFormats(Class<?> c) {
605
                if(tileclass == null) {
606
                        if(RasterProvider.class.isAssignableFrom(c)) {
607
                                List<Object> pList = getTiledProvidersInstance();
608
                                for (int i = 0; i < pList.size(); i++) {
609
                                        String[] fList = ((RasterProvider)pList.get(i)).getFormatList();
610
                                        for (int j = 0; j < fList.length; j++) {
611
                                                String value = fList[j];
612
                                                addFormat(value, c);
613
                                        }
614
                                }
615
                        }
616
                        tileclass = c;
617
                }
618
        }
619

    
620
        private List<Object> getTiledProvidersInstance() {
621
                List<Object> list = new ArrayList<Object>();
622
                for (int i = 0; i < tiledProviders.size(); i++) {
623
                        Class<?> provider = tiledProviders.get(i);
624
                        try {
625
                                Constructor<?> c = provider.getConstructor();
626
                                list.add(c.newInstance());
627
                        } catch (SecurityException e) {
628
                                log.info("Error SecurityException in open", e);
629
                        } catch (NoSuchMethodException e) {
630
                                log.info("Error NoSuchMethodException in open", e);
631
                        } catch (IllegalArgumentException e) {
632
                                log.info("Error IllegalArgumentException in open", e);
633
                        } catch (InstantiationException e) {
634
                                log.info("Error InstantiationException in open", e);
635
                        } catch (IllegalAccessException e) {
636
                                log.info("Error IllegalAccessException in open", e);
637
                        } catch (InvocationTargetException e) {
638
                                log.info("Error in open. Problemas con las librer?as nativas.", e);
639
                        }
640
                }
641
                return list;
642
        }
643

    
644
        public void registerOverviewBuilderImplementation(String id, OverviewBuilder ovBuilder) {
645
                DefaultRasterManager.overviewBuilderRegistry.put(id, ovBuilder);
646
        }
647

    
648
        public void registerCRSUtilImplementation(CRSUtils crsUtil) {
649
                DefaultRasterManager.crsUtilRegistry = crsUtil;
650
        }
651
}