Primary item inheritance or redefinition in CND
-----------------------------------------------
Key: JCR-493
URL: http://issues.apache.org/jira/browse/JCR-493
Project: Jackrabbit
Issue Type: Improvement
Components: nodetype
Affects Versions: 1.0.1
Reporter: Jaka Jaksic
Priority: Minor
Jackrabbit does not support primary item inheritance among node types. The JCR
spec does not require this, although I think it would be correct. From object
methodology's point of view, a subtype should have all features of its
supertype, but currently a subtype of a node type that has a primary item
defined (e.g. nt:resource) has NO primary item, therefore the subtype can not
be used in generic procedures written for its supertype, which breaks the rules
of object orientation. (There may also be other properties besides primary item
which are not inherited.)
Because the JCR spec (section 6.7.8) does not specify exactly how inheritance
(especially of multiple types) should be handled, there is another possible
solution to this problem, which is more Jackrabbit specific: to simply redefine
the primary item in each subtype. This works well if the primary item is set
directly thorough NoteTypeDef.setPrimaryItemName() method. But it produces an
error if the subtype's is defined, together with the primary item, in a CND
file and imported with CompactNodeTypeDefReader.
A CND like the following produces "ambigous property definition" exception
(EffectiveNodeType.internalMerge(), line 1051):
...
[foo:myResource] > nt:resource
- jcr:data (binary) mandatory
...
It would be nice if it was possible to define node types like this entirely in
CND, not having to add the primary items manually. Even better would be if
there was proper node type inheritance, but since this is not a JCR
requirement, you just do what you think is best.
I created a simple solution for myself, which provides me node type inheritance
(not handling potential conflicts among multiple supertypes):
private static void inheritPrimaryItemName(final NodeTypeDef ntd, final
NodeTypeRegistry ntReg) {
if (ntd.getPrimaryItemName() != null) return;
for (QName superNodeTypeName : ntd.getSupertypes()) {
try {
NodeTypeDef superNtd = ntReg.getNodeTypeDef(superNodeTypeName);
QName piName = superNtd.getPrimaryItemName();
if (piName != null) {
ntd.setPrimaryItemName(piName);
return;
}
} catch (NoSuchNodeTypeException e) {}
}
}
I call this during the CND import procedure for every imported node type .
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira