jackrabbit-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Giota Karadimitriou <Giota.Karadimitr...@eurodyn.com>
Subject extend a node type
Date Tue, 13 Dec 2005 13:38:52 GMT
I am trying to extend the node type "nt:resource" in order to be able to add
custom properties to it.
I started by creating a new node type named my:myresource where 'my' is a
registered namespace. I also set the new node type to have a supertype of
However, I ran into the following problems:

1) Even though the new node type has "nt:resource" as a supertype as I mentioned
earlier, it does not automatically inherit any of its properties
(jcr:data,jcr:encoding,jcr:mimeType and jcr:lastModified). Maybe I am missing
sth but if the properties are not inherited, what is in fact inherited from a
certain supertype? As far as I can see properties are left out. So is it
children or is it sth else?

2)Since the properties were not inherited, I decided to find the properties of
nt:resource (PropDefs[]) and add them one by one to the new node type. I
therefore created a new PropDef array and I added all "nt:resource" properties
to it. I finally added an extra property "my:lang" to it. In the end, I assigned
this new PropDef array to the new node type. However, execution failed with

invalid declaring node type specified



This exception occured in validateNodeTypeDef method of NodeTypeRegistry class
in the sanity check part of the code where it checks the node type declaration
of the property

             * sanity check:
             * make sure declaring node type matches name of node type definition
            if (!name.equals(pd.getDeclaringNodeType())) {
                String msg = "[" + name + "#" + pd.getName()
                        + "] invalid declaring node type specified";
                throw new InvalidNodeTypeDefException(msg);

and the exception is thrown because 'name' = "my:resource" while
'pd.getDeclaringNodeType' = "nt:resource".
I think this is a bug because at this stage what should be checked is not
"equals" but also inheritance. What I mean is that maybe it should be also
checked whether 'pd.getDeclaringNodeType()' and 'name' have some other
connection besides equality, like inheritance for example; because
"my:myresource" is in fact nt:resource and in such a case, exception should not
be thrown

The way to implement what I just said would be to find the NodeTypeDef of 'name'
and the NodeTypeDef of 'pd.getDeclaringNodeType()' and check if the second is a
supertype of the first.

Of course maybe I am not heading towards the right direction here...but it is an

3) Finally, to find a way arround the previous problem, I did the following:
Whenever I added an nt:resource property to the new node type; (e.g. when I
added jcr:data
to "my:myresource" propdef array) I also declared my:myresource as the declared
node type of the property using the following code (in order to avoid the
previous exception)

QName mResourceName=new QName("http://www.my.com/my/1.0", "myresource");

However this approach again failed with a new exception "Not implemented"

javax.jcr.RepositoryException: not yet implemented



Could anybody give me some feedback on the above issues or have any ideas how to
work arround them to extend a nt:resource node type?


View raw message