posts - 193,  comments - 520,  trackbacks - 0
內容倉庫模型
JSR-170 是這樣定義內容倉庫的,內容倉庫由一組 workspace(工作空間)組成,這些workspace通常應該包含相似的內容。一個內容倉庫有一個到多個 workspace。每個workspace都是一個樹狀結構,都有一個唯一的樹根節點(root node)。樹上的item(元素)或者是個node(節點)或者是個property(屬性)。每個node都可以有零個到多個子節點和零個到多個子屬性。只有根節點沒有父節點,其余所有的節點都有一個父節點。property 也必須有一個父節點,但它沒有子節點或是子屬性,property 是葉子元素。property是真正存儲數據的元素。

下圖描述了一個blog應用程序的內容倉庫模型。每個root node(根節點)的子節點都代表了一個blog實體。與這個blog實體有關的數據都存儲在 bolgEntry 節點的屬性里,其中一個 blogAttachment property 存儲了一個二進制圖片文件。
repositorymodel3.gif
根據內容倉庫實現的功能,JSR-170定義了三種級別:
Level 1:定義了一個只讀的內容倉庫。功能包括讀取內容,將內容導出為XML和查找內容。
Level 2:定義了可寫的內容倉庫。Level 2是Level 1的擴展,新增的功能包括往內容倉庫里寫入內容,和從XML導入數據到倉庫。
Advanced options:定義實現五種附加功能,版本控制、JTA、SQL查詢、清晰的內容鎖定和監視。

什么是Apache JackRabbit?
Apache JackRabbit是一個開放源碼的JSR-170 實現,實現了Level 2,但它還有許多擴展的功能。詳細可以去它的官方網站。

下面我們決定用Apache JackRabbit來作為我們示例程序的內容倉庫。

如何配置Apache JackRabbit
JackRabbit需要兩個參數來配置一個內容倉庫實例。
1.內容倉庫主目錄:這個文件目錄下通常包含了所有的內容,搜索索引,內部配置文件和其他持久化信息。它的結構看起來會像下面這個樣子:
???c:/temp
????????
|
????????
|--Blogging
????????????????
|
????????????????
|-repository
????????????????
|???????|
????????????????
|???????|-index
????????????????
|???????|-meta
????????????????
|???????|-namespaces
????????????????
|???????|-nodetypes?????????????
????????????????
|
????????????????
|-version
????????????????
|
????????????????
|-workspace
????????????????????????
|
????????????????????????
|--default

? 在上面的情況下,內容倉庫主目錄是c:/temp/Blogging.
2.內容倉庫配置文件:一個典型的配置文件如下:
<Repository>
?
<FileSystem?class="org.apache.jackrabbit.core.fs.local.LocalFileSystem">
??
<param?name="path"?value="${rep.home}/repository"/>
?
</FileSystem>
?
<Security?appName="Jackrabbit">
??
<AccessManager?class="org.apache.jackrabbit.core.security.SimpleAccessManager"/>
??
<LoginModule?class="org.apache.jackrabbit.core.security.SimpleLoginModule">
????
<param?name="anonymousId"?value="anonymous"/>
??
</LoginModule>
?
</Security>
?
<Workspaces?rootPath="${rep.home}/workspaces"?defaultWorkspace="default"/>
?
<Workspace?name="${wsp.name}">
??
<FileSystem?class="org.apache.jackrabbit.core.fs.local.LocalFileSystem">
???
<param?name="path"?value="${wsp.home}"/>
??
</FileSystem>
??
<PersistenceManager?
????????
class="org.apache.jackrabbit.core.state.db.DerbyPersistenceManager">
???
<param?name="url"?value="jdbc:derby:${wsp.home}/db;create=true"/>
???
<param?name="schemaObjectPrefix"?value="${wsp.name}_"/>
??
</PersistenceManager>
??
<SearchIndex?class="org.apache.jackrabbit.core.query.lucene.SearchIndex">
???
<param?name="path"?value="${wsp.home}/index"/>
??
</SearchIndex>
?
</Workspace>
?
<Versioning?rootPath="${rep.home}/version">
??
<FileSystem?class="org.apache.jackrabbit.core.fs.local.LocalFileSystem">
???
<param?name="path"?value="${rep.home}/version"?/>
??
</FileSystem>
??
<PersistenceManager?
????????
class="org.apache.jackrabbit.core.state.db.DerbyPersistenceManager">
???
<param?name="url"?value="jdbc:derby:${rep.home}/version/db;create=true"/>
???
<param?name="schemaObjectPrefix"?value="version_"/>
??
</PersistenceManager>
??
</Versioning>
??
<SearchIndex?class="org.apache.jackrabbit.core.query.lucene.SearchIndex">
???
<param?name="path"?value="${rep.home}/repository/index"/>
??
</SearchIndex>
</Repository>

?
? 在這個配置文件里,<Repository>元素是根元素,它包含了下面這些元素:
? a,<FileSystem>: 該元素配置了內容倉庫的全局數據存儲位置,這些全局數據包括已注冊的命名空間,定制的節點類型等等。??? ??? JackRabbit 提供了幾種選擇,一種是像上面例子里配置的存儲在本地文件里,LocalFileSystem. 如果你想把它們存儲在數據庫里,你可以使用 DbFileSystem.
? b,<Security>:內容倉庫的安全配置,它有兩個子元素:<AccessManager>和<LoginModule>。<AccessManager>配置的類用來判斷用戶有沒有權限來對特定數據執行特定的操作。
? c,<Workspaces>:這個元素的配置對所有的workspace都通用。它的rootPath 屬性是所有workspace文件夾的根目錄,在我們的例子里它是c:/temp/Blogging/Workspace;defaultWorkspace 屬性則包含了workspace的默認名。
? d,<Workspace>:這個元素是所有workspace的默認配置模板。去每個workspace文件夾下你都會發現一個workspace.xml文件,這個文件和這個元素的配置一模一樣。三個子元素:<FileSystem>,和這個workspace相關數據的存儲位置;<PersistenceManager> ,這個workspace內容節點存儲策略;<SearchIndex>,可選,全文檢索。
? e,<Versioning>:配置一個版本相關的對象。其實JackRabbit也是把它作為節點來處理的。

這兩個參數可以通過兩種方式設置,一種是在倉庫實例創建時直接傳到Jackrabbit里去,一種是間接的通過設置JNDI object factory。
你可以設置org.apache.jackrabbit.repository.home 這個系統屬性的值來指定你的內容倉庫主目錄;也可以設置
org.apache.jackrabbit.repository.conf 這個系統屬性的值來指定你的內容倉庫配置文件repository.xml。如果你不設定這兩個
參數,Jackrabbit會把當前目錄作為內容倉庫主目錄,同時,它有一個默認的內容倉庫配置文件。

http://www.cxosbg.tw/ronghao 榮浩原創,轉載請注明出處:)
posted on 2007-01-23 23:57 ronghao 閱讀(6556) 評論(25)  編輯  收藏 所屬分類: 工作日志cms

FeedBack:
# re: 什么是JAVA內容倉庫(Java Content Repository)(2)
2007-01-25 10:39 | 饒志華
有無JSR-170 的中文版?  回復  更多評論
  
# re: 什么是JAVA內容倉庫(Java Content Repository)(2)
2007-01-25 20:58 | ronghao
呵呵 如果你有,麻煩隨便給我也發一份:)  回復  更多評論
  
# re: 什么是JAVA內容倉庫(Java Content Repository)(2)
2007-06-21 10:29 | 無名小卒
配置存儲在數據庫里怎么配啊?  回復  更多評論
  
# re: 什么是JAVA內容倉庫(Java Content Repository)(2)
2007-06-21 12:03 | ronghao
<PersistenceManager>節點屬性可以配置  回復  更多評論
  
# re: 什么是JAVA內容倉庫(Java Content Repository)(2)
2007-06-21 15:22 | 無名小卒
請問倉庫除了存儲和提供數據,還有其它的能力嗎?比如訪問控制工作流之類的?  回復  更多評論
  
# re: 什么是JAVA內容倉庫(Java Content Repository)(2)
2007-06-21 18:19 | ronghao
權限控制這塊做的很弱。我覺得主要是提供了一種很爽的數據存儲模型,樹結構,符合編程習慣。另外就是內置了版本管理以及全文檢索。  回復  更多評論
  
# re: 什么是JAVA內容倉庫(Java Content Repository)(2)
2007-06-22 08:56 | 無名小卒
在實際開發中,它只能做為存儲單元,與前臺的門戶和后面的工作流是怎么結合的呢?它有沒有接口直接訪問別人提供的數據內容展現給門戶!!  回復  更多評論
  
# re: 什么是JAVA內容倉庫(Java Content Repository)(2)[未登錄]
2007-06-22 09:54 | ronghao
你可以把它理解等同為數據庫,你從里面獲取和存儲數據而已,與前臺的門戶和后面的工作流的結合都不是它而是開發人員所要操心的事情。  回復  更多評論
  
# re: 什么是JAVA內容倉庫(Java Content Repository)(2)
2007-06-22 10:03 | 無名小卒
好的,謝謝!!那jcr提供的那些接口,比如rmi,net是做什么用啊?  回復  更多評論
  
# re: 什么是JAVA內容倉庫(Java Content Repository)(2)[未登錄]
2007-06-22 17:07 | ronghao
我沒用到過。猜想的話,應該是提供遠程訪問。  回復  更多評論
  
# re: 什么是JAVA內容倉庫(Java Content Repository)(2)
2007-06-25 16:40 | 無名小卒
想把數據存儲在數據庫里,除了配置使用DbFileSystem.還需要怎么配置啊?還有數據庫結構怎么定義?太麻煩你了哈,剛接觸這個!想認真學習一下,又找不到相關的文檔!  回復  更多評論
  
# re: 什么是JAVA內容倉庫(Java Content Repository)(2)[未登錄]
2007-06-26 22:43 | ronghao
@無名小卒
不需要再配置,jackrabbit會在第一次初始化的時候自動生成相關的數據庫表:)  回復  更多評論
  
# re: 什么是JAVA內容倉庫(Java Content Repository)(2)
2007-06-27 09:36 | 無名小卒
哦,是這樣哦!就只要配置Repository.xml里的filesystem節點就行了是不?
:)  回復  更多評論
  
# re: 什么是JAVA內容倉庫(Java Content Repository)(2)
2007-06-27 09:39 | 無名小卒
還有這個DBFILESYSTEM支持所有的數據庫嗎?  回復  更多評論
  
# 報錯,搞不懂了
2007-06-27 10:10 | 無名小卒
ERROR - failed to initialize file system
java.sql.SQLException: ORA-00906: 缺少左括號

at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
at oracle.jdbc.ttc7.TTIoer.processError(TTIoer.java:289)
at oracle.jdbc.ttc7.Oall7.receive(Oall7.java:573)
at oracle.jdbc.ttc7.TTC7Protocol.doOall7(TTC7Protocol.java:1891)
at oracle.jdbc.ttc7.TTC7Protocol.parseExecuteFetch(TTC7Protocol.java:1093)
at oracle.jdbc.driver.OracleStatement.executeNonQuery(OracleStatement.java:2047)
at oracle.jdbc.driver.OracleStatement.doExecuteOther(OracleStatement.java:1940)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:2709)
at oracle.jdbc.driver.OracleStatement.executeUpdate(OracleStatement.java:796)
at org.apache.jackrabbit.core.fs.db.DatabaseFileSystem.checkSchema(DatabaseFileSystem.java:1166)
at org.apache.jackrabbit.core.fs.db.DatabaseFileSystem.init(DatabaseFileSystem.java:181)
at org.apache.jackrabbit.core.config.FileSystemConfig.createFileSystem(FileSystemConfig.java:47)
at org.apache.jackrabbit.core.RepositoryImpl.<init>(RepositoryImpl.java:239)
at org.apache.jackrabbit.core.RepositoryImpl.create(RepositoryImpl.java:584)
at org.apache.jackrabbit.core.TransientRepository$2.getRepository(TransientRepository.java:245)
at org.apache.jackrabbit.core.TransientRepository.startRepository(TransientRepository.java:265)
at org.apache.jackrabbit.core.TransientRepository.login(TransientRepository.java:333)
at org.apache.jackrabbit.core.TransientRepository.login(TransientRepository.java:388)
at com.test.common.JcrBase.<clinit>(JcrBase.java:26)
at com.example.FourHop.addN(FourHop.java:34)
at com.example.FourHop.main(FourHop.java:20)
Exception in thread "main" java.lang.NullPointerException
at com.example.FourHop.addN(FourHop.java:38)
at com.example.FourHop.main(FourHop.java:20)
  回復  更多評論
  
# re: 什么是JAVA內容倉庫(Java Content Repository)(2)
2007-06-27 10:43 | 無名小卒
成功了!!  回復  更多評論
  
# re: 什么是JAVA內容倉庫(Java Content Repository)(2)
2007-06-27 14:46 | 無名小卒
唉,還沒搞懂啊!!里面有幾個FILEsystem節點,該怎么配置啊? 數據還是存在文件系統里,能不能給我你做的DEMO看看!謝謝!!QQ:20367120  回復  更多評論
  
# re: 什么是JAVA內容倉庫(Java Content Repository)(2)
2007-06-27 17:29 | 無名小卒
數據庫里創建了三張表,但是數據還是存在本地系統的文件里面得!搞不懂怎么使用了!  回復  更多評論
  
# re: 什么是JAVA內容倉庫(Java Content Repository)(2)[未登錄]
2007-06-28 09:40 | ronghao
# re: 什么是JAVA內容倉庫(Java Content Repository)(2)
2007-06-28 11:38 | 無名小卒
怎么都看不到關于全用數據庫存儲的東西哦!!
他的示例也是文件系統:
System.setProperty("org.apache.jackrabbit.repository.home","c:/temp/Blogging");  回復  更多評論
  
# re: 什么是JAVA內容倉庫(Java Content Repository)(2)
2007-06-28 15:07 | 無名小卒
<PersistenceManager class="org.apache.jackrabbit.core.state.db.JNDIOracleDatabasePersistenceManager">
<param name="path" value="${wsp.home}/db"/>
<param name="dataSourceLocation" value="jdbc/jcr"/>
<param name="checkValidConnectionSQL" value="select 0 from dual" />
<param name="schemaObjectPrefix" value="pm_def"/>
<param name="schema" value="oracle" />
<param name="externalBLOBs" value="false"/>
</PersistenceManager>

--------要把這個配成直接連數據庫怎么配啊?  回復  更多評論
  
# re: 什么是JAVA內容倉庫(Java Content Repository)(2)
2007-06-28 15:26 | 無名小卒
配好了!!現在只差跟數據源的配置了!!哈哈!!  回復  更多評論
  
# re: 什么是JAVA內容倉庫(Java Content Repository)(2)
2008-06-10 17:22 | zhou_zch
剛開始接觸jcr,有類似于helloworld這樣的實例沒  回復  更多評論
  
# re: 什么是JAVA內容倉庫(Java Content Repository)(2)[未登錄]
2008-10-24 23:16 | bill
請問后臺數據與前臺UI 是怎樣調用的?比如文件系統中保存的信息怎樣顯示到前臺 以tree 的方式?煩勞
  回復  更多評論
  
# re: 什么是JAVA內容倉庫(Java Content Repository)(2)
2011-07-26 22:18 | 斐格
這玩意還真是難搞啊  回復  更多評論
  

只有注冊用戶登錄后才能發表評論。


網站導航:
 
<2007年1月>
31123456
78910111213
14151617181920
21222324252627
28293031123
45678910

關注工作流和企業業務流程改進。現就職于ThoughtWorks。新浪微博:http://weibo.com/ronghao100

常用鏈接

留言簿(37)

隨筆分類

隨筆檔案

文章分類

文章檔案

常去的網站

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

云南11选5软件