Какой лучший способ синхронизировать состояние 2-го комплексного графа объектов

У меня есть сложный граф объектов для представления планирования работы. В какой-то момент мне приходится сериализовать весь график в веб-интерфейс (через XML/JSON), чтобы пользователь мог изменить расписание, используя компонент диаграммы gantt, основанный на Javascript. После того, как пользователь закончил редактирование, состояние графика на уровне Java/server должно быть синхронизировано с измененным состоянием.

Я хотел бы спросить о лучшей стратегии для реализации такой синхронизации состояний сложного графа объектов, например. как изменения в состоянии представлены таким образом, чтобы имитировать изменения на стороне сервера можно упростить? Как другие реализуют это?

FYI, мой текущий стек технологий: JSF + Richfaces, Seam 2.1, Hibernate 3. Но я считаю, что решение этой проблемы может быть использовано и в другом стеке технологий.

Ответ 1

Я предлагаю избегать синхронизации двух графиков, но записывать операции редактирования как операции "Удалить Node/Insert Node/Replace Node". Отправьте эти операции на сервер и примените их к исходному графику.

Эта идея связана с переписыванием AST (абстрактного дерева синтаксиса). В eclipse JDT у вас есть АСТ из вашего источника. Когда применяется рефакторинг (например, переименование метода), должно быть возможно создать предварительный просмотр изменений. Для этого для записи событий перезаписи (Delte/Insert/Replace) записываются и применяются к копии AST. Из этого создается предварительный просмотр. Если пользователь принимает события, применяются к исходному AST.

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

Ответ 2

Я работаю над крупномасштабным проектом с той же (нормальной?) проблемой. Дизайнеры реализовали следующее решение, основанное на шаблоне DTO и CMP2:

Общая идея состоит в том, что каждый bean, представляющий объект на графике, может записывать свои собственные изменения. Поэтому каждый bean имеет дополнительную структуру (набор), где хранятся только ключи (имена столбцов) измененных атрибутов (значений) bean. Логика сервера использует эти подсказки для обновления хранимых данных. Логика сервера может использовать эти подсказки только для обновления изменений.

Сам (упрощенный!) bean выглядит примерно так:

public TableBean {

  private String column1;

  // ... more fields

  private Set<String> changes = new Set<String>();

  public String getColumn1() {
    return column1;
  }

  public void setColumn1(String value) {
    if (!value.equals(column1)) {
      changes.add("column1");
      column1 = value;
    }
  }

  public Collection<String> getChanges() {
    return changes;
  } 
}

Подзависимости обрабатываются соответственно, есть другая структура, которая записывает эти дочерние графы, которые необходимо удалить.

Это может быть даже стандартный шаблон j2ee, прокомментируйте, если это произойдет.

(кроме того, я одобряю решение Arne для новых проектов!)