Dear list
I'm trying to use OCM in a project or two - but for now I'm simply running a
few tests with the "5' with Jackrabbit OCM" sample [1]. Things work out quite
nicely (atomic fields, beans), but unfortunately I cannot seem to get the
collections to work. My java objects setup looks like this:
PressRelease -1-------------n- URL
Now I would like this object graph to be stored in the repo as follows (N =
Node, P = Property, node type behind node in parenthesis):
N (testPressRelease) pressrelease1
|
--- P date
--- P title
--- N (mgnl:contentNode) urls
|
--- N (pressReleaseURL) url1
--- N (pressReleaseURL) url2
--- N (pressReleaseURL) url3
QUESTION 1: What would my collection descriptor have to look like?
I tried with:
- fieldName: url
- jcrName: url
- elementClassName: test.package.URL
- jcrType: mgnl:contentNode
and always got an exception like
"javax.jcr.nodetype.ConstraintViolationException: no matching child node
definition found for {}urls". (The node type definitions are listed below for
those interested in the details.)
Looking at the code of DefaultCollectionConverterImpl (line 114) I noticed that
the node type is not passed to the addNode() method when creating the
collection node. So I guess the system fully relies on the node type
definition, looking for a child node definition for that name to get the info
to build the collection node? Isn't this a bit... "static"?
QUESTION 2: What is the CollectionDescriptors "jcrType" for? I tried to change
the behavior of the DefaultCollectionConverterImpl class so that it would look
at jcrType and pass this on as the type to use when adding the collection node.
Unfortunately this broke about 1/3 of the unit tests. So what's the intention
here? Should I write a custom converter class if I want a more dynamic approach
than the node type definitions?
Thanks!
-will
Details of the node type definitions:
The parent node in my case is of the type "testPressRelease". It is defined as
follows:
<nodeType hasOrderableChildNodes="true" isMixin="false" name="testPressRelease"
primaryItemName=""><supertypes><supertype>dataItem</supertype></supertypes></nodeType>
dataItem is defined as:
<nodeType hasOrderableChildNodes="true" isMixin="false" name="dataItem"
primaryItemName=""><supertypes><supertype>dataItemBase</supertype></supertypes><childNodeDefinition
autoCreated="true" defaultPrimaryType="mgnl:metaData" mandatory="true"
name="MetaData" onParentVersion="COPY" protected="false"
sameNameSiblings="false"><requiredPrimaryTypes><requiredPrimaryType>mgnl:metaData</requiredPrimaryType></requiredPrimaryTypes></childNodeDefinition></nodeType>
dataItemBase is defined as:
<nodeType hasOrderableChildNodes="true" isMixin="false" name="dataItemBase"
primaryItemName=""><supertypes><supertype>dataBase</supertype></supertypes></nodeType>
dataBase as:
<nodeType hasOrderableChildNodes="true" isMixin="false" name="dataBase"
primaryItemName=""><supertypes><supertype>mix:referenceable</supertype><supertype>nt:hierarchyNode</supertype></supertypes><propertyDefinition
autoCreated="false" mandatory="false" multiple="false" name="*"
onParentVersion="COPY" protected="false"
requiredType="undefined"/><childNodeDefinition autoCreated="false"
defaultPrimaryType="" mandatory="false" name="*" onParentVersion="COPY"
protected="false"
sameNameSiblings="true"><requiredPrimaryTypes><requiredPrimaryType>nt:base</requiredPrimaryType></requiredPrimaryTypes></childNodeDefinition></nodeType>
[1]: http://jackrabbit.apache.org/5-with-jackrabbit-ocm.html