2009-11-04 33 views
3

如何最好我可以实现一个基于Java的Web应用程序的文章修订历史记录,并保存在审计日志实施第三修订历史

任何想法

StackOverflow上已经有这样的功能,让一见从一个版本到另一个版本的差异,几乎和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 

HibernateInterceptor将拦截 保存过程和使用Castor XML创建旧的对象的XML字符串。

类和id用于获取特定对象的修订版。

google-diff-match-patch将被用于创建HTML差异文件

+0

从答案中,我将使用DaisyDiff。 SVNKit适用于SVN服务器中的数据。从JackRabbit的API中,我没有看到用于获取文档/节点差异的任何接口。 – n002213f

+0

发现了一个类似的问题:http://stackoverflow.com/questions/923398/how-show-revision-history-like-revisions – n002213f

+0

更多; http://stackoverflow.com/questions/39281/database-design-for-revisions; http://stackoverflow.com/questions/762405/database-data-versioning – n002213f

回答

2

最好的解决办法是使用其已经支持版本的数据库或存储,例如Apache Jackrabbit

如果这不是一个选项,那么你必须决定你想存储文章的位置。在文件系统上?然后使每篇文章成为一个目录,并将修订版保存为数字(00001,00002等),并将最新修订版的编号放入特殊文件(如current)中。然后,您可以快速找出有多少个版本(只需查看current)并前后移动即可。

如果您使用数据库,则向文章表中添加一个版本号字段,并添加第二个表或标记,以指明当前版本是哪一个。你也可以用max(version)进行选择,但是那些SQL结构往往是相当丑陋和令人困惑的。在别处保存这些信息要简单得多。

[编辑]生成的diff,看看这个项目:google-diff-match-patch

+0

我将使用MySQL数据库,语法突出显示如何显示网页上的差异(添加,删除...)? – n002213f

+0

看一看Apache Jackrabbit – n002213f

+0

在数据存储之上,你需要一个diff工具。看到这个项目:http://code.google.com/p/google-diff-match-patch/ –

1

我会使用现有的VCS(例如,SVN)的引擎盖下。您有修订历史记录 - 剩下的部分就是从应用程序到VCS的界面。

+3

如果你走这条路,看看SvnKit(http://svnkit.com/)一个Java Svn库,尽管我会推荐使用Jackrabbit(JCR)作为其他答案,因为它也会为你做更多的事情。 – cjstehno