2009-11-04 130 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