You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by mr...@apache.org on 2006/07/28 18:00:00 UTC

svn commit: r426582 - in /jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi: ./ state/

Author: mreutegg
Date: Fri Jul 28 09:00:00 2006
New Revision: 426582

URL: http://svn.apache.org/viewvc?rev=426582&view=rev
Log:
SPI:
- remove ItemStateFactory parameter from resolve methods
- add create[Node|Property]State methods to ItemStateFactory which take a parent NodeState
- use PropertyReference in NodeState instead of plain property QNames
- add getNodeState() and getPropertyState() on NodeState for state traversal

Modified:
    jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/WorkspaceManager.java
    jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ChildItemReference.java
    jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ChildNodeEntry.java
    jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ChildNodeReference.java
    jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ItemStateFactory.java
    jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/NodeState.java
    jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/PathElementReference.java
    jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/PropertyReference.java
    jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/UUIDReference.java

Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/WorkspaceManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/WorkspaceManager.java?rev=426582&r1=426581&r2=426582&view=diff
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/WorkspaceManager.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/WorkspaceManager.java Fri Jul 28 09:00:00 2006
@@ -462,17 +462,57 @@
             throws NoSuchItemStateException, ItemStateException {
         try {
             NodeInfo info = service.getNodeInfo(sessionInfo, nodeId);
-            QName ntName = info.getNodetype();
-            NodeId parentId = (info.getParentId() != null) ? info.getParentId() : null;
 
             // get parent
+            NodeId parentId = (info.getParentId() != null) ? info.getParentId() : null;
             NodeState parent = (parentId != null) ? (NodeState) ism.getItemState(parentId) : null;
+
+            return createNodeState(info, parent);
+        } catch (PathNotFoundException e) {
+            throw new NoSuchItemStateException(e.getMessage(), e);
+        } catch (RepositoryException e) {
+            throw new ItemStateException(e.getMessage(), e);
+        }
+    }
+
+    /**
+     * Creates the node with information retrieved from the
+     * <code>RepositoryService</code>.
+     *
+     * @inheritDoc
+     * @see ItemStateFactory#createNodeState(NodeId, NodeState)
+     */
+    public NodeState createNodeState(NodeId nodeId, NodeState parent)
+            throws NoSuchItemStateException, ItemStateException {
+        try {
+            NodeInfo info = service.getNodeInfo(sessionInfo, nodeId);
+            return createNodeState(info, parent);
+        } catch (PathNotFoundException e) {
+            throw new NoSuchItemStateException(e.getMessage(), e);
+        } catch (RepositoryException e) {
+            throw new ItemStateException(e.getMessage(), e);
+        }
+    }
+
+    /**
+     * Creates the node with information retrieved from <code>info</code>.
+     *
+     * @param info   the <code>NodeInfo</code> to use to create the
+     *               <code>NodeState</code>.
+     * @param parent the parent <code>NodeState</code>.
+     * @return the new <code>NodeState</code>.
+     */
+    private NodeState createNodeState(NodeInfo info, NodeState parent)
+            throws NoSuchItemStateException, ItemStateException {
+        try {
+            QName ntName = info.getNodetype();
+
             // TODO pass parent in constructor of NodeState
 
             // build the node state
             // NOTE: unable to retrieve definitionId -> needs to be retrieved
             // by the itemManager upon Node creation.
-            NodeState state = new NodeState(info.getId(), ntName, parentId, ItemState.STATUS_EXISTING, false, getIdFactory());
+            NodeState state = new NodeState(info.getId(), ntName, parent.getNodeId(), ItemState.STATUS_EXISTING, false, getIdFactory());
             // set mixin nodetypes
             state.setMixinTypeNames(info.getMixins());
 
@@ -513,9 +553,49 @@
             throws NoSuchItemStateException, ItemStateException {
         try {
             PropertyInfo info = service.getPropertyInfo(sessionInfo, propertyId);
-
-            // get parent
             NodeState parent = (NodeState) ism.getItemState(info.getParentId());
+            return createPropertyState(info, parent);
+        } catch (PathNotFoundException e) {
+            throw new NoSuchItemStateException(e.getMessage(), e);
+        } catch (RepositoryException e) {
+            throw new ItemStateException(e.getMessage(), e);
+        }
+    }
+
+    /**
+     * Creates the property with information retrieved from the
+     * <code>RepositoryService</code>.
+     *
+     * @inheritDoc
+     * @see ItemStateFactory#createPropertyState(PropertyId, NodeState)
+     */
+    public PropertyState createPropertyState(PropertyId propertyId,
+                                             NodeState parent)
+            throws NoSuchItemStateException, ItemStateException {
+        try {
+            PropertyInfo info = service.getPropertyInfo(sessionInfo, propertyId);
+            return createPropertyState(info, parent);
+        } catch (PathNotFoundException e) {
+            throw new NoSuchItemStateException(e.getMessage(), e);
+        } catch (RepositoryException e) {
+            throw new ItemStateException(e.getMessage(), e);
+        }
+    }
+
+    /**
+     * Creates the property with information retrieved from <code>info</code>.
+     *
+     * @param info   the <code>PropertyInfo</code> to use to create the
+     *               <code>PropertyState</code>.
+     * @param parent the parent <code>NodeState</code>.
+     * @return the new <code>PropertyState</code>.
+     * @throws ItemStateException if an error occurs while retrieving the
+     *                            <code>PropertyState</code>.
+     */
+    private PropertyState createPropertyState(PropertyInfo info,
+                                              NodeState parent)
+            throws ItemStateException {
+        try {
             // TODO: pass parent in constructor of PropertyState
 
             // build the PropertyState
@@ -545,10 +625,6 @@
             // TODO check if needed
             // state.addListener(this);
             return state;
-        } catch (PathNotFoundException e) {
-            throw new NoSuchItemStateException(e.getMessage(), e);
-        } catch (RepositoryException e) {
-            throw new ItemStateException(e.getMessage(), e);
         } catch (IOException e) {
             throw new ItemStateException(e.getMessage(), e);
         }

Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ChildItemReference.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ChildItemReference.java?rev=426582&r1=426581&r2=426582&view=diff
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ChildItemReference.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ChildItemReference.java Fri Jul 28 09:00:00 2006
@@ -44,16 +44,23 @@
     protected final QName name;
 
     /**
+     * The item state factory to create the the item state.
+     */
+    protected final ItemStateFactory isf;
+
+    /**
      * Creates a new <code>ChildItemReference</code> with the given parent
      * <code>NodeState</code>.
      *
      * @param parent the <code>NodeState</code> that owns this child node
      *               reference.
-     * @param name      the name of the child item.
+     * @param name   the name of the child item.
+     * @param isf    the item state factory to create the item state.
      */
-    public ChildItemReference(NodeState parent, QName name) {
+    public ChildItemReference(NodeState parent, QName name, ItemStateFactory isf) {
         this.parent = parent;
         this.name = name;
+        this.isf = isf;
     }
 
     /**
@@ -61,14 +68,12 @@
      * <code>ItemState</code> of this reference.
      *
      * @param isf the item state factory responsible for creating node states.
-     * @param ism the item state manager to access already created / known
-     *            <code>ItemState</code>s.
      * @return the <code>ItemState</code> where this reference points to.
      * @throws NoSuchItemStateException if the referenced <code>ItemState</code>
      *                                  does not exist.
      * @throws ItemStateException       if an error occurs.
      */
-    public ItemState resolve(ItemStateFactory isf, ItemStateManager ism)
+    public ItemState resolve(ItemStateFactory isf)
             throws NoSuchItemStateException, ItemStateException {
         // check if cached
         if (target != null) {
@@ -78,7 +83,7 @@
             }
         }
         // not cached. retrieve and keep weak reference to state
-        ItemState state = doResolve(isf, ism);
+        ItemState state = doResolve();
         target = new WeakReference(state);
         return state;
     }
@@ -97,15 +102,11 @@
      * Resolves this <code>ChildItemReference</code> and returns the target
      * <code>ItemState</code> of this reference.
      *
-     * @param isf the item state factory responsible for creating node states.
-     * @param ism the item state manager to access already created / known
-     *            <code>ItemState</code>s.
      * @return the <code>ItemState</code> where this reference points to.
      * @throws NoSuchItemStateException if the referenced <code>ItemState</code>
      *                                  does not exist.
      * @throws ItemStateException       if an error occurs.
      */
-    protected abstract ItemState doResolve(ItemStateFactory isf,
-                                           ItemStateManager ism)
+    protected abstract ItemState doResolve()
             throws NoSuchItemStateException, ItemStateException;
 }

Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ChildNodeEntry.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ChildNodeEntry.java?rev=426582&r1=426581&r2=426582&view=diff
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ChildNodeEntry.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ChildNodeEntry.java Fri Jul 28 09:00:00 2006
@@ -41,16 +41,12 @@
     public int getIndex();
 
     /**
-     * TODO: move parameters isf and ism to constructor of implementations of this interface
-     * @param isf the item state factory to create the node state.
-     * @param ism the item state manager to access already created / known
-     *            <code>ItemState</code>s.
      * @return the referenced <code>NodeState</code>.
      * @throws NoSuchItemStateException if the <code>NodeState</code> does not
      *                                  exist anymore.
      * @throws ItemStateException       if an error occurs while retrieving the
      *                                  <code>NodeState</code>.
      */
-    public NodeState getNodeState(ItemStateFactory isf, ItemStateManager ism)
+    public NodeState getNodeState()
             throws NoSuchItemStateException, ItemStateException;
 }

Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ChildNodeReference.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ChildNodeReference.java?rev=426582&r1=426581&r2=426582&view=diff
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ChildNodeReference.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ChildNodeReference.java Fri Jul 28 09:00:00 2006
@@ -30,10 +30,11 @@
      *
      * @param parent the <code>NodeState</code> that owns this child node
      *               reference.
-     * @param name      the name of the child item.
+     * @param name   the name of the child item.
+     * @param isf    the item state factory to create the item state.
      */
-    public ChildNodeReference(NodeState parent, QName name) {
-        super(parent, name);
+    public ChildNodeReference(NodeState parent, QName name, ItemStateFactory isf) {
+        super(parent, name, isf);
     }
 
     /**
@@ -54,10 +55,10 @@
 
     /**
      * @inheritDoc
-     * @see ChildNodeEntry#getNodeState(ItemStateFactory, ItemStateManager)
+     * @see ChildNodeEntry#getNodeState()
      */
-    public NodeState getNodeState(ItemStateFactory isf, ItemStateManager ism)
+    public NodeState getNodeState()
             throws NoSuchItemStateException, ItemStateException {
-        return (NodeState) resolve(isf, ism);
+        return (NodeState) resolve(isf);
     }
 }

Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ItemStateFactory.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ItemStateFactory.java?rev=426582&r1=426581&r2=426582&view=diff
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ItemStateFactory.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ItemStateFactory.java Fri Jul 28 09:00:00 2006
@@ -42,12 +42,26 @@
             throws NoSuchItemStateException, ItemStateException;
 
     /**
+     * Creates the child <code>NodeState</code> with the given
+     * <code>nodeId</code>.
+     *
+     * @param nodeId the id of the <code>NodeState</code> to create.
+     * @param parent the parent of the <code>NodeState</code> to create.
+     * @return the created <code>NodeState</code>.
+     * @throws NoSuchItemStateException if there is no such <code>NodeState</code>.
+     * @throws ItemStateException       if an error occurs while retrieving the
+     *                                  <code>NodeState</code>.
+     */
+    public NodeState createNodeState(NodeId nodeId, NodeState parent)
+            throws NoSuchItemStateException, ItemStateException;
+
+    /**
      * Creates the <code>PropertyState</code> with the given
      * <code>propertyId</code>.
      *
      * @param propertyId the id of the <code>PropertyState</code> to create.
      * @param ism        the item state manager to retrievev the parent of the
-     *                   <code>NodeState</code> to create.
+     *                   <code>PropertyState</code> to create.
      * @return the created <code>PropertyState</code>.
      * @throws NoSuchItemStateException if there is no such <code>PropertyState</code>.
      * @throws ItemStateException       if an error occurs while retrieving the
@@ -55,5 +69,20 @@
      */
     public PropertyState createPropertyState(PropertyId propertyId,
                                              ItemStateManager ism)
+            throws NoSuchItemStateException, ItemStateException;
+
+    /**
+     * Creates the <code>PropertyState</code> with the given
+     * <code>propertyId</code>.
+     *
+     * @param propertyId the id of the <code>PropertyState</code> to create.
+     * @param parent the parent of the <code>PropertyState</code> to create.
+     * @return the created <code>PropertyState</code>.
+     * @throws NoSuchItemStateException if there is no such <code>PropertyState</code>.
+     * @throws ItemStateException       if an error occurs while retrieving the
+     *                                  <code>PropertyState</code>.
+     */
+    public PropertyState createPropertyState(PropertyId propertyId,
+                                             NodeState parent)
             throws NoSuchItemStateException, ItemStateException;
 }

Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/NodeState.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/NodeState.java?rev=426582&r1=426581&r2=426582&view=diff
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/NodeState.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/NodeState.java Fri Jul 28 09:00:00 2006
@@ -85,12 +85,13 @@
     private boolean sharedChildNodeEntries = false;
 
     /**
-     * set of property names (QName objects)
+     * Map of properties. Key = {@link QName} of property. Value = {@link
+     * PropertyReference}.
      */
-    private HashSet propertyNames = new HashSet();
+    private HashMap properties = new HashMap();
 
     /**
-     * Set to <code>true</code> if {@link #propertyNames} is shared between
+     * Set to <code>true</code> if {@link #properties} is shared between
      * different <code>NodeState</code> instances.
      */
     private boolean sharedPropertyNames = false;
@@ -105,6 +106,33 @@
     private final IdFactory idFactory;
 
     /**
+     * The <code>ItemStateFactory</code> which is used to create new
+     * <code>ItemState</code> instances.
+     */
+    private final ItemStateFactory isf;
+
+    /**
+     * Constructs a new node state that is not connected.
+     *
+     * @param id            id of this NodeState
+     * @param parent        the parent of this NodeState
+     * @param nodeTypeName  node type of this node
+     * @param initialStatus the initial status of the node state object
+     * @param isTransient   flag indicating whether this state is transient or
+     *                      not.
+     * @param isf           the item state factory responsible for creating node
+     *                      states.
+     */
+    public NodeState(NodeId id, NodeState parent, QName nodeTypeName,
+                     int initialStatus, boolean isTransient, ItemStateFactory isf) {
+        super(initialStatus, isTransient);
+        this.id = id;
+        this.idFactory = parent.idFactory;
+        this.nodeTypeName = nodeTypeName;
+        this.isf = isf;
+    }
+
+    /**
      * Constructs a new <code>NodeState</code> that is initially connected to
      * an overlayed state.
      *
@@ -117,6 +145,8 @@
         super(overlayedState, initialStatus, isTransient);
         pull();
         idFactory = overlayedState.idFactory;
+        // TODO: remove this constructor
+        this.isf = null;
     }
 
     /**
@@ -135,6 +165,8 @@
         this.parentId = parentId;
         this.nodeTypeName = nodeTypeName;
         this.idFactory = idFactory;
+        // TODO: remove this constructor
+        this.isf = null;
     }
 
     /**
@@ -148,7 +180,7 @@
             nodeTypeName = nodeState.nodeTypeName;
             mixinTypeNames = nodeState.mixinTypeNames;
             def = nodeState.getDefinition();
-            propertyNames = nodeState.propertyNames;
+            properties = nodeState.properties;
             sharedPropertyNames = true;
             nodeState.sharedPropertyNames = true;
             childNodeEntries = nodeState.childNodeEntries;
@@ -322,7 +354,7 @@
      *         <code>QName</code>.
      */
     public synchronized boolean hasPropertyName(QName propName) {
-        return propertyNames.contains(propName);
+        return properties.containsKey(propName);
     }
 
     /**
@@ -517,7 +549,7 @@
      * @see #removePropertyName
      */
     public synchronized Set getPropertyNames() {
-        return Collections.unmodifiableSet(propertyNames);
+        return Collections.unmodifiableSet(properties.keySet());
     }
 
     /**
@@ -527,10 +559,10 @@
      */
     public synchronized void addPropertyName(QName propName) {
         if (sharedPropertyNames) {
-            propertyNames = (HashSet) propertyNames.clone();
+            properties = (HashMap) properties.clone();
             sharedPropertyNames = false;
         }
-        propertyNames.add(propName);
+        properties.put(propName, new PropertyReference(this, propName, isf, idFactory));
     }
 
     /**
@@ -542,10 +574,10 @@
      */
     public synchronized boolean removePropertyName(QName propName) {
         if (sharedPropertyNames) {
-            propertyNames = (HashSet) propertyNames.clone();
+            properties = (HashMap) properties.clone();
             sharedPropertyNames = false;
         }
-        return propertyNames.remove(propName);
+        return properties.remove(propName) != null;
     }
 
     /**
@@ -553,10 +585,10 @@
      */
     public synchronized void removeAllPropertyNames() {
         if (sharedPropertyNames) {
-            propertyNames = new HashSet();
+            properties = new HashMap();
             sharedPropertyNames = false;
         } else {
-            propertyNames.clear();
+            properties.clear();
         }
     }
 
@@ -565,18 +597,9 @@
      * properties of this node.
      */
     public synchronized void setPropertyNames(Set propNames) {
-        if (propNames instanceof HashSet) {
-            HashSet names = (HashSet) propNames;
-            propertyNames = (HashSet) names.clone();
-            sharedPropertyNames = false;
-        } else {
-            if (sharedPropertyNames) {
-                propertyNames = new HashSet();
-                sharedPropertyNames = false;
-            } else {
-                propertyNames.clear();
-            }
-            propertyNames.addAll(propNames);
+        removeAllPropertyNames();
+        for (Iterator it = propNames.iterator(); it.hasNext(); ) {
+            addPropertyName((QName) it.next());
         }
     }
 
@@ -590,7 +613,48 @@
         this.nodeTypeName = nodeTypeName;
     }
 
+    /**
+     * Returns the property state with the given name.
+     *
+     * @param propertyName the name of the property state to return.
+     * @throws NoSuchItemStateException if there is no property state with the
+     *                                  given name.
+     * @throws ItemStateException       if an error occurs while retrieving the
+     *                                  property state.
+     */
+    public synchronized PropertyState getPropertyState(QName propertyName)
+            throws NoSuchItemStateException, ItemStateException {
+        PropertyReference propRef = (PropertyReference) properties.get(propertyName);
+        if (propRef == null) {
+            throw new NoSuchItemStateException(idFactory.createPropertyId(getNodeId(), propertyName).toString());
+        }
+        return (PropertyState) propRef.resolve(isf);
+    }
+
+    /**
+     * Returns the node state with the given relative path.
+     *
+     * @param relPath the relative path (actually PathElement) of the child node
+     *                state.
+     * @return the child node state
+     * @throws NoSuchItemStateException if there is no node state with the given
+     *                                  <code>relPath</code>.
+     * @throws ItemStateException       if an error occurs while retrieving the
+     *                                  node state.
+     */
+    public synchronized NodeState getNodeState(Path.PathElement relPath)
+            throws NoSuchItemStateException, ItemStateException {
+        ChildNodeEntry cne = childNodeEntries.get(relPath.getName(), relPath.getNormalizedIndex());
+        if (cne == null) {
+            Path p = Path.create(relPath.getName(), relPath.getIndex());
+            NodeId id = idFactory.createNodeId(getNodeId(), p);
+            throw new NoSuchItemStateException(id.toString());
+        }
+        return cne.getNodeState();
+    }
+
     //---------------------------------------------------------< diff methods >
+
     /**
      * Returns a set of <code>QName</code>s denoting those properties that
      * do not exist in the overlayed node state but have been added to
@@ -601,12 +665,12 @@
      */
     public synchronized Set getAddedPropertyNames() {
         if (!hasOverlayedState()) {
-            return Collections.unmodifiableSet(propertyNames);
+            return Collections.unmodifiableSet(properties.keySet());
         }
 
         NodeState other = (NodeState) getOverlayedState();
-        HashSet set = new HashSet(propertyNames);
-        set.removeAll(other.propertyNames);
+        HashSet set = new HashSet(properties.keySet());
+        set.removeAll(other.properties.keySet());
         return set;
     }
 
@@ -639,8 +703,8 @@
         }
 
         NodeState other = (NodeState) getOverlayedState();
-        HashSet set = new HashSet(other.propertyNames);
-        set.removeAll(propertyNames);
+        HashSet set = new HashSet(other.properties.keySet());
+        set.removeAll(properties.keySet());
         return set;
     }
 
@@ -1125,9 +1189,9 @@
          */
         private ChildNodeEntry createChildNodeEntry(QName nodeName, NodeId id) {
             if (id.getRelativePath() != null) {
-                return new PathElementReference(NodeState.this, nodeName, NodeState.this.idFactory);
+                return new PathElementReference(NodeState.this, nodeName, NodeState.this.isf, NodeState.this.idFactory);
             } else {
-                return new UUIDReference(NodeState.this, id, nodeName);
+                return new UUIDReference(NodeState.this, id, NodeState.this.isf, nodeName);
             }
         }
 

Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/PathElementReference.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/PathElementReference.java?rev=426582&r1=426581&r2=426582&view=diff
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/PathElementReference.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/PathElementReference.java Fri Jul 28 09:00:00 2006
@@ -38,22 +38,24 @@
      * @param parent    the <code>ItemState</code> that owns this child item
      *                  reference.
      * @param name      the name of the child node.
+     * @param isf       the item state factory to create the node state.
      * @param idFactory the <code>IdFactory</code> to create new ItemIds
      */
-    public PathElementReference(NodeState parent, QName name, IdFactory idFactory) {
-        super(parent, name);
+    public PathElementReference(NodeState parent, QName name,
+                                ItemStateFactory isf, IdFactory idFactory) {
+        super(parent, name, isf);
         this.idFactory = idFactory;
     }
 
     /**
      * @inheritDoc
-     * @see ChildItemReference#doResolve(ItemStateFactory, ItemStateManager)
+     * @see ChildItemReference#doResolve()
      * <p/>
      * Returns a <code>NodeState</code>.
      */
-    protected ItemState doResolve(ItemStateFactory isf, ItemStateManager ism)
+    protected ItemState doResolve()
             throws NoSuchItemStateException, ItemStateException {
-        return isf.createNodeState(getId(), ism);
+        return isf.createNodeState(getId(), getParent());
     }
 
     /**

Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/PropertyReference.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/PropertyReference.java?rev=426582&r1=426581&r2=426582&view=diff
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/PropertyReference.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/PropertyReference.java Fri Jul 28 09:00:00 2006
@@ -33,24 +33,26 @@
     /**
      * Creates a new <code>PropertyReference</code>.
      *
-     * @param parent the parent <code>NodeState</code> where the property
-     *               belongs to.
-     * @param name   the name of the property.
+     * @param parent    the parent <code>NodeState</code> where the property
+     *                  belongs to.
+     * @param name      the name of the property.
+     * @param isf       the item state factory to create the node state.
+     * @param idFactory the id factory to create new ids.
      */
-    public PropertyReference(NodeState parent, QName name, IdFactory idFactory) {
-        super(parent, name);
+    public PropertyReference(NodeState parent, QName name, ItemStateFactory isf, IdFactory idFactory) {
+        super(parent, name, isf);
         this.idFactory = idFactory;
     }
 
     /**
      * @inheritDoc
-     * @see ChildItemReference#doResolve(ItemStateFactory, ItemStateManager)
+     * @see ChildItemReference#doResolve()
      * <p/>
      * Returns a <code>PropertyState</code>.
      */
-    protected ItemState doResolve(ItemStateFactory isf, ItemStateManager ism)
+    protected ItemState doResolve()
             throws NoSuchItemStateException, ItemStateException {
         PropertyId id = idFactory.createPropertyId(parent.getNodeId(), name);
-        return isf.createPropertyState(id, ism);
+        return isf.createPropertyState(id, getParent());
     }
 }

Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/UUIDReference.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/UUIDReference.java?rev=426582&r1=426581&r2=426582&view=diff
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/UUIDReference.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/UUIDReference.java Fri Jul 28 09:00:00 2006
@@ -37,11 +37,13 @@
      *                reference.
      * @param childId the id of the referenced <code>NodeState</code>. This id
      *                must not have a relative path component.
+     * @param name    the name of the child node.
+     * @param isf     the item state factory to create the node state.
      * @throws IllegalArgumentException if <code>childId</code> has a relative
      *                                  path component.
      */
-    public UUIDReference(NodeState parent, NodeId childId, QName name) {
-        super(parent, name);
+    public UUIDReference(NodeState parent, NodeId childId, ItemStateFactory isf, QName name) {
+        super(parent, name, isf);
         if (childId.getRelativePath() == null) {
             throw new IllegalArgumentException("childId must not contain a relative path");
         }
@@ -50,13 +52,13 @@
 
     /**
      * @inheritDoc
-     * @see ChildItemReference#doResolve(ItemStateFactory, ItemStateManager)
+     * @see ChildItemReference#doResolve()
      * <p/>
      * Returns a <code>NodeState</code>.
      */
-    protected ItemState doResolve(ItemStateFactory isf, ItemStateManager ism)
+    protected ItemState doResolve()
             throws NoSuchItemStateException, ItemStateException {
-        return isf.createNodeState(childId, ism);
+        return isf.createNodeState(childId, getParent());
     }
 
     /**