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

History | View | Annotate | Download (20.4 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.Iterator;
31
import java.util.List;
32
import java.util.Map;
33
import java.util.Set;
34
import java.util.TreeMap;
35

    
36
import org.gvsig.fmap.dal.DALFileLocator;
37
import org.gvsig.fmap.dal.DALLocator;
38
import org.gvsig.fmap.dal.DataManager;
39
import org.gvsig.fmap.dal.DataStoreParameters;
40
import org.gvsig.fmap.dal.coverage.RasterLocator;
41
import org.gvsig.fmap.dal.coverage.RasterManager;
42
import org.gvsig.fmap.dal.coverage.dataset.Buffer;
43
import org.gvsig.fmap.dal.coverage.datastruct.Extent;
44
import org.gvsig.fmap.dal.coverage.datastruct.Params;
45
import org.gvsig.fmap.dal.coverage.exception.FileNotSupportedException;
46
import org.gvsig.fmap.dal.coverage.exception.NotSupportedExtensionException;
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.exception.RmfSerializerException;
50
import org.gvsig.fmap.dal.coverage.store.DataServerWriter;
51
import org.gvsig.fmap.dal.coverage.store.RasterDataStore;
52
import org.gvsig.fmap.dal.coverage.store.RasterWriter;
53
import org.gvsig.fmap.dal.coverage.store.parameter.RasterDataParameters;
54
import org.gvsig.fmap.dal.coverage.store.parameter.RasterFileStoreParameters;
55
import org.gvsig.fmap.dal.coverage.store.props.ColorInterpretation;
56
import org.gvsig.fmap.dal.coverage.util.ProviderServices;
57
import org.gvsig.fmap.dal.exception.InitializeException;
58
import org.gvsig.fmap.dal.exception.ProviderNotRegisteredException;
59
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
60
import org.gvsig.fmap.dal.raster.spi.CoverageStoreProvider;
61
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorer;
62
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorerParameters;
63
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemStoreParameters;
64
import org.gvsig.fmap.dal.serverexplorer.filesystem.spi.FilesystemServerExplorerProvider;
65
import org.gvsig.fmap.dal.spi.DataManagerProviderServices;
66
import org.gvsig.fmap.dal.spi.DataStoreProvider;
67
import org.gvsig.fmap.dal.spi.DataStoreProviderServices;
68
import org.gvsig.raster.impl.DefaultRasterManager;
69
import org.gvsig.raster.impl.provider.DefaultRasterProvider;
70
import org.gvsig.raster.impl.provider.RasterProvider;
71
import org.gvsig.raster.impl.store.WriteFileFormatFeatures;
72
import org.gvsig.raster.impl.store.rmf.ClassSerializer;
73
import org.gvsig.raster.impl.store.rmf.RmfBlocksManager;
74
import org.gvsig.tools.ToolsLocator;
75
import org.gvsig.tools.extensionpoint.ExtensionPoint;
76
import org.gvsig.tools.extensionpoint.ExtensionPoint.Extension;
77
import org.gvsig.tools.extensionpoint.ExtensionPointManager;
78

    
79
/**
80
 * 
81
 * 31/10/2007
82
 * @author Nacho Brodin nachobrodin@gmail.com
83
 */
84
public class DefaultProviderServices implements ProviderServices {
85
        public TreeMap<String, WriteFileFormatFeatures>
86
                                  fileFeature    = new TreeMap<String, WriteFileFormatFeatures>();
87

    
88
        public DefaultRasterManager getManager() {
89
                return (DefaultRasterManager)RasterLocator.getManager();
90
        }
91
        
92
        public TreeMap<String, WriteFileFormatFeatures> getFileFeature() {
93
                return fileFeature;
94
        }
95
        
96
        /**
97
         * Abre un dataset pasando como par�metros la proyecci�n y un objeto identificador del dataset. Este
98
         * objeto puede ser una ruta a un fichero en disco. En este caso la extensi�n del fichero servir� para
99
         * buscar el driver que lo gestiona. Si proporcionamos un array de cadenas se tratar�n como la ruta a N ficheros
100
         * de disco. Tambi�n puede ser un buffer de datos en memoria o cualquier otro objeto
101
         * que pueda aceptar un driver.
102
         * @param param Par�metros al driver
103
         * @return RasterMultiDatset
104
         * @throws NotSupportedExtensionException
105
         * @throws RasterDriverException
106
         */
107
        public RasterDataStore open(DataStoreParameters param) throws NotSupportedExtensionException, RasterDriverException {
108
                return getManager().open(param);
109
        }
110
        
111
        public RasterDataStore open(CoverageStoreProvider prov, DataStoreParameters params) throws NotSupportedExtensionException, RasterDriverException {
112
                return getManager().open(prov, params);
113
        }
114
        
115
        
116
        /**
117
         * Loads the specific provider to download data
118
         * @param file
119
         * @return
120
         * @throws NotSupportedExtensionException
121
         * @throws FileNotSupportedException 
122
         */
123
        public static DefaultRasterProvider loadProvider(File file) throws ProviderNotRegisteredException, InitializeException {
124
                DataManagerProviderServices dataManager = (DataManagerProviderServices)DALLocator.getDataManager();
125
                DataStoreProviderServices storeServices = null;
126
                DataStoreProvider prov = null;
127

    
128
                if(file != null) {
129
                        //We have to locate a provider's name which manages the selected file
130
                        //A FilesystemServerExplorer will give a getProviderNames service
131
                        FilesystemServerExplorerParameters paramsExplorer = (FilesystemServerExplorerParameters)dataManager.createServerExplorerParameters(FilesystemServerExplorer.NAME);
132
                        FilesystemServerExplorer serverExplorer = null;
133
                        try {
134
                                paramsExplorer.setRoot(File.separator);
135
                                serverExplorer = (FilesystemServerExplorer)dataManager.openServerExplorer(FilesystemServerExplorer.NAME, paramsExplorer);
136
                        } catch (ValidateDataParametersException e) {
137
                                throw new InitializeException(e);
138
                        }
139

    
140
                        //Gets the list of provider's name to manage the file
141
                        List<String> provNameList = serverExplorer.getProviderNameList(file);
142
                        if(provNameList.size() > 0) {
143
                                for (int i = 0; i < provNameList.size(); i++) {
144
                                        //Gets the first provider what is not a TileProvider
145
                                        if(provNameList.get(i).compareTo("Tile Store") != 0) {
146
                                                DataStoreParameters newparams = dataManager.createStoreParameters(provNameList.get(i));
147
                                                ((FilesystemStoreParameters)newparams).setFile(file); 
148
                                                prov = dataManager.createProvider(storeServices, newparams);
149
                                        }
150
                                }
151
                        } else { //Default provider. This should be Gdal
152
                                ExtensionPointManager extensionPoints = ToolsLocator.getExtensionPointManager();
153
                                ExtensionPoint point = extensionPoints.get("DefaultRasterProvider");
154
                                Extension ext = point.get("reader");
155
                                String provName = ext.getDescription();
156
                                DataStoreParameters newparams = dataManager.createStoreParameters(provName);
157
                                ((FilesystemStoreParameters)newparams).setFile(file); 
158
                                prov = dataManager.createProvider(storeServices, newparams);
159
                        }
160
                }
161

    
162
                if(prov != null && prov instanceof RasterProvider) {
163
                        if(((RasterProvider)prov).isRotated())
164
                                throw new InitializeException("Rotation not supported tiling files", new Throwable());
165

    
166
                        return (DefaultRasterProvider)prov;
167
                }
168
                
169
                return null;
170
        }
171
        
172
        public RasterDataParameters createNotTiledParameters(String id) throws InitializeException, ProviderNotRegisteredException {
173
                DataManagerProviderServices dataManager = (DataManagerProviderServices)DALLocator.getDataManager();
174
                ArrayList<RasterDataParameters> parametersList = createParametersList(id);
175
                for (int i = 0; i < parametersList.size(); i++) {
176
                        DataStoreProvider p = dataManager.createProvider(null, parametersList.get(i));
177
                        if(p instanceof RasterProvider) {
178
                                if(!((RasterProvider)p).isTiled()) 
179
                                        return parametersList.get(i);
180
                        }
181
                }
182
                return null;
183
        }
184

    
185
        @SuppressWarnings("unchecked")
186
        public RasterDataParameters createParameters(String id) {
187
                Iterator it = DALFileLocator.getFilesystemServerExplorerManager().getRegisteredProviders();
188
                while (it.hasNext()) {
189
                        ExtensionPoint.Extension o = (ExtensionPoint.Extension)it.next();
190
                        Class c = o.getExtension();
191
                        try {
192
                                Constructor hazNuevo = c.getConstructor();
193
                                Object [] args2 = {};
194
                                Object obj = hazNuevo.newInstance(args2);
195
                                if(obj instanceof FilesystemServerExplorerProvider) {
196
                                        FilesystemServerExplorerProvider prov = (FilesystemServerExplorerProvider)obj;
197
                                        File file = new File(id);
198
                                        if(prov.accept(file)) {
199
                                                DataManager manager = DALLocator.getDataManager();
200
                                                RasterFileStoreParameters params = null;
201
                                                try {
202
                                                        params = (RasterFileStoreParameters) manager
203
                                                                        .createStoreParameters(prov.getDataStoreProviderName());
204
                                                } catch (InitializeException e) {
205
                                                } catch (ProviderNotRegisteredException e) {
206
                                                }
207
                                                params.setFile(file);
208
                                                return params;
209
                                        }
210
                                } 
211
                        } catch (SecurityException e) {
212
                                System.out.println("Error SecurityException in open");
213
                        } catch (NoSuchMethodException e) {
214
                                System.out.println("Error NoSuchMethodException in open");
215
                        } catch (IllegalArgumentException e) {
216
                                System.out.println("Error IllegalArgumentException in open");
217
                        } catch (InstantiationException e) {
218
                                System.out.println("Error InstantiationException in open");
219
                        } catch (IllegalAccessException e) {
220
                                System.out.println("Error IllegalAccessException in open");
221
                        } catch (InvocationTargetException e) {
222
                                System.out.println("Error opening this image with ");
223
                        }
224
                }
225
                return null;
226
        }
227
        
228
        @SuppressWarnings("unchecked")
229
        public ArrayList<RasterDataParameters> createParametersList(String id) {
230
                ArrayList<RasterDataParameters> list = new ArrayList<RasterDataParameters>();
231
                
232
                Iterator it = DALFileLocator.getFilesystemServerExplorerManager().getRegisteredProviders();
233
                while (it.hasNext()) {
234
                        ExtensionPoint.Extension o = (ExtensionPoint.Extension)it.next();
235
                        Class c = o.getExtension();
236
                        try {
237
                                Constructor hazNuevo = c.getConstructor();
238
                                Object [] args2 = {};
239
                                Object obj = hazNuevo.newInstance(args2);
240
                                if(obj instanceof FilesystemServerExplorerProvider) {
241
                                        FilesystemServerExplorerProvider prov = (FilesystemServerExplorerProvider)obj;
242
                                        File file = new File(id);
243
                                        if(prov.accept(file)) {
244
                                                DataManager manager = DALLocator.getDataManager();
245
                                                RasterFileStoreParameters params = null;
246
                                                try {
247
                                                        params = (RasterFileStoreParameters) manager
248
                                                                        .createStoreParameters(prov.getDataStoreProviderName());
249
                                                } catch (InitializeException e) {
250
                                                } catch (ProviderNotRegisteredException e) {
251
                                                }
252
                                                params.setFile(file);
253
                                                list.add(params);
254
                                        }
255
                                } 
256
                        } catch (SecurityException e) {
257
                                System.out.println("Error SecurityException in open");
258
                        } catch (NoSuchMethodException e) {
259
                                System.out.println("Error NoSuchMethodException in open");
260
                        } catch (IllegalArgumentException e) {
261
                                System.out.println("Error IllegalArgumentException in open");
262
                        } catch (InstantiationException e) {
263
                                System.out.println("Error InstantiationException in open");
264
                        } catch (IllegalAccessException e) {
265
                                System.out.println("Error IllegalAccessException in open");
266
                        } catch (InvocationTargetException e) {
267
                                System.out.println("Error opening this image with ");
268
                        }
269
                }
270
                return list;
271
        }
272
        
273
        public RasterDataParameters createParametersForTiledFiled(String id) {
274
                DataManager manager = DALLocator.getDataManager();
275
                RasterFileStoreParameters params = null;
276
                try {
277
                        params = (RasterFileStoreParameters) manager.createStoreParameters("Tile Store");
278
                } catch (InitializeException e) {
279
                } catch (ProviderNotRegisteredException e) {
280
                }
281
                File file = new File(id);
282
                params.setFile(file);
283
                return params;
284
        }
285
        
286
        @SuppressWarnings("unchecked")
287
        public String[] getDriversExtensions() {
288
                ExtensionPointManager extensionPoints = ToolsLocator.getExtensionPointManager();
289
                ExtensionPoint point = extensionPoints.get("RasterWriter");
290
                return (String[])point.getNames().toArray(new String[0]);
291
        }
292
        
293
        public String[] getRODriversExtensions() {
294
                return getReadOnlyFormatList();
295
        }
296

    
297
        @SuppressWarnings("unchecked")
298
        public ArrayList<String> getExtensionsSupported(int dataType, int bands) throws RasterDriverException {
299
                ExtensionPointManager extensionPoints = ToolsLocator.getExtensionPointManager();
300
                ExtensionPoint point = extensionPoints.get("RasterWriter");
301
                Iterator iterator = point.iterator();
302
                ArrayList<String> result = new ArrayList<String>();
303
                while (iterator.hasNext()) {
304
                        ExtensionPoint.Extension extension = (ExtensionPoint.Extension) iterator.next();
305
                        String ext = extension.getName();
306
                        try {
307
                                if (isSupportedThisFileToWrite(ext, dataType, bands))
308
                                        result.add(ext);
309
                        } catch (SecurityException e) {
310
                                throw new RasterDriverException("Error SecurityException in open");
311
                        }  catch (IllegalArgumentException e) {
312
                                throw new RasterDriverException("Error IllegalArgumentException in open");
313
                        }
314
                }
315
                return result;
316
        }
317

    
318
        @SuppressWarnings("unchecked")
319
        public String[] getWriteDriversType() {
320
                if (fileFeature.size() == 0)
321
                        return null;
322
                String[] list = new String[fileFeature.size()];
323
                Set values = fileFeature.entrySet();
324
                int i = 0;
325
                for (Iterator it = values.iterator(); it.hasNext();) {
326
                        list[i] = ((WriteFileFormatFeatures) ((Map.Entry) it.next()).getValue()).getDriverName();
327
                        i++;
328
                }
329

    
330
                return list;
331
        }
332

    
333
        public String getWriteDriverType(String ext) {
334
                return ((WriteFileFormatFeatures) fileFeature.get(ext)).getDriverName();
335
        }
336

    
337
        public int getWriteNDrivers() {
338
                ExtensionPointManager extensionPoints = ToolsLocator.getExtensionPointManager();
339
                ExtensionPoint point = extensionPoints.get("RasterWriter");
340
                return point.getCount();
341
        }
342

    
343
        public int getWriteNTypes() {
344
                return fileFeature.size();
345
        }
346

    
347
        public boolean isSupportedThisFileToWrite(String ext, int dataType, int bands) {
348
                WriteFileFormatFeatures features = (WriteFileFormatFeatures) fileFeature.get(ext);
349
                if (features == null)
350
                        return false;
351
                int[] bandsSupported = features.getNBandsSupported();
352
                if (bandsSupported[0] != -1 && bandsSupported[0] < bands)
353
                        return false;
354
                int[] dt = features.getDataTypesSupported();
355
                for (int i = 0; i < dt.length; i++)
356
                        if (dataType == dt[i])
357
                                return true;
358
                return false;
359
        }
360
        
361
        /**
362
         * Guarda en el RMF que trata el BlocksManager el valor value usando el serializador que soporta
363
         * la clase class1.
364
         *
365
         * @param blocksManager
366
         * @param class1
367
         * @param value
368
         * @throws RmfSerializerException
369
         */
370
        @SuppressWarnings("unchecked")
371
        public void saveObjectToRmfFile(RmfBlocksManager blocksManager, Class class1, Object value) throws RmfSerializerException {
372
                ClassSerializer serializerObject = getSerializerObject(class1, value);
373

    
374
                if (serializerObject == null)
375
                        throw new RmfSerializerException("No se ha podido encontrar el serializador para el Rmf");
376

    
377
                if (!blocksManager.checkRmf())
378
                        throw new RmfSerializerException("Error al comprobar el fichero Rmf");
379

    
380
                blocksManager.addClient(serializerObject);
381
                try {
382
                        blocksManager.write(true);
383
                } catch (IOException e) {
384
                        throw new RmfSerializerException("Error al escribir el fichero Rmf", e);
385
                }
386
                blocksManager.removeAllClients();
387
        }
388

    
389
        @SuppressWarnings("unchecked")
390
        public void saveObjectToRmfFile(String file, Class class1, Object value) throws RmfSerializerException {
391
                String fileRMF = RasterLocator.getManager().getFileUtils().getNameWithoutExtension(file) + ".rmf";
392
                RmfBlocksManager blocksManager = new RmfBlocksManager(fileRMF);
393
                saveObjectToRmfFile(blocksManager, class1, value);
394
        }
395

    
396
        public void saveObjectToRmfFile(String file, Object value) throws RmfSerializerException {
397
                saveObjectToRmfFile(file, value.getClass(), value);
398
        }
399
        
400
        /**
401
         * Construye un serializador que soporte la clase class1. El constructor se invoca
402
         * con el parametro value.
403
         *
404
         * @param class1
405
         * @param value
406
         * @return
407
         * @throws RmfSerializerException
408
         */
409
        @SuppressWarnings("unchecked")
410
        public ClassSerializer getSerializerObject(Class class1, Object value) throws RmfSerializerException {
411
                try {
412
                        Class[] args = { class1 };
413
                        Constructor constructor = getSerializerClass(class1).getConstructor(args);
414
                        Object[] args2 = { value };
415
                        return (ClassSerializer) constructor.newInstance(args2);
416
                } catch (Exception e) {
417
                        throw new RmfSerializerException("No se ha podido crear el serializador para el Rmf", e);
418
                }
419
        }
420
        
421
        /**
422
         * Gets the serializer which has a constructor with the class selected in the 
423
         * parameters of this function
424
         * @throws RmfSerializerException
425
         */
426
        @SuppressWarnings("unchecked")
427
        private Class getSerializerClass(Class class1)
428
                        throws RmfSerializerException {
429
                ExtensionPointManager extensionPoints = ToolsLocator.getExtensionPointManager();
430
                ExtensionPoint point = extensionPoints.get("Serializer");
431
                Iterator iterator = point.iterator();
432
                while (iterator.hasNext()) {
433
                        ExtensionPoint.Extension extension = (ExtensionPoint.Extension) iterator.next();
434
                        if (extension != null) {
435
                                Class[] args = { class1 };
436
                                Class clase = extension.getExtension();
437
                                try {
438
                                        clase.getConstructor(args);
439
                                        return clase;
440
                                } catch (Exception e) {
441
                                        // Si no encuentra un constructor para esta clase, seguir� buscando en los dem�s elementos
442
                                }
443
                        }
444
                }
445
                throw new RmfSerializerException("No se ha encontrado la clase para el serializador");
446
        }
447
        
448
        @SuppressWarnings("deprecation")
449
        public void exportBufferToFile(Buffer bufResult, 
450
                        double pixelSize, 
451
                        String extension, 
452
                        boolean alphaBand, 
453
                        File file, 
454
                        Extent extent,
455
                        ColorInterpretation colorInterpretation) throws NotSupportedExtensionException, RasterDriverException, ProcessInterruptedException, IOException {
456
                //Escritura en disco del tile
457
                RasterManager rManager = RasterLocator.getManager();
458
                DataServerWriter dataWriter = RasterLocator.getManager().createDataServerWriter();
459
                dataWriter.setBuffer(bufResult, -1);
460
                Params params = rManager.createWriter("_." + extension).getParams();
461
                AffineTransform affineTransform = new AffineTransform(pixelSize, 0, 0, -pixelSize,
462
                                extent.getULX(),
463
                                extent.getULY());
464
                RasterWriter rw = rManager.createWriter(dataWriter, file.getAbsolutePath(),
465
                                bufResult.getBandCount(), affineTransform, bufResult.getWidth(),
466
                                bufResult.getHeight(), bufResult.getDataType(), params, null);
467
                
468
                if(colorInterpretation != null) {
469
                        String[] values = colorInterpretation.getValues();
470
                        if(alphaBand) {
471
                                String[] newValues = values;
472
                                boolean exists = false;
473
                                for (int i = 0; i < values.length; i++) {
474
                                        if(values[i] != null && values[i].compareTo("Alpha") == 0)
475
                                                exists = true;
476
                                }
477
                                if(!exists) {
478
                                        newValues = new String[values.length + 1];
479
                                        for (int i = 0; i < values.length; i++) {
480
                                                newValues[i] = values[i];
481
                                        }
482
                                        newValues[newValues.length - 1] = "Alpha";
483
                                }
484
                                rw.setColorBandsInterpretation(newValues);
485
                        }
486
                        
487
                } else {
488
                        if(alphaBand) {
489
                                String[] ci = new String[bufResult.getBandCount()];
490
                                if(bufResult.getBandCount() == 4) {
491
                                        ci[0] = "Red";
492
                                        ci[1] = "Green";
493
                                        ci[2] = "Blue";
494
                                        ci[3] = "Alpha";
495
                                } else {
496
                                        for (int i = 0; i < bufResult.getBandCount(); i++) {
497
                                                ci[i] = "Gray";
498
                                        }
499
                                }
500
                                rw.setColorBandsInterpretation(ci);
501
                        }
502
                }
503
                rw.dataWrite();
504
                rw.writeClose();
505
        }
506

    
507
        public void addFormat(String ext, Class<?> c) {
508
                getManager().addFormat(ext, c);
509
        }
510

    
511
        public String[] getReadOnlyFormatList() {
512
                return getManager().getReadOnlyFormatList();
513
        }
514

    
515
        public boolean isExtensionSupported(String ext, Class<?> c) {
516
                return getManager().isExtensionSupported(ext, c);
517
        }
518

    
519
        public boolean isExtensionSupported(String ext) {
520
                return getManager().isExtensionSupported(ext);
521
        }
522

    
523
        public void registerFileProvidersTiled(Class<?> provider) {
524
                getManager().registerFileProvidersTiled(provider);
525
        }
526

    
527
        public void registerTileProviderFormats(Class<?> c) {
528
                getManager().registerTileProviderFormats(c);
529
        }
530
}