/**
   * Controla que los tipos de los filtros de la pila sean correctos, es decir, que el tipo de
   * salida de un filtro de salida coincida con el tipo de la entrada del siguiente. En caso de no
   * ser así crea el filtro de tipo adecuado y lo sustituye en el no coincidente. Esto es necesario
   * ya que en la eliminación de filtros puede quedarse en inconsistencia de tipos.
   */
  public void controlTypes() throws FilterTypeException {
    ArrayList exceptions = new ArrayList();
    for (int i = 0; i < rasterFilterList.lenght(); i++) {
      String classFilter = null, packageFilter = null, oldClass = null;
      try {
        RasterFilter rf = rasterFilterList.get(i);
        if (rf == null) return;
        classFilter = rf.getClass().toString();
        packageFilter =
            classFilter.substring(classFilter.indexOf(" ") + 1, classFilter.lastIndexOf("."));
        oldClass = classFilter.substring(classFilter.lastIndexOf(".") + 1, classFilter.length());
      } catch (ArrayIndexOutOfBoundsException ex) {
        return;
      } catch (NullPointerException ex) {
        return;
      }

      // Para el primer filtro comprobamos con el tipo de dato de entrada a la pila
      if (i == 0) {
        if (rasterFilterList.getInitDataType() != rasterFilterList.get(i).getInRasterDataType()) {
          Pattern p =
              Pattern.compile(
                  RasterUtilities.typesToString(rasterFilterList.get(i).getInRasterDataType()));
          Matcher m = p.matcher(oldClass);
          String newClass =
              m.replaceAll(RasterUtilities.typesToString(rasterFilterList.getInitDataType()));
          String strPackage = packageFilter + "." + newClass;

          renewFilterFromControlTypes(strPackage, i, exceptions);
        }

        // Desde el filtro 2 en adelante se compara la salida de uno con la entrada del siguiente
      } else if (rasterFilterList.get(i - 1).getOutRasterDataType()
          != rasterFilterList.get(i).getInRasterDataType()) {
        Pattern p =
            Pattern.compile(
                RasterUtilities.typesToString(rasterFilterList.get(i).getInRasterDataType()));
        Matcher m = p.matcher(oldClass);
        String newClass =
            m.replaceAll(
                RasterUtilities.typesToString(rasterFilterList.get(i - 1).getOutRasterDataType()));
        String strPackage = packageFilter + "." + newClass;

        renewFilterFromControlTypes(strPackage.trim(), i, exceptions);
      }
    }

    if (exceptions.size() > 0) throw new FilterTypeException("");

    if (debug) rasterFilterList.show();
  }
  public ArrayList getStringsFromFilterList() {
    filterList = new ArrayList();
    for (int i = 0; i < rasterFilterList.lenght(); i++) {
      RasterFilter rf = rasterFilterList.get(i);

      // Se recorren todos los managers registrados comprobando si corresponde a
      // la clase del filtro
      for (int j = 0; j < managers.size(); j++)
        filterList =
            ((IRasterFilterListManager) managers.get(j)).getStringsFromFilterList(filterList, rf);
    }

    return filterList;
  }