2010-07-29 1 views
9

Знаете ли вы хорошую библиотеку посетителя графического объекта java?Java-объект graph visitor library

Я хочу посетить объект и его подкомпоненты и выполнить некоторые действия при выполнении некоторых условий. Использование

Примера:

  • на огромном объект домена графа, сбросить каждый идентификатор null
  • на огромном объект домена графа, заменить каждую Set с TreeSet экземпляра, содержащим те же элементы.

Мне нужна библиотека, а не пользовательский код, потому что обход графа объектов может быть сложным. Вы должны обрабатывать коллекции, массивы, прокси и т. Д. ... Я думаю о повторном использовании XStream для достижения этого, но это выглядит не так просто: посетитель Xstream более ориентирован на преобразование объекта, чем самообследование объекта ,

+0

+1, интересный вопрос! –

ответ

1

Зачем вам нужна библиотека для этого?

Учитывая, что вы указываете, что это граф объекта, тогда почему бы не определить и реализовать соответствующие интерфейсы, чтобы позволить вашим объектам домена посещать различные реализации посетителя? Одна из реализаций могла (как вы укажете) сбросить каждый ID до null.

Пример

Сначала определяют интерфейсы, которые будут реализованы с помощью объектов, которые можно посетить или выступать в качестве посетителей.

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

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

Теперь определите два класса объектов домена, оба из которых можно посетить.

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

Теперь определит конкретную реализацию Visitor, что делает что-то полезное:

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

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

Я уточнил свой вопрос о вашем соответствующем ответе. Мой домен огромный, а мои графики - комплексы. Поэтому мне нужно что-то надежное и уже отлаженное и готовое к использованию. – Guillaume

+0

ИМО, вы сделали проблему сложной, пытаясь быть более общим. Какая точка в библиотеке, которая может пересекать * любой * объектный граф (предположительно путем отражения), а затем вызывать * любой метод * на заданных объектах? Вы эффективно отказываетесь от какой-либо безопасности типа компиляции. В конце концов, можно утверждать, что любое приложение OO просто пересекает граф объектов и вызывает методы на подмножестве объектов. – Adamski

+0

Я не хочу быть uber-generic. Мой домен усложнен;) И, кстати, именно так работают инструменты сериализации, такие как XStream. И они отлично работают. – Guillaume

1

Как насчет сортировочной вашего графа объектов в XML и использовать некоторые стандартные библиотеки XML обработки/манипуляций?

+0

Это хорошее предложение, но я хочу избежать его, если это возможно. Он добавляет еще несколько шагов, которые я бы хотел избежать. – Guillaume

+0

Какими будут эти шаги? – Jatin

+0

Часть «самообновление объекта», вероятно, потребует большого количества настраиваемого кода ... – Guillaume

1

Возможно, стоит попробовать базу данных графа, такую ​​как Neo4j или TitanDB. Это позволит вам повлиять на посещение, используя запросы для перекрестного набора данных и изучения отношений.

Оба они имеют обширные API-интерфейсы Java для облегчения загрузки и запросов данных.

2

Как бы то ни было, я сделал такое. На самом деле это не библиотека, но она может легко превратиться в одну.

Но я наткнулся на это, так как искал что-то лучшее. Я не могу это дать, и это определенно еще не в состоянии, когда я это сделаю, но, возможно, такая вещь должна появиться в качестве ОС?

То, что я позволяю мне перемещаться и модифицировать тип объекта, тип-типа, экземпляр-экземпляр, необязательно дублируя его, чтобы исходный текст оставался нетронутым. Java BTW.То, что также немного работает, - это схватывание отношений в графе (ребра, если хотите).

То, что я мог представить, - это четкое определение операций (таких как модификация, расширение, дублирование, коллапс, траверс) и соответствующие имполнения. Ортогональные аспекты, такие как идентификационные подграфы, будут правильно учтены.

Любой, кто интересуется таким проектом, пожалуйста, ответьте, возможно, мы сможем что-то начать.