Реализация истории изменений статьи для веб-приложения на основе Java

Любые идеи о том, как лучше всего реализовать историю изменений статей для веб-приложения на основе Java и сохранить ее в AuditLog

Stackru уже имеет такую ​​функцию, позволяющую увидеть различия между версиями, почти как у клиентов SVN.

Это больше вопрос дизайна, чем вопроса реализации.

дополнение: как можно отобразить эти изменения на веб-странице?

дополнение: предлагаемое решение

Article
--------------------------------
    Integer id
    String title
    String body
    List<Tag> tags
    AppUser createdBy
    Date createdDate

AuditLog
--------------------------------
    Integer id
    Integer objectId
    Operation operation // enum with UPDATE and DELETE. I won't audit an insert
    Date createdDate
    AppUser createdBy
    String class
    String revisionXML
    String comment

Перехватчик Hibernate будет перехватывать процесс сохранения и использовать Castor XML для создания XML-строки старого объекта.

Класс и идентификатор используются для получения ревизий конкретного объекта.

google-diff-match-patch будет использоваться для создания HTML-файлов diff

2 ответа

Решение

Лучшим решением было бы использовать базу данных или хранилище, которое уже поддерживает версии, например Apache Jackrabbit.

Если это не вариант, то вы должны решить, где вы хотите хранить статьи. В файловой системе? Затем сделайте каждую статью каталогом и сохраните редакции в виде чисел (00001, 00002 и т. Д.) И поместите номер последней редакции в специальный файл (например, current). Тогда вы можете быстро узнать, сколько существует версий (просто посмотрите на current) и иди вперед и назад.

Если вы используете базу данных, добавьте поле номера версии в таблицу статей и добавьте вторую таблицу или флаг, в котором указано, какая из них является текущей версией. Вы также можете выбрать с помощью max(version) но эти конструкции SQL имеют тенденцию быть довольно уродливыми и запутанными. Гораздо проще сохранить эту информацию в другом месте.

[РЕДАКТИРОВАТЬ] Чтобы создать diff, посмотрите на этот проект: http://code.google.com/p/google-diff-match-patch

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

Другие вопросы по тегам