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

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.jgdal.GdalWarp;
57
import org.gvsig.raster.impl.provider.DefaultRasterProvider;
58
import org.gvsig.raster.impl.provider.RasterProvider;
59
import org.gvsig.raster.impl.store.WriteFileFormatFeatures;
60
import org.gvsig.raster.impl.store.rmf.ClassSerializer;
61
import org.gvsig.raster.impl.store.rmf.RmfBlocksManager;
62
import org.gvsig.raster.impl.store.writer.DefaultRasterWriter;
63
import org.gvsig.tools.ToolsLocator;
64
import org.gvsig.tools.extensionpoint.ExtensionPoint;
65
import org.gvsig.tools.extensionpoint.ExtensionPointManager;
66
import org.gvsig.tools.extensionpoint.ExtensionPoint.Extension;
67

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

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

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

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

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

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

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

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

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

    
320
                return list;
321
        }
322

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

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

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

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

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

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

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

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

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