Statistics
| Revision:

svn-gvsig-desktop / branches / v2_0_0_prep / libraries / libRaster / src / org / gvsig / raster / RasterLibrary.java @ 29786

History | View | Annotate | Download (13.5 KB)

1 11526 bsanchez
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
2
 *
3
 * Copyright (C) 2006 IVER T.I. and Generalitat Valenciana.
4
 *
5
 * This program is free software; you can redistribute it and/or
6
 * modify it under the terms of the GNU General Public License
7
 * as published by the Free Software Foundation; either version 2
8
 * of the License, or (at your option) any later version.
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License
16
 * along with this program; if not, write to the Free Software
17
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
18
 */
19 10960 nacho
package org.gvsig.raster;
20
21
import java.io.File;
22
import java.util.ArrayList;
23
24 22299 bsanchez
import org.gvsig.raster.dataset.serializer.ColorInterpretationRmfSerializer;
25
import org.gvsig.raster.dataset.serializer.GeoInfoRmfSerializer;
26 22337 bsanchez
import org.gvsig.raster.dataset.serializer.GeoPointListRmfSerializer;
27 22299 bsanchez
import org.gvsig.raster.dataset.serializer.ProjectionRmfSerializer;
28
import org.gvsig.raster.dataset.serializer.StatisticsRmfSerializer;
29
import org.gvsig.raster.datastruct.serializer.ColorTableRmfSerializer;
30
import org.gvsig.raster.datastruct.serializer.HistogramRmfSerializer;
31
import org.gvsig.raster.datastruct.serializer.NoDataRmfSerializer;
32 17051 nbrodin
import org.gvsig.raster.grid.filter.bands.ColorBalanceCMYManager;
33
import org.gvsig.raster.grid.filter.bands.ColorBalanceRGBManager;
34 12218 nacho
import org.gvsig.raster.grid.filter.bands.ColorTableListManager;
35 15970 nbrodin
import org.gvsig.raster.grid.filter.bands.HSLToRGBManager;
36
import org.gvsig.raster.grid.filter.bands.RGBToHSLManager;
37 17148 nbrodin
import org.gvsig.raster.grid.filter.bands.ToLumSaManager;
38 12095 dguerrero
import org.gvsig.raster.grid.filter.convolution.ConvolutionListManager;
39 12000 bsanchez
import org.gvsig.raster.grid.filter.correction.MedianListManager;
40 22580 nbrodin
import org.gvsig.raster.grid.filter.correction.ModeManager;
41 11526 bsanchez
import org.gvsig.raster.grid.filter.enhancement.BrightnessContrastListManager;
42 20272 bsanchez
import org.gvsig.raster.grid.filter.enhancement.EnhancementStretchListManager;
43 19556 nbrodin
import org.gvsig.raster.grid.filter.enhancement.EqualizationManager;
44 13385 amunoz
import org.gvsig.raster.grid.filter.pansharp.PanSharpeningListManager;
45 11986 bsanchez
import org.gvsig.raster.grid.filter.segmentation.FirstDerivativeListManager;
46 12333 bsanchez
import org.gvsig.raster.grid.filter.statistics.StatisticsListManager;
47 18960 nbrodin
import org.gvsig.raster.util.PropertyEvent;
48
import org.gvsig.raster.util.PropertyListener;
49 26873 vcaballero
import org.gvsig.tools.ToolsLocator;
50
import org.gvsig.tools.extensionpoint.ExtensionPointManager;
51 10960 nacho
/**
52 11351 nacho
 * Clase principal de la libreria. En ella se definen variables globales con informaci?n
53
 * de uso general, as? como acciones a realizar al arracar la librer?a. El m?todo que
54
 * contiene las acciones de arranque es wakeUp. Las tareas principales de este m?todo
55 12333 bsanchez
 * son de registro de drivers de lectura y escritura y eliminaci?n del directorio de
56 11351 nacho
 * temporales.
57 12333 bsanchez
 *
58 10960 nacho
 * @author Nacho Brodin (nachobrodin@gmail.com)
59
 */
60
public class RasterLibrary {
61 17353 nbrodin
        /**
62
         * Control de librer?a ya inicializada.
63
         */
64
        public static boolean       wakeup = false;
65 16637 nbrodin
        public static ArrayList     writersClassList = new ArrayList();
66 11986 bsanchez
67 10960 nacho
        /**
68
         * En la generaci?n autom?tica de clases esta variable representa el n?mero de
69
         * clases en las que se hace la divisi?n.
70
         */
71 16637 nbrodin
        public static int          defaultNumberOfClasses = 64;
72 12504 bsanchez
73 11207 nacho
        /**
74 12504 bsanchez
         * En la genraci?n de las paletas de color, esta variable representa el n?mero
75
         * de colores en las que se hace la divisi?n para generar la paleta nueva.
76
         * Con esto conseguimos velocidad de procesamiento. Cuanto menor sea, peor
77
         * ser? la calidad representada de la imagen.
78
         */
79 16637 nbrodin
        public static int          defaultNumberOfColors = 256;
80 12504 bsanchez
        /**
81 12333 bsanchez
         * Tama?o de bloque en los procesos que recorren un raster completo a base de ventanas con recorrido
82
         * descendente. Esta variable indica la altura de dicho bloque. Por lo tanto cada bloque ser? de
83
         * raster.width X blockHeight. Tipicamente recorridos de este tipo se usan para el calculo de estad?sticas,
84
         * histogramas, salvado a raster, etc... Es importante para el buen funcionamiento que este bloque sea
85 11386 nacho
         * potencia de dos.
86 11207 nacho
         */
87 16637 nbrodin
        public static int          blockHeight = 512;
88 11986 bsanchez
89 10960 nacho
        //*************CACHE*******************
90
        /**
91 12333 bsanchez
         * Tama?o aproximado de cach? en Megas. Si este valor es alto cabr?n muchas p?ginas en memoria
92 10960 nacho
         * a la vez y si es bajo cabr?n pocas. Hay que tener en cuenta que al instanciar se convertira en bytes
93
         * para su mejor tratamiento. Al llamar al constructor esta variable contendr? el tama?o exacto
94
         * de la cache en bytes. El tama?o aqu? especificado es aproximado. Este variar? dependiendo de los
95
         * par?metros del raster a cachear ya que las p?ginas deben tener una altura potencia de 2.
96
         */
97 18960 nbrodin
        public static long          cacheSize = 25;
98 10960 nacho
        /**
99
         * Tama?o m?ximo de la p?gina en Megas. Hay que tener en cuenta que al instanciar se convertira en bytes
100
         * para su mejor tratamiento. Al llamar al constructor esta variable contendr? el tama?o exacto
101
         * de la p?gina en bytes
102
         */
103 18960 nbrodin
        public static double        pageSize = 4;
104 10960 nacho
        /**
105
         * N?mero de p?ginas que tiene cada conjunto de cach?
106
         */
107 18960 nbrodin
        public static int           pagsPerGroup = 5;
108 11986 bsanchez
109 10960 nacho
        //*************PATHS*******************
110 11986 bsanchez
111 10960 nacho
        /**
112
         * Directorio temporal para la cach?. Si gastamos el mismo que andami este se ocupar? de gestionar su
113
         * destrucci?n al cerrar gvSIG.
114
         */
115 27699 nbrodin
        private static String tempCacheDirectoryPath = System
116
                        .getProperty("java.io.tmpdir")
117
                        + File.separator + "tmp-andami";
118 10960 nacho
        /**
119 11483 nacho
         * Ruta o rutas donde busca jars con clases que incorporen elementos nuevos que extiendan
120
         * otros ya existentes. Estos pueden ser drivers o filtros.
121
         */
122 18960 nbrodin
        public static String[]       pathExtensions = {"." + File.separator};
123 17040 bsanchez
124 11483 nacho
        /**
125 17660 bsanchez
         * Valor noData por defecto para la librer?a. En caso de no tener un valor asociado
126 16637 nbrodin
         * al raster se usar? este.
127
         */
128 18960 nbrodin
        public static double         defaultNoDataValue = -99999;
129
        /**
130
         * Contador global de las capas generadas para raster
131
         */
132
        private static int           layerCount = 1;
133
        private static ArrayList     propetiesListeners = new ArrayList();
134 17040 bsanchez
135 20430 bsanchez
        public static final int NODATATYPE_DISABLED = 0;
136
        public static final int NODATATYPE_LAYER    = 1;
137
        public static final int NODATATYPE_USER     = 2;
138 16637 nbrodin
        /**
139 10960 nacho
         * Ejecuta las acciones necesarias para arrancar la librer?a.
140
         */
141 11527 bsanchez
        public static void wakeUp() {
142 22299 bsanchez
                if (wakeup)
143 17353 nbrodin
                        return;
144 22299 bsanchez
145 28498 nbrodin
                ExtensionPointManager extensionPoints = ToolsLocator.getExtensionPointManager();
146 22299 bsanchez
                // Punto de extensi?n para registro de drivers de lectura
147 28498 nbrodin
                extensionPoints.add("RasterReader", "Raster Reader Classes");
148 22422 bsanchez
                // Punto de extensi?n para registro de drivers de escritura
149 28498 nbrodin
                extensionPoints.add("RasterWriter", "Raster Writer Classes");
150 22422 bsanchez
                // Punto de extensi?n de los filtros
151 28498 nbrodin
                extensionPoints.add("RasterFilter", "Raster Filter Classes");
152
                // Punto de extensi?n de los serializadores
153
                extensionPoints.add("Serializer", "Raster Serializer Classes");
154
                // Registro de clases por defecto
155
                extensionPoints.add("DefaultDriver", "Default Raster Drivers");
156 11710 bsanchez
157 22422 bsanchez
                // Invoca las llamadas est?ticas de cada clase para registrarlas en los puntos de extensi?n
158 12122 bsanchez
                BrightnessContrastListManager.register();
159
                FirstDerivativeListManager.register();
160
                MedianListManager.register();
161
                ConvolutionListManager.register();
162 12218 nacho
                ColorTableListManager.register();
163 12333 bsanchez
                StatisticsListManager.register();
164 13385 amunoz
                PanSharpeningListManager.register();
165 15970 nbrodin
                RGBToHSLManager.register();
166
                HSLToRGBManager.register();
167 17051 nbrodin
                ColorBalanceCMYManager.register();
168
                ColorBalanceRGBManager.register();
169 17148 nbrodin
                ToLumSaManager.register();
170 19337 nbrodin
                EnhancementStretchListManager.register();
171 19556 nbrodin
                EqualizationManager.register();
172 22580 nbrodin
                ModeManager.register();
173 22299 bsanchez
                // EnhancementListManager.register();
174
                // RGBToCMYKManager.register();
175 11710 bsanchez
                // Registrar los nuevos filtros del directorio
176 22299 bsanchez
                // registerClasses();
177 11986 bsanchez
178 22299 bsanchez
                // Registro de serializadores
179
                ColorInterpretationRmfSerializer.register();
180
                GeoInfoRmfSerializer.register();
181 22337 bsanchez
                GeoPointListRmfSerializer.register();
182 22299 bsanchez
                ProjectionRmfSerializer.register();
183
                StatisticsRmfSerializer.register();
184
                ColorTableRmfSerializer.register();
185
                HistogramRmfSerializer.register();
186
                NoDataRmfSerializer.register();
187
188
                // Limpiamos el directorio temporal
189 10960 nacho
                RasterLibrary.cleanUpTempFiles();
190 28174 nbrodin
                // Crea el directorio de temporales
191
                getTemporalPath();
192 17353 nbrodin
                wakeup = true;
193 10960 nacho
        }
194 11986 bsanchez
195 10960 nacho
        /**
196 11526 bsanchez
         * Elimina los ficheros del directorio temporal. Realizamos esta acci?n al
197
         * levantar la librer?a.
198 10960 nacho
         */
199 11526 bsanchez
        public static void cleanUpTempFiles() {
200
                try {
201
                        File tempDirectory = new File(tempCacheDirectoryPath);
202 10960 nacho
203 11526 bsanchez
                        File[] files = tempDirectory.listFiles();
204 26932 jmvivo
                        if (files != null)
205 11526 bsanchez
                                for (int i = 0; i < files.length; i++) {
206
                                        // s?lo por si en un futuro se necesitan crear directorios temporales
207
                                        if (files[i].isDirectory())
208
                                                deleteDirectory(files[i]);
209
                                        files[i].delete();
210
                                }
211
                        tempDirectory.delete();
212
                } catch (Exception e) {
213
                }
214
        }
215 10960 nacho
216 11526 bsanchez
        /**
217
         * Recursive directory delete.
218
         * @param f
219
         */
220
        private static void deleteDirectory(File f) {
221
                File[] files = f.listFiles();
222
                for (int i = 0; i < files.length; i++) {
223
                        if (files[i].isDirectory())
224
                                deleteDirectory(files[i]);
225
                        files[i].delete();
226
                }
227
        }
228 26873 vcaballero
229 18960 nbrodin
        //******* Servicio de nombres de capas ?nicos **************
230 26873 vcaballero
231 18960 nbrodin
        /**
232
         * La gesti?n de nombres ?nicos en la generaci?n de capas se lleva de forma
233
         * autom?tica. Cuando alguien crea una capa nueva, si esta no tiene nombre especifico,
234
         * obtiene su nombre mediante este m?todo. La siguiente vez que se llame dar? un nombre
235
         * distinto. El nombre de la capa ser? NewLayer_ seguido de un contador de actualizaci?n
236
         * autom?tica cada vez que se usa.
237
         * @return Nombre ?nico para la capa.
238
         */
239
        public static String usesOnlyLayerName() {
240
                String oldValue = getOnlyLayerName();
241
                String newValue = "NewLayer_" + (++RasterLibrary.layerCount);
242 26932 jmvivo
                for (int i = 0; i < propetiesListeners.size(); i++)
243 26873 vcaballero
                        if(propetiesListeners.get(i) instanceof PropertyListener)
244 18960 nbrodin
                                ((PropertyListener)propetiesListeners.get(i)).actionValueChanged(new PropertyEvent(oldValue, "NewLayer", newValue, oldValue));
245
                return newValue;
246
        }
247 26873 vcaballero
248 18960 nbrodin
        /**
249
         * Obtiene el nombre ?nico de la siguiente capa sin actualizar el contador. Es
250
         * solo para consulta. La siguiente vez que se llama a getOnlyLayerName o usesOnlyLayerName
251 26873 vcaballero
         * devolver? el mismo nomnbre.
252 18960 nbrodin
         * @return Nombre ?nico para la capa.
253
         */
254
        public static String getOnlyLayerName() {
255
                return "NewLayer_" + RasterLibrary.layerCount;
256
        }
257 26873 vcaballero
258 18960 nbrodin
        /**
259
         * A?adir un listener a la lista de eventos
260
         * @param listener
261
         */
262
        public static void addOnlyLayerNameListener(PropertyListener listener) {
263
                if (!propetiesListeners.contains(listener))
264
                        propetiesListeners.add(listener);
265
        }
266 26873 vcaballero
267 18960 nbrodin
        /**
268
         * Elimina un listener de la lista de eventos
269
         * @param listener
270
         */
271
        public static void removeOnlyLayerNameListener(PropertyListener listener) {
272
                for (int i = 0; i < propetiesListeners.size(); i++)
273
                        if(propetiesListeners.get(i) == listener)
274
                                propetiesListeners.remove(i);
275
        }
276 22422 bsanchez
277 18960 nbrodin
        //******* End: Servicio de nombres de capas ?nicos **************
278 26873 vcaballero
279 22422 bsanchez
        /**
280
         * Esta funci?n crea el directorio para temporales y devuelve el manejador
281
         * del directorio
282
         * @return
283
         */
284
        static public File getTemporalFile() {
285
                File tempDirectory = new File(tempCacheDirectoryPath);
286
                if (!tempDirectory.exists())
287
                        tempDirectory.mkdir();
288
                return tempDirectory;
289
        }
290 10960 nacho
291 11526 bsanchez
        /**
292 22422 bsanchez
         * Esta funci?n crea el directorio para temporales y devuelve la ruta de este
293
         * @return
294
         */
295
        static public String getTemporalPath() {
296
                return getTemporalFile().getAbsolutePath();
297
        }
298
299
/*
300
        private static Hashtable     clasesJar = new Hashtable();
301

302
         *
303 11526 bsanchez
         * Esta funci?n buscar? todos los jars en las rutas de pathExtensions y
304
         * registrar? todos las clases registrables. En este momento hay posibilidad
305
         * de registro de drivers y filtros.
306 22422 bsanchez
         *
307 14134 nbrodin
        private static void registerClasses() throws Exception {
308
                RasterClassLoader loader = new RasterClassLoader();
309 17040 bsanchez

310 14134 nbrodin
                //Cargamos sobre jarList todos los File correspondientes a los jar contenidos en pathExtensions
311
                File[] jarList = null;
312 11526 bsanchez
                for (int iPath = 0; iPath < pathExtensions.length; iPath++) {
313 14134 nbrodin
                        File directory = new File(pathExtensions[iPath]);
314
                        if (directory.isDirectory() && directory.canRead()) {
315
                                jarList = directory.listFiles(new FileFilter() {
316
                                                                                                public boolean accept(File pathname) {
317
                                                                                                                return (pathname.getName().toUpperCase().endsWith(".JAR"));
318
                                                                                                }
319 17040 bsanchez
                                                                                                });
320 11505 nacho
                        }
321
                }
322 17040 bsanchez

323 14134 nbrodin
                //Creamos las URL
324
                URL[] urls = new URL[jarList.length];
325

326
                for (int j = 0; j < jarList.length; j++) {
327
                        try {
328
                                urls[j] = new URL("file:" + jarList[j]);
329
                        } catch (MalformedURLException e) {
330
                                Logger.getLogger(RasterLibrary.class.getName()).debug("Error formando la URL, jar incorrecto", e);
331
                        }
332
                }
333 17040 bsanchez

334 14134 nbrodin
                //Comprobamos que no haya clases repetidas
335
                ZipFile[] jarFiles = new ZipFile[jarList.length];
336
                for (int i = 0; i < jarList.length; i++) {
337
                        try {
338
                                jarFiles[i] = new ZipFile(jarList[i].getPath());
339

340
                                Enumeration entradas = jarFiles[i].entries();
341

342
                                while (entradas.hasMoreElements()) {
343
                                        ZipEntry file = (ZipEntry) entradas.nextElement();
344
                                        String fileName = file.getName();
345

346 17040 bsanchez
                                        if (!fileName.toLowerCase().endsWith(".class"))
347 14134 nbrodin
                                                continue;
348 17040 bsanchez

349 14134 nbrodin
                                        fileName = fileName.substring(0, fileName.length() - 6).replace('/', '.');
350

351
                                        if (clasesJar.get(fileName) != null) {
352
                                                throw new JarException("CLASES REPETIDAS: " + fileName + " " + " en " +
353
                                                                jarFiles[i].getName() + " y en " + ((ZipFile) clasesJar.get(fileName)).getName());
354
                                        }
355

356
                                        clasesJar.put(fileName, jarFiles[i]);
357
                                }
358
                        } catch (ZipException e) {
359
                                throw new IOException(" Jar: " + jarList[i].getPath() + ": " + jarFiles[i]);
360
                        } catch (IOException e) {
361
                                throw e;
362
                        }
363
                }
364 11526 bsanchez
        }
365 22422 bsanchez
*/
366 10960 nacho
}