com.ejie.r01f.jvt
Class JVTComparator

java.lang.Object
  extended bycom.ejie.r01f.jvt.JVTComparator

public class JVTComparator
extends java.lang.Object

Clase que compara dos objetos JVT (Java Value Types), buscando las diferencias en su estado y en base a ellas compone un "plan de trabajo" con los cambios a realizar Se tienen dos copias de objetos JVT, uno que está en un estado S1 y otro que está en un estado S2 (estado S1 después de que se hayan modificado datos, creado o borrado objetos dependientes) Esta clase se encarga de buscar las diferencias entre el estado S1 y el estado S2 componiendo un plan de trabajo con las actualizaciones a realizar. El objetivo es construir una lista que ponga "en plano" el grafo del objeto junto con las operaciones que hay que realizar para pasar del estado S1 al estado S2 El resultado de comparar las siguientes jerarquías de objetos: Obj1 Obj1 (estado modificado) |_Obj1.1 |_Obj1.1 (inalterado) | |_Obj1.1.1 | |_Obj1.1.1 (estado modificado) | |_Obj1.1.2 | |_(El objeto 1.1.2 y sus descendientes han sido borrados) | |_Obj1.1.2.1 |_(El objeto 1.2 y sus descendientes han sido borrados) |_Obj1.2 |_Obj1.3 (nuevo objeto junto con una jerarquia inferior nueva) |_Obj1.2.1 |_Obj1.3.1 |_Obj1.3.2 |_Obj1.3.2.1 Será la siguiente lista de instrucciones a realizar: 1 [Actualizar el estado de Obj1] 2 [Actualizar el estado de Obj1.1.1] 3 [Borrar Obj1.1.2 (y sus descendientes) de los hijos de Obj1.1] 4 [Borrar Obj1.2 (y sus descendientes)] 5 [Insertar Obj1.3 como hijo de Obj1] 6 [Insertar Obj1.3.1 como hijo de Obj1.3] 7 [Insertar Obj1.3.2 como hijo de Obj1.3] 8 [Insertar Obj1.3.2.1 como hijo de Obj1.3.2] Las posibles operaciones a realizar son: - Actualizar el estado del objeto - Crear o borrar un objeto dependiente con el que hay una relacion de COMPOSICION (el objeto dependiente NO tiene vida propia sin el padre: "borrado en cascada") - Hacer o quitar un link con un objeto dependiente con el que hay una relacion de AGREGACIÓN (el objeto dependiente TIENE vida propia sin este objeto: "no hay borrado en cascada") El algoritmo es RECURSIVO con las siguientes llamadas: _compare(objS1,objS2) | ---> _processObjMembers(objS1,objS2) <---------------------------------------------------------| (dependiendo de si el objeto dependiente es una coleccion o un objeto simple) | |--> _processSet(parentObj,parentField,objsS1,objsS2) == COLECCION == | | | | | ----> _processSubSet(parentObj,parentField,objsMapS1,objsMapS2) | | | | | ---> _processObject(parentObj,parentField,objS1,objS2)-------->| (llamada recursiva) | | ---> _processObject(parentObj,parentField,objS1,objS2) == OBJETO SIMPLE == ----->| (llamada recursiva) Ejemplo de utilizacion: // Ejecutar la comparacion XOMap map = new XOMap(new FileInputStream(XMLProperties.get("r01d","mapFiles/contentObjects")) ); JVTComparator comp = new JVTComparator(map,cont1,cont2); // Pintar DEBUG R01FLog.to("r01f.test").fine(JVTComparator.composeDebugInfo( comp.getPlanTable() ); R01FLog.to("r01f.test").fine("\r\n\r\n\r\n############################ FIN DE LA COMPARACION ########################\r\n\r\n\r\n\r\n\r\n\r\n\r\n"); // Informacion de depuracion JVTComparator.PlanTableOperation operation = comp.nextOperation() ; while (operation != null) { System.out.print(operation.toString()); if (operation.args != null) { if (operation.args.length == 1) { R01FLog.to("r01f.test").fine(" OIDs = " + (operation.args[0] != null ? comp.getObjectOid(operation.args[0]):" obj null")); } else if (operation.args.length == 2) { R01FLog.to("r01f.test").fine(" OIDs = " + (operation.args[0] != null ? comp.getObjectOid(operation.args[0]):"obj null") + "," + (operation.args[1] != null ? comp.getObjectOid(operation.args[1]):"obj null")); } } operation = comp.nextOperation(); } } NOTA: Llamar al método reset cuando se reutilice el mismo comparador (con el mismo mapa) para comparar varias veces


Nested Class Summary
 class JVTComparator.PlanTableOperation
           
 
Field Summary
static java.lang.String[] OPERATION_DESCS
           
 
Constructor Summary
JVTComparator()
          Constructor por defecto
JVTComparator(XOMap map, java.lang.Object objS1, java.lang.Object objS2)
          Constructor en base al mapeo de clases y miembros y los objetos a comparar.
 
Method Summary
 java.lang.String composeDebugInfo()
          Compone información de depuración acerca de la pila de operaciones
static java.lang.String composeDebugInfo(java.util.List planList)
          Pinta la informacion de depuración a partir de la lista de tareas Utilizacion: // Ejecutar la comparacion XOMap map = new XOMap(new FileInputStream(XMLProperties.get("r01d","mapFiles/contentObjects")) ); JVTComparator comp = new JVTComparator(map,cont1,cont2); JVTComparator.composeDebugInfo( comp.getPlanTable() );
 void doComparision(XOMap map, java.lang.Object objS1, java.lang.Object objS2)
          Ejecuta la comparacion de los objetos utilizando el mapeo especificado Compara dos objetos JVT para crear un "plan de trabajo":: Busca los cambios que ha podido haber entre el objeto en el estado 1 (inicial) y el estado2 (final).
 java.lang.Object getObjectOid(java.lang.Object obj)
          Metodo de utilidad que obtiene el oid de un objeto
 java.util.List getPlanTable()
          Devuelve la lista de operaciones a realizar
 java.util.Iterator getPlanTableIterator()
          Obtiene un iterador por las operaciones a realizar
 JVTComparator.PlanTableOperation nextOperation()
          Obtiene la siguiente operacion en la lista
 JVTComparator.PlanTableOperation prevOperation()
          Obtiene la operacion anterior en la lista
 void reset()
          Resetea el objeto para hacer otra comparación basada en el mismo mapa Llamar a este método cuando se reutilice el mismo comparador (con el mismo mapa) para comparar varias veces
 
Methods inherited from class java.lang.Object
equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

OPERATION_DESCS

public static final java.lang.String[] OPERATION_DESCS
Constructor Detail

JVTComparator

public JVTComparator()
Constructor por defecto


JVTComparator

public JVTComparator(XOMap map,
                     java.lang.Object objS1,
                     java.lang.Object objS2)
              throws JVTComparatorException
Constructor en base al mapeo de clases y miembros y los objetos a comparar. En el propio constructor se lanza la ejecución de la comparacion

Parameters:
map - Fichero de mapeo de clases y miembros
objS1 - Objeto en el estado 1
objS2 - Objeto en el estado 2
Throws:
JVTComparatorException - si ocurre un error durante la comparacion
Method Detail

composeDebugInfo

public java.lang.String composeDebugInfo()
Compone información de depuración acerca de la pila de operaciones

Returns:
una cadena con las operaciones a ejecutar

composeDebugInfo

public static java.lang.String composeDebugInfo(java.util.List planList)
Pinta la informacion de depuración a partir de la lista de tareas Utilizacion: // Ejecutar la comparacion XOMap map = new XOMap(new FileInputStream(XMLProperties.get("r01d","mapFiles/contentObjects")) ); JVTComparator comp = new JVTComparator(map,cont1,cont2); JVTComparator.composeDebugInfo( comp.getPlanTable() );

Parameters:
planList - La lista de operaciones se obtiene del objeto JVTComparator con el metodo getPlanTable()
Returns:
Una cadena con informacion de depuracion

reset

public void reset()
Resetea el objeto para hacer otra comparación basada en el mismo mapa Llamar a este método cuando se reutilice el mismo comparador (con el mismo mapa) para comparar varias veces


doComparision

public void doComparision(XOMap map,
                          java.lang.Object objS1,
                          java.lang.Object objS2)
                   throws JVTComparatorException
Ejecuta la comparacion de los objetos utilizando el mapeo especificado Compara dos objetos JVT para crear un "plan de trabajo":: Busca los cambios que ha podido haber entre el objeto en el estado 1 (inicial) y el estado2 (final).

Parameters:
map - Fichero de mapeo de clases y miembros
objS1 - Objeto en el estado 1
objS2 - Objeto en el estado 2
Throws:
JVTComparatorException - si ocurre un error durante la comparacion

nextOperation

public JVTComparator.PlanTableOperation nextOperation()
Obtiene la siguiente operacion en la lista

Returns:
Una operacion a realizar o null si no hay mas operaciones para realizar

prevOperation

public JVTComparator.PlanTableOperation prevOperation()
Obtiene la operacion anterior en la lista

Returns:
Una operacion a realizar o null si no hay operaciones anteriores

getPlanTableIterator

public java.util.Iterator getPlanTableIterator()
Obtiene un iterador por las operaciones a realizar

Returns:
El iterador o null si la lista de operaciones es null

getPlanTable

public java.util.List getPlanTable()
Devuelve la lista de operaciones a realizar

Returns:
La lista de operaciones

getObjectOid

public java.lang.Object getObjectOid(java.lang.Object obj)
                              throws JVTComparatorException
Metodo de utilidad que obtiene el oid de un objeto

Parameters:
obj - El objeto cuyo oid se quiere obtener
Returns:
El oid
Throws:
JVTComparatorException - Si existe alguna excepción en el proceso de comparación