miércoles, 11 de marzo de 2009

Como guardar datos persistentes en una aplicación JavaFX Web Start


Esto permite que incluso una aplicación JWS -sin autorización para acceder a los recursos locales- almacene objetos y datos localmente, utilizando un mecanismo parecido a los "cookies" de los navegadores web.

Para el desarrollo del proyecto, hay que incluir el archivo javaws.jar entre las bibliotecas del proyecto, de manera de poder compilar el código. El archivo javaws.jar es standard en las distribuciones de Java 6 y posteriores, así que no es necesario incluirlo en la distribución de tu aplicación.

Comenzamos incluyendo los import en la aplicación:

import java.io.*;
import java.net.URL;
import javax.jnlp.*;

A continuación declaramos dos variables:

var persistenceService: PersistenceService = null;
var codebase: URL = null;

En el bloque INIT de la aplicación JavaFX, incluimos:

init {
try {
var basicService: BasicService =
ServiceManager.lookup("javax.jnlp.BasicService")
as BasicService;
codebase = basicService.getCodeBase();
persistenceService =
ServiceManager.lookup("javax.jnlp.PersistenceService")
as PersistenceService;
} catch (use:Exception) {
}

};

Eso inicializa codebase y persistenceService.

En este ejemplo, declaro una clase Java que contendrá los datos que deseo almacenar persistentemente en el computador del usuario:

import java.io.Serializable;

class persistentData implements Serializable {

public float x;
public float y;
public float width;
public float height;

persistentData (float x, float y, float width, float height) {
this.x=x;
this.y=y;
this.width=width;
this.height=height;
};
}

Ahora, puedo incluir el código para almacenar en el repositorio local una instancia de mi clase persistentData:


var cache = new persistentData (x, y, width, height);
try {
var fc: FileContents =
persistenceService.get(codebase);
var oos: ObjectOutputStream =
new ObjectOutputStream
(fc.getOutputStream(true));
oos.writeObject( cache );
oos.flush();
oos.close();
} catch (e:Exception) {
}


Y para recuperar el objeto desde el repositorio:

var cache:persistentData;
try {

var appSettings: FileContents = null;
appSettings = persistenceService.get(codebase);
var ois: ObjectInputStream = new ObjectInputStream
( appSettings.getInputStream() );
cache = ois.readObject() as persistentData;
ois.close();
} catch (fnfe: FileNotFoundException ) {
try {
var size = persistenceService.create(codebase, 1024);
} catch (ioe:IOException) {
}
} catch (e:Exception) {
}


Voila!

Nota: el número 1024 en la línea persistenceService.create(codebase, 1024) indica el espacio (en bytes) que la aplicación está solicitando al repositorio para almacenar datos.

Si vas a ejecutar más de una aplicación Java Web Start desde una misma ruta (el mismo directorio en las URLs), es necesario agregar algo al codebase de manera de distinguir a ambas aplicaciones, porque si no, van a "pisarse" los datos almacenados.

No hay comentarios: