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/08/14 15:42:12 UTC

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

Author: mreutegg
Date: Mon Aug 14 06:42:11 2006
New Revision: 431348

URL: http://svn.apache.org/viewvc?rev=431348&view=rev
Log:
- Remove node id from NodeState
- Add node name and uuid to NodeState
- Remove unnecessary calls to getId()

Modified:
    jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/HierarchyManagerImpl.java
    jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ItemState.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/SessionItemStateManager.java
    jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/TransientChangeLog.java
    jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/WorkspaceItemStateFactory.java

Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/HierarchyManagerImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/HierarchyManagerImpl.java?rev=431348&r1=431347&r2=431348&view=diff
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/HierarchyManagerImpl.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/HierarchyManagerImpl.java Mon Aug 14 06:42:11 2006
@@ -192,7 +192,7 @@
     protected void buildPath(Path.PathBuilder builder, ItemState state)
             throws ItemStateException, RepositoryException {
         // shortcut
-        if (state.getId().equals(rootNodeId)) {
+        if (state.getParent() == null) {
             builder.addRoot();
             return;
         }

Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ItemState.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ItemState.java?rev=431348&r1=431347&r2=431348&view=diff
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ItemState.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/ItemState.java Mon Aug 14 06:42:11 2006
@@ -64,6 +64,11 @@
     public static final int STATUS_STALE_DESTROYED = 6;
 
     /**
+     * a new state was deleted and is now 'removed'
+     */
+    public static final int STATUS_REMOVED = 7;
+
+    /**
      * the internal status of this item state
      */
     protected int status = STATUS_UNDEFINED;

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=431348&r1=431347&r2=431348&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 Mon Aug 14 06:42:11 2006
@@ -24,6 +24,7 @@
 import org.apache.jackrabbit.spi.QNodeDefinition;
 import org.apache.jackrabbit.name.Path;
 import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.name.MalformedPathException;
 import org.apache.jackrabbit.spi.NodeId;
 import org.apache.jackrabbit.spi.ItemId;
 import org.apache.jackrabbit.spi.PropertyId;
@@ -53,6 +54,22 @@
     private static Logger log = LoggerFactory.getLogger(NodeState.class);
 
     /**
+     * A current element Path instance.
+     */
+    private static final Path CURRENT_PATH;
+
+    static {
+        try {
+            Path.PathBuilder builder = new Path.PathBuilder();
+            builder.addFirst(Path.CURRENT_ELEMENT);
+            CURRENT_PATH = builder.getPath();
+        } catch (MalformedPathException e) {
+            // path is always valid
+            throw new InternalError("unable to create path from '.'");
+        }
+    }
+
+    /**
      * the name of this node's primary type
      */
     private QName nodeTypeName;
@@ -63,10 +80,15 @@
     private QName[] mixinTypeNames = new QName[0];
 
     /**
-     * TODO: id is not stable unless sole uuid.
-     * The id of this node state.
+     * The UUID of this node state or <code>null</code> if this node state
+     * cannot be identified with a uuid.
+     */
+    private String uuid;
+
+    /**
+     * The name of this node
      */
-    private NodeId id;
+    private QName name;
 
     /**
      * The parent <code>NodeState</code> or <code>null</code> if this
@@ -109,7 +131,9 @@
     /**
      * Constructs a new node state that is not connected.
      *
-     * @param id            id of this NodeState
+     * @param name          the name of this NodeState
+     * @param uuid          the uuid of this NodeState or <code>null</code> if
+     *                      this node state cannot be identified with a UUID.
      * @param parent        the parent of this NodeState
      * @param nodeTypeName  node type of this node
      * @param initialStatus the initial status of the node state object
@@ -120,11 +144,12 @@
      * @param idFactory     the <code>IdFactory</code> to create new id
      *                      instance.
      */
-    public NodeState(NodeId id, NodeState parent, QName nodeTypeName,
-                     int initialStatus, boolean isTransient,
+    public NodeState(QName name, String uuid, NodeState parent,
+                     QName nodeTypeName, int initialStatus, boolean isTransient,
                      ItemStateFactory isf, IdFactory idFactory) {
         super(initialStatus, isTransient);
-        this.id = id;
+        this.name = name;
+        this.uuid = uuid;
         this.parent = parent;
         this.idFactory = idFactory;
         this.nodeTypeName = nodeTypeName;
@@ -159,7 +184,8 @@
     protected synchronized void copy(ItemState state) {
         synchronized (state) {
             NodeState nodeState = (NodeState) state;
-            id = nodeState.id;
+            name = nodeState.name;
+            uuid = nodeState.uuid;
             parent = nodeState.parent; // TODO: parent from wrong ism layer
             nodeTypeName = nodeState.nodeTypeName;
             mixinTypeNames = nodeState.mixinTypeNames;
@@ -214,15 +240,36 @@
      * {@inheritDoc}
      */
     public ItemId getId() {
-        return id;
+        return getNodeId();
     }
 
     /**
      * Returns the id of this node state.
+     *
      * @return the id of this node state.
      */
     public NodeId getNodeId() {
-        return id;
+        if (uuid != null) {
+            return idFactory.createNodeId(uuid);
+        } else if (parent != null) {
+            // find this in parent child node entries
+            for (Iterator it = parent.getChildNodeEntries(name).iterator(); it.hasNext(); ) {
+                ChildNodeEntry cne = (ChildNodeEntry) it.next();
+                try {
+                    if (cne.getNodeState() == this) {
+                        Path relPath = Path.create(cne.getName(), cne.getIndex());
+                        return idFactory.createNodeId(parent.getNodeId(), relPath);
+                    }
+                } catch (ItemStateException e) {
+                    log.warn("Unable to access child node entry: " + cne.getId());
+                }
+            }
+        } else {
+            // root node
+            return idFactory.createNodeId((String) null, CURRENT_PATH);
+        }
+        // TODO: replace with ItemStateException instead of error.
+        throw new InternalError("Unable to retrieve NodeId for NodeState");
     }
 
     /**

Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/SessionItemStateManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/SessionItemStateManager.java?rev=431348&r1=431347&r2=431348&view=diff
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/SessionItemStateManager.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/SessionItemStateManager.java Mon Aug 14 06:42:11 2006
@@ -315,7 +315,7 @@
      *                            to be canceled as well in another sub-tree.
      */
     public void undo(ItemState state) throws ItemStateException {
-        if (rootId.equals(state.getId())) {
+        if (state.getParent() == null) {
             // optimization for root
             transientStateMgr.disposeAllItemStates();
             return;
@@ -620,7 +620,7 @@
      */
     private ChangeLog getChangeLog(ItemState itemState) throws StaleItemStateException, ItemStateException {
         ChangeLog changeLog = new TransientChangeLog(idFactory, workspaceItemStateMgr);
-        if (rootId.equals(itemState.getId())) {
+        if (itemState.getParent() == null) {
             // root state -> get all item states
             for (Iterator it = transientStateMgr.addedStates(); it.hasNext(); ) {
                 changeLog.added((ItemState) it.next());

Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/TransientChangeLog.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/TransientChangeLog.java?rev=431348&r1=431347&r2=431348&view=diff
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/TransientChangeLog.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/TransientChangeLog.java Mon Aug 14 06:42:11 2006
@@ -18,7 +18,6 @@
 
 import org.apache.jackrabbit.jcr2spi.operation.Operation;
 import org.apache.jackrabbit.name.QName;
-import org.apache.jackrabbit.name.Path;
 import org.apache.jackrabbit.spi.NodeId;
 import org.apache.jackrabbit.spi.ItemId;
 import org.apache.jackrabbit.spi.PropertyId;
@@ -345,13 +344,7 @@
      * @see TransientItemStateFactory#createNewNodeState(QName, String, NodeState)
      */
     public NodeState createNewNodeState(QName name, String uuid, NodeState parent) {
-        NodeId id;
-        if (uuid == null) {
-            id = idFactory.createNodeId(parent.getNodeId(), Path.create(name, 0));
-        } else {
-            id = idFactory.createNodeId(uuid);
-        }
-        NodeState nodeState = new NodeState(id, parent, null,
+        NodeState nodeState = new NodeState(name, uuid, parent, null,
                 ItemState.STATUS_NEW, true, this, idFactory);
         // get a notification when this item state is saved or invalidated
         nodeState.addListener(this);
@@ -441,7 +434,7 @@
      * @see ItemStateListener#stateCreated(ItemState)
      */
     public void stateCreated(ItemState created) {
-        // TODO: remove from added set of change log
+        addedStates.remove(created);
     }
 
     /**
@@ -449,7 +442,7 @@
      * @see ItemStateListener#stateModified(ItemState)
      */
     public void stateModified(ItemState modified) {
-        // TODO: remove from modified set of change log
+        modifiedStates.remove(modified);
     }
 
     /**
@@ -457,7 +450,7 @@
      * @see ItemStateListener#stateDestroyed(ItemState)
      */
     public void stateDestroyed(ItemState destroyed) {
-        // TODO: remove from deleted set of change log
+        deletedStates.remove(destroyed);
     }
 
     /**
@@ -478,6 +471,51 @@
         // 'existing modified' to 'existing'.
         // a state which changes from 'existing' to 'existing modified' will
         // go into the modified set of the change log, etc.
+        switch (state.getStatus()) {
+            case ItemState.STATUS_EXISTING:
+                if (previousStatus == ItemState.STATUS_EXISTING_MODIFIED) {
+                    // was modified and is now refreshed
+                    modifiedStates.remove(state);
+                } else if (previousStatus == ItemState.STATUS_EXISTING_REMOVED) {
+                    // was removed and is now refreshed
+                    deletedStates.remove(state);
+                } else if (previousStatus == ItemState.STATUS_STALE_MODIFIED) {
+                    // was modified and state and is now refreshed
+                    modifiedStates.remove(state);
+                }
+                break;
+            case ItemState.STATUS_EXISTING_MODIFIED:
+                modifiedStates.add(state);
+                break;
+            case ItemState.STATUS_EXISTING_REMOVED:
+                // check if modified earlier
+                if (previousStatus == ItemState.STATUS_EXISTING_MODIFIED) {
+                    modifiedStates.remove(state);
+                }
+                deletedStates.add(state);
+                break;
+            case ItemState.STATUS_REMOVED:
+                // remove from added
+                addedStates.remove(state);
+                break;
+            case ItemState.STATUS_STALE_DESTROYED:
+                // state is now stale. keep in modified. wait until refreshed.
+                // TODO: how is a stale destroyed state refreshed?
+                break;
+            case ItemState.STATUS_STALE_MODIFIED:
+                // state is now stale. keep in modified. wait until refreshed
+                break;
+            case ItemState.STATUS_NEW:
+                // should never happen
+                log.warn("ItemState changed status to 'new'");
+                break;
+            case ItemState.STATUS_UNDEFINED:
+                // should never happen
+                log.warn("ItemState changed status to 'undefined'");
+                break;
+            default:
+                log.warn("ItemState has invalid status: " + state.getStatus());
+        }
     }
 
     //--------------------------------------------------------< inner classes >

Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/WorkspaceItemStateFactory.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/WorkspaceItemStateFactory.java?rev=431348&r1=431347&r2=431348&view=diff
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/WorkspaceItemStateFactory.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/WorkspaceItemStateFactory.java Mon Aug 14 06:42:11 2006
@@ -108,7 +108,11 @@
             // 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(), parent, ntName,
+            String uuid = null;
+            if (info.getId().getRelativePath() == null) {
+                uuid = info.getId().getUUID();
+            }
+            NodeState state = new NodeState(info.getQName(), uuid, parent, ntName,
                     ItemState.STATUS_EXISTING, false, this, service.getIdFactory());
             // set mixin nodetypes
             state.setMixinTypeNames(info.getMixins());