Statistics
| Revision:

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

History | View | Annotate | Download (12 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
                typeFilter = rasterBuf.getDataType();
289
        }
290

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

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

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

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

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

    
350
        /**
351
         * Aplica los filtros de la pila sobre el buffer correspondiente
352
         * @param dataType
353
         * @throws InterruptedException
354
         */
355
        private void executeFilterByDataType(int dataType) throws InterruptedException {
356
                for (int i = 0; i < list.size(); i++) {
357
                        RasterFilter filter = (RasterFilter) list.get(i);
358

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

    
366
                        filter.addParam("raster", rasterBuf);
367
                        filter.execute();
368

    
369
                        if (filter.getResult("raster") != null)
370
                                this.rasterBuf = (IBuffer) filter.getResult("raster");
371
                }
372
        }
373

    
374
        /**
375
         * Aplica los filtros sobre un RasterBuf
376
         * @return IBuffer de salida
377
         * @throws InterruptedException
378
         */
379
        public IBuffer execute() throws InterruptedException {
380
                if (rasterBuf == null)
381
                        return null;
382
                executeFilterByDataType(rasterBuf.getDataType());
383
                return rasterBuf;
384
        }
385

    
386
        /**
387
         * Muestra el contenido de la pila de filtros para depuraci?n
388
         */
389
        public void show() {
390
                System.out.println("--------------------------------------------");
391

    
392
                for (int i = 0; i < list.size() ; i++) {
393
                        System.out.println("FILTRO:" + i + " NAME:" + ((RasterFilter) list.get(i)).getName() + " FIL:" + ((RasterFilter) list.get(i)).toString());
394
                }
395
        }
396

    
397
        public void resetPercent() {
398
                for (int i = 0; i < list.size(); i++)
399
                        ((RasterFilter) list.get(i)).resetPercent();
400
        }
401

    
402
        public int getPercent() {
403
                int percent = 0;
404
                if (list.size() == 0)
405
                        return 0;
406
                for (int i = 0; i < list.size(); i++)
407
                        percent += ((RasterFilter) list.get(i)).getPercent();
408

    
409
                percent = percent / list.size();
410
                return percent;
411
        }
412

    
413
        /**
414
         * Guarda el estado de la lista de filtros en una pila, que se podr?
415
         * ir recuperando con popStatus()
416
         */
417
        public void pushStatus() {
418
                status.push(getStatusCloned());
419
        }
420

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

    
438
        /**
439
         * Define el estado actual de los filtros
440
         * @param newArray
441
         */
442
        public void setStatus(ArrayList newArray) {
443
                list.clear();
444
                for (int i = 0; i < newArray.size(); i++) {
445
                        list.add(newArray.get(i));
446
                }
447
        }
448

    
449
        /**
450
         * Recupera un estado guardado con antelaci?n mediante el m?todo pushStatus()
451
         */
452
        public void popStatus() {
453
                if (status.size() <= 0)
454
                        return;
455

    
456
                setStatus((ArrayList) status.pop());
457
        }
458

    
459
        /**
460
         * Obtiene el TreeMap con los par?metros
461
         * @return TreeMap
462
         */
463
        public TreeMap getEnv() {
464
                return environment;
465
        }
466

    
467
        /**
468
         * Asigna el TreeMap con los par?metros del entorno
469
         * @param env
470
         */
471
        public void setEnv(TreeMap env) {
472
                this.environment = env;
473
        }
474
}