Monday, September 27, 2010

patron Factory

Llevando el mantenimiento de una aplicacación. Me comentaron cambiar el envío de los datos, estos datos son un conjunto de ficheros que se tienen que enviar entre 2 computadores. Antes se realizaba a través de un FTP pero ahora se realizaza con rutas locales de red. Todos sabemos que el día de mañana es posible que te digan que lo dejaras como estaba antes. Pues habrá que dejarlo preparado.

Como el envío de los ficheros no está centralizado, es decir, esta disperso en toda la apliacion, y no tienes una clase que centraliza este envío, (yo no lo hice) tienes que deditacte a bucar, modificar y probar todo el código de tu aplicación.
Como solucion propongo el centralizarlo y además de crear un interfaz para el envio de fichero común. Que no sepa el usuario que tipo de envio esta realizarndo. Se envía y punto. Todo ello configurable en un fichero properties

//generamos un interface comun a todas las clases de transporte
public interface TransportFile {
 
   void connect() throws SocketException, IOException;
   void copyFile(String str_rutaOrigen, String str_rutaDestino) throws IOException;
   void disconnect() throws IOException;
   void get(String str_rutaLocal, String str_rutaRemota) throws IOException;
   boolean isConnected();

}
//implementamos cada uno de los metodos de envio de fichero, FTP, unidades de red, etc
 public class LocalFile implements TransportFile{

}
 //creamos una factoria que crea la implementación que necesitemos
public class FactoryTransportFile {

    public FactoryTransportFile(String ftpDireccion,String ftplogin,String ftppassword){
    }
    public TransportFile create(){

    }
}

Pros de esta solución:
No tienes que rehacer todo tu código. solamente donde generas el patron factoria.
Esta preparado para cambiar a otro tipo de métod de transporte de ficheros.

Tuesday, September 21, 2010

gestión de la memoria a través de ficheros

Realizando el mantenimiento de una aplicación, que utiliza un fichero temporal para la copia entre directorios de un FTP, he descubierto un método para mejorar el proceso sin crear ficheros temporales.  Esto es el NIO. Para mí completamente nuevo, pero por lo que he podido leer esta disponible desde la versión 1.4 de JVM.

Con NIO puedes utilizar la memoria como si fuera un fichero. Ya no tienes por que que crearte un byte buffer[], simplemente usas un fichero que se mapea en la memoria, en mi caso lectura y escritura, y te mueves por su contenido, y puedes ir realizando marcas leyendo datos escribiendo, etc.

static int length = 0x01FFFFFF; 

MappedByteBuffer inOut = new RandomAccessFile("fileMemory.dat", "rw").getChannel().map(FileChannel.MapMode.READ_WRITE, 0, length);


//Borra la zona de memoria
inOut.clear();

DataInputStream dis = new DataInputStream(...);

while (dis.available() != 0) {
    inOut.put(dis.readByte());
}
inOut.rewind();//pone el puntero del fichero al inicio

for(;contadorBufferFichero>0;contadorBufferFichero--) {
    dos.writeByte(inOut.get());
}