Statistics
| Revision:

svn-gvsig-desktop / branches / v10 / libraries / libCq CMS for java.old / src / org / cresques / filter / RasterFilterStackManager.java @ 8831

History | View | Annotate | Download (33.5 KB)

1
/*
2
 * Cresques Mapping Suite. Graphic Library for constructing mapping applications.
3
 *
4
 * Copyright (C) 2004-5.
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 2
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
19
 *
20
 * For more information, contact:
21
 *
22
 * cresques@gmail.com
23
 */
24
package org.cresques.filter;
25

    
26
import java.io.IOException;
27
import java.lang.reflect.Constructor;
28
import java.lang.reflect.InvocationTargetException;
29
import java.util.ArrayList;
30
import java.util.Hashtable;
31
import java.util.StringTokenizer;
32
import java.util.regex.Matcher;
33
import java.util.regex.Pattern;
34

    
35
import org.cresques.filter.BrightnessContrast.BrightnessContrastStackManager;
36
import org.cresques.filter.ComputeMinMax.ComputeMinMaxFilter;
37
import org.cresques.filter.ComputeMinMax.ComputeMinMaxImageFilter;
38
import org.cresques.filter.ComputeMinMax.ComputeMinMaxShortFilter;
39
import org.cresques.filter.LinearEnhancement.LinearEnhancementFilter;
40
import org.cresques.filter.LinearEnhancement.LinearEnhancementImageFilter;
41
import org.cresques.filter.LinearEnhancement.LinearEnhancementShortFilter;
42
import org.cresques.filter.PercentTailTrim.PercentTailTrimFilter;
43
import org.cresques.filter.PercentTailTrim.PercentTailTrimImageFilter;
44
import org.cresques.filter.PercentTailTrim.PercentTailTrimShortFilter;
45
import org.cresques.filter.RemoveBands.RemoveBandsFilter;
46
import org.cresques.filter.RemoveBands.RemoveBandsImageFilter;
47
import org.cresques.filter.RemoveBands.RemoveBandsShortFilter;
48
import org.cresques.filter.Transparency.TransparencyFilter;
49
import org.cresques.filter.Transparency.TransparencyImageFilter;
50
import org.cresques.filter.Transparency.TransparencyRange;
51
import org.cresques.filter.Transparency.TransparencyShortFilter;
52
import org.cresques.io.GeoRasterFile;
53

    
54

    
55
/**
56
 * Esta clase es de la parte cliente y es la encargada de la gesti�n
57
 * de la pila de filtros. Es la que conoce el orden en que se deben apilar
58
 * estos para que la ejecuci�n sea correcta. Un cliente que desee aplicar un
59
 * filtro deber� introducirlo en la pila usando para ello esta clase.
60
 * @author Nacho Brodin (brodin_ign@gva.es)
61
 *
62
 */
63
public class RasterFilterStackManager implements IStackManager {
64
    protected RasterFilterStack         filterStack = null;
65
    private boolean                                 debug = false;
66
    protected Hashtable                         typeFilters = new Hashtable();
67
    public int[]                                         order = null;
68
    protected ArrayList                         filterList = null;
69
    private GeoRasterFile[]                 grfList = null;
70
    private static ArrayList                stackManagerClass = new ArrayList();
71
    private ArrayList                                 managers = new ArrayList();
72
        
73
    static{
74
            RasterFilterStackManager.addClassStackManager(BrightnessContrastStackManager.class);
75
    }
76
    
77
        /**
78
         * Registra las clases que tendr�n gesti�n de alg�n filtro. Esta funci�n suele llamarse en 
79
         * la carga de una extensi�n.
80
         * @param clase Clase a registrar
81
         */
82
        public static void addClassStackManager(Class clase) {
83
                boolean esta = false;
84
                for(int i=0;i<stackManagerClass.size();i++)
85
                        if(((Class)stackManagerClass.get(i)).equals(clase))
86
                                esta = true;
87
                if(!esta)
88
                        RasterFilterStackManager.stackManagerClass.add(clase);
89
        }
90

    
91
    /**
92
     * Constructor
93
     * @param filterStack
94
     */
95
    public RasterFilterStackManager(RasterFilterStack filterStack) {
96
        this.filterStack = filterStack;
97
        typeFilters.put("transparency", new Integer(0));
98
        typeFilters.put("enhanced", new Integer(1));
99
        typeFilters.put("computeminmax", new Integer(2));
100
        typeFilters.put("tail", new Integer(3));
101
        typeFilters.put("removebands", new Integer(4));
102
        init();
103
        this.filterStack.setOrder(order);
104
                
105
        //Cargamos el manager con los gestores de drivers registrados
106
        for(int i = 0;i<RasterFilterStackManager.stackManagerClass.size();i++){
107
                Object obj = RasterFilterStackManager.loadClass((Class)stackManagerClass.get(i), this);
108
                if(obj != null)
109
                        managers.add(obj);
110
        }
111
        
112
    }
113

    
114
    /**
115
     * Registra un manager del sistema
116
     * @param manager
117
     */
118
    /*public void register(IStackManager manager) {
119
            filterStack.managers.add(manager);
120
    }*/
121

    
122
    /**
123
     * Inicializaci�n. Asigna el orden de los filtros
124
     */
125
    protected void init() {
126
        order = new int[typeFilters.size()];
127
        //order[0] = ((Integer) typeFilters.get("sharpening")).intValue();
128
        order[0] = ((Integer) typeFilters.get("computeminmax")).intValue();
129
        order[1] = ((Integer) typeFilters.get("tail")).intValue();
130
        order[2] = ((Integer) typeFilters.get("enhanced")).intValue();
131
        order[3] = ((Integer) typeFilters.get("transparency")).intValue();
132
        order[4] = ((Integer) typeFilters.get("removebands")).intValue();
133
    }
134

    
135
    /**
136
     * A�ade un nuevo tipo de filtro
137
     * @param key        Nombre del filtro
138
     * @param type        Constante entera asignada a ese tipo
139
     */
140
    public void addTypeFilter(String key, int type, int position) {
141
        typeFilters.put(key, new Integer(type));
142

    
143
        int[] newOrder = new int[order.length + 1];
144

    
145
        for (int i = 0; i < position; i++)
146
            newOrder[i] = order[i];
147

    
148
        newOrder[position] = type;
149

    
150
        for (int i = position + 1; i < newOrder.length; i++)
151
            newOrder[i] = order[i - 1];
152

    
153
        order = newOrder;
154
        this.filterStack.setOrder(order);
155
    }
156

    
157
    /**
158
     * Obtiene la constante correspondiente a un tipo de filtro
159
     * @param key        Clave para obtener la constante que corresponde al nombre del filtro
160
     * @return        Tipo de filtro
161
     */
162
    public int getTypeFilter(String key) {
163
            Integer value = ((Integer) typeFilters.get(key));
164
            if(value != null)
165
                    return value.intValue();
166
            else 
167
                    return -1;
168
    }
169

    
170
    /**
171
     * A�ade un filtro de transparencia
172
     * @param red        Intervalos de la banda del rojo a poner transparentes
173
     * @param green        Intervalos de la banda del verde a poner transparentes
174
     * @param blue        Intervalos de la banda del azul a poner transparentes
175
     * @param alpha        Transparencia
176
     * @param transparencyRed        Color en la banda del rojo de la transparencia
177
     * @param transparencyGreen        Color en la banda del verde de la transparencia
178
     * @param transparencyBlue        Color en la banda del azul de la transparencia
179
     */
180
    public void addTransparencyFilter(ArrayList rangesList,
181
                                      int alpha, int transparencyRed,
182
                                      int transparencyGreen,
183
                                      int transparencyBlue) {
184
        RasterFilter filtro = null;
185

    
186
        switch (filterStack.getDataTypeInFilter(((Integer) typeFilters.get("transparency")).intValue())) {
187
        case RasterBuf.TYPE_IMAGE:
188
            filtro = new TransparencyImageFilter();
189
            break;
190
        case RasterBuf.TYPE_SHORT:
191
        case RasterBuf.TYPE_USHORT:
192
        case RasterBuf.TYPE_INT:
193
            filtro = new TransparencyShortFilter();
194
            break;
195
        }
196

    
197
        if(filtro != null){
198
                filtro.addParam("rangesList", rangesList);        
199
                filtro.addParam("alpha", new Integer(alpha));
200
                filtro.addParam("transparencyRed", new Integer(transparencyRed));
201
                filtro.addParam("transparencyGreen", new Integer(transparencyGreen));
202
                filtro.addParam("transparencyBlue", new Integer(transparencyBlue));
203
        
204
                //Elimina los filtros que son equivalentes a este
205
                /*for(int i=0;i<filterStack.lenght();i++){
206
                        if( filterStack.get(i) instanceof TransparencyImageFilter ||
207
                                filterStack.get(i) instanceof TransparencyShortFilter){
208
        
209
                                //Si este filtro es equivalente a uno de la pila se elimina este
210
                                if(((TransparencyFilter)filtro).isEquivalent((TransparencyFilter)filterStack.get(i)))
211
                                        filterStack.removeFilter(filterStack.get(i));
212
        
213
                        }
214
                }
215
        
216
                //A�ade el filtro si no hay uno equivalente
217
        
218
                boolean equivalentFilter = false;
219
                for(int i=0;i<filterStack.lenght();i++){
220
                        if( filterStack.get(i) instanceof TransparencyImageFilter ||
221
                                filterStack.get(i) instanceof TransparencyShortFilter){
222
        
223
                                //Si no existe en la pila un filtro equivalente se a�ade
224
                                if(((TransparencyFilter)filterStack.get(i)).isEquivalent((TransparencyFilter)filtro)){
225
                                        equivalentFilter = true;
226
                                        break;
227
                                }
228
                        }
229
                }
230
                if(!equivalentFilter)*/
231
                filterStack.removeFilter(((Integer) typeFilters.get("transparency")).intValue());
232
                filterStack.addFilter(((Integer) typeFilters.get("transparency")).intValue(),
233
                                      filtro);
234
                this.controlTypes();
235
        }
236
    }
237

    
238
    /**
239
     * Obtiene la lista de rangos del filtro de transparencia de la pila
240
     * @return ArrayList con la lista de rangos. Cada elemento es un objeto TransparencyRange 
241
     */
242
    public ArrayList getTransparencyRGB(){
243
            for (int i = 0; i < filterStack.lenght(); i++) {
244
            if (filterStack.get(i) instanceof TransparencyImageFilter ||
245
                    filterStack.get(i) instanceof TransparencyShortFilter) {
246
                return ((TransparencyFilter) filterStack.get(i)).rangesList;
247
            }
248
        }
249
        return null;
250
    }
251
   
252
    /**
253
     * A�ade un filtro de eliminado de bandas. Las pone a 0
254
     * @param bands
255
     */
256
    public void addRemoveBands(String bands) {
257
        RasterFilter filtro = null;
258

    
259
        switch (filterStack.getDataTypeInFilter(((Integer) typeFilters.get("removebands")).intValue())) {
260
        case RasterBuf.TYPE_IMAGE:
261
            filtro = new RemoveBandsImageFilter();
262
            break;
263
        case RasterBuf.TYPE_SHORT:
264
        case RasterBuf.TYPE_USHORT:
265
        case RasterBuf.TYPE_INT:
266
            filtro = new RemoveBandsShortFilter();
267
            break;
268
        }
269
        
270
        if(filtro != null){
271
                filtro.addParam("stats", filterStack.getStats());
272
                filtro.addParam("bands", bands);
273
        
274
                filterStack.removeFilter(((Integer) typeFilters.get("removebands")).intValue());
275
                filterStack.addFilter(((Integer) typeFilters.get("removebands")).intValue(),
276
                                      filtro);
277
                this.controlTypes();
278
        }
279
    }
280

    
281
    /**
282
     * A�ade un filtro de recorte de colas.
283
     * @param tail        porcentaje de recorte
284
     * @param samples        porcentaje de muestras tomadas del total de la imagen
285
     */
286
    public void addTailFilter(double tail, double samples,
287
                              boolean removeMaxValue) {
288
        if (filterStack.isActive(((Integer) typeFilters.get("tail")).intValue())) {
289
            filterStack.removeFilter(((Integer) typeFilters.get("tail")).intValue());
290
        }
291

    
292
        RasterFilter filtro = null;
293

    
294
        switch (filterStack.getDataTypeInFilter(((Integer) typeFilters.get("tail")).intValue())) {
295
        case RasterBuf.TYPE_IMAGE:
296
            filtro = new PercentTailTrimImageFilter();
297
            break;
298
        case RasterBuf.TYPE_SHORT:
299
        case RasterBuf.TYPE_USHORT:
300
        case RasterBuf.TYPE_INT:
301
            filtro = new PercentTailTrimShortFilter();
302
            break;
303
        }
304
        
305
        if(filtro != null){
306
                filtro.addParam("stats", filterStack.getStats());
307
                filtro.addParam("tail", new Double(tail));
308
                filtro.addParam("samples", new Double(samples));
309
                filtro.addParam("remove", new Boolean(removeMaxValue));
310
        
311
                filterStack.addFilter(((Integer) typeFilters.get("tail")).intValue(),
312
                                      filtro);
313
                this.controlTypes();
314
        }
315
    }
316

    
317
    /**
318
     * A�ade un filtro de realce. Esta versi�n tiene el par�metro para a�adirle el nombre
319
     * del fichero. Esto se usa para que si a un fichero se le ha calculado ya el recorte de colas
320
     * no se vuelva a calcular, evitando as� que si hacemos un draw a una imagen por bloques cada
321
     * bloque tenga un calculo distinto para el recorte.
322
     */
323
    public void addEnhancedFilter(boolean remove, String fileName) {
324
        if (filterStack.isActive(((Integer) typeFilters.get("enhanced")).intValue())) {
325
            filterStack.removeFilter(((Integer) typeFilters.get("enhanced")).intValue());
326
        }
327

    
328
        RasterFilter filtro = null;
329
        
330
        switch (filterStack.getDataTypeInFilter(((Integer) typeFilters.get("enhanced")).intValue())) {
331
        case RasterBuf.TYPE_IMAGE:
332
            filtro = new LinearEnhancementImageFilter();
333
            break;
334
        case RasterBuf.TYPE_SHORT:
335
        case RasterBuf.TYPE_USHORT:
336
        case RasterBuf.TYPE_INT:
337
            filtro = new LinearEnhancementShortFilter();
338
            break;
339
        }
340

    
341
        if(filtro != null){
342
                filtro.addParam("stats", filterStack.getStats());
343
        
344
                if (remove) {
345
                    filtro.addParam("remove", new Boolean(true));
346
                } else {
347
                    filtro.addParam("remove", new Boolean(false));
348
                }
349
        
350
                if (fileName != null) {
351
                    filtro.addParam("filename", fileName);
352
                } else {
353
                    filtro.addParam("filename", new String(""));
354
                }
355
        
356
                filterStack.addFilter(((Integer) typeFilters.get("enhanced")).intValue(),
357
                                      filtro);
358
                this.controlTypes();
359
        }
360
    }
361

    
362
    /**
363
     * A�ade un filtro de realce
364
     */
365
    public void addEnhancedFilter(boolean remove) {
366
        addEnhancedFilter(remove, "");
367
    }
368

    
369
    /**
370
     * A�ade un filtro ComputeMinMax
371
     */
372
    public void addComputeMinMaxFilter() {
373
        if (!filterStack.isActive(((Integer) typeFilters.get("computeminmax")).intValue())) { //Solo lo a�adimos si no est�
374

    
375
            RasterFilter filtro = null;
376

    
377
            switch (filterStack.getDataTypeInFilter(((Integer) typeFilters.get("computeminmax")).intValue())) {
378
            case RasterBuf.TYPE_IMAGE:
379
                filtro = new ComputeMinMaxImageFilter();
380
                break;
381
            case RasterBuf.TYPE_SHORT:
382
            case RasterBuf.TYPE_USHORT:
383
            case RasterBuf.TYPE_INT:
384
                filtro = new ComputeMinMaxShortFilter();
385
                break;
386
            }
387
            
388
            if(filtro != null){
389
                    filtro.addParam("stats", filterStack.getStats());
390
                    filterStack.addFilter(((Integer) typeFilters.get("computeminmax")).intValue(),
391
                                          filtro);
392
            }
393
        }
394

    
395
        this.controlTypes();
396
    }
397
    
398
    /**
399
     * Obtiene de la pila el primer filtro del tipo solicitado si existe sino devuelve null
400
     * @param type Tipo de filtro
401
     * @return Filtro
402
     */
403
    public RasterFilter getFilter(String type){
404
            int intType = getTypeFilter(type);
405
            return filterStack.getByType(intType);
406
            
407
    }
408
    
409
    /**
410
     * Obtiene el tipo de filtro a partir del objeto RasterFilter
411
     * @param rasterFilter        Objeto RasterFilter del cual se quiere saber que tipo de filtro contiene
412
     * @return        Tipo de filtro seg�n las constantes contenidas en RasterFilterStackManager
413
     */
414
    public int getType(RasterFilter rasterFilter) {
415
        if (rasterFilter instanceof TransparencyFilter) 
416
            return ((Integer)typeFilters.get("transparency")).intValue();
417
      
418
        if (rasterFilter instanceof LinearEnhancementFilter) 
419
                return ((Integer)typeFilters.get("enhanced")).intValue();
420
       
421
        if (rasterFilter instanceof ComputeMinMaxFilter)
422
                return ((Integer)typeFilters.get("computeminmax")).intValue();
423
        
424
        if (rasterFilter instanceof PercentTailTrimFilter) 
425
                return ((Integer)typeFilters.get("tail")).intValue();
426
        
427
        if (rasterFilter instanceof RemoveBandsFilter) 
428
                return ((Integer)typeFilters.get("removebands")).intValue();
429

    
430
        return -1;
431
    }
432

    
433
    /**
434
     * Controla que los tipos de los filtros de la pila sean correctos, es decir, que
435
     * el tipo de salida de un filtro de salida coincida con el tipo de la entrada del
436
     * siguiente. En caso de no ser as� crea el filtro de tipo adecuado y lo sustituye
437
     * en el no coincidente. Esto es necesario ya que en la eliminaci�n de filtros puede
438
     * quedarse en inconsistencia de tipos.
439
     */
440
    public void controlTypes() {
441
        for (int i = filterStack.lenght(); i >= 0; i--) {
442
                String classFilter = null, packageFilter = null, oldClass = null;
443
                try{
444
                        classFilter = filterStack.get(i - 1).getClass().toString();
445
                        packageFilter = classFilter.substring(classFilter.indexOf(" ") + 1, classFilter.lastIndexOf("."));
446
                        oldClass = classFilter.substring(classFilter.lastIndexOf(".") +1, classFilter.length());
447
                }catch(ArrayIndexOutOfBoundsException ex){
448
                        return;
449
                }
450
                
451
            if ((i - 1) >= 0) {
452
                //Para el primer filtro comprobamos con el tipo de dato de entrada a la pila
453
                if (i == filterStack.lenght()) {
454
                    if (filterStack.getInitDataType() != filterStack.get(i - 1).getInRasterDataType()) {
455
                        Pattern p = Pattern.compile(RasterBuf.typesToString(filterStack.get(i - 1).getInRasterDataType()));
456
                        Matcher m = p.matcher(oldClass);
457
                        String newClass = m.replaceAll(RasterBuf.typesToString(filterStack.getInitDataType()));
458
                        String strPackage = packageFilter + "." + newClass;
459
                    
460
                        try {
461
                            Class filterClass = Class.forName(strPackage);
462
                            Constructor con = filterClass.getConstructor(null);
463
                            RasterFilter newFilter = (RasterFilter) con.newInstance(null);
464
                            newFilter.params = filterStack.get(i - 1).params;
465
                            filterStack.replace(newFilter, i - 1, getType(newFilter));
466
                        } catch (Exception e) {
467
                            e.printStackTrace();
468
                        }
469
                    }
470

    
471
                    //Desde el filtro 2 en adelante se compara la salida de uno con la entrada del siguiente
472
                } else if (filterStack.get(i).getOutRasterDataType() != filterStack.get(i - 1).getInRasterDataType()) {
473
                    Pattern p = Pattern.compile(RasterBuf.typesToString(filterStack.get(i - 1).getInRasterDataType()));
474
                    Matcher m = p.matcher(oldClass);
475
                    String newClass = m.replaceAll(RasterBuf.typesToString(filterStack.get(i).getOutRasterDataType()));
476
                    String strPackage = packageFilter + "." + newClass;
477
                    
478
                    try {
479
                        Class filterClass = Class.forName(strPackage.trim());
480
                        Constructor con = filterClass.getConstructor(null);
481
                        RasterFilter newFilter = (RasterFilter) con.newInstance(null);
482
                        //newFilter.setFilterName(filterStack.get(i - 1).getFilterName());
483
                        newFilter.params = filterStack.get(i - 1).params;
484
                        filterStack.replace(newFilter, i - 1, getType(newFilter));
485
                    } catch (Exception e) {
486
                        e.printStackTrace();
487
                    }
488
                }
489
            }
490
        }
491

    
492
        if (debug) 
493
            filterStack.show();
494
    
495
    }
496

    
497
    /**
498
     * M�todo que devuelve true si el tipo de filtro pasado por par�metro est� en la
499
     * pila y false si no lo est�.
500
     * @param filter        Tipo de filtro a comprobar
501
     * @return true si est� en la pila y false si no lo est�
502
     */
503
    public boolean isActive(int type) {
504
        return filterStack.isActive(type);
505
    }
506

    
507
    /**
508
     * Elimina los filtros de la pila de un determinado tipo
509
     * @param type        Tipo de filtro a eliminar
510
     */
511
    public void removeFilter(int type) {
512
        filterStack.removeFilter(type);
513
        this.controlTypes();
514
    }
515

    
516
    /**
517
     * Resetea el flag de temporalidad de los filtros de la pila.
518
     * Esto equivale a fijar los filtros que ya existen en la pila. A partir de
519
     * ese momento los filtros que se introduzcan podr�n ser eliminados de golpe
520
     * llamando a la funci�n deleteTempFilters
521
     */
522
    public void resetTempFilters() {
523
        filterStack.resetTempFilters();
524
    }
525

    
526
    /**
527
     * Elimina los filtros temporales, es decir, todos los filtros introducidos desde
528
     * el �ltimo resetTempFilters que se ha realizado.
529
     */
530
    public void deleteTempFilters() {
531
        filterStack.deleteTempFilters();
532
    }
533

    
534
    /**
535
     * Obtiene el objeto de estadisticas asignado a la pila.
536
     * @return
537
     */
538
    public RasterStats getStackStats() {
539
        return filterStack.getStats();
540
    }
541

    
542
    /* (non-Javadoc)
543
     * @see org.cresques.io.raster.StackManager#getStringsFromStack()
544
     */
545
    public ArrayList getStringsFromStack() {
546
        filterList = new ArrayList();
547
        for (int i = 0; i < filterStack.lenght(); i++) {
548
            RasterFilter rf = filterStack.get(i);
549

    
550
            if (rf instanceof TransparencyFilter) {
551
                filterList.add("filter.transparency.active=true");
552
                for(int j=0;j<((TransparencyFilter) rf).rangesList.size();j++)
553
                        filterList.add("filter.transparency.transparencyRange"+j+"="+
554
                                        ((TransparencyRange)((TransparencyFilter) rf).rangesList.get(j)).getStrEntry());
555
            } else if (rf instanceof LinearEnhancementFilter) {
556
                filterList.add("filter.enhanced.active=true");
557
                filterList.add("filter.enhanced.remove=" +
558
                               ((LinearEnhancementFilter) rf).getRemoveExtrema()
559
                                .toString());
560
            } else if (rf instanceof ComputeMinMaxFilter) {
561
                filterList.add("filter.computeminmax.active=true");
562
            } else if (rf instanceof PercentTailTrimFilter) {
563
                filterList.add("filter.tail.active=true");
564
                filterList.add("filter.tail.value=" +
565
                               this.getStackStats().tailPercent);
566
                filterList.add("filter.tail.remove=" +
567
                               ((PercentTailTrimFilter) rf).removeMaxValue());
568
            } else if (rf instanceof RemoveBandsFilter) {
569
                filterList.add("filter.removebands.active=true");
570
                filterList.add("filter.removebands.bands=" +
571
                               ((RemoveBandsFilter) rf).bands);
572
            } else { //Se recorren todos los managers registrados comprobando si corresponde a la clase del filtro
573
                /*for (int j = 0; j < filterStack.managers.size(); j++){
574
                        filterList = ((IStackManager) filterStack.managers.get(j)).getStringsFromStack(filterList, rf);
575
                }*/
576
                for (int j = 0; j < managers.size(); j++){
577
                        filterList = ((IStackManager) managers.get(j)).getStringsFromStack(filterList, rf);
578
                }
579
            }
580
        }
581

    
582
        return filterList;
583
    }
584

    
585
    /* (non-Javadoc)
586
     * @see org.cresques.io.raster.StackManager#getStringsFromStack()
587
     */
588
    public ArrayList getStringsFromStack(ArrayList filterList, RasterFilter rf){
589
            return null;
590
    }
591
        
592
    /**
593
     * Crea una pila de filtros a partir de un Array de Strings. Cada elemento del array debe
594
     * tener la forma elemento=valor.
595
     * @param filters
596
     */
597
    public void createStackFromStrings(ArrayList f) {
598
            this.grfList = null;
599
        this.createStackFromStrings(f, new Integer(0));
600
    }
601
    
602
    /**
603
     * Crea una pila de filtros a partir de un Array de Strings. Cada elemento del array debe
604
     * tener la forma elemento=valor.
605
     * @param filters
606
     */
607
    public void createStackFromStrings(ArrayList f, GeoRasterFile[] grfList) {
608
            this.grfList = grfList;
609
        this.createStackFromStrings(f, new Integer(0));
610
    }
611
   
612
    public void createStackFromStrings(ArrayList f, Integer pos) {
613
        ArrayList filters = (ArrayList) f.clone();
614
        filterStack.clear();
615

    
616
        int filteri = pos.intValue();
617

    
618
        //Busca un filtro activo y despu�s todas las propiedades que necesita ese filtro para
619
        //ser creado. Una vez las tiene a�ade en la pila el tipo de filtro.
620
        while ((filters.size() > 0) && (filteri < filters.size())) {
621
            String fil = (String) filters.get(filteri);
622

    
623
            if (fil.startsWith("filter.transparency.active") &&
624
                    getValue(fil).equals("true")) {
625
                filters.remove(filteri);
626
                
627
                ArrayList list = new ArrayList();
628
                for (int propFilter = 0;propFilter < filters.size();propFilter++) {
629
                    String elem = (String) filters.get(propFilter);
630

    
631
                    if (elem.startsWith("filter.transparency.transparencyRange")) {
632
                            TransparencyRange tr = new TransparencyRange();
633
                            String value = getValue(elem);
634
                            tr.setStrEntry(value);
635
                            int[] red = new int[2];
636
                                int[] green = new int[2];
637
                                int[] blue = new int[2];
638
                                boolean and = true;
639
                                try{
640
                                        and = TransparencyRange.stringToInterval(value, red, green, blue);
641
                                        if(red[0] == -1)
642
                                                red = null;
643
                                        if(green[0] == -1)
644
                                                green = null;
645
                                        if(blue[0] == -1)
646
                                                blue = null;
647
                                }catch(IOException e){
648
                                        e.printStackTrace();
649
                                }
650
                                tr.setAnd(and);
651
                                tr.setRed(red);
652
                                tr.setGreen(green);
653
                                tr.setBlue(blue);
654
                                list.add(tr);
655
                        filters.remove(propFilter);
656
                        propFilter--;
657
                    }
658
                }
659

    
660
                this.addTransparencyFilter(list, 0x0, 0xff, 0xff, 0xff);
661
                                   
662
                filteri = -1;
663
            }
664

    
665
            if (fil.startsWith("filter.enhanced.active") &&
666
                    getValue(fil).equals("true")) {
667
                filters.remove(filteri);
668

    
669
                for (int propFilter = 0;propFilter < filters.size();propFilter++) {
670
                    String elem = (String) filters.get(propFilter);
671

    
672
                    if (elem.startsWith("filter.enhanced.remove")) {
673
                        this.addEnhancedFilter(Boolean.valueOf(getValue(elem))
674
                                                      .booleanValue());
675
                        filters.remove(propFilter);
676
                        propFilter--;
677
                    }
678
                }
679

    
680
                this.addComputeMinMaxFilter();
681
                filteri = -1;
682
            }
683

    
684
            if (fil.startsWith("filter.tail.active") &&
685
                    getValue(fil).equals("true")) {
686
                filters.remove(filteri);
687
                this.removeFilter(this.getTypeFilter("computeminmax"));
688

    
689
                double recorte = 0D;
690
                boolean remove = false;
691

    
692
                for (int propFilter = 0; propFilter < filters.size();propFilter++) {
693
                    String elem = (String) filters.get(propFilter);
694

    
695
                    if (elem.startsWith("filter.tail.value")) {
696
                        recorte = Double.parseDouble(getValue(elem));
697
                        filters.remove(propFilter);
698
                        propFilter--;
699
                    }
700

    
701
                    if (elem.startsWith("filter.tail.remove")) {
702
                        remove = Boolean.valueOf(getValue(elem)).booleanValue();
703
                        filters.remove(propFilter);
704
                        propFilter--;
705
                    }
706
                }
707

    
708
                this.addTailFilter(recorte, 0D, remove);
709
                filteri = -1;
710
            }
711

    
712
            if (fil.startsWith("filter.removebands.active") &&
713
                    getValue(fil).equals("true")) {
714
                filters.remove(filteri);
715

    
716
                for (int propFilter = 0;propFilter < filters.size();propFilter++) {
717
                    String elem = (String) filters.get(propFilter);
718

    
719
                    if (elem.startsWith("filter.removebands.bands")) {
720
                        this.addRemoveBands(getValue(elem));
721
                        filters.remove(propFilter);
722
                        propFilter--;
723
                    }
724
                }
725
                filteri = -1;
726
            }
727
            
728
            for (int j = 0; j < managers.size(); j++){
729
                    filteri = ((IStackManager) managers.get(j)).createStackFromStrings(filters, fil, this.grfList, filteri);
730
                    this.grfList = null;
731
            }
732

    
733
            filteri++;
734
        }
735
    }
736

    
737
    /**
738
     * Obtiene el elemento de una cadena de la forma elemento=valor
739
     * @param cadena
740
     * @return
741
     */
742
    public static String getElem(String cadena) {
743
        if (cadena != null) {
744
            return cadena.substring(0, cadena.indexOf("="));
745
        } else {
746
            return null;
747
        }
748
    }
749

    
750
    /**
751
     * Obtiene el valor de una cadena de la forma elemento=valor
752
     * @param cadena
753
     * @return
754
     */
755
    public static String getValue(String cadena) {
756
        if (cadena != null) {
757
            return cadena.substring(cadena.indexOf("=") + 1, cadena.length());
758
        } else {
759
            return null;
760
        }
761
    }
762

    
763
    /**
764
     * Convierte un rango contenido en una array doble en una cadena
765
     * de strings para poder salvar a xml
766
     * @param rang
767
     * @return
768
     */
769
    private String rangeToString(int[][] rang) {
770
        StringBuffer rangoStr = new StringBuffer();
771

    
772
        if (rang != null) {
773
            for (int i = 0; i < rang.length; i++) {
774
                rangoStr.append(String.valueOf(rang[i][0]) + ":");
775
                rangoStr.append(String.valueOf(rang[i][1]) + ":");
776
            }
777

    
778
            String r = rangoStr.toString();
779

    
780
            if (r.endsWith(":")) {
781
                r = r.substring(0, r.length() - 1);
782
            }
783

    
784
            return r;
785
        } else {
786
            return null;
787
        }
788
    }
789

    
790
    /**
791
     * Convierte una cadena en una lista de rangos numericos para poder
792
     * asignar transparencias a la imagen
793
     * @param rang
794
     * @return
795
     */
796
    private int[][] stringToRange(String rang) {
797
        if ((rang != null) && !rang.equals("null")) {
798
            ArrayList lista = new ArrayList();
799
            StringTokenizer tokenizer = new StringTokenizer(rang, ":");
800

    
801
            while (tokenizer.hasMoreTokens())
802
                lista.add(tokenizer.nextToken());
803

    
804
            int[][] intervalos = new int[(int) (lista.size() / 2)][2];
805

    
806
            for (int i = 0; i < lista.size(); i = i + 2) {
807
                intervalos[i / 2][0] = Integer.valueOf((String) lista.get(i))
808
                                              .intValue();
809
                intervalos[i / 2][1] = Integer.valueOf((String) lista.get(i +
810
                                                                          1))
811
                                              .intValue();
812
            }
813

    
814
            return intervalos;
815
        } else {
816
            return null;
817
        }
818
    }
819

    
820
    /**
821
     * Obtiene la pila de filtros
822
     * @return RasterFilterStack
823
     */
824
        public RasterFilterStack getFilterStack() {
825
                return filterStack;
826
        }
827

    
828
        /**
829
         * Obtiene la Hashable que contiene los tipos de filtros registrados
830
         * @return Hashtable
831
         */
832
        public Hashtable getTypeFilters() {
833
                return typeFilters;
834
        }
835

    
836
        public int createStackFromStrings(ArrayList filters, String fil, GeoRasterFile[] grfList, int filteri) {
837
                // TODO Auto-generated method stub
838
                return filteri;
839
        }
840
        
841
        /**
842
         * Carga una clase pasada por par�metro. Como argumento del constructor de la clase se 
843
         * pasar� un RasterFilterStackManager. Esto es usado para instanciar los gestores de filtros
844
         * registrados
845
         * @param clase Clase a instanciar
846
         * @param stackManager Par�metro del constructor de la clase a instanciar
847
         * @return Objeto que corresponde a la instancia de la clase pasada.
848
         */
849
        public static Object loadClass(Class clase, RasterFilterStackManager stackManager) {
850
                Object obj = null;
851
                Class [] args = {RasterFilterStackManager.class};
852
                try {
853
                        Constructor hazNuevo = clase.getConstructor(args);
854
                        Object [] args2 = {stackManager};
855
                        obj =  hazNuevo.newInstance(args2);
856
                } catch (SecurityException e) {
857
                        // TODO Auto-generated catch block
858
                        e.printStackTrace();
859
                } catch (NoSuchMethodException e) {
860
                        // TODO Auto-generated catch block
861
                        e.printStackTrace();
862
                } catch (IllegalArgumentException e) {
863
                        // TODO Auto-generated catch block
864
                        e.printStackTrace();
865
                } catch (InstantiationException e) {
866
                        // TODO Auto-generated catch block
867
                        e.printStackTrace();
868
                } catch (IllegalAccessException e) {
869
                        // TODO Auto-generated catch block
870
                        e.printStackTrace();
871
                } catch (InvocationTargetException e) {
872
                        // TODO Auto-generated catch block
873
                        e.printStackTrace();
874
                }
875
                return obj;
876
        }
877
        
878
        /**
879
         * Obtiene el manager registrado a partir de la clase
880
         * @return
881
         */
882
        public IStackManager getManagerByClass(Class c){
883
                for (int j = 0; j < managers.size(); j++){
884
                if(managers.get(j).getClass().equals(c))
885
                        return (IStackManager)managers.get(j);
886
        }
887
                return null;
888
        }
889

    
890
}
891