Statistics
| Revision:

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

History | View | Annotate | Download (11.6 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.TreeMap;
23

    
24
import org.gvsig.raster.dataset.IBuffer;
25

    
26

    
27
/**
28
 * Esta clase representa la lista de filtros que debe ser manejada desde el
29
 * RasterFilterListManager.
30
 * @author Nacho Brodin (nachobrodin@gmail.com)
31
 *
32
 */
33
public class RasterFilterList {
34
        public final static int                         UNDEFINED = -1;
35
        public final static int                         ADD_END = 0;
36
        public final static int                         ADD_END_AND_DELETE = 1;
37
        public final static int                         MODIFY_LAST = 2;
38

    
39
    private IBuffer                 rasterBuf = null;
40
    private int                                typeFilter = -1;
41
    private TreeMap                        params = new TreeMap();
42
    
43
    //Pila de objetos Filter (Contiene un RasterFilter)
44
    private ArrayList                list = new ArrayList();
45

    
46
    
47
    /**
48
     * A?ade un par?metro a la lista de filtros. Estos par?metros luego
49
     * pueden ser utilizados por los managers que se registren
50
     * @param key Nombre del par?metro que coincide con el nombre de la clase.
51
     * @param value Objeto
52
     */
53
    public void addParam(String key, Object value) {
54
            params.put(key, value);
55
    }
56
    
57
    /**
58
     * Obtiene un par?metro de la lista de filtros.
59
     * @param key Identificador del par?metro. Coincide con el nombre de la clase del par?metro.
60
     */
61
    public Object getParam(String key) {
62
            return params.get(key);
63
    }
64

    
65
    /**
66
     * A?ade un filtro al final de la lista
67
     * @param filter        filtro a?adido
68
     */
69
    public void add(RasterFilter filter) {
70
        list.add(filter);
71
    }
72
    
73
    /**
74
     * Elimina un filtro a partir de su nombre
75
     * @param name Nombre del filtro a eliminar
76
     */
77
    public void remove(String name) {
78
            for (int i = list.size() - 1; i >= 0; i--){
79
                if(((RasterFilter)list.get(i)).getName().equals(name))
80
                        list.remove(i);
81
        }
82
    }
83
    
84
    /**
85
     * Elimina un filtro concreto de la pila
86
     * @param type
87
     */
88
    public void remove(RasterFilter filter) {
89
        for (int i = list.size() - 1; i >= 0; i--) {
90
            if (((RasterFilter) list.get(i)).equals(filter))
91
                list.remove(i);
92
        }
93
    }
94
    
95
    /**
96
     * Elimina un filtro por clase. 
97
     * @param baseFilterClass
98
     */
99
    public void removeByClass(Class baseFilterClass) {
100
            for(int i = 0; i < lenght(); i++) {
101
                    if(baseFilterClass.isInstance(((RasterFilter) list.get(i)))) {
102
                            list.remove(i);
103
                            i --;
104
                    }
105
            }
106
    }
107

    
108
    /**
109
     * Devuelve el tipo de dato de retorno al aplicar la pila de filtros
110
     * @return
111
     */
112
    public int getOutDataType() {
113
            if(list.size() > 0)
114
                    return ((RasterFilter)list.get(list.size() - 1)).getOutRasterDataType();
115
            else
116
                    return rasterBuf.getDataType();
117
    }
118

    
119
    /**
120
     * Devuelve el raster resultado de la aplicacion de la pila de filtros
121
     * @return
122
     */
123
    public IBuffer getResult() {
124
          return rasterBuf;
125
    }
126

    
127
    /**
128
     * Devuelve true si el filtro 'a' est? por encima del 'b' en la lista y false si no lo est?
129
     * @param a  Nombre de filtro
130
     * @param b  Nombre de filtro
131
     * @return
132
     */
133
    private boolean isOnTop(String a, String b) {
134
        int posA = -1;
135
        int posB = -1;
136

    
137
        for (int i = 0; i < list.size(); i++) {
138
            if (list.get(i).equals(a)) 
139
                posA = i;
140

    
141
            if (list.get(i).equals(b))
142
                posB = i;
143

    
144
            if ((posA != -1) && (posB != -1))
145
                break;
146
        }
147

    
148
        if (posA < posB)
149
            return true;
150
        else
151
            return false;
152
    }
153

    
154
    /**
155
     * Dado un modo de inserci?n se obtiene el tipo de dato del filtro a introducir.
156
     * Se insertionMode es ADD_END quiere decir que se a?adir? al final de la lista
157
     * por lo que devuelve el tipo de la salida del ?ltimo filtro. Si es ADD_END_AND_DELETE
158
     * lo mismo y si es MODIFY_LAST quiere decir que buscar? si hay alguno de este tipo y 
159
     * si lo hay devuelve el tipo de dato del anterior filtro en la lista.
160
     * 
161
     * @param name        Nombre del filtro a insertar en la lista. Este debe corresponder con la variable
162
     * genericName definida para cada tipo de filtro
163
     * 
164
     * @param insertionMode Modo de inserci?n en la lista. Debe corresponder con alguna de las 
165
     * constantes definidas en RasterFilterList ADD_END, ADD_END_AND_DELETE, MODIFY_LAST o UNDEFINED
166
     * 
167
     */
168
    public int getDataTypeInFilter(String name, int insertionMode) {
169
            switch(insertionMode) {
170
               
171
            //Devuelve el tipo de salida del primer filtro que sea != del q se quiere insertar
172
            case ADD_END_AND_DELETE: 
173
                            for(int i = list.size() - 1; i >= 0; i--) {
174
                                    if(((RasterFilter) list.get(i)).getName().compareTo(name) != 0) 
175
                                            return ((RasterFilter) list.get(i)).getOutRasterDataType();
176
                            }
177
                            return getInitDataType();
178
                            
179
            //Devuelve el tipo del filtro anterior al ?ltimo que coincide con el tipo pasado. Si no existe
180
            //devolver? el tipo de salida del ?ltimo filtro de la lista
181
            case MODIFY_LAST:
182
                    for(int i = list.size() - 1; i >= 0; i--) {
183
                                if(((RasterFilter) list.get(i)).getName().compareTo(name) == 0) {
184
                                        if(i > 0)
185
                                                return ((RasterFilter) list.get(i - 1)).getOutRasterDataType();
186
                                        else
187
                                                return getInitDataType();
188
                                }
189
                    }
190
                    
191
            //Devuelve el tipo de salida del ?ltimo filtro de la lista
192
            case ADD_END: 
193
                            if(list.size() == 0)
194
                                    return getInitDataType();
195
                            else
196
                                    return ((RasterFilter) list.get(list.size() - 1)).getOutRasterDataType();
197
            }
198
            
199
            return getInitDataType(); 
200
    }
201

    
202
    /**
203
     * Obtiene la cantidad de filtros en la lista
204
     * @return N?mero de filtros apilados
205
     */
206
    public int lenght() {
207
        return list.size();
208
    }
209

    
210
    /**
211
     * Obtiene el filtro apilado de la posici?n i o null si el indice es incorrecto
212
     * @param i        Posici?n a acceder en la pila
213
     * @return        Filtro
214
     */
215
    public RasterFilter get(int i) {
216
            if(i >= list.size() || i < 0)
217
                    return null;
218
        return ((RasterFilter) list.get(i));
219
    }
220
    
221
    /**
222
     * Obtiene el filtro apilado de nombre name o null si no existe
223
     * @param i       Nombre del filtro buscado
224
     * @return        Filtro
225
     */
226
    public RasterFilter get(String name) {
227
            for (int i = list.size() - 1; i >= 0; i--){
228
                    if(((RasterFilter) list.get(i)).getName().equals(name))
229
                            return ((RasterFilter) list.get(i));
230
            }
231
            return null;
232
    }
233
    
234
    /**
235
     * Obtiene el filtro apilado que corresponde con el nombre
236
     * @param name        Nombre de filtro
237
     * @return      Filtro en caso de que exista un filtro apilado de ese tipo
238
     * o null si no hay ninguno.
239
     */
240
    public RasterFilter getByName(String name) {
241
            for(int i = 0; i < lenght(); i++) {
242
                    if(((RasterFilter) list.get(i)).getName().equals(name))
243
                            return ((RasterFilter) list.get(i));
244
            }
245
        return null;
246
    }
247

    
248
    /**
249
     * Obtiene el primer filtro de la lista que es instancia de la clase pasada por 
250
     * par?metro 
251
     * @param baseFilterClass Filtro base
252
     * @return RasterFilter
253
     */
254
    public RasterFilter getFilterByBaseClass(Class baseFilterClass) {
255
            for(int i = 0; i < lenght(); i++) {
256
                    if(baseFilterClass.isInstance(((RasterFilter) list.get(i))))
257
                            return ((RasterFilter) list.get(i));
258
            }
259
            return null;
260
    }
261
    
262
    /**
263
     * Obtiene el tipo del filtro de la pila de la posici?n i
264
     * @param i Posici?n a acceder en la pila
265
     * @return tipo de filtro
266
     */
267
    public String getName(int i) {
268
        return ((RasterFilter) list.get(i)).getName();
269
    }
270

    
271
    /**
272
     * Elimina todos los filtros de la pila
273
     */
274
    public void clear() {
275
        list.clear();
276
    }
277

    
278
    /**
279
     * Sustituye un filtro de una posici?n de la pila por otro
280
     * @param filter
281
     * @param i
282
     */
283
    public void replace(RasterFilter filter, String name) {
284
            for (int i = list.size() - 1; i >= 0; i--)  {
285
                    if(((RasterFilter) list.get(i)).getName().equals(name)){
286
                            list.remove(i);
287
                            list.add(i, filter);
288
                    }
289
            }
290
    }
291
    
292
    /**
293
     * Sustituye un filtro de una posici?n de la pila por otro
294
     * @param filter
295
     * @param i
296
     */
297
    public void replace(RasterFilter filter, int i) {
298
            list.remove(i);
299
            list.add(i, filter);
300
    }
301

    
302
    /**
303
     * Asigna el raster de entrada inicial
304
     * @param raster
305
     */
306
    public void setInitRasterBuf(IBuffer raster) {
307
            rasterBuf = (IBuffer) raster;
308
            typeFilter = rasterBuf.getDataType();
309
    }
310

    
311
    /**
312
     * Devuelve el tipo de datos inicial de la lista
313
     * @return Tipo de dato del raster inicial
314
     */
315
    public int getInitDataType() {
316
        return typeFilter;
317
    }
318

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

    
333
    /**
334
     * M?todo que devuelve true si el tipo de filtro pasado por par?metro est? en la
335
     * pila y false si no lo est?.
336
     * @param filter        Tipo de filtro a comprobar
337
     * @return true si est? en la pila y false si no lo est?
338
     */
339
    public boolean isActive(RasterFilter filter) {
340
        for (int i = list.size() - 1; i >= 0; i--) {
341
            if (((RasterFilter) list.get(i)).equals(filter)) {
342
                return true;
343
            }
344
        }
345
        return false;
346
    }
347

    
348
    /**
349
     * Aplica los filtros de la pila sobre el buffer correspondiente
350
     * @param dataType
351
     */
352
    private void executeFilterByDataType(int dataType) {
353
        for (int i = list.size() - 1; i >= 0; i--) {
354
            RasterFilter filter = ((RasterFilter) list.get(i));
355

    
356
            //System.err.println("SACANDO FILTRO "+i+"  "+filter.toString());
357
            filter.addParam("raster", rasterBuf);
358
            filter.execute();
359

    
360
            if (filter.getResult("raster") != null)
361
                    this.rasterBuf = (IBuffer) filter.getResult("raster");            
362
        }
363
    }
364

    
365
    /**
366
     * Aplica los filtros sobre un RasterBuf
367
     * @return IBuffer de salida
368
     */
369
    public IBuffer execute() {
370
            if(rasterBuf == null)
371
                    return null;
372
        executeFilterByDataType(rasterBuf.getDataType());
373
        return rasterBuf;
374
    }
375
        
376
    /**
377
     *Muestra el contenido de la pila de filtros para depuraci?n
378
     */
379
    public void show() {
380
        System.out.println("--------------------------------------------");
381

    
382
        for (int i = list.size() - 1; i >= 0; i--) {
383
            System.out.println("FILTRO:" + i + " NAME:" +
384
                               ((RasterFilter) list.get(i)).getName() + " FIL:" +
385
                               ((RasterFilter) list.get(i)).toString());
386
        }
387
    }
388
        
389
}