详析 Jackrabbit 各个模块 (二)

这一章我们主要是来了解Node Type 模块。

针对想自定义Jackrabbit功能的人来讲,了解Node Type 模块非常重要。 实际上,根据存储结构的不同,我们在实际应用中肯定要根据情况来新增一些自定义的Node Type 以满足实际需要。

接下来,我来讲Node Type的内容:

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



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

    <nodeType name="nt:file" isMixin="false" hasOrderableChildNodes="false" primaryItemName="jcr:content">
        <supertypes>
            <supertype>nt:hierarchyNode</supertype>
        </supertypes>
        <childNodeDefinition name="jcr:content" defaultPrimaryType="" autoCreated="false" mandatory="true" onParentVersion="COPY" protected="false" sameNameSiblings="false">
            <requiredPrimaryTypes>
                <requiredPrimaryType>nt:base</requiredPrimaryType>
            </requiredPrimaryTypes>
        </childNodeDefinition>
    </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是如何定义的。

    <nodeType name="nt:base" isMixin="false" hasOrderableChildNodes="false" primaryItemName="">
        <propertyDefinition name="jcr:primaryType" requiredType="Name" autoCreated="true" mandatory="true" onParentVersion="COMPUTE" protected="true" multiple="false"/>
        <propertyDefinition name="jcr:mixinTypes" requiredType="Name" autoCreated="false" mandatory="false" onParentVersion="COMPUTE" protected="true" multiple="true"/>
    </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 定义讲的全面些,我们看一个普通的类型定义, 如下:


    <nodeType name="nt:folder" isMixin="false" hasOrderableChildNodes="false" primaryItemName="">
        <supertypes>
            <supertype>nt:hierarchyNode</supertype>
        </supertypes>
        <childNodeDefinition name="*" defaultPrimaryType="" autoCreated="false" mandatory="false" onParentVersion="VERSION" protected="false" sameNameSiblings="false">
            <requiredPrimaryTypes>
                <requiredPrimaryType>nt:hierarchyNode</requiredPrimaryType>
            </requiredPrimaryTypes>
        </childNodeDefinition>
    </nodeType>


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

supertypes定义了它继承自如个节点,childNodeDefinition则是对自身的子节点作了些约束。如上。








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值