Statistics
| Revision:

svn-gvsig-desktop / trunk / libraries / libRaster / src / org / gvsig / raster / grid / filter / RasterFilterList.java @ 21386

History | View | Annotate | Download (12.3 KB)

1
/* 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
package org.gvsig.raster.grid.filter;
20

    
21
import java.util.ArrayList;
22
import java.util.Stack;
23
import java.util.TreeMap;
24

    
25
import org.gvsig.raster.dataset.IBuffer;
26
/**
27
 * Esta clase representa la lista de filtros que debe ser manejada desde el
28
 * RasterFilterListManager.
29
 *
30
 * @author Nacho Brodin (nachobrodin@gmail.com)
31
 */
32
public class RasterFilterList {
33
        private IBuffer   rasterBuf   = null;
34
        private int       typeFilter  = -1;
35
        private TreeMap   environment = new TreeMap();
36

    
37
        // Pila de objetos Filter (Contiene un RasterFilter)
38
        private ArrayList list        = new ArrayList();
39
        private Stack     status      = new Stack();
40

    
41
        /**
42
         * A?ade un par?metro a la lista de filtros. Estos par?metros luego pueden ser
43
         * utilizados por los managers que se registren
44
         * @param key Nombre del par?metro que coincide con el nombre de la clase.
45
         * @param value Objeto
46
         */
47
        public void addEnvParam(String key, Object value) {
48
                environment.put(key, value);
49
        }
50

    
51
        /**
52
         * Obtiene un par?metro de la lista de filtros.
53
         * @param key Identificador del par?metro. Coincide con el nombre de la clase del par?metro.
54
         */
55
        public Object getEnvParam(String key) {
56
                return environment.get(key);
57
        }
58

    
59
        /**
60
         * Controla que los tipos de entrada y salida de los filtros sean los
61
         * correctos
62
         * @throws FilterTypeException
63
         */
64
        public void controlTypes() throws FilterTypeException {
65
                RasterFilterListManager stackManager = new RasterFilterListManager(this);
66
                stackManager.controlTypes();
67
        }
68

    
69
        /**
70
         * A?ade un filtro al final de la lista
71
         * @param filter        filtro a?adido
72
         * @throws FilterTypeException
73
         */
74
        public void add(RasterFilter filter) throws FilterTypeException {
75
                if (isActive(filter.getName())) {
76
                        replace(filter, filter.getName());
77
                } else {
78
                        list.add(filter);
79
                        controlTypes();
80
                }
81
                filter.setEnv(environment);
82
        }
83

    
84
        /**
85
         * Sustituye un filtro de una posici?n de la pila por otro
86
         * @param filter
87
         * @param i
88
         * @throws FilterTypeException
89
         */
90
        public void replace(RasterFilter filter, String name) throws FilterTypeException {
91
                boolean changed = false;
92
                filter.setEnv(environment);
93
                for (int i = list.size() - 1; i >= 0; i--)
94
                        if (((RasterFilter) list.get(i)).getName().equals(name)) {
95
                                list.remove(i);
96
                                list.add(i, filter);
97
                                changed = true;
98
                        }
99

    
100
                if (changed)
101
                        controlTypes();
102
        }
103

    
104
        /**
105
         * A?ade un filtro en la lista en la posici?n indicada.
106
         * @param filter        filtro a?adido
107
         * @param pos        posici?n
108
         * @throws FilterTypeException
109
         */
110
        public void add(RasterFilter filter, int pos) throws FilterTypeException {
111
                try {
112
                        list.add(pos, filter);
113
                        controlTypes();
114
                } catch (IndexOutOfBoundsException e) {
115
                        add(filter);
116
                }
117
                filter.setEnv(environment);
118
        }
119

    
120
        /**
121
         * Elimina un filtro a partir de su nombre
122
         * @param name Nombre del filtro a eliminar
123
         * @throws FilterTypeException
124
         */
125
        public void remove(String name) throws FilterTypeException {
126
                boolean changed = false;
127
                for (int i = list.size() - 1; i >= 0; i--)
128
                        if (((RasterFilter) list.get(i)).getName().equals(name)) {
129
                                list.remove(i);
130
                                changed = true;
131
                        }
132
                if (changed)
133
                        controlTypes();
134
        }
135

    
136
        /**
137
         * Elimina un filtro por clase.
138
         *
139
         * @param baseFilterClass
140
         * @throws FilterTypeException
141
         */
142
        public void remove(Class baseFilterClass) throws FilterTypeException {
143
                boolean changed = false;
144
                for (int i = 0; i < lenght(); i++)
145
                        if (baseFilterClass.isInstance((RasterFilter) list.get(i))) {
146
                                list.remove(i);
147
                                i--;
148
                                changed = true;
149
                        }
150
                if (changed)
151
                        controlTypes();
152
        }
153

    
154
        /**
155
         * Devuelve el tipo de dato de retorno al aplicar la pila de filtros
156
         * @return
157
         */
158
        public int getOutDataType() {
159
                if (list.size() > 0)
160
                        return ((RasterFilter) list.get(list.size() - 1)).getOutRasterDataType();
161
                else
162
                        return rasterBuf.getDataType();
163
        }
164

    
165
        /**
166
         * Devuelve el raster resultado de la aplicacion de la pila de filtros
167
         * @return
168
         */
169
        public IBuffer getResult() {
170
                return rasterBuf;
171
        }
172

    
173
        /**
174
         * Obtiene la cantidad de filtros en la lista
175
         * @return N?mero de filtros apilados
176
         */
177
        public int lenght() {
178
                return list.size();
179
        }
180

    
181
        /**
182
         * Obtiene el filtro apilado de la posici?n i o null si el indice es incorrecto
183
         * @param i        Posici?n a acceder en la pila
184
         * @return        Filtro
185
         */
186
        public RasterFilter get(int i) {
187
                if (i >= list.size() || i < 0)
188
                        return null;
189
                return (RasterFilter) list.get(i);
190
        }
191

    
192
        /**
193
         * Obtiene el filtro apilado de nombre name o null si no existe
194
         * @param i       Nombre del filtro buscado
195
         * @return        Filtro
196
         */
197
        public RasterFilter get(String name) {
198
                for (int i = list.size() - 1; i >= 0; i--) {
199
                        if (((RasterFilter) list.get(i)).getName().equals(name))
200
                                return (RasterFilter) list.get(i);
201
                }
202
                return null;
203
        }
204

    
205
        /**
206
         * Obtiene el filtro apilado que corresponde con el nombre
207
         * @param name        Nombre de filtro
208
         * @return      Filtro en caso de que exista un filtro apilado de ese tipo
209
         * o null si no hay ninguno.
210
         */
211
        public RasterFilter getByName(String name) {
212
                for (int i = 0; i < lenght(); i++) {
213
                        if (((RasterFilter) list.get(i)).getName().equals(name))
214
                                return (RasterFilter) list.get(i);
215
                }
216
                return null;
217
        }
218

    
219
        /**
220
         * Obtiene el primer filtro de la lista que es instancia de la clase pasada por
221
         * par?metro
222
         * @param baseFilterClass Filtro base
223
         * @return RasterFilter
224
         */
225
        public RasterFilter getFilterByBaseClass(Class baseFilterClass) {
226
                for (int i = 0; i < lenght(); i++) {
227
                        if (baseFilterClass.isInstance((RasterFilter) list.get(i)))
228
                                return (RasterFilter) list.get(i);
229
                }
230
                return null;
231
        }
232

    
233
        /**
234
         * Obtiene el tipo del filtro de la pila de la posici?n i
235
         * @param i Posici?n a acceder en la pila
236
         * @return tipo de filtro
237
         */
238
        public String getName(int i) {
239
                return ((RasterFilter) list.get(i)).getName();
240
        }
241

    
242
        /**
243
         * Elimina todos los filtros de la pila
244
         */
245
        public void clear() {
246
                list.clear();
247
        }
248

    
249
        /**
250
         * Sustituye un filtro de una posici?n de la pila por otro
251
         * @param filter
252
         * @param i
253
         */
254
        public void replace(RasterFilter filter, int i) {
255
                filter.setEnv(environment);
256
                list.remove(i);
257
                list.add(i, filter);
258
        }
259

    
260
        /**
261
         * Move un filtro determinado a la posici?n especificada.
262
         * @param filter Filtro a mover
263
         * @param position Posici?n a asignar
264
         * @return Devuelve true si el filtro existia y lo ha movido y false si no lo ha hecho.
265
         */
266
        public boolean move(Class filter, int position) {
267
                RasterFilter f = null;
268
                for (int i = 0; i < list.size(); i++) {
269
                        if(filter.isInstance(list.get(i))) {
270
                                f = (RasterFilter) list.get(i);
271
                                list.remove(i);
272
                                break;
273
                        }
274
                }
275
                if(f != null) {
276
                        list.add(position, f);
277
                        return true;
278
                }
279
                return false;
280
        }
281

    
282
        /**
283
         * Asigna el raster de entrada inicial
284
         * @param raster
285
         */
286
        public void setInitRasterBuf(IBuffer raster) {
287
                rasterBuf = (IBuffer) raster;
288
                if(rasterBuf != null)
289
                        typeFilter = rasterBuf.getDataType();
290
        }
291

    
292
        /**
293
         * Devuelve el tipo de datos inicial de la lista
294
         * @return Tipo de dato del raster inicial
295
         */
296
        public int getInitDataType() {
297
                return typeFilter;
298
        }
299

    
300
        /**
301
         * Asigna el tipo de dato inicial
302
         * @param dt
303
         */
304
        public void setInitDataType(int dt) {
305
                this.typeFilter = dt;
306
        }
307

    
308
        /**
309
         * M?todo que devuelve true si el tipo de filtro pasado por par?metro est? en la
310
         * pila y false si no lo est?.
311
         * @param type        Tipo de par?metro a comprobar
312
         * @return true si est? en la pila y false si no lo est?
313
         */
314
        public boolean isActive(String name) {
315
                for (int i = list.size() - 1; i >= 0; i--) {
316
                        if (((RasterFilter) list.get(i)).getName().equals(name))
317
                                return true;
318
                }
319
                return false;
320
        }
321

    
322
        /**
323
         * M?todo que devuelve true si el tipo de filtro pasado por par?metro est? en
324
         * la pila y false si no lo est?.
325
         *
326
         * @param filter Tipo de filtro a comprobar
327
         * @return true si est? en la pila y false si no lo est?
328
         */
329
        public boolean isActive(RasterFilter filter) {
330
                for (int i = list.size() - 1; i >= 0; i--) {
331
                        if (((RasterFilter) list.get(i)).equals(filter)) {
332
                                return true;
333
                        }
334
                }
335
                return false;
336
        }
337

    
338
        /**
339
         * Devuelve la posici?n en la lista de una clase de filtro concreta
340
         *
341
         * @param c Clase a buscar en la lista
342
         * @return posici?n en la lista
343
         */
344
        public int getPosition(Class c) {
345
                for (int i = 0; i < list.size(); i++)
346
                        if (c.isInstance(list.get(i)))
347
                                return i;
348
                return -1;
349
        }
350

    
351
        /**
352
         * Aplica los filtros de la pila sobre el buffer correspondiente
353
         * @param dataType
354
         * @throws InterruptedException
355
         */
356
        private void executeFilterByDataType(int dataType) throws InterruptedException {
357
                environment.put("FirstUseTransparency", Boolean.TRUE);
358
                environment.put("HasNoDataFilter", Boolean.valueOf(isActive("nodata")));
359
                
360
                environment.put("FirstRaster", rasterBuf);
361
                for (int i = 0; i < list.size(); i++) {
362
                        RasterFilter filter = (RasterFilter) list.get(i);
363

    
364
                        // TODO: Arquitectura. Quitar el ControlTypes y en este momento
365
                        // cerciorarse de si el tipo del filtro es totalmente el correcto o hay
366
                        // que recrearlo. Ejemplo:
367
                        // Si el filtro que tenemos antes de preprocesar es de tipo Byte y la
368
                        // entrada de datos es de tipo float, reconstruir solo este filtro para
369
                        // que sea de tipo float
370

    
371
                        filter.addParam("raster", rasterBuf);
372
                        filter.execute();
373

    
374
                        if (filter.getResult("raster") != null)
375
                                this.rasterBuf = (IBuffer) filter.getResult("raster");
376
                }
377
                environment.remove("FirstRaster");
378
        }
379

    
380
        /**
381
         * Aplica los filtros sobre un RasterBuf
382
         * @return IBuffer de salida
383
         * @throws InterruptedException
384
         */
385
        public IBuffer execute() throws InterruptedException {
386
                if (rasterBuf == null)
387
                        return null;
388
                executeFilterByDataType(rasterBuf.getDataType());
389
                return rasterBuf;
390
        }
391

    
392
        /**
393
         * Muestra el contenido de la pila de filtros para depuraci?n
394
         */
395
        public void show() {
396
                System.out.println("--------------------------------------------");
397

    
398
                for (int i = 0; i < list.size() ; i++) {
399
                        System.out.println("FILTRO:" + i + " NAME:" + ((RasterFilter) list.get(i)).getName() + " FIL:" + ((RasterFilter) list.get(i)).toString());
400
                }
401
        }
402

    
403
        public void resetPercent() {
404
                for (int i = 0; i < list.size(); i++)
405
                        ((RasterFilter) list.get(i)).resetPercent();
406
        }
407

    
408
        public int getPercent() {
409
                int percent = 0;
410
                if (list.size() == 0)
411
                        return 0;
412
                for (int i = 0; i < list.size(); i++)
413
                        percent += ((RasterFilter) list.get(i)).getPercent();
414

    
415
                percent = percent / list.size();
416
                return percent;
417
        }
418

    
419
        /**
420
         * Guarda el estado de la lista de filtros en una pila, que se podr?
421
         * ir recuperando con popStatus()
422
         */
423
        public void pushStatus() {
424
                status.push(getStatusCloned());
425
        }
426

    
427
        /**
428
         * Obtiene el estado actual de los filtros, el ArrayList devuelto es una
429
         * clonaci?n del original, asi no compartiran datos.
430
         * @return
431
         */
432
        public ArrayList getStatusCloned() {
433
                ArrayList newArray = new ArrayList();
434
                for (int i = 0; i < list.size(); i++) {
435
                        try {
436
                                newArray.add(((RasterFilter) list.get(i)).clone());
437
                        } catch (CloneNotSupportedException e) {
438
                                System.out.println("No se ha podido clonar");
439
                        }
440
                }
441
                return newArray;
442
        }
443

    
444
        /**
445
         * Define el estado actual de los filtros
446
         * @param newArray
447
         */
448
        public void setStatus(ArrayList newArray) {
449
                list.clear();
450
                if(newArray == null)
451
                        return;
452
                for (int i = 0; i < newArray.size(); i++) {
453
                        list.add(newArray.get(i));
454
                }
455
        }
456

    
457
        /**
458
         * Recupera un estado guardado con antelaci?n mediante el m?todo pushStatus()
459
         */
460
        public void popStatus() {
461
                if (status.size() <= 0)
462
                        return;
463

    
464
                setStatus((ArrayList) status.pop());
465
        }
466

    
467
        /**
468
         * Obtiene el TreeMap con los par?metros
469
         * @return TreeMap
470
         */
471
        public TreeMap getEnv() {
472
                return environment;
473
        }
474

    
475
        /**
476
         * Asigna el TreeMap con los par?metros del entorno
477
         * @param env
478
         */
479
        public void setEnv(TreeMap env) {
480
                this.environment = env;
481
        }
482
}