2010-07-29 15 views
9

¿Conoces una buena biblioteca de visitantes de Java objeto gráfico?Biblioteca de visitantes del gráfico de objetos Java

Quiero visitar un objeto y sus subcomponentes y realizar algunas acciones cuando se cumplen algunas condiciones. uso

Ejemplo:

  • en un enorme gráfico de objetos de dominio, restablecer cada id para null
  • en un enorme gráfico de objetos de dominio, reemplazar cada Set con una instancia TreeSet que contiene el mismo elementos.

Quiero una biblioteca, no código personalizado porque atravesar un gráfico de objetos puede ser complicado. Tienes que manejar colecciones, matrices, proxies, etc. ... He pensado en reutilizar parte de XStream para lograr esto, pero no parece tan fácil: el visitante de Xstream está más orientado a la transformación de objetos que la auto modificación de objetos. .

+0

+1, interesante pregunta! –

Respuesta

1

¿Por qué necesita una biblioteca para poder hacer eso?

Dado que especifica que este es un gráfico de objeto de dominio, ¿por qué no definir e implementar interfaces relevantes para permitir que sus objetos de dominio sean visitados por diferentes implementaciones de visitante? Una de las implementaciones podría (según especifique) restablecer cada ID a null.

Ejemplo

En primer lugar definir las interfaces que deben aplicar los objetos que se pueden visitar o actuar como visitantes.

public interface Visitable { 
    void visit(Visitor visitor); 
} 

public interface Visitor { 
    void visitDomainObjectA(DomainObjectA obj); 
    void visitDomainObjectB(DomainObjectB obj); 
} 

Ahora defina dos clases de objetos de dominio, que se pueden visitar.

public abstract class DomainObject implements Visitable { 
    private Object id; 

    public Object getId() { return this.id; } 
    public void setId(Object id) { this.id = id; } 
} 

public class DomainObjectA extends DomainObject { 
    public void visit(Visitor visitor) { 
    visitor.visitDomainObjectA(this); 
    } 
} 

public class DomainObjectB extends DomainObject { 
    public void visit(Visitor visitor) { 
    visitor.visitDomainObjectB(this); 
    } 
} 

Ahora definir una implementación concreta del visitante que hace algo útil:

public class MyVisitor implements Visitor { 
    public void visitDomainObjectA(DomainObjectA doa) { 
    doa.setId(null); 
    } 

    public void visitDomainObjectB(DomainObjectB dob) { 
    doa.setId(UUID.randomUUID()); 
    } 
} 
+0

He refinado mi pregunta acerca de su respuesta relevante. Mi dominio es enorme y mis gráficos son complejos. Entonces necesito algo robusto y ya depurado y listo para usar. – Guillaume

+0

IMO ha hecho el problema complicado tratando de ser genérico. ¿Cuál es el punto en una biblioteca que puede atravesar * cualquier * gráfico de objeto (presumiblemente por reflexión) y luego llamar * a cualquier método * en objetos determinados? De hecho, descarta cualquier tipo de seguridad de tipo de tiempo de compilación. Después de todo, podría argumentarse que cualquier aplicación OO simplemente está atravesando un gráfico de objeto y métodos de llamada en un subconjunto de los objetos. – Adamski

+0

No quiero ser genérico. Mi dominio es súper complicado;) Y por cierto, así es como funcionan las herramientas de serialización como XStream. Y funcionan bien. – Guillaume

1

¿Qué hay de cálculo de referencias de su gráfico de objetos en XML y el uso de alguna biblioteca XML manejo/manipulación estándar?

+0

Esa es una buena sugerencia, pero quiero evitarla si es posible. Agrega algunos pasos más que me gustaría evitar – Guillaume

+0

¿Cuáles serían esos pasos? – Jatin

+0

la parte 'auto-modificación' probablemente necesitará mucha código personalizado ... – Guillaume

1

Puede valer la pena intentar una base de datos de gráfico como Neo4j o TitanDB. Le permitirá afectar las visitas mediante el uso de consultas para reducir su conjunto de datos y explorar las relaciones.

Ambos tienen amplias API de Java para facilitar la carga y consulta de datos.

2

Como sucede, he hecho algo así. No es realmente una biblioteca, pero podría convertirse fácilmente en una.

Pero me encontré con esto porque estaba buscando algo mejor. No puedo darlo, y definitivamente todavía no está en un estado en el que haría esto, pero tal vez tal cosa debería venir a vivir como sistema operativo.

Lo que tengo me permite recorrer y modificar un gráfico de objetos de tipo seguro, instancia por instancia, opcionalmente duplicándolo de manera que el original permanezca intacto. Java por cierto.Lo que también funciona un poco es captar las relaciones en el gráfico (los bordes, si quieres).

Lo que podría visualizar es una definición nítida de operaciones (como modificar, extender, duplicar, colapsar, atravesar) y las implementaciones respectivas. Los aspectos ortogonales, como identificar subgrafos, se deberían tener en cuenta.

Cualquier persona interesada en un proyecto de este tipo responda, tal vez podamos comenzar algo.

Cuestiones relacionadas