Statistics
| Revision:

root / trunk / libraries / libRaster / src / org / gvsig / raster / grid / filter / RasterFilterList.java @ 12180

History | View | Annotate | Download (13.7 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   params     = 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 addParam(String key, Object value) {
48
                params.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 getParam(String key) {
56
                return params.get(key);
57
        }
58

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

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

    
81
        /**
82
         * Sustituye un filtro de una posici?n de la pila por otro
83
         * @param filter
84
         * @param i
85
         */
86
        public void replace(RasterFilter filter, String name) {
87
                boolean changed = false;
88

    
89
                for (int i = list.size() - 1; i >= 0; i--)
90
                        if (((RasterFilter) list.get(i)).getName().equals(name)) {
91
                                list.remove(i);
92
                                list.add(i, filter);
93
                                changed = true;
94
                        }
95

    
96
                if (changed)
97
                        controlTypes();
98
        }
99

    
100
        /**
101
         * A?ade un filtro en la lista en la posici?n indicada.
102
         * @param filter        filtro a?adido
103
         * @param pos        posici?n
104
         */
105
        public void add(RasterFilter filter, int pos) {
106
                try {
107
                        list.add(pos, filter);
108
                        controlTypes();
109
                } catch (IndexOutOfBoundsException e) {
110
                        add(filter);
111
                }
112
        }
113

    
114
        /**
115
         * Elimina un filtro a partir de su nombre
116
         * @param name Nombre del filtro a eliminar
117
         */
118
        public void remove(String name) {
119
                boolean changed = false;
120
                for (int i = list.size() - 1; i >= 0; i--)
121
                        if (((RasterFilter) list.get(i)).getName().equals(name)) {
122
                                list.remove(i);
123
                                changed = true;
124
                        }
125
                if (changed)
126
                        controlTypes();
127
        }
128

    
129
        /**
130
         * Elimina un filtro concreto de la pila
131
         * @param type
132
         */
133
        public void remove(RasterFilter filter) {
134
                boolean changed = false;
135
                for (int i = list.size() - 1; i >= 0; i--)
136
                        if (((RasterFilter) list.get(i)).equals(filter)) {
137
                                list.remove(i);
138
                                changed = true;
139
                        }
140
                if (changed)
141
                        controlTypes();
142
        }
143

    
144
        /**
145
         * Elimina un filtro por clase.
146
         * 
147
         * @param baseFilterClass
148
         */
149
        public void remove(Class baseFilterClass) {
150
                boolean changed = false;
151
                for (int i = 0; i < lenght(); i++)
152
                        if (baseFilterClass.isInstance(((RasterFilter) list.get(i)))) {
153
                                list.remove(i);
154
                                i--;
155
                                changed = true;
156
                        }
157
                if (changed)
158
                        controlTypes();
159
        }
160

    
161
        /**
162
         * Devuelve el tipo de dato de retorno al aplicar la pila de filtros
163
         * @return
164
         */
165
        public int getOutDataType() {
166
                if (list.size() > 0)
167
                        return ((RasterFilter) list.get(list.size() - 1)).getOutRasterDataType();
168
                else
169
                        return rasterBuf.getDataType();
170
        }
171

    
172
        /**
173
         * Devuelve el raster resultado de la aplicacion de la pila de filtros
174
         * @return
175
         */
176
        public IBuffer getResult() {
177
                return rasterBuf;
178
        }
179

    
180
        /**
181
         * Devuelve true si el filtro 'a' est? por encima del 'b' en la lista y false si no lo est?
182
         * @param a  Nombre de filtro
183
         * @param b  Nombre de filtro
184
         * @return
185
         */
186
/*
187
        private boolean isOnTop(String a, String b) {
188
                int posA = -1;
189
                int posB = -1;
190

191
                for (int i = 0; i < list.size(); i++) {
192
                        if (list.get(i).equals(a))
193
                                posA = i;
194

195
                        if (list.get(i).equals(b))
196
                                posB = i;
197

198
                        if ((posA != -1) && (posB != -1))
199
                                break;
200
                }
201

202
                if (posA < posB)
203
                        return true;
204
                else
205
                        return false;
206
        }
207
*/
208
        /**
209
         * Dado un modo de inserci?n se obtiene el tipo de dato del filtro a
210
         * introducir. Se insertionMode es ADD_END quiere decir que se a?adir? al
211
         * final de la lista por lo que devuelve el tipo de la salida del ?ltimo
212
         * filtro. Si es ADD_END_AND_DELETE lo mismo y si es MODIFY_LAST quiere decir
213
         * que buscar? si hay alguno de este tipo y si lo hay devuelve el tipo de dato
214
         * del anterior filtro en la lista.
215
         * 
216
         * @param name Nombre del filtro a insertar en la lista. Este debe
217
         *          corresponder con la variable genericName definida para cada tipo
218
         *          de filtro
219
         * @param insertionMode Modo de inserci?n en la lista. Debe corresponder con
220
         *          alguna de las constantes definidas en RasterFilterList ADD_END,
221
         *          ADD_END_AND_DELETE, MODIFY_LAST o UNDEFINED
222
         */
223
/*
224
        public int getDataTypeInFilter(String name, int insertionMode) {
225

226
                // Si no hay filtros, devolvemos el inicial
227
                if (list.size() == 0)
228
                        return getInitDataType();
229

230
                if (insertionMode == MODIFY_LAST) {
231
                        for (int i = list.size() - 1; i >= 0; i--) {
232
                                if (((RasterFilter) list.get(i)).getName().equals(name)) {
233
                                        if (i > 0)
234
                                                return ((RasterFilter) list.get(i - 1)).getOutRasterDataType();
235
                                        else
236
                                                return getInitDataType();
237
                                }
238
                        }
239
                }
240

241
                // Si no se encuentra un filtro, suponemos que estamos tratando el ultimo de
242
                // la lista
243
                return ((RasterFilter) list.get(list.size() - 1)).getOutRasterDataType();
244
        }
245
*/
246

    
247
        /**
248
         * Obtiene la cantidad de filtros en la lista
249
         * @return N?mero de filtros apilados
250
         */
251
        public int lenght() {
252
                return list.size();
253
        }
254

    
255
        /**
256
         * Obtiene el filtro apilado de la posici?n i o null si el indice es incorrecto
257
         * @param i        Posici?n a acceder en la pila
258
         * @return        Filtro
259
         */
260
        public RasterFilter get(int i) {
261
                if (i >= list.size() || i < 0)
262
                        return null;
263
                return ((RasterFilter) list.get(i));
264
        }
265

    
266
        /**
267
         * Obtiene el filtro apilado de nombre name o null si no existe
268
         * @param i       Nombre del filtro buscado
269
         * @return        Filtro
270
         */
271
        public RasterFilter get(String name) {
272
                for (int i = list.size() - 1; i >= 0; i--) {
273
                        if (((RasterFilter) list.get(i)).getName().equals(name))
274
                                return ((RasterFilter) list.get(i));
275
                }
276
                return null;
277
        }
278

    
279
        /**
280
         * Obtiene el filtro apilado que corresponde con el nombre
281
         * @param name        Nombre de filtro
282
         * @return      Filtro en caso de que exista un filtro apilado de ese tipo
283
         * o null si no hay ninguno.
284
         */
285
        public RasterFilter getByName(String name) {
286
                for (int i = 0; i < lenght(); i++) {
287
                        if (((RasterFilter) list.get(i)).getName().equals(name))
288
                                return ((RasterFilter) list.get(i));
289
                }
290
                return null;
291
        }
292

    
293
        /**
294
         * Obtiene el primer filtro de la lista que es instancia de la clase pasada por
295
         * par?metro
296
         * @param baseFilterClass Filtro base
297
         * @return RasterFilter
298
         */
299
        public RasterFilter getFilterByBaseClass(Class baseFilterClass) {
300
                for (int i = 0; i < lenght(); i++) {
301
                        if (baseFilterClass.isInstance(((RasterFilter) list.get(i))))
302
                                return ((RasterFilter) list.get(i));
303
                }
304
                return null;
305
        }
306

    
307
        /**
308
         * Obtiene el tipo del filtro de la pila de la posici?n i
309
         * @param i Posici?n a acceder en la pila
310
         * @return tipo de filtro
311
         */
312
        public String getName(int i) {
313
                return ((RasterFilter) list.get(i)).getName();
314
        }
315

    
316
        /**
317
         * Elimina todos los filtros de la pila
318
         */
319
        public void clear() {
320
                list.clear();
321
        }
322

    
323
        /**
324
         * Sustituye un filtro de una posici?n de la pila por otro
325
         * @param filter
326
         * @param i
327
         */
328
        public void replace(RasterFilter filter, int i) {
329
                list.remove(i);
330
                list.add(i, filter);
331
        }
332

    
333
        /**
334
         * Asigna el raster de entrada inicial
335
         * @param raster
336
         */
337
        public void setInitRasterBuf(IBuffer raster) {
338
                rasterBuf = (IBuffer) raster;
339
                typeFilter = rasterBuf.getDataType();
340
        }
341

    
342
        /**
343
         * Devuelve el tipo de datos inicial de la lista
344
         * @return Tipo de dato del raster inicial
345
         */
346
        public int getInitDataType() {
347
                return typeFilter;
348
        }
349

    
350
        /**
351
         * Asigna el tipo de dato inicial
352
         * @param dt
353
         */
354
        public void setInitDataType(int dt) {
355
                this.typeFilter = dt;
356
        }
357

    
358
        /**
359
         * M?todo que devuelve true si el tipo de filtro pasado por par?metro est? en la
360
         * pila y false si no lo est?.
361
         * @param type        Tipo de par?metro a comprobar
362
         * @return true si est? en la pila y false si no lo est?
363
         */
364
        public boolean isActive(String name) {
365
                for (int i = list.size() - 1; i >= 0; i--) {
366
                        if (((RasterFilter) list.get(i)).getName().equals(name))
367
                                return true;
368
                }
369
                return false;
370
        }
371

    
372
        /**
373
         * M?todo que devuelve true si el tipo de filtro pasado por par?metro est? en
374
         * la pila y false si no lo est?.
375
         * 
376
         * @param filter Tipo de filtro a comprobar
377
         * @return true si est? en la pila y false si no lo est?
378
         */
379
        public boolean isActive(RasterFilter filter) {
380
                for (int i = list.size() - 1; i >= 0; i--) {
381
                        if (((RasterFilter) list.get(i)).equals(filter)) {
382
                                return true;
383
                        }
384
                }
385
                return false;
386
        }
387

    
388
        /**
389
         * Devuelve la posici?n en la lista de una clase de filtro concreta
390
         * 
391
         * @param c Clase a buscar en la lista
392
         * @return posici?n en la lista
393
         */
394
        public int getPosition(Class c) {
395
                for (int i = 0; i < list.size(); i++)
396
                        if (c.isInstance(list.get(i)))
397
                                return i;
398
                return -1;
399
        }
400

    
401
        /**
402
         * Aplica los filtros de la pila sobre el buffer correspondiente
403
         * @param dataType
404
         */
405
        private void executeFilterByDataType(int dataType) {
406
//                RasterFilterListManager stackManager = new RasterFilterListManager(this);
407
//                stackManager.controlTypes();
408
/*
409
                System.out.println("-----------------");
410
                for (int i=0; i<this.lenght(); i++) {
411
                        System.out.println(this.get(i).getInRasterDataType());
412
                        System.out.println(this.get(i).getClass());
413
                        System.out.println(this.get(i).getOutRasterDataType());
414
                }
415
                System.out.println("+++++++++++++++++");
416
*/
417

    
418
                for (int i = 0; i < list.size(); i++) {
419
                        RasterFilter filter = ((RasterFilter) list.get(i));
420

    
421
                        // TODO: Arquitectura. Quitar el ControlTypes y en este momento
422
                        // cerciorarse de si el tipo del filtro es totalmente el correcto o hay
423
                        // que recrearlo. Ejemplo:
424
                        // Si el filtro que tenemos antes de preprocesar es de tipo Byte y la
425
                        // entrada de datos es de tipo float, reconstruir solo este filtro para
426
                        // que sea de tipo float
427

    
428
                        filter.addParam("raster", rasterBuf);
429
                        filter.execute();
430

    
431
                        if (filter.getResult("raster") != null)
432
                                this.rasterBuf = (IBuffer) filter.getResult("raster");
433
                }
434
        }
435

    
436
        /**
437
         * Aplica los filtros sobre un RasterBuf
438
         * @return IBuffer de salida
439
         */
440
        public IBuffer execute() {
441
                if (rasterBuf == null)
442
                        return null;
443
                executeFilterByDataType(rasterBuf.getDataType());
444
                return rasterBuf;
445
        }
446

    
447
        /**
448
         * Muestra el contenido de la pila de filtros para depuraci?n
449
         */
450
        public void show() {
451
                System.out.println("--------------------------------------------");
452

    
453
                for (int i = 0; i < list.size() ; i++) {
454
                        System.out.println("FILTRO:" + i + " NAME:" + ((RasterFilter) list.get(i)).getName() + " FIL:" + ((RasterFilter) list.get(i)).toString());
455
                }
456
        }
457

    
458
        public void resetPercent() {
459
                for (int i = 0; i < list.size(); i++)
460
                        ((RasterFilter) list.get(i)).resetPercent();
461
        }
462

    
463
        public int getPercent() {
464
                int percent = 0;
465
                if (list.size() == 0)
466
                        return 0;
467
                for (int i = 0; i < list.size(); i++)
468
                        percent += ((RasterFilter) list.get(i)).getPercent();
469

    
470
                percent = percent / list.size();
471
                return percent;
472
        }
473

    
474
        /**
475
         * Metodo para poder cancelar el proceso de calculo de histograma.
476
         */
477
        public void setCanceled(boolean value) {
478
                for (int i = 0; i < list.size(); i++)
479
                        ((RasterFilter) list.get(i)).setCanceled(value);
480
        }
481

    
482
        /**
483
         * Metodo para saber si se ha cancelado un proceso de calculo de histograma
484
         * @return boolean
485
         */
486
        public boolean isCanceled(int process) {
487
                for (int i = 0; i < list.size(); i++)
488
                        if (((RasterFilter) list.get(i)).isCanceled())
489
                                return true;
490
                return false;
491
        }
492

    
493
        /**
494
         * Guarda el estado de la lista de filtros en una pila, que se podr?
495
         * ir recuperando con popStatus()
496
         */
497
        public void pushStatus() {
498
                status.push(getStatusCloned());
499
        }
500

    
501
        /**
502
         * Obtiene el estado actual de los filtros, el ArrayList devuelto es una
503
         * clonaci?n del original, asi no compartiran datos.
504
         * @return
505
         */
506
        public ArrayList getStatusCloned() {
507
                ArrayList newArray = new ArrayList();
508
                for (int i = 0; i < list.size(); i++) {
509
                        try {
510
                                newArray.add(((RasterFilter) list.get(i)).clone());
511
                        } catch (CloneNotSupportedException e) {
512
                                System.out.println("No se ha podido clonar");
513
                        }
514
                }
515
                return newArray;
516
        }
517

    
518
        /**
519
         * Define el estado actual de los filtros
520
         * @param newArray
521
         */
522
        public void setStatus(ArrayList newArray) {
523
                list.clear();
524
                for (int i = 0; i < newArray.size(); i++) {
525
                        list.add((RasterFilter) newArray.get(i));
526
                }
527
        }
528

    
529
        /**
530
         * Recupera un estado guardado con antelaci?n mediante el m?todo pushStatus()
531
         */
532
        public void popStatus() {
533
                if (status.size() <= 0)
534
                        return;
535

    
536
                setStatus((ArrayList) status.pop());
537
        }
538
}