/**
  * Copia los archivos a utilizar por una aplicación, en el directorio de trabajos de tdderive,
  * comprime tales archivos y los divide dejando los resultados de ambas acciones en sus
  * directorios correspondientes.
  * <li>Registra los archivos de la tarea.
  * <li>Si se debe exportar se crea un directorio cuyo nombre será
  *     <tt>"tarea"+MilisegundosDesde1ºEnero1970</tt>.
  * <li>Si se exporta, se exportan los archivos bloque por bloque, asi que aquí se indica el nombre
  *     de cada bloque.
  * <li>Si no se exporta, entonces no se indican bloques, pero se indica que cada archivo está
  *     local.
  *
  * @throws ADMINExcepcion Si error.
  * @throws OIExcepcion Si error.
  */
 protected void ubicaArchivos() throws OIExcepcion, ADMINGLOExcepcion {
   int i = 0, idx = 0;
   String cNombreArchivo, cNombreComprimido, cBloque;
   tdutils.SplitInfo[] acBloques;
   PERSCoordinacion.Archivos archivoI, archivoII = null;
   File fArchivo = null;
   Iterator itr;
   Map mpArchivosACargar = new TreeMap(String.CASE_INSENSITIVE_ORDER);
   mpArchivosACargar.putAll(mpArchivos);
   mpArchivos.clear();
   itr = mpArchivosACargar.values().iterator();
   while (itr.hasNext()) {
     archivoI = (PERSCoordinacion.Archivos) itr.next();
     cNombreArchivo = archivoI.getRutaOriginal();
     fArchivo = new File(cNombreArchivo);
     // el archivo o directorio sí existe
     // se comprime en directorio de comprimidos
     cNombreComprimido = tarea.getComprimidosDir() + "/" + archivoI.getNombre();
     try {
       Zip.zipFile(cNombreComprimido, cNombreArchivo);
     } catch (IOException ex) {
       throw new ADMINGLOExcepcion("No se pudo comprimir archivo.", ex);
     }
     archivoII = new PERSCoordinacion.Archivos(this.info);
     archivoII.setNombre(archivoI.getNombre());
     archivoII.setInfoArchivo(archivoI.getInfoArchivo());
     archivoII.setSiLocal(false);
     archivoII.setEstadoArchivo(ADMINAPPIArchivos.ARCHIVO_PRESENTE);
     // prepara lista de archivos a exportar
     mpArchivos.put(archivoII.getNombre(), archivoII);
   }
 }
  /** Descomprime los archivos de la tarea. */
  protected void descompArchivos() throws ADMINGLOExcepcion {
    String cNombreAnt = "";
    Iterator itr;
    PERSCoordinacion.Archivos archI;
    Map mpArchListos, mpArchPresentes, mpArchAusentes;
    mpArchListos = new TreeMap(String.CASE_INSENSITIVE_ORDER);
    mpArchPresentes = new TreeMap(String.CASE_INSENSITIVE_ORDER);
    if (this.siSubtrabajo()) {
      if (this.siSubtrabajoFin()) {
        subtraV.loadArchivosSalidaListos(mpArchListos);
        subtraV.loadArchivosSalidaPresentes(mpArchPresentes);
      } else {
        subtraV.loadArchivosListos(mpArchListos);
        subtraV.loadArchivosPresentes(mpArchPresentes);
      }
    } else {
      //      // provisional [
      //      try {
      //        this.info.getConex().dbCommit();
      //      } catch (OIExcepcion e) {
      //        System.err.println("[Provisional] No pudo escribirse en la base de datos");
      //      }
      //      // provisional ]
      tarea.loadArchivosListos(mpArchListos);
      tarea.loadArchivosPresentes(mpArchPresentes);
    }
    itr = mpArchivos.values().iterator();
    while (itr.hasNext()) {
      archI = (PERSCoordinacion.Archivos) itr.next();
      if (mpArchListos.get(archI.getNombre()) != null) {
        // el archivo no se debe descomprimir, ya está listo.
      } else {
        if (mpArchPresentes.get(archI.getNombre()) != null) {
          // el archivo se debe descomprimir.
          if (this.siSubtrabajo()) {
            if (this.siSubtrabajoFin()) {
              //              Zip.unzipFile(subtrabajo.getComprimidosDir()+
              //                  "/"+archI.getNombre(),
              //                  subtrabajo.getResultadosDir());
              // tdutils.copiaArchivo()

              try {
                tdutils.copiaArchivo(
                    new File(subtraV.getSubtrabajoDir() + "/" + archI.getNombre()),
                    new File(subtraV.getResultadosDir() + "/" + archI.getNombre()));
                // tdutils.copiaArchivo(new File(subtraV.getSubtrabajoDir()+"/"+ archI.getNombre()),
                // new File(subtraV.getResultadosDir()+"/"+archI.getNombre()));
              } catch (IOException e) {
                e.printStackTrace();
              }

            } else {
              //              Zip.unzipFile(subtrabajo.getComprimidosDir()+
              //                  "/"+archI.getNombre(),
              //                  subtrabajo.getSubtrabajoDir());
            }
          } else {
            Zip.unzipFile(tarea.getComprimidosDir() + "/" + archI.getNombre(), tarea.getTareaDir());
          }
          try {
            archI.setEstadoArchivo(ADMINAPPIArchivos.ARCHIVO_LISTO);
            archI.write();
          } catch (ADMINGLOExcepcion ex) {
          }
        } else {
          // el archivo está ausente
          archI.setEstadoArchivo(ADMINAPPIArchivos.ARCHIVO_AUSENTE);
          try {
            archI.write();
          } catch (ADMINGLOExcepcion ex1) {
          }
          continue;
        }
      }
    }
  }
 /**
  * Importa los archivos de una tarea solicitada y los guarda en forma volátil en la lista de
  * archivos.
  *
  * @throws ADMINExcepcion
  * @throws OIExcepcion
  *     <li>Realiza los chequeos documentados por ejecutarInicio().
  *     <li>Cambia estados de los archivos: de "Ausente" a "Listo".
  */
 protected final boolean importaArchivos() throws OIExcepcion, ADMINGLOExcepcion {
   boolean res = false;
   int medida = 0, puertoremoto = 0;
   byte[] contenidoI = null;
   String sIndicacion = "";
   Map mpArchListos, mpArchPresentes, mpArchivosErroneos, mpEsperas;
   Iterator itr;
   ACONDescriptor desc;
   ACONConectorDesp conec = new ACONConectorDesp();
   PERSCoordinacion.Archivos archivo0;
   ACONGestor gestor;
   itr = mpArchivos.values().iterator();
   mpArchListos = new TreeMap(String.CASE_INSENSITIVE_ORDER);
   mpArchPresentes = new TreeMap(String.CASE_INSENSITIVE_ORDER);
   mpArchivosErroneos = new TreeMap(String.CASE_INSENSITIVE_ORDER);
   mpEsperas = new TreeMap(String.CASE_INSENSITIVE_ORDER);
   if (this.siSubtrabajo()) {
     if (this.siSubtrabajoFin()) {
       subtraV.loadArchivosSalidaListos(mpArchListos);
       subtraV.loadArchivosSalidaPresentes(mpArchPresentes);
     } else {
       subtraV.loadArchivosListos(mpArchListos);
       subtraV.loadArchivosPresentes(mpArchPresentes);
     }
   } else {
     tarea.loadArchivosListos(mpArchListos);
     tarea.loadArchivosPresentes(mpArchPresentes);
   }
   // @TODO considerar carga de archivos corruptos
   try {
     /*
      * decide si importa archivos o no
      */
     if (mpArchivos.size() > 0) {
       /*
        * importa archivos, pide inicio de envío
        */
       if (this.siSubtrabajo()) {
         this.send(
             solicitante.getIdParcial()
                 + tarea.getIdTarea()
                 + subtraV.getIdSubtrabajo()
                 + SOLICITUD_SEPARADOR
                 + SOLICITUD_ENVIAR);
       } else {
         this.send(
             solicitante.getIdParcial()
                 + tarea.getIdTarea()
                 + SOLICITUD_SEPARADOR
                 + SOLICITUD_ENVIAR);
       }
     } else {
       /*
        * no importa archivos, pide que no se envíe
        */
       if (this.siSubtrabajo()) {
         this.send(
             solicitante.getIdParcial()
                 + tarea.getIdTarea()
                 + subtraV.getIdSubtrabajo()
                 + SOLICITUD_SEPARADOR
                 + SOLICITUD_NOENVIAR);
       } else {
         this.send(
             solicitante.getIdParcial()
                 + tarea.getIdTarea()
                 + SOLICITUD_SEPARADOR
                 + SOLICITUD_NOENVIAR);
       }
     }
     /*
      * [0] Recibe puerto del exportador de archivos
      * que ya espera pasivamente las conexiones
      */
     try {
       this.setTiempoEspera((int) info.getPesoUmbralPolitica("DESPA_ESPERA_DETALLEIMPORT"));
     } catch (ADMINGLOExcepcion ex) {
       this.setTiempoEspera(TIEMPOESPERA_LECTURA);
     }
     sIndicacion = this.receive();
     try {
       puertoremoto = Integer.parseInt(sIndicacion);
       if (puertoremoto == 0) {
         System.err.println("El puerto remoto es cero.");
       }
     } catch (Exception ex) {
       System.err.println("El puerto remoto es cero.");
       puertoremoto = 0;
     }
     System.out.println("Usará el puerto: " + puertoremoto + ".");
     if (puertoremoto != 0) {
       /*
        * [1] Ciclo de importación de archivos. Se importa
        *     archivo por archivo utilizando un hilo diferente.
        */
       while (itr.hasNext()) {
         archivo0 = (PERSCoordinacion.Archivos) itr.next();
         /*
          * los archivos adquieren 'personalidad' como
          * parte de una tarea o de un subtrabajo
          *
          */
         if (this.siSubtrabajo()) {
           System.out.println(
               "----------- Prepara importación 1 " + this.subtraV.toString() + " -----------");
           archivo0.setSubTrabajo(this.subtraV);
           archivo0.setSiEntrada(!this.subtrabajo.getSiFin());
         } else {
           archivo0.setTarea(this.tarea);
         }
         if (mpArchListos.get(archivo0.getNombre()) != null) {
           // el archivo ya está listo, no se toca
         } else {
           // el archivo no está listo
           if (mpArchPresentes.get(archivo0.getNombre()) != null) {
             // el archivo está sin descomprimir
           } else {
             if (mpArchivosErroneos.get(archivo0.getNombre()) != null) {
               // @TODO Archivo con error debe poderse mandar de nuevo.
             } else {
               System.out.println("----------- Prepara importación 2 -----------");
               // el archivo no está
               archivo0.write();
               this.info.getConex().dbCommit();
               desc = new ACONDescriptor();
               desc.localport = 0;
               desc.remoteport = puertoremoto;
               desc.remotehost = this.getHostRemoto();
               desc.socket_type = ACONDescriptor.STREAM;
               desc.aoNavegables = new Object[] {this.info, archivo0};
               /*
                * se hace un hilo por cada archivo a importar
                */
               desc.wait = false;
               try {
                 desc.tiempoConexion =
                     (int) info.getPesoUmbralPolitica("DESPA_ESPERA_IMPORTACIONCONEX");
               } catch (ADMINGLOExcepcion ex) {
                 desc.tiempoConexion = TIEMPOESPERA_CONEXION;
               }
               try {
                 desc.tiempoEspera =
                     (int) info.getPesoUmbralPolitica("DESPA_ESPERA_ARCHIVOIMPORT");
               } catch (ADMINGLOExcepcion ex) {
                 desc.tiempoEspera = TIEMPOESPERA_LECTURA;
               }
               gestor = new ADMINGLOGestionImportadora(desc);
               conec.conecta(gestor);
               mpEsperas.put(archivo0.getNombre(), gestor);
               res = true;
             }
           }
         }
       }
     } else {
       /*
        * se recibió un puerto inválido para el canal de
        * transmisión de datos
        */
       System.err.println("Error en el puerto del canal de " + "transmisión de datos.");
     }
     /*
      * [2] cierra el extremo pasivo exportador
      */
     if (mpEsperas.size() > 0) {
       /*
        * espera a que todos los hilos hayan terminado de
        * importar
        */
       itr = mpEsperas.values().iterator();
       while (itr.hasNext()) {
         gestor = (ACONGestor) itr.next();
         if (gestor.esFin()) {
           // camina simplemente
         }
       }
     }
     this.send(SOLICITUD_CERRAR);
     /*
      * [3] determina si debe esperar el resultado de la tarea
      */
     if (_si_esperar) {
       /*
        * [3.1] al sistema lo están esperando
        */
     } else {
       /*
        * [3.2] al sistema no lo están esperando
        */
     }
     this.info.getConex().dbCommit();
     mpArchListos.clear();
     mpArchListos = null;
     mpArchPresentes.clear();
     mpArchPresentes = null;
     mpArchivosErroneos.clear();
     mpArchivosErroneos = null;
     itr = null;
     archivo0 = null;
   } catch (OACTExcepcion ex) {
     // errores de envío y recepción, se asume que no se puede
     // establecer contacto.
     if (mpArchListos != null) {
       mpArchListos.clear();
       mpArchListos = null;
     }
     if (mpArchPresentes != null) {
       mpArchPresentes.clear();
       mpArchPresentes = null;
     }
     if (mpArchivosErroneos != null) {
       mpArchivosErroneos.clear();
       mpArchivosErroneos = null;
     }
     itr = null;
     archivo0 = null;
     throw new ADMINGLOExcepcion("Error en importación de archivos.", ex);
   } catch (ACONExcArbitraria ex) {
     ex.printStackTrace();
   } catch (ACONExcOmision ex) {
     ex.printStackTrace();
   } catch (ACONExcTemporizacion ex) {
     ex.printStackTrace();
   }
   return res;
 }
  /**
   * Importa los archivos de una tarea solicitada y los guarda en forma volátil en la lista de
   * archivos.
   *
   * @throws ADMINExcepcion
   * @throws OIExcepcion
   *     <li>Realiza los chequeos documentados por ejecutarInicio().
   *     <li>Cambia estados de los archivos: de "Ausente" a "Listo".
   * @deprecated Mejor utilizar importaArchivos, debido a que ahora se cuenta con un canal de
   *     comunicacion dedicado a la transmisión de datos.
   */
  protected void importaArchivosOld() throws OIExcepcion, ADMINGLOExcepcion {
    int medida = 0;
    byte[] contenidoI = null;
    PERSCoordinacion.Archivos archivo0, archivo00 = null;
    Iterator itr;
    itr = mpArchivos.values().iterator();
    Map mpArchListos, mpArchPresentes, mpArchivosErroneos;
    mpArchListos = new TreeMap(String.CASE_INSENSITIVE_ORDER);
    mpArchPresentes = new TreeMap(String.CASE_INSENSITIVE_ORDER);
    mpArchivosErroneos = new TreeMap(String.CASE_INSENSITIVE_ORDER);
    tarea.loadArchivosListos(mpArchListos);
    tarea.loadArchivosPresentes(mpArchPresentes);
    try {
      /*
       * Solamente va a haber un archivo.
       */
      if (itr.hasNext()) {
        archivo0 = (PERSCoordinacion.Archivos) itr.next();
        archivo0.setTarea(this.tarea);
        if (mpArchListos.get(archivo0.getNombre()) != null) {
          // el archivo ya está listo, no se toca
          this.send(
              solicitante.getIdParcial()
                  + tarea.getIdTarea()
                  + SOLICITUD_SEPARADOR
                  + SOLICITUD_NOENVIAR);
        } else {
          // el archivo no está listo
          if (mpArchPresentes.get(archivo0.getNombre()) != null) {
            // el archivo está sin descomprimir
            this.send(
                solicitante.getIdParcial()
                    + tarea.getIdTarea()
                    + SOLICITUD_SEPARADOR
                    + SOLICITUD_NOENVIAR);
          } else {
            if (mpArchivosErroneos.get(archivo0.getNombre()) != null) {
              // TODO Archivo con error debe poderse enviar de nuevo.
              this.send(
                  solicitante.getIdParcial()
                      + tarea.getIdTarea()
                      + SOLICITUD_SEPARADOR
                      + SOLICITUD_NOENVIAR);
            } else {
              // el archivo no se encuentra y se necesita importar
              this.send(
                  solicitante.getIdParcial()
                      + tarea.getIdTarea()
                      + SOLICITUD_SEPARADOR
                      + SOLICITUD_ENVIAR);
              archivo0.setEstadoArchivo(ADMINAPPIArchivos.ARCHIVO_IMPORTANDO);
              /*
               * TODO Debe esperar el número de puerto para el enlace de datos
               * usado para el intercambio de archivos.
               */

              archivo0.write();
              try {
                contenidoI = new byte[10 * 1024]; // 10KB
                while ((medida = this.receiveb(contenidoI)) >= 0) {
                  archivo0.setContenido(contenidoI, medida);
                  archivo0.write();
                  System.err.println("\nSe han escrito " + medida + " bytes.\n");
                }
              } catch (ADMINGLOExcepcion ex) {
                // no se pudo escribir archivo (¿?)
                // detiene la importación
                mpArchivosErroneos.put(archivo0.getNombre(), archivo0.getNombre());
                archivo0.setContenido(null);
                archivo0.setEstadoArchivo(ADMINAPPIArchivos.ARCHIVO_IMPORTANDO);
                archivo0.write();
              }
            }
          }
        }
      }
      this.info.getConex().dbCommit();
      mpArchListos.clear();
      mpArchListos = null;
      mpArchPresentes.clear();
      mpArchPresentes = null;
      mpArchivosErroneos.clear();
      mpArchivosErroneos = null;
      itr = null;
      archivo0 = null;
      archivo00 = null;
      this.closeComm();
    } catch (OACTExcepcion ex) {
      // errores de envío y recepción, se asume que no se puede
      // establecer contacto.
      if (mpArchListos != null) {
        mpArchListos.clear();
        mpArchListos = null;
      }
      if (mpArchPresentes != null) {
        mpArchPresentes.clear();
        mpArchPresentes = null;
      }
      if (mpArchivosErroneos != null) {
        mpArchivosErroneos.clear();
        mpArchivosErroneos = null;
      }
      itr = null;
      archivo0 = null;
      archivo00 = null;
      try {
        this.closeComm();
      } catch (OACTExcepcion ex1) {
      }
      throw new ADMINGLOExcepcion("Error en importación de archivos.", ex);
    } catch (ACONExcArbitraria ex) {
      ex.printStackTrace();
    } catch (ACONExcOmision ex) {
      ex.printStackTrace();
    } catch (ACONExcTemporizacion ex) {
    }
  }