Statistics
| Revision:

svn-gvsig-desktop / trunk / libraries / libCq CMS for java.old / src / org / cresques / io / raster / RasterFilterStackManager.java @ 4578

History | View | Annotate | Download (30.2 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.io.raster;
25

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

    
34
import org.cresques.io.GeoRasterFile;
35

    
36

    
37
/**
38
 * Esta clase es de la parte cliente y es la encargada de la gesti?n
39
 * de la pila de filtros. Es la que conoce el orden en que se deben apilar
40
 * estos para que la ejecuci?n sea correcta. Un cliente que desee aplicar un
41
 * filtro deber? introducirlo en la pila usando para ello esta clase.
42
 * @author Nacho Brodin (brodin_ign@gva.es)
43
 *
44
 */
45
public class RasterFilterStackManager implements IStackManager {
46
    protected RasterFilterStack         filterStack = null;
47
    private boolean                                 debug = false;
48
    protected Hashtable                         typeFilters = new Hashtable();
49
    public int[]                                         order = null;
50
    private ArrayList                                 managers = new ArrayList();
51
    protected ArrayList                         filterList = null;
52

    
53
    /**
54
     * Constructor
55
     * @param filterStack
56
     */
57
    public RasterFilterStackManager(RasterFilterStack filterStack) {
58
        this.filterStack = filterStack;
59
        typeFilters.put("transparency", new Integer(0));
60
        typeFilters.put("enhanced", new Integer(1));
61
        typeFilters.put("computeminmax", new Integer(2));
62
        typeFilters.put("tail", new Integer(3));
63
        typeFilters.put("removebands", new Integer(4));
64
        init();
65
        this.filterStack.setOrder(order);
66
    }
67

    
68
    /**
69
     * Registra un manager del sistema
70
     * @param manager
71
     */
72
    public void register(IStackManager manager) {
73
        managers.add(manager);
74
    }
75

    
76
    /**
77
     * Inicializaci?n. Asigna el orden de los filtros
78
     *
79
     */
80
    protected void init() {
81
        order = new int[typeFilters.size()];
82
        //order[0] = ((Integer) typeFilters.get("sharpening")).intValue();
83
        order[0] = ((Integer) typeFilters.get("computeminmax")).intValue();
84
        order[1] = ((Integer) typeFilters.get("tail")).intValue();
85
        order[2] = ((Integer) typeFilters.get("enhanced")).intValue();
86
        order[3] = ((Integer) typeFilters.get("transparency")).intValue();
87
        order[4] = ((Integer) typeFilters.get("removebands")).intValue();
88
    }
89

    
90
    /**
91
     * A?ade un nuevo tipo de filtro
92
     * @param key        Nombre del filtro
93
     * @param type        Constante entera asignada a ese tipo
94
     */
95
    public void addTypeFilter(String key, int type, int position) {
96
        typeFilters.put(key, new Integer(type));
97

    
98
        int[] newOrder = new int[order.length + 1];
99

    
100
        for (int i = 0; i < position; i++)
101
            newOrder[i] = order[i];
102

    
103
        newOrder[position] = type;
104

    
105
        for (int i = position + 1; i < newOrder.length; i++)
106
            newOrder[i] = order[i - 1];
107

    
108
        order = newOrder;
109
        this.filterStack.setOrder(order);
110
    }
111

    
112
    /**
113
     * Obtiene la constante correspondiente a un tipo de filtro
114
     * @param key        Clave para obtener la constante que corresponde al nombre del filtro
115
     * @return        Tipo de filtro
116
     */
117
    public int getTypeFilter(String key) {
118
            Integer value = ((Integer) typeFilters.get(key));
119
            if(value != null)
120
                    return value.intValue();
121
            else 
122
                    return -1;
123
    }
124

    
125
    /**
126
     * A?ade un filtro de transparencia
127
     * @param red        Intervalos de la banda del rojo a poner transparentes
128
     * @param green        Intervalos de la banda del verde a poner transparentes
129
     * @param blue        Intervalos de la banda del azul a poner transparentes
130
     * @param alpha        Transparencia
131
     * @param transparencyRed        Color en la banda del rojo de la transparencia
132
     * @param transparencyGreen        Color en la banda del verde de la transparencia
133
     * @param transparencyBlue        Color en la banda del azul de la transparencia
134
     */
135
    public void addTransparencyFilter(ArrayList rangesList,
136
                                      int alpha, int transparencyRed,
137
                                      int transparencyGreen,
138
                                      int transparencyBlue) {
139
        RasterFilter filtro = null;
140

    
141
        switch (filterStack.getDataTypeInFilter(((Integer) typeFilters.get("transparency")).intValue())) {
142
        case RasterBuf.TYPE_IMAGE:
143
            filtro = new TransparencyImageFilter();
144
            break;
145
        case RasterBuf.TYPE_SHORT:
146
        case RasterBuf.TYPE_USHORT:
147
        case RasterBuf.TYPE_INT:
148
            filtro = new TransparencyShortFilter();
149
            break;
150
        }
151

    
152
        if(filtro != null){
153
                filtro.addParam("rangesList", rangesList);        
154
                filtro.addParam("alpha", new Integer(alpha));
155
                filtro.addParam("transparencyRed", new Integer(transparencyRed));
156
                filtro.addParam("transparencyGreen", new Integer(transparencyGreen));
157
                filtro.addParam("transparencyBlue", new Integer(transparencyBlue));
158
        
159
                //Elimina los filtros que son equivalentes a este
160
                /*for(int i=0;i<filterStack.lenght();i++){
161
                        if( filterStack.get(i) instanceof TransparencyImageFilter ||
162
                                filterStack.get(i) instanceof TransparencyShortFilter){
163
        
164
                                //Si este filtro es equivalente a uno de la pila se elimina este
165
                                if(((TransparencyFilter)filtro).isEquivalent((TransparencyFilter)filterStack.get(i)))
166
                                        filterStack.removeFilter(filterStack.get(i));
167
        
168
                        }
169
                }
170
        
171
                //A?ade el filtro si no hay uno equivalente
172
        
173
                boolean equivalentFilter = false;
174
                for(int i=0;i<filterStack.lenght();i++){
175
                        if( filterStack.get(i) instanceof TransparencyImageFilter ||
176
                                filterStack.get(i) instanceof TransparencyShortFilter){
177
        
178
                                //Si no existe en la pila un filtro equivalente se a?ade
179
                                if(((TransparencyFilter)filterStack.get(i)).isEquivalent((TransparencyFilter)filtro)){
180
                                        equivalentFilter = true;
181
                                        break;
182
                                }
183
                        }
184
                }
185
                if(!equivalentFilter)*/
186
                filterStack.removeFilter(((Integer) typeFilters.get("transparency")).intValue());
187
                filterStack.addFilter(((Integer) typeFilters.get("transparency")).intValue(),
188
                                      filtro);
189
                this.controlTypes();
190
        }
191
    }
192

    
193
    /**
194
     * Obtiene la lista de rangos del filtro de transparencia de la pila
195
     * @return ArrayList con la lista de rangos. Cada elemento es un objeto TransparencyRange 
196
     */
197
    public ArrayList getTransparencyRGB(){
198
            for (int i = 0; i < filterStack.lenght(); i++) {
199
            if (filterStack.get(i) instanceof TransparencyImageFilter ||
200
                    filterStack.get(i) instanceof TransparencyShortFilter) {
201
                return ((TransparencyFilter) filterStack.get(i)).rangesList;
202
            }
203
        }
204
        return null;
205
    }
206
   
207
    /**
208
     * A?ade un filtro de eliminado de bandas. Las pone a 0
209
     * @param bands
210
     */
211
    public void addRemoveBands(String bands) {
212
        RasterFilter filtro = null;
213

    
214
        switch (filterStack.getDataTypeInFilter(((Integer) typeFilters.get("removebands")).intValue())) {
215
        case RasterBuf.TYPE_IMAGE:
216
            filtro = new RemoveBandsImageFilter();
217
            break;
218
        case RasterBuf.TYPE_SHORT:
219
        case RasterBuf.TYPE_USHORT:
220
        case RasterBuf.TYPE_INT:
221
            filtro = new RemoveBandsShortFilter();
222
            break;
223
        }
224
        
225
        if(filtro != null){
226
                filtro.addParam("stats", filterStack.getStats());
227
                filtro.addParam("bands", bands);
228
        
229
                filterStack.removeFilter(((Integer) typeFilters.get("removebands")).intValue());
230
                filterStack.addFilter(((Integer) typeFilters.get("removebands")).intValue(),
231
                                      filtro);
232
                this.controlTypes();
233
        }
234
    }
235

    
236
    /**
237
     * A?ade un filtro de recorte de colas.
238
     * @param tail        porcentaje de recorte
239
     * @param samples        porcentaje de muestras tomadas del total de la imagen
240
     */
241
    public void addTailFilter(double tail, double samples,
242
                              boolean removeMaxValue) {
243
        if (filterStack.isActive(((Integer) typeFilters.get("tail")).intValue())) {
244
            filterStack.removeFilter(((Integer) typeFilters.get("tail")).intValue());
245
        }
246

    
247
        RasterFilter filtro = null;
248

    
249
        switch (filterStack.getDataTypeInFilter(((Integer) typeFilters.get("tail")).intValue())) {
250
        case RasterBuf.TYPE_IMAGE:
251
            filtro = new PercentTailTrimImageFilter();
252
            break;
253
        case RasterBuf.TYPE_SHORT:
254
        case RasterBuf.TYPE_USHORT:
255
        case RasterBuf.TYPE_INT:
256
            filtro = new PercentTailTrimShortFilter();
257
            break;
258
        }
259
        
260
        if(filtro != null){
261
                filtro.addParam("stats", filterStack.getStats());
262
                filtro.addParam("tail", new Double(tail));
263
                filtro.addParam("samples", new Double(samples));
264
                filtro.addParam("remove", new Boolean(removeMaxValue));
265
        
266
                filterStack.addFilter(((Integer) typeFilters.get("tail")).intValue(),
267
                                      filtro);
268
                this.controlTypes();
269
        }
270
    }
271

    
272
    /**
273
     * A?ade un filtro de realce. Esta versi?n tiene el par?metro para a?adirle el nombre
274
     * del fichero. Esto se usa para que si a un fichero se le ha calculado ya el recorte de colas
275
     * no se vuelva a calcular, evitando as? que si hacemos un draw a una imagen por bloques cada
276
     * bloque tenga un calculo distinto para el recorte.
277
     */
278
    public void addEnhancedFilter(boolean remove, String fileName) {
279
        if (filterStack.isActive(((Integer) typeFilters.get("enhanced")).intValue())) {
280
            filterStack.removeFilter(((Integer) typeFilters.get("enhanced")).intValue());
281
        }
282

    
283
        RasterFilter filtro = null;
284
        
285
        switch (filterStack.getDataTypeInFilter(((Integer) typeFilters.get("enhanced")).intValue())) {
286
        case RasterBuf.TYPE_IMAGE:
287
            filtro = new LinearEnhancementImageFilter();
288
            break;
289
        case RasterBuf.TYPE_SHORT:
290
        case RasterBuf.TYPE_USHORT:
291
        case RasterBuf.TYPE_INT:
292
            filtro = new LinearEnhancementShortFilter();
293
            break;
294
        }
295

    
296
        if(filtro != null){
297
                filtro.addParam("stats", filterStack.getStats());
298
        
299
                if (remove) {
300
                    filtro.addParam("remove", new Boolean(true));
301
                } else {
302
                    filtro.addParam("remove", new Boolean(false));
303
                }
304
        
305
                if (fileName != null) {
306
                    filtro.addParam("filename", fileName);
307
                } else {
308
                    filtro.addParam("filename", new String(""));
309
                }
310
        
311
                filterStack.addFilter(((Integer) typeFilters.get("enhanced")).intValue(),
312
                                      filtro);
313
                this.controlTypes();
314
        }
315
    }
316

    
317
    /**
318
     * A?ade un filtro de realce
319
     */
320
    public void addEnhancedFilter(boolean remove) {
321
        addEnhancedFilter(remove, "");
322
    }
323

    
324
    /**
325
     * A?ade un filtro ComputeMinMax
326
     */
327
    public void addComputeMinMaxFilter() {
328
        if (!filterStack.isActive(((Integer) typeFilters.get("computeminmax")).intValue())) { //Solo lo a?adimos si no est?
329

    
330
            RasterFilter filtro = null;
331

    
332
            switch (filterStack.getDataTypeInFilter(((Integer) typeFilters.get("computeminmax")).intValue())) {
333
            case RasterBuf.TYPE_IMAGE:
334
                filtro = new ComputeMinMaxImageFilter();
335
                break;
336
            case RasterBuf.TYPE_SHORT:
337
            case RasterBuf.TYPE_USHORT:
338
            case RasterBuf.TYPE_INT:
339
                filtro = new ComputeMinMaxShortFilter();
340
                break;
341
            }
342
            
343
            if(filtro != null){
344
                    filtro.addParam("stats", filterStack.getStats());
345
                    filterStack.addFilter(((Integer) typeFilters.get("computeminmax")).intValue(),
346
                                          filtro);
347
            }
348
        }
349

    
350
        this.controlTypes();
351
    }
352
    
353
    /**
354
     * Obtiene de la pila el primer filtro del tipo solicitado si existe sino devuelve null
355
     * @param type Tipo de filtro
356
     * @return Filtro
357
     */
358
    public RasterFilter getFilter(String type){
359
            int intType = getTypeFilter(type);
360
            return filterStack.getByType(intType);
361
            
362
    }
363
    
364
    /**
365
     * Obtiene el tipo de filtro a partir del objeto RasterFilter
366
     * @param rasterFilter        Objeto RasterFilter del cual se quiere saber que tipo de filtro contiene
367
     * @return        Tipo de filtro seg?n las constantes contenidas en RasterFilterStackManager
368
     */
369
    public int getType(RasterFilter rasterFilter) {
370
        if (rasterFilter instanceof TransparencyFilter) 
371
            return ((Integer)typeFilters.get("transparency")).intValue();
372
      
373
        if (rasterFilter instanceof LinearEnhancementFilter) 
374
                return ((Integer)typeFilters.get("enhanced")).intValue();
375
       
376
        if (rasterFilter instanceof ComputeMinMaxFilter)
377
                return ((Integer)typeFilters.get("computeminmax")).intValue();
378
        
379
        if (rasterFilter instanceof PercentTailTrimFilter) 
380
                return ((Integer)typeFilters.get("tail")).intValue();
381
        
382
        if (rasterFilter instanceof RemoveBandsFilter) 
383
                return ((Integer)typeFilters.get("removebands")).intValue();
384

    
385
        return -1;
386
    }
387

    
388
    /**
389
     * Controla que los tipos de los filtros de la pila sean correctos, es decir, que
390
     * el tipo de salida de un filtro de salida coincida con el tipo de la entrada del
391
     * siguiente. En caso de no ser as? crea el filtro de tipo adecuado y lo sustituye
392
     * en el no coincidente. Esto es necesario ya que en la eliminaci?n de filtros puede
393
     * quedarse en inconsistencia de tipos.
394
     */
395
    public void controlTypes() {
396
        if (debug) {
397
            filterStack.show();
398
        }
399

    
400
        for (int i = filterStack.lenght(); i >= 0; i--) {
401
            if ((i - 1) >= 0) {
402
                //Para el primer filtro comprobamos con el tipo de dato de entrada a la pila
403
                if (i == filterStack.lenght()) {
404
                    if (filterStack.getInitDataType() != 
405
                            filterStack.get(i - 1).getInRasterDataType()) {
406
                        String oldClass = filterStack.get(i - 1).
407
                                                                                        getClass().
408
                                            toString().
409
                                                                                        substring(filterStack.get(i - 1).
410
                                                                                                                getClass().
411
                                                                                                                toString().
412
                                                                                                                lastIndexOf(".") +1,
413
                                                        filterStack.get(i - 1).
414
                                                        getClass().
415
                                                        toString().
416
                                                        length());
417
                        Pattern p = Pattern.compile(RasterBuf.typesToString(filterStack.get(i - 1).getInRasterDataType()));
418
                        Matcher m = p.matcher(oldClass);
419
                        String newClass = m.replaceAll(RasterBuf.typesToString(filterStack.getInitDataType()));
420

    
421
                        try {
422
                            Class filterClass = Class.forName("org.cresques.io.raster." +
423
                                                              newClass);
424
                            Constructor con = filterClass.getConstructor(null);
425
                            RasterFilter newFilter = (RasterFilter) con.newInstance(null);
426
                            newFilter.params = filterStack.get(i - 1).params;
427
                            filterStack.replace(newFilter, i - 1,
428
                                                this.getType(newFilter));
429
                        } catch (Exception e) {
430
                            e.printStackTrace();
431
                        }
432
                    }
433

    
434
                    //Desde el filtro 2 en adelante se compara la salida de uno con la entrada del siguiente
435
                } else if (filterStack.get(i).getOutRasterDataType() != 
436
                                        filterStack.get(i - 1).getInRasterDataType()) {
437
                    String oldClass = filterStack.get(i - 1).getClass().
438
                                      toString().substring(filterStack.get(i - 1).
439
                                                                                      getClass().
440
                                                                                                                        toString().
441
                                                                                                                        lastIndexOf(".") + 1,
442
                                                            filterStack.get(i - 1).
443
                                                            getClass().
444
                                                            toString().
445
                                                            length());
446
                    Pattern p = Pattern.compile(RasterBuf.typesToString(filterStack.get(i - 1).getInRasterDataType()));
447
                    Matcher m = p.matcher(oldClass);
448
                    String newClass = m.replaceAll(RasterBuf.typesToString(filterStack.get(i).getOutRasterDataType()));
449

    
450
                    try {
451
                        Class filterClass = Class.forName("org.cresques.io.raster." +
452
                                                          newClass);
453
                        Constructor con = filterClass.getConstructor(null);
454
                        RasterFilter newFilter = (RasterFilter) con.newInstance(null);
455
                        newFilter.params = filterStack.get(i - 1).params;
456
                        filterStack.replace(newFilter, i - 1,
457
                                            this.getType(newFilter));
458
                    } catch (Exception e) {
459
                        e.printStackTrace();
460
                    }
461
                }
462
            }
463
        }
464

    
465
        if (debug) {
466
            filterStack.show();
467
        }
468
    }
469

    
470
    /**
471
     * M?todo que devuelve true si el tipo de filtro pasado por par?metro est? en la
472
     * pila y false si no lo est?.
473
     * @param filter        Tipo de filtro a comprobar
474
     * @return true si est? en la pila y false si no lo est?
475
     */
476
    public boolean isActive(int type) {
477
        return filterStack.isActive(type);
478
    }
479

    
480
    /**
481
     * Elimina los filtros de la pila de un determinado tipo
482
     * @param type        Tipo de filtro a eliminar
483
     */
484
    public void removeFilter(int type) {
485
        filterStack.removeFilter(type);
486
        this.controlTypes();
487
    }
488

    
489
    /**
490
     * Resetea el flag de temporalidad de los filtros de la pila.
491
     * Esto equivale a fijar los filtros que ya existen en la pila. A partir de
492
     * ese momento los filtros que se introduzcan podr?n ser eliminados de golpe
493
     * llamando a la funci?n deleteTempFilters
494
     */
495
    public void resetTempFilters() {
496
        filterStack.resetTempFilters();
497
    }
498

    
499
    /**
500
     * Elimina los filtros temporales, es decir, todos los filtros introducidos desde
501
     * el ?ltimo resetTempFilters que se ha realizado.
502
     */
503
    public void deleteTempFilters() {
504
        filterStack.deleteTempFilters();
505
    }
506

    
507
    /**
508
     * Obtiene el objeto de estadisticas asignado a la pila.
509
     * @return
510
     */
511
    public RasterStats getStackStats() {
512
        return filterStack.getStats();
513
    }
514

    
515
    /* (non-Javadoc)
516
     * @see org.cresques.io.raster.StackManager#getStringsFromStack()
517
     */
518
    public ArrayList getStringsFromStack() {
519
        filterList = new ArrayList();
520
        for (int i = 0; i < filterStack.lenght(); i++) {
521
            RasterFilter rf = filterStack.get(i);
522

    
523
            if (rf instanceof TransparencyFilter) {
524
                filterList.add("filter.transparency.active=true");
525
                for(int j=0;j<((TransparencyFilter) rf).rangesList.size();j++)
526
                        filterList.add("filter.transparency.transparencyRange"+j+"="+
527
                                        ((TransparencyRange)((TransparencyFilter) rf).rangesList.get(j)).getStrEntry());
528
            } else if (rf instanceof LinearEnhancementFilter) {
529
                filterList.add("filter.enhanced.active=true");
530
                filterList.add("filter.enhanced.remove=" +
531
                               ((LinearEnhancementFilter) rf).getRemoveExtrema()
532
                                .toString());
533
            } else if (rf instanceof ComputeMinMaxFilter) {
534
                filterList.add("filter.computeminmax.active=true");
535
            } else if (rf instanceof PercentTailTrimFilter) {
536
                filterList.add("filter.tail.active=true");
537
                filterList.add("filter.tail.value=" +
538
                               this.getStackStats().tailPercent);
539
                filterList.add("filter.tail.remove=" +
540
                               ((PercentTailTrimFilter) rf).removeMaxValue());
541
            } else if (rf instanceof RemoveBandsFilter) {
542
                filterList.add("filter.removebands.active=true");
543
                filterList.add("filter.removebands.bands=" +
544
                               ((RemoveBandsFilter) rf).bands);
545
            } else { //Se recorren todos los managers registrados comprobando si corresponde a la clase del filtro 
546
                System.out.println("...Manager registrado "+rf.getClass().getName()+" - "+managers.size());
547
                for (int j = 0; j < managers.size(); j++){
548
                        filterList = ((IStackManager) managers.get(j)).getStringsFromStack(filterList, rf);
549
                }
550
            }
551
        }
552

    
553
        return filterList;
554
    }
555

    
556
    /* (non-Javadoc)
557
     * @see org.cresques.io.raster.StackManager#getStringsFromStack()
558
     */
559
    public ArrayList getStringsFromStack(ArrayList filterList, RasterFilter rf){
560
            return null;
561
    }
562
    
563
    public int createStackFromStrings(String fil, ArrayList filters, int filteri){
564
            return 0;
565
    }
566
    
567
    /**
568
     * Crea una pila de filtros a partir de un Array de Strings. Cada elemento del array debe
569
     * tener la forma elemento=valor.
570
     * @param filters
571
     */
572
    public void createStackFromStrings(ArrayList f) {
573
        this.createStackFromStrings(f, new Integer(0));
574
    }
575
    
576
    private GeoRasterFile[] grfList = null;
577
    
578
    /**
579
     * Crea una pila de filtros a partir de un Array de Strings. Cada elemento del array debe
580
     * tener la forma elemento=valor.
581
     * @param filters
582
     */
583
    public void createStackFromStrings(ArrayList f, GeoRasterFile[] grfList) {
584
            this.grfList = grfList;
585
        this.createStackFromStrings(f, new Integer(0));
586
    }
587
   
588
    public void createStackFromStrings(ArrayList f, Integer pos) {
589
        ArrayList filters = (ArrayList) f.clone();
590
        filterStack.clear();
591

    
592
        int filteri = pos.intValue();
593

    
594
        //Busca un filtro activo y despu?s todas las propiedades que necesita ese filtro para
595
        //ser creado. Una vez las tiene a?ade en la pila el tipo de filtro.
596
        while ((filters.size() > 0) && (filteri < filters.size())) {
597
            String fil = (String) filters.get(filteri);
598

    
599
            if (fil.startsWith("filter.transparency.active") &&
600
                    getValue(fil).equals("true")) {
601
                filters.remove(filteri);
602
                
603
                ArrayList list = new ArrayList();
604
                for (int propFilter = 0;propFilter < filters.size();propFilter++) {
605
                    String elem = (String) filters.get(propFilter);
606

    
607
                    if (elem.startsWith("filter.transparency.transparencyRange")) {
608
                            TransparencyRange tr = new TransparencyRange();
609
                            String value = getValue(elem);
610
                            tr.setStrEntry(value);
611
                            int[] red = new int[2];
612
                                int[] green = new int[2];
613
                                int[] blue = new int[2];
614
                                boolean and = true;
615
                                try{
616
                                        and = TransparencyRange.stringToInterval(value, red, green, blue);
617
                                        if(red[0] == -1)
618
                                                red = null;
619
                                        if(green[0] == -1)
620
                                                green = null;
621
                                        if(blue[0] == -1)
622
                                                blue = null;
623
                                }catch(IOException e){
624
                                        e.printStackTrace();
625
                                }
626
                                tr.setAnd(and);
627
                                tr.setRed(red);
628
                                tr.setGreen(green);
629
                                tr.setBlue(blue);
630
                                list.add(tr);
631
                        filters.remove(propFilter);
632
                        propFilter--;
633
                    }
634
                }
635

    
636
                this.addTransparencyFilter(list, 0x10, 0xff, 0xff, 0xff);
637
                                   
638
                filteri = -1;
639
            }
640

    
641
            if (fil.startsWith("filter.enhanced.active") &&
642
                    getValue(fil).equals("true")) {
643
                filters.remove(filteri);
644

    
645
                for (int propFilter = 0;propFilter < filters.size();propFilter++) {
646
                    String elem = (String) filters.get(propFilter);
647

    
648
                    if (elem.startsWith("filter.enhanced.remove")) {
649
                        this.addEnhancedFilter(Boolean.valueOf(getValue(elem))
650
                                                      .booleanValue());
651
                        filters.remove(propFilter);
652
                        propFilter--;
653
                    }
654
                }
655

    
656
                this.addComputeMinMaxFilter();
657
                filteri = -1;
658
            }
659

    
660
            if (fil.startsWith("filter.tail.active") &&
661
                    getValue(fil).equals("true")) {
662
                filters.remove(filteri);
663
                this.removeFilter(this.getTypeFilter("computeminmax"));
664

    
665
                double recorte = 0D;
666
                boolean remove = false;
667

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

    
671
                    if (elem.startsWith("filter.tail.value")) {
672
                        recorte = Double.parseDouble(getValue(elem));
673
                        filters.remove(propFilter);
674
                        propFilter--;
675
                    }
676

    
677
                    if (elem.startsWith("filter.tail.remove")) {
678
                        remove = Boolean.valueOf(getValue(elem)).booleanValue();
679
                        filters.remove(propFilter);
680
                        propFilter--;
681
                    }
682
                }
683

    
684
                this.addTailFilter(recorte, 0D, remove);
685
                filteri = -1;
686
            }
687

    
688
            if (fil.startsWith("filter.removebands.active") &&
689
                    getValue(fil).equals("true")) {
690
                filters.remove(filteri);
691

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

    
695
                    if (elem.startsWith("filter.removebands.bands")) {
696
                        this.addRemoveBands(getValue(elem));
697
                        filters.remove(propFilter);
698
                        propFilter--;
699
                    }
700
                }
701
                filteri = -1;
702
            }
703
            
704
            for (int j = 0; j < managers.size(); j++)
705
                filteri = ((IStackManager) managers.get(j)).createStackFromStrings(fil, filters, filteri);
706

    
707
            filteri++;
708
        }
709
    }
710

    
711
    /**
712
     * Obtiene el elemento de una cadena de la forma elemento=valor
713
     * @param cadena
714
     * @return
715
     */
716
    public static String getElem(String cadena) {
717
        if (cadena != null) {
718
            return cadena.substring(0, cadena.indexOf("="));
719
        } else {
720
            return null;
721
        }
722
    }
723

    
724
    /**
725
     * Obtiene el valor de una cadena de la forma elemento=valor
726
     * @param cadena
727
     * @return
728
     */
729
    public static String getValue(String cadena) {
730
        if (cadena != null) {
731
            return cadena.substring(cadena.indexOf("=") + 1, cadena.length());
732
        } else {
733
            return null;
734
        }
735
    }
736

    
737
    /**
738
     * Convierte un rango contenido en una array doble en una cadena
739
     * de strings para poder salvar a xml
740
     * @param rang
741
     * @return
742
     */
743
    private String rangeToString(int[][] rang) {
744
        StringBuffer rangoStr = new StringBuffer();
745

    
746
        if (rang != null) {
747
            for (int i = 0; i < rang.length; i++) {
748
                rangoStr.append(String.valueOf(rang[i][0]) + ":");
749
                rangoStr.append(String.valueOf(rang[i][1]) + ":");
750
            }
751

    
752
            String r = rangoStr.toString();
753

    
754
            if (r.endsWith(":")) {
755
                r = r.substring(0, r.length() - 1);
756
            }
757

    
758
            return r;
759
        } else {
760
            return null;
761
        }
762
    }
763

    
764
    /**
765
     * Convierte una cadena en una lista de rangos numericos para poder
766
     * asignar transparencias a la imagen
767
     * @param rang
768
     * @return
769
     */
770
    private int[][] stringToRange(String rang) {
771
        if ((rang != null) && !rang.equals("null")) {
772
            ArrayList lista = new ArrayList();
773
            StringTokenizer tokenizer = new StringTokenizer(rang, ":");
774

    
775
            while (tokenizer.hasMoreTokens())
776
                lista.add(tokenizer.nextToken());
777

    
778
            int[][] intervalos = new int[(int) (lista.size() / 2)][2];
779

    
780
            for (int i = 0; i < lista.size(); i = i + 2) {
781
                intervalos[i / 2][0] = Integer.valueOf((String) lista.get(i))
782
                                              .intValue();
783
                intervalos[i / 2][1] = Integer.valueOf((String) lista.get(i +
784
                                                                          1))
785
                                              .intValue();
786
            }
787

    
788
            return intervalos;
789
        } else {
790
            return null;
791
        }
792
    }
793

    
794
    /**
795
     * Obtiene la pila de filtros
796
     * @return RasterFilterStack
797
     */
798
        public RasterFilterStack getFilterStack() {
799
                return filterStack;
800
        }
801

    
802
        /**
803
         * Obtiene la Hashable que contiene los tipos de filtros registrados
804
         * @return Hashtable
805
         */
806
        public Hashtable getTypeFilters() {
807
                return typeFilters;
808
        }
809

    
810
}