El mecanismo de persistencia se basa en la existencia
de una clase Storage, similar a un map,
encargada de
almacenar el estado de un objeto. Cada objeto debera exponer
un metodo getstate
encargado de almacenar su
estado en el Storage, y un metodo setstate
encargado de recuperar su estado del Storage.
Aunque las clases del paquete estan pensadas para persistir sobre XML, podria sustituirse el motor de persistencia para dar persistencia sobre otro formato. Nos encontraremos:
Este interface se presenta como un Map especializado, junto
con metodos para volcar su contenido a XML, a traves del metodo
dump
, o para recuperar su valor, mediante load
.
Ademas de este interface se suministra una clase abstracta, {@link storage.StorageAbstract}. Esta clase provee de la implementacion necesaria para que el Storage se comporte como un Map con las peculiaridades necesarias. Por ejemplo, si se introduce un valor de tipo objeto, comprovara si este objeto soporta el interface {@link storage.IStorable}, y de ser asi, intentara persistir el objeto en un nuevo Storage, siendo este ultimo el que almacenara. Ademas presentara la implementacion para almacenar {@link java.util.Map} y {@link java.util.Collection}, de forma que se de soporte a estructuras de datos complejas.
Esta clase, {@link storage.StorageAbstract}, dejara sin implementar los
metodos dump
y
load
del interface {@link storage.IStorage} para que puedan
ser creadas varias clases que den soporte a como se persiste el
objeto, pudiendose asi implementar varias alternativas al formato
en de oersistencia.
getstate
y setstate
. Estos dos
metodos recibiran un objeto que cumple el interface {@link storage.IStorage}.
El primero, getstate
, se encargara de almacenar el
estado del objeto sonre el Storage, y el segundo de recuperar su
estado desde el.
dump
y load
que le faltan a esta
para completar el interface {@link storage.IStorage}.
Estos metodos reciben un {@link java.io.Reader} y {@link java.io.Writer} respectivamente
y son los encargados de formatear los datos almacenados en el
Storage en XML o recuperarlos desde un XML.
Un ejemplo sencillo de como usar el Storage podemos verlo con la clase Direccion. Podriamos tener la siguiente implementacion:
public class Direccion implements IStorable { String calle = null; String localidad = "aqui"; String pais = null; public Direccion(String calle, String localidad, String pais) { this.calle = calle; this.localidad = localidad; this.pais = pais; } public void getstate(IStorage state) { state.setTheClass(this); state.put("calle",this.calle); state.put("localidad",this.localidad); state.put("pais",this.pais); } public void setstate(IStorage state) { this.calle = (String)state.get("calle"); this.localidad = (String)state.get("localidad"); this.pais = (String)state.get("pais"); } }
Para persistir la clase en XML seria:
Direccion direccion = new Direccion("calle1", "localidad1", "pais1"); IStorage storage = new StorageXML(); FileWriter writer = null; direccion.getstate(storage); writer = new FileWriter("direccion.xml"); storage.dump(writer); writer.close();
Y para recuperar su estado desde el XML:
Direccion direccion = new Direccion(); IStorage storage = new StorageXML(); FileReader reader = null; reader = new FileReader("direccion.xml"); storage.load(reader); direccion.setstate(storage);