这一章我们主要是来了解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 是如何定义的:
在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是如何定义的。
好的,我们知道了, 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 定义讲的全面些,我们看一个普通的类型定义, 如下:
与nt:base相比,它多了个supertypes的定义和childNodeDefinition的定义。
supertypes定义了它继承自如个节点,childNodeDefinition则是对自身的子节点作了些约束。如上。
针对想自定义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则是对自身的子节点作了些约束。如上。