/** * 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) { } }