Реализация истории изменений статьи для веб-приложения на основе 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.