Index: src/main/java/org/apache/jackrabbit/core/AbstractNodeData.java =================================================================== --- src/main/java/org/apache/jackrabbit/core/AbstractNodeData.java (revision 808032) +++ src/main/java/org/apache/jackrabbit/core/AbstractNodeData.java (working copy) @@ -17,6 +17,7 @@ package org.apache.jackrabbit.core; import javax.jcr.nodetype.NodeDefinition; +import javax.jcr.RepositoryException; import org.apache.jackrabbit.core.id.ItemId; import org.apache.jackrabbit.core.id.NodeId; @@ -34,10 +35,10 @@ * Create a new instance of this class. * * @param state node state - * @param definition node definition + * @param itemMgr item manager */ - protected AbstractNodeData(NodeState state, NodeDefinition definition) { - super(state, definition); + protected AbstractNodeData(NodeState state, ItemManager itemMgr) { + super(state, itemMgr); if (state.isShareable()) { this.primaryParentId = state.getParentId(); @@ -66,8 +67,9 @@ * Return the associated node defintion. * * @return node definition + * @throws RepositoryException if the definition cannot be retrieved. */ - public NodeDefinition getNodeDefinition() { + public NodeDefinition getNodeDefinition() throws RepositoryException { return (NodeDefinition) getDefinition(); } Index: src/main/java/org/apache/jackrabbit/core/ItemData.java =================================================================== --- src/main/java/org/apache/jackrabbit/core/ItemData.java (revision 808032) +++ src/main/java/org/apache/jackrabbit/core/ItemData.java (working copy) @@ -17,10 +17,13 @@ package org.apache.jackrabbit.core; import javax.jcr.nodetype.ItemDefinition; +import javax.jcr.RepositoryException; import org.apache.jackrabbit.core.id.ItemId; import org.apache.jackrabbit.core.id.NodeId; import org.apache.jackrabbit.core.state.ItemState; +import org.apache.jackrabbit.core.state.NodeState; +import org.apache.jackrabbit.core.state.PropertyState; /** * Data object referenced by different ItemImpl instances that @@ -40,16 +43,19 @@ /** Status */ private int status; + /** The item manager */ + private ItemManager itemMgr; + /** * Create a new instance of this class. * * @param state item state - * @param definition item definition + * @param itemMgr item manager */ - protected ItemData(ItemState state, ItemDefinition definition) { + protected ItemData(ItemState state, ItemManager itemMgr) { this.id = state.getId(); this.state = state; - this.definition = definition; + this.itemMgr = itemMgr; this.status = ItemImpl.STATUS_NORMAL; } @@ -85,8 +91,16 @@ * Return the associated item definition. * * @return item definition + * @throws RepositoryException if the definition cannot be retrieved. */ - public ItemDefinition getDefinition() { + public ItemDefinition getDefinition() throws RepositoryException { + if (definition == null && itemMgr != null) { + if (isNode()) { + definition = itemMgr.getDefinition((NodeState) state); + } else { + definition = itemMgr.getDefinition((PropertyState) state); + } + } return definition; } Index: src/main/java/org/apache/jackrabbit/core/ItemManager.java =================================================================== --- src/main/java/org/apache/jackrabbit/core/ItemManager.java (revision 808032) +++ src/main/java/org/apache/jackrabbit/core/ItemManager.java (working copy) @@ -163,8 +163,13 @@ shareableNodesCache.clear(); } - private NodeDefinition getDefinition(NodeState state) + NodeDefinition getDefinition(NodeState state) throws RepositoryException { + if (state.getId().equals(rootNodeId)) { + // special handling required for root node + return rootNodeDef; + } + NodeDefId defId = state.getDefinitionId(); NodeDefinitionImpl def = session.getNodeTypeManager().getNodeDefinition(defId); if (def == null) { @@ -185,7 +190,7 @@ return def; } - private PropertyDefinition getDefinition(PropertyState state) + PropertyDefinition getDefinition(PropertyState state) throws RepositoryException { PropDefId defId = state.getDefinitionId(); PropertyDefinitionImpl def = session.getNodeTypeManager().getPropertyDefinition(defId); @@ -720,16 +725,12 @@ */ private ItemData createItemData(ItemState state, Path path, boolean permissionCheck) throws RepositoryException { ItemData data; - ItemId id = state.getId(); - if (id.equals(rootNodeId)) { - // special handling required for root node - data = new NodeData((NodeState) state, rootNodeDef); - } else if (state.isNode()) { + if (state.isNode()) { NodeState nodeState = (NodeState) state; - data = new NodeData(nodeState, getDefinition(nodeState)); + data = new NodeData(nodeState, this); } else { PropertyState propertyState = (PropertyState) state; - data = new PropertyData(propertyState, getDefinition(propertyState)); + data = new PropertyData(propertyState, this); } // make sure read-perm. is granted before returning the data. if (permissionCheck && !canRead(data, path)) { Index: src/main/java/org/apache/jackrabbit/core/NodeData.java =================================================================== --- src/main/java/org/apache/jackrabbit/core/NodeData.java (revision 808032) +++ src/main/java/org/apache/jackrabbit/core/NodeData.java (working copy) @@ -16,7 +16,6 @@ */ package org.apache.jackrabbit.core; -import javax.jcr.nodetype.NodeDefinition; import org.apache.jackrabbit.core.state.NodeState; /** @@ -30,9 +29,9 @@ * Create a new instance of this class. * * @param state node state - * @param definition node definition + * @param itemMgr item manager */ - NodeData(NodeState state, NodeDefinition definition) { - super(state, definition); + NodeData(NodeState state, ItemManager itemMgr) { + super(state, itemMgr); } } Index: src/main/java/org/apache/jackrabbit/core/NodeDataRef.java =================================================================== --- src/main/java/org/apache/jackrabbit/core/NodeDataRef.java (revision 808032) +++ src/main/java/org/apache/jackrabbit/core/NodeDataRef.java (working copy) @@ -17,6 +17,7 @@ package org.apache.jackrabbit.core; import javax.jcr.nodetype.ItemDefinition; +import javax.jcr.RepositoryException; import org.apache.jackrabbit.core.id.NodeId; import org.apache.jackrabbit.core.state.ItemState; @@ -66,8 +67,9 @@ * {@inheritDoc} * * This implementation returns the definition of the referenced data object. + * @throws RepositoryException if the definition cannot be retrieved. */ - public ItemDefinition getDefinition() { + public ItemDefinition getDefinition() throws RepositoryException { return data.getDefinition(); } Index: src/main/java/org/apache/jackrabbit/core/PropertyData.java =================================================================== --- src/main/java/org/apache/jackrabbit/core/PropertyData.java (revision 808032) +++ src/main/java/org/apache/jackrabbit/core/PropertyData.java (working copy) @@ -17,6 +17,8 @@ package org.apache.jackrabbit.core; import javax.jcr.nodetype.PropertyDefinition; +import javax.jcr.RepositoryException; + import org.apache.jackrabbit.core.state.PropertyState; /** @@ -28,10 +30,10 @@ * Create a new instance of this class. * * @param state associated property state - * @param definition associated property definition + * @param itemMgr item manager */ - PropertyData(PropertyState state, PropertyDefinition definition) { - super(state, definition); + PropertyData(PropertyState state, ItemManager itemMgr) { + super(state, itemMgr); } /** @@ -47,8 +49,9 @@ * Return the associated property definition. * * @return property definition + * @throws RepositoryException if the definition cannot be retrieved. */ - public PropertyDefinition getPropertyDefinition() { + public PropertyDefinition getPropertyDefinition() throws RepositoryException { return (PropertyDefinition) getDefinition(); } }