Chinaunix首页 | 论坛 | 博客
  • 博客访问: 128353
  • 博文数量: 69
  • 博客积分: 2895
  • 博客等级: 少校
  • 技术积分: 710
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-03 18:05
文章分类

全部博文(69)

文章存档

2010年(69)

我的朋友

分类:

2010-09-11 15:07:36

从jackrabbit.apache.org把Jackrabbit源代码下载下来,它把各模块分为好几个类包,在本文,我所讲的是Jackrabbit的核心包 jackrabbit-core. 

无论你以哪种方式来使用Jackrabbit, jackrabbit-core包必不可少。jackrabbit-core包负责文件的存储,索引的建立。如果有cluster, core包还要负责Jackrabbit集群方面的工作。好,接下来,我们以如下几个主题展开来讲。 

1. Node Type : org/apache/jackrabbit/core/nodetype 
   node type 定义内容的存储格式,众所周知,Jackrabbit是JSR 170 或 JSR 283 JCR 的一个实际。 那么它就要以树状的节点来存储内容,节点下面可以有子节点也可以没有, 节点下面还可以有属性。 属性里面存储文本的或是二进制的内容,在Jackrabbit 里面称之为Value. 

Jackrabbit将节点类型定义在一个XML里面, 如下: 

下面是摘自 org/apache/jackrabbit/core/nodetype/builtin_nodetypes.xml 的一个片断: 

Xml代码 
  1. <nodeType name="nt:file" isMixin="false" hasOrderableChildNodes="false" primaryItemName="jcr:content">  
  2.     <supertypes>  
  3.         <supertype>nt:hierarchyNodesupertype>  
  4.     supertypes>  
  5.     <childNodeDefinition name="jcr:content" defaultPrimaryType="" autoCreated="false" mandatory="true" onParentVersion="COPY" protected="false" sameNameSiblings="false">  
  6.         <requiredPrimaryTypes>  
  7.             <requiredPrimaryType>nt:baserequiredPrimaryType>  
  8.         requiredPrimaryTypes>  
  9.     childNodeDefinition>  
  10. nodeType>  


有了Node Type的定义,Jackrabbit 的存储才有章可循, 只有按照指定的格式存储,数据的完整性,合理性,交换性才可能得到保障。 

2 Item State : org/apache/jackrabbit/core/state 
  
  在核心层,Jackrabbit以Item State来管理内存中的临时数据,以保存数据为例,应用层将数据封将成 Item, core 核心将 Item 转换为 Item State, 然后将 State 持久到DB或是文件系统 

   Item State 的持久化过程可分为Session, Local, Share 三层。 Session层收集应用层数据经 Local 层到Share 层, Share 层检测冲突并 与  持久层原数据进行合并然后将合并结果持久化到 持久层。 


3 版本 

4 Search Manager: 
   
   搜索是Jackrabbit很重要的一块,它基于Lucene, 可采用XML或SQL构建语法树来进行搜索。 

5 事件机制 
   
   一个Node 或是 Property 产生 CRUD 的操作都会有相应的事件产生,事件的消费者会对事件进行消费。 在Jackrabbit 里面,搜索模块的索引建立就有赖于事件机制, 如果将Jackrabbit的集群功能启用起来,事件机制还可帮助Jackrabbit保持Cache同步。 


6. 锁/并发 

    Jackrabbit中的锁机制可保证Jackrabbit的各项操作的完整性。

7.Node Type 

在Jackrabbit里,org/apache/jackrabbit/core/nodetype/builtin_nodetypes.xml是Node Type的内置定义文件。为了自定义自己的Node Type, 你可以在此文件夹下面建一个 custom_nodetypes.xml 文件,里面可以定义自己的Node Type. 



下面, 我们详细看看内置Node Type 是如何定义的: 

Xml代码 
  1. <nodeType name="nt:file" isMixin="false" hasOrderableChildNodes="false" primaryItemName="jcr:content">  
  2.     <supertypes>  
  3.         <supertype>nt:hierarchyNodesupertype>  
  4.     supertypes>  
  5.     <childNodeDefinition name="jcr:content" defaultPrimaryType="" autoCreated="false" mandatory="true" onParentVersion="COPY" protected="false" sameNameSiblings="false">  
  6.         <requiredPrimaryTypes>  
  7.             <requiredPrimaryType>nt:baserequiredPrimaryType>  
  8.         requiredPrimaryTypes>  
  9.     childNodeDefinition>  
  10. nodeType>  


在Jackrabbit里面, Node Type具有继承性,甚至还有可以相互组合的特点。就Java里面Object是所有类的基类一样,在Jackrabbit里面, 所有 Node Type 的 Super Type 是 nt:base. 刚刚说过Node Type 可以有相互组合的特点,意思就是说我可以让几个node type合并在一起组成一个新的node type, 但也有一定的约束。 我们看一下上面那一段node type 的定义: 

nt:file 是一个 node type, 它的 isMixin 属性为 false, 这表示 nt:file 只可以作为某个node 的主类型。 我们前面提到的 node type 的组合就是说 一个 node 可以有一个主类型加若干个 mix 类型。 也就是说一个 node 可以没有mix类型,但一定要有主类型。 

知道了这个之后,我们看一下nt:base是如何定义的。 

Xml代码 
  1. <nodeType name="nt:base" isMixin="false" hasOrderableChildNodes="false" primaryItemName="">  
  2.     <propertyDefinition name="jcr:primaryType" requiredType="Name" autoCreated="true" mandatory="true" onParentVersion="COMPUTE" protected="true" multiple="false"/>  
  3.     <propertyDefinition name="jcr:mixinTypes" requiredType="Name" autoCreated="false" mandatory="false" onParentVersion="COMPUTE" protected="true" multiple="true"/>  
  4. nodeType>  


好的,我们知道了, nt:base 也是 node 的主类型, 属性 hasOrderableChildNodes 表示它下面的子节点是不是按顺排列的。 

Okay, node type不仅仅定义了它自身的特点,它还管着自己的子节点的部分特性。 同样是上面那个例子里面有两个PropertyDefinition, 它们定义了这个node 下面只能有两个属性,一个名为jcr;primaryType, 另一个名为 jcr:mixinTypes. 



propertyDefinition 定义的几个属性意义分别为: 

name: 属性名称, 属性名称也可是星号。 如果星号则表示任何名字都可以。 
requiredType: 类型约束,表示这个属性只可以存放所定义的类型。 
autoCreated: 表示是否是自动创建, 节点被创建时,node type 所定义的 autoCreated 为 true 的 properties 也要求同时被创建。 
mandatory: 为true表示这个Property是一个必须有的Property,只要被创建了,就不能被删除。 
protected: 为true表示这个属性是一个受保护的Property,这个Property不能被修改。 
multiple: 表示Property存储的是一个数组。 

好了,nt:base 这个 node type 已经讲完了,其它的其本类同。 

为了把 node type 定义讲的全面些,我们看一个普通的类型定义, 如下: 


Xml代码 
  1. <nodeType name="nt:folder" isMixin="false" hasOrderableChildNodes="false" primaryItemName="">  
  2.     <supertypes>  
  3.         <supertype>nt:hierarchyNodesupertype>  
  4.     supertypes>  
  5.     <childNodeDefinition name="*" defaultPrimaryType="" autoCreated="false" mandatory="false" onParentVersion="VERSION" protected="false" sameNameSiblings="false">  
  6.         <requiredPrimaryTypes>  
  7.             <requiredPrimaryType>nt:hierarchyNoderequiredPrimaryType>  
  8.         requiredPrimaryTypes>  
  9.     childNodeDefinition>  
  10. nodeType>  


与nt:base相比,它多了个supertypes的定义和childNodeDefinition的定义。 

supertypes定义了它继承自如个节点,childNodeDefinition则是对自身的子节点作了些约束。如上。 
阅读(1247) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~