Suministra los interfaces y clases necesarios para dotar de persistencia sobre XML a los objetos de un proyecto.

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:

Interface del motor de persistencia.

Para implementar la parte de persistencia de objetos, se suministra un interface que debe cumplir la clase encargada de persistir un objeto, {@link storage.IStorage}.

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.

Interface de los objetos persistentes.

Para que un objeto sea persistente debera implementar el interface {@link storage.IStorable}. Este interface obliga a la implementacion de dos metodos, 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.

El motor de persistencia sobre XML.

La clase encargada de persistir un objeto es {@link storage.StorageXML}. Esta clase implementa extiende a {@link storage.StorageAbstract}, implementado los metodos 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 de uso.

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);

Documentacion relacionada

Las clases siguientes son usadas por Storage.