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

History | View | Annotate | Download (18 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.io.File;
25
import java.io.IOException;
26
import java.lang.reflect.Constructor;
27
import java.lang.reflect.InvocationTargetException;
28
import java.util.ArrayList;
29
import java.util.Iterator;
30
import java.util.Map;
31
import java.util.Set;
32
import java.util.TreeMap;
33

    
34
import org.gvsig.fmap.dal.DALFileLocator;
35
import org.gvsig.fmap.dal.DALLocator;
36
import org.gvsig.fmap.dal.DataManager;
37
import org.gvsig.fmap.dal.DataStoreParameters;
38
import org.gvsig.fmap.dal.coverage.RasterLocator;
39
import org.gvsig.fmap.dal.coverage.exception.FileNotSupportedException;
40
import org.gvsig.fmap.dal.coverage.exception.NotSupportedExtensionException;
41
import org.gvsig.fmap.dal.coverage.exception.RasterDriverException;
42
import org.gvsig.fmap.dal.coverage.exception.RmfSerializerException;
43
import org.gvsig.fmap.dal.coverage.store.parameter.RasterDataParameters;
44
import org.gvsig.fmap.dal.coverage.store.parameter.RasterFileStoreParameters;
45
import org.gvsig.fmap.dal.coverage.util.ProviderServices;
46
import org.gvsig.fmap.dal.exception.InitializeException;
47
import org.gvsig.fmap.dal.exception.ProviderNotRegisteredException;
48
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
49
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorer;
50
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorerParameters;
51
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemStoreParameters;
52
import org.gvsig.fmap.dal.serverexplorer.filesystem.spi.FilesystemServerExplorerProvider;
53
import org.gvsig.fmap.dal.spi.DataManagerProviderServices;
54
import org.gvsig.fmap.dal.spi.DataStoreProvider;
55
import org.gvsig.fmap.dal.spi.DataStoreProviderServices;
56
import org.gvsig.raster.impl.provider.DefaultRasterProvider;
57
import org.gvsig.raster.impl.provider.RasterProvider;
58
import org.gvsig.raster.impl.store.WriteFileFormatFeatures;
59
import org.gvsig.raster.impl.store.rmf.ClassSerializer;
60
import org.gvsig.raster.impl.store.rmf.RmfBlocksManager;
61
import org.gvsig.raster.impl.store.writer.DefaultRasterWriter;
62
import org.gvsig.tools.ToolsLocator;
63
import org.gvsig.tools.extensionpoint.ExtensionPoint;
64
import org.gvsig.tools.extensionpoint.ExtensionPointManager;
65
import org.gvsig.tools.extensionpoint.ExtensionPoint.Extension;
66

    
67
import es.gva.cit.jgdal.GdalWarp;
68

    
69
/**
70
 * 
71
 * 31/10/2007
72
 * @author Nacho Brodin nachobrodin@gmail.com
73
 */
74
public class DefaultProviderServices implements ProviderServices {
75
        public TreeMap<String, WriteFileFormatFeatures>
76
                                  fileFeature    = new TreeMap<String, WriteFileFormatFeatures>();
77

    
78
        public TreeMap<String, WriteFileFormatFeatures> getFileFeature() {
79
                return fileFeature;
80
        }
81
        
82
        /**
83
         * Loads the specific provider to download data
84
         * @param file
85
         * @return
86
         * @throws NotSupportedExtensionException
87
         * @throws FileNotSupportedException 
88
         */
89
        public static DefaultRasterProvider loadProvider(File file) throws ProviderNotRegisteredException, InitializeException {
90
                DataManagerProviderServices dataManager = (DataManagerProviderServices)DALLocator.getDataManager();
91
                DataStoreProviderServices storeServices = null;
92
                DataStoreProvider prov = null;
93

    
94
                if(file != null) {
95
                        //We have to locate a provider's name which manages the selected file
96
                        //A FilesystemServerExplorer will give a getProviderNames service
97
                        FilesystemServerExplorerParameters paramsExplorer = (FilesystemServerExplorerParameters)dataManager.createServerExplorerParameters(FilesystemServerExplorer.NAME);
98
                        FilesystemServerExplorer serverExplorer = null;
99
                        try {
100
                                paramsExplorer.setRoot(File.separator);
101
                                serverExplorer = (FilesystemServerExplorer)dataManager.openServerExplorer(FilesystemServerExplorer.NAME, paramsExplorer);
102
                        } catch (ValidateDataParametersException e) {
103
                                throw new InitializeException(e);
104
                        }
105

    
106
                        //Gets the list of provider's name to manage the file
107
                        ArrayList<String> provNameList = serverExplorer.getProviderNameList(file);
108
                        if(provNameList.size() > 0) {
109
                                for (int i = 0; i < provNameList.size(); i++) {
110
                                        //Gets the first provider what is not a TileProvider
111
                                        if(provNameList.get(i).compareTo("Tile Store") != 0) {
112
                                                DataStoreParameters newparams = dataManager.createStoreParameters(provNameList.get(i));
113
                                                ((FilesystemStoreParameters)newparams).setFile(file); 
114
                                                prov = dataManager.createProvider(storeServices, newparams);
115
                                        }
116
                                }
117
                        } else { //Default provider. This should be Gdal
118
                                ExtensionPointManager extensionPoints = ToolsLocator.getExtensionPointManager();
119
                                ExtensionPoint point = extensionPoints.get("DefaultDriver");
120
                                Extension ext = point.get("reader");
121
                                String provName = ext.getDescription();
122
                                DataStoreParameters newparams = dataManager.createStoreParameters(provName);
123
                                ((FilesystemStoreParameters)newparams).setFile(file); 
124
                                prov = dataManager.createProvider(storeServices, newparams);
125
                        }
126
                }
127

    
128
                if(prov != null && prov instanceof RasterProvider) {
129
                        if(((RasterProvider)prov).isRotated())
130
                                throw new InitializeException("Rotation not supported tiling files", new Throwable());
131

    
132
                        return (DefaultRasterProvider)prov;
133
                }
134
                
135
                return null;
136
        }
137
        
138
        /*
139
         * (non-Javadoc)
140
         * @see org.gvsig.fmap.dal.coverage.util.ProviderServices#createNotTiledParameters(java.lang.String)
141
         */
142
        public RasterDataParameters createNotTiledParameters(String id) throws InitializeException, ProviderNotRegisteredException {
143
                DataManagerProviderServices dataManager = (DataManagerProviderServices)DALLocator.getDataManager();
144
                ArrayList<RasterDataParameters> parametersList = createParametersList(id);
145
                for (int i = 0; i < parametersList.size(); i++) {
146
                        DataStoreProvider p = dataManager.createProvider(null, parametersList.get(i));
147
                        if(p instanceof RasterProvider) {
148
                                if(!((RasterProvider)p).isTiled()) 
149
                                        return parametersList.get(i);
150
                        }
151
                }
152
                return null;
153
        }
154

    
155
        /*
156
         * (non-Javadoc)
157
         * @see org.gvsig.fmap.dal.coverage.util.ProviderServices#createParameters(java.lang.String)
158
         */
159
        @SuppressWarnings("unchecked")
160
        public RasterDataParameters createParameters(String id) {
161
                Iterator it = DALFileLocator.getFilesystemServerExplorerManager().getRegisteredProviders();
162
                while (it.hasNext()) {
163
                        ExtensionPoint.Extension o = (ExtensionPoint.Extension)it.next();
164
                        Class c = o.getExtension();
165
                        try {
166
                                Constructor hazNuevo = c.getConstructor();
167
                                Object [] args2 = {};
168
                                Object obj = hazNuevo.newInstance(args2);
169
                                if(obj instanceof FilesystemServerExplorerProvider) {
170
                                        FilesystemServerExplorerProvider prov = (FilesystemServerExplorerProvider)obj;
171
                                        File file = new File(id);
172
                                        if(prov.accept(file)) {
173
                                                DataManager manager = DALLocator.getDataManager();
174
                                                RasterFileStoreParameters params = null;
175
                                                try {
176
                                                        params = (RasterFileStoreParameters) manager
177
                                                                        .createStoreParameters(prov.getDataStoreProviderName());
178
                                                } catch (InitializeException e) {
179
                                                } catch (ProviderNotRegisteredException e) {
180
                                                }
181
                                                params.setFile(file);
182
                                                return params;
183
                                        }
184
                                } 
185
                        } catch (SecurityException e) {
186
                                System.out.println("Error SecurityException in open");
187
                        } catch (NoSuchMethodException e) {
188
                                System.out.println("Error NoSuchMethodException in open");
189
                        } catch (IllegalArgumentException e) {
190
                                System.out.println("Error IllegalArgumentException in open");
191
                        } catch (InstantiationException e) {
192
                                System.out.println("Error InstantiationException in open");
193
                        } catch (IllegalAccessException e) {
194
                                System.out.println("Error IllegalAccessException in open");
195
                        } catch (InvocationTargetException e) {
196
                                System.out.println("Error opening this image with ");
197
                        }
198
                }
199
                return null;
200
        }
201
        
202
        /*
203
         * (non-Javadoc)
204
         * @see org.gvsig.fmap.dal.coverage.util.ProviderServices#createParametersList(java.lang.String)
205
         */
206
        @SuppressWarnings("unchecked")
207
        public ArrayList<RasterDataParameters> createParametersList(String id) {
208
                ArrayList<RasterDataParameters> list = new ArrayList<RasterDataParameters>();
209
                
210
                Iterator it = DALFileLocator.getFilesystemServerExplorerManager().getRegisteredProviders();
211
                while (it.hasNext()) {
212
                        ExtensionPoint.Extension o = (ExtensionPoint.Extension)it.next();
213
                        Class c = o.getExtension();
214
                        try {
215
                                Constructor hazNuevo = c.getConstructor();
216
                                Object [] args2 = {};
217
                                Object obj = hazNuevo.newInstance(args2);
218
                                if(obj instanceof FilesystemServerExplorerProvider) {
219
                                        FilesystemServerExplorerProvider prov = (FilesystemServerExplorerProvider)obj;
220
                                        File file = new File(id);
221
                                        if(prov.accept(file)) {
222
                                                DataManager manager = DALLocator.getDataManager();
223
                                                RasterFileStoreParameters params = null;
224
                                                try {
225
                                                        params = (RasterFileStoreParameters) manager
226
                                                                        .createStoreParameters(prov.getDataStoreProviderName());
227
                                                } catch (InitializeException e) {
228
                                                } catch (ProviderNotRegisteredException e) {
229
                                                }
230
                                                params.setFile(file);
231
                                                list.add(params);
232
                                        }
233
                                } 
234
                        } catch (SecurityException e) {
235
                                System.out.println("Error SecurityException in open");
236
                        } catch (NoSuchMethodException e) {
237
                                System.out.println("Error NoSuchMethodException in open");
238
                        } catch (IllegalArgumentException e) {
239
                                System.out.println("Error IllegalArgumentException in open");
240
                        } catch (InstantiationException e) {
241
                                System.out.println("Error InstantiationException in open");
242
                        } catch (IllegalAccessException e) {
243
                                System.out.println("Error IllegalAccessException in open");
244
                        } catch (InvocationTargetException e) {
245
                                System.out.println("Error opening this image with ");
246
                        }
247
                }
248
                return list;
249
        }
250
        
251
        /*
252
         * (non-Javadoc)
253
         * @see org.gvsig.fmap.dal.coverage.util.ProviderServices#getDriversExtensions()
254
         */
255
        @SuppressWarnings("unchecked")
256
        public String[] getDriversExtensions() {
257
                ExtensionPointManager extensionPoints = ToolsLocator.getExtensionPointManager();
258
                ExtensionPoint point = extensionPoints.get("RasterWriter");
259
                return (String[])point.getNames().toArray(new String[0]);
260
        }
261

    
262
        /*
263
         * (non-Javadoc)
264
         * @see org.gvsig.fmap.dal.coverage.util.ProviderServices#getExtensionsSupported(int, int, boolean)
265
         */
266
        @SuppressWarnings("unchecked")
267
        public ArrayList<String> getExtensionsSupported(int dataType, int bands, boolean reprojectable) throws RasterDriverException {
268
                ExtensionPointManager extensionPoints = ToolsLocator.getExtensionPointManager();
269
                ExtensionPoint point = extensionPoints.get("RasterWriter");
270
                Iterator iterator = point.iterator();
271
                ArrayList<String> result = new ArrayList<String>();
272
                while (iterator.hasNext()) {
273
                        ExtensionPoint.Extension extension = (ExtensionPoint.Extension) iterator
274
                                        .next();
275
                        String ext = extension.getName();
276
                        Class writerClass = extension.getExtension();
277
                        Class[] args = { String.class };
278
                        try {
279
                                Constructor hazNuevo = writerClass.getConstructor(args);
280
                                Object[] args2 = { ext };
281
                                DefaultRasterWriter grw = (DefaultRasterWriter) hazNuevo.newInstance(args2);
282
                                if (isSupportedThisFileToWrite(ext, dataType, bands))
283
                                        if (reprojectable) {
284
                                                if (GdalWarp.getDrivers().contains(grw.getDriverName()))
285
                                                        result.add(ext);
286
                                        } else
287
                                                result.add(ext);
288
                        } catch (SecurityException e) {
289
                                throw new RasterDriverException("Error SecurityException in open");
290
                        } catch (NoSuchMethodException e) {
291
                                throw new RasterDriverException("Error NoSuchMethodException in open");
292
                        } catch (IllegalArgumentException e) {
293
                                throw new RasterDriverException("Error IllegalArgumentException in open");
294
                        } catch (InstantiationException e) {
295
                                throw new RasterDriverException("Error InstantiationException in open");
296
                        } catch (IllegalAccessException e) {
297
                                throw new RasterDriverException("Error IllegalAccessException in open");
298
                        } catch (InvocationTargetException e) {
299
                                throw new RasterDriverException("Error in open");
300
                        }
301
                }
302
                return result;
303
        }
304

    
305
        /*
306
         * (non-Javadoc)
307
         * @see org.gvsig.fmap.dal.coverage.util.ProviderServices#getWriteDriversType()
308
         */
309
        @SuppressWarnings("unchecked")
310
        public String[] getWriteDriversType() {
311
                if (fileFeature.size() == 0)
312
                        return null;
313
                String[] list = new String[fileFeature.size()];
314
                Set values = fileFeature.entrySet();
315
                int i = 0;
316
                for (Iterator it = values.iterator(); it.hasNext();) {
317
                        list[i] = ((WriteFileFormatFeatures) ((Map.Entry) it.next()).getValue()).getDriverName();
318
                        i++;
319
                }
320

    
321
                return list;
322
        }
323

    
324
        /*
325
         * (non-Javadoc)
326
         * @see org.gvsig.fmap.dal.coverage.util.ProviderServices#getWriteDriverType(java.lang.String)
327
         */
328
        public String getWriteDriverType(String ext) {
329
                return ((WriteFileFormatFeatures) fileFeature.get(ext)).getDriverName();
330
        }
331

    
332
        /*
333
         * (non-Javadoc)
334
         * @see org.gvsig.fmap.dal.coverage.util.ProviderServices#getWriteNDrivers()
335
         */
336
        public int getWriteNDrivers() {
337
                ExtensionPointManager extensionPoints = ToolsLocator.getExtensionPointManager();
338
                ExtensionPoint point = extensionPoints.get("RasterWriter");
339
                return point.getCount();
340
        }
341

    
342
        /*
343
         * (non-Javadoc)
344
         * @see org.gvsig.fmap.dal.coverage.util.ProviderServices#getWriteNTypes()
345
         */
346
        public int getWriteNTypes() {
347
                return fileFeature.size();
348
        }
349
        
350

    
351
        /*
352
         * (non-Javadoc)
353
         * @see org.gvsig.fmap.dal.coverage.util.ProviderServices#isSupportedThisFileToWrite(java.lang.String, int, int)
354
         */
355
        public boolean isSupportedThisFileToWrite(String ext, int dataType, int bands) {
356
                WriteFileFormatFeatures features = (WriteFileFormatFeatures) fileFeature.get(ext);
357
                if (features == null)
358
                        return false;
359
                int[] bandsSupported = features.getNBandsSupported();
360
                if (bandsSupported[0] != -1 && bandsSupported[0] < bands)
361
                        return false;
362
                int[] dt = features.getDataTypesSupported();
363
                for (int i = 0; i < dt.length; i++)
364
                        if (dataType == dt[i])
365
                                return true;
366
                return false;
367
        }
368
        
369
        /**
370
         * Guarda en el RMF que trata el BlocksManager el valor value usando el serializador que soporta
371
         * la clase class1.
372
         *
373
         * @param blocksManager
374
         * @param class1
375
         * @param value
376
         * @throws RmfSerializerException
377
         */
378
        @SuppressWarnings("unchecked")
379
        public void saveObjectToRmfFile(RmfBlocksManager blocksManager, Class class1, Object value) throws RmfSerializerException {
380
                ClassSerializer serializerObject = getSerializerObject(class1, value);
381

    
382
                if (serializerObject == null)
383
                        throw new RmfSerializerException("No se ha podido encontrar el serializador para el Rmf");
384

    
385
                if (!blocksManager.checkRmf())
386
                        throw new RmfSerializerException("Error al comprobar el fichero Rmf");
387

    
388
                blocksManager.addClient(serializerObject);
389
                try {
390
                        blocksManager.write(true);
391
                } catch (IOException e) {
392
                        throw new RmfSerializerException("Error al escribir el fichero Rmf", e);
393
                }
394
                blocksManager.removeAllClients();
395
        }
396

    
397
        /*
398
         * (non-Javadoc)
399
         * @see org.gvsig.fmap.dal.coverage.util.ProviderServices#saveObjectToRmfFile(java.lang.String, java.lang.Class, java.lang.Object)
400
         */
401
        @SuppressWarnings("unchecked")
402
        public void saveObjectToRmfFile(String file, Class class1, Object value) throws RmfSerializerException {
403
                String fileRMF = RasterLocator.getManager().getFileUtils().getNameWithoutExtension(file) + ".rmf";
404
                RmfBlocksManager blocksManager = new RmfBlocksManager(fileRMF);
405
                saveObjectToRmfFile(blocksManager, class1, value);
406
        }
407

    
408
        /*
409
         * (non-Javadoc)
410
         * @see org.gvsig.fmap.dal.coverage.util.ProviderServices#saveObjectToRmfFile(java.lang.String, java.lang.Object)
411
         */
412
        public void saveObjectToRmfFile(String file, Object value) throws RmfSerializerException {
413
                saveObjectToRmfFile(file, value.getClass(), value);
414
        }
415
        
416
        /**
417
         * Construye un serializador que soporte la clase class1. El constructor se invoca
418
         * con el parametro value.
419
         *
420
         * @param class1
421
         * @param value
422
         * @return
423
         * @throws RmfSerializerException
424
         */
425
        @SuppressWarnings("unchecked")
426
        public ClassSerializer getSerializerObject(Class class1, Object value) throws RmfSerializerException {
427
                try {
428
                        Class[] args = { class1 };
429
                        Constructor constructor = getSerializerClass(class1).getConstructor(args);
430
                        Object[] args2 = { value };
431
                        return (ClassSerializer) constructor.newInstance(args2);
432
                } catch (Exception e) {
433
                        throw new RmfSerializerException("No se ha podido crear el serializador para el Rmf", e);
434
                }
435
        }
436
        
437
        /**
438
         * Devuelve un serializador que tenga un constructor con la clase pasada por parametro
439
         * @throws RmfSerializerException
440
         */
441
        @SuppressWarnings("unchecked")
442
        private Class getSerializerClass(Class class1)
443
                        throws RmfSerializerException {
444
                ExtensionPointManager extensionPoints = ToolsLocator.getExtensionPointManager();
445
                ExtensionPoint point = extensionPoints.get("Serializer");
446
                Iterator iterator = point.iterator();
447
                while (iterator.hasNext()) {
448
                        ExtensionPoint.Extension extension = (ExtensionPoint.Extension) iterator.next();
449
                        if (extension != null) {
450
                                Class[] args = { class1 };
451
                                Class clase = extension.getExtension();
452
                                try {
453
                                        clase.getConstructor(args);
454
                                        return clase;
455
                                } catch (Exception e) {
456
                                        // Si no encuentra un constructor para esta clase, seguir? buscando en los dem?s elementos
457
                                }
458
                        }
459
                }
460
                throw new RmfSerializerException("No se ha encontrado la clase para el serializador");
461
        }
462
}