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.blogjava.net/ronghao 荣浩原创,转载请注明出处:)
posted on 2007-01-23 23:57 ronghao 阅读(6805) 评论(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年6月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

关注工作流和企业业务流程改进。现就职于ThoughtWorks。新浪微博:http://weibo.com/ronghao100

常用链接

留言簿(38)

随笔分类

随笔档案

文章分类

文章档案

常去的网站

搜索

  •  

最新评论

阅读排行榜

评论排行榜