最近做的工作与Jackrabbit有一定的联系,所以看了一部分Jackrabbit的代码。我的这方面的工作会一直持续,所以有关Jackrabbit的文章也会多写几篇。
从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 的一个片断:
nt:hierarchyNode
nt:base
有了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的各项操作的完整性。
这6部分我将分为五篇文章进行详解,敬请留意。