Mostrando entradas con la etiqueta persistence. Mostrar todas las entradas
Mostrando entradas con la etiqueta persistence. Mostrar todas las entradas

viernes, 13 de marzo de 2009

MemeFX ... mi biblioteca para JavaFX


El nombre puede parecer "curioso", pero tiene una razón "intelectualoide" de ser...

Meme (se pronuncia MIM), responde a toda una teoría sobre la capacidad de las ideas para replicarse y evolucionar por si mismas, como seres vivos. La idea es que el diseño puede surgir del caos (suena a código abierto, ¿no?).

Se supone que a través de un proceso evolutivo y se selección natural, se consigue un resultado superior al original... ahora, como este proyecto es código abierto, y por lo mismo, fácilmente replicable y modificable (puede mutar y evolucionar libremente)... entonces, podría convertirse en un meme.

Veamos si el EFECTO MEME (MemeFX) ocurre con él... ;)

En este momento la biblioteca contiene sólo tres componentes, pero, no por eso no son útiles ;D ... la idea es que con el tiempo vaya creciendo. Tengo algunas ideas como incorporar controles para un menu flotante gráfico (si han mirado el blog, por ahí ya hice un intento), un componente de acordeón, componentes que permitan fácilmente asignar drag and drop a los elementos y definir areas para ser arrojados, un componente para simplificar que los applets sean arrastrables desde el navegador al escritorio (básicamente que genere el área de arrastre solo, porque de por sí es simple habilitar esa funcionalidad), etc. Las ideas son bienvenidas.

Por ahora, aquí está el código fuente de la biblioteca, demos Java Web Start con sus respectivos códigos fuentes y la documentación sobre como utilizarlos y personalizarlos.

Ojalá les sean de utilidad y puedan unirse al proyecto quienes se sientan motivados.

http://code.google.com/p/memefx/

Aquí hay más info sobre los Memes, si alguien tiene curiosidad.

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.