You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by tr...@apache.org on 2005/09/02 16:18:47 UTC

svn commit: r267207 - in /incubator/jackrabbit/trunk/core/src/java/org/apache/jackrabbit/core: state/ version/ virtual/

Author: tripod
Date: Fri Sep  2 07:18:34 2005
New Revision: 267207

URL: http://svn.apache.org/viewcvs?rev=267207&view=rev
Log:
- seperating VersionManagerImpl from ItemStateProvider to avoid potential deadlocks during checkin.
- VersionItemStateProvider returns now shared item states
- Node References handling adjusted

Added:
    incubator/jackrabbit/trunk/core/src/java/org/apache/jackrabbit/core/version/VersionItemStateProvider.java   (with props)
Modified:
    incubator/jackrabbit/trunk/core/src/java/org/apache/jackrabbit/core/state/SharedItemStateManager.java
    incubator/jackrabbit/trunk/core/src/java/org/apache/jackrabbit/core/version/VersionManagerImpl.java
    incubator/jackrabbit/trunk/core/src/java/org/apache/jackrabbit/core/virtual/AbstractVISProvider.java
    incubator/jackrabbit/trunk/core/src/java/org/apache/jackrabbit/core/virtual/VirtualItemStateProvider.java

Modified: incubator/jackrabbit/trunk/core/src/java/org/apache/jackrabbit/core/state/SharedItemStateManager.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/core/src/java/org/apache/jackrabbit/core/state/SharedItemStateManager.java?rev=267207&r1=267206&r2=267207&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/core/src/java/org/apache/jackrabbit/core/state/SharedItemStateManager.java (original)
+++ incubator/jackrabbit/trunk/core/src/java/org/apache/jackrabbit/core/state/SharedItemStateManager.java Fri Sep  2 07:18:34 2005
@@ -35,7 +35,6 @@
 import javax.jcr.PropertyType;
 import javax.jcr.nodetype.ConstraintViolationException;
 import javax.jcr.nodetype.NoSuchNodeTypeException;
-import java.util.ArrayList;
 import java.util.Iterator;
 import java.io.PrintStream;
 
@@ -329,10 +328,6 @@
 
         ChangeLog shared = new ChangeLog();
 
-        // set of virtual node references
-        // todo: remember by provider
-        ArrayList virtualRefs = new ArrayList();
-
         EventStateCollection events = null;
         if (obsMgr != null) {
             events = obsMgr.createEventStateCollection();
@@ -351,25 +346,14 @@
             while (iter.hasNext()) {
                 NodeReferences refs = (NodeReferences) iter.next();
                 NodeId id = new NodeId(refs.getUUID());
-                // if targetid is in virtual provider, transfer to its modified set
-                for (int i = 0; i < virtualProviders.length; i++) {
-                    VirtualItemStateProvider provider = virtualProviders[i];
-                    if (provider.hasItemState(id)) {
-                        virtualRefs.add(refs);
-                        refs = null;
-                        break;
+                if (refs.hasReferences()) {
+                    if (!local.has(id) && !hasItemState(id)) {
+                        String msg = "Target node " + id
+                                + " of REFERENCE property does not exist";
+                        throw new ItemStateException(msg);
                     }
                 }
-                if (refs != null) {
-                    if (refs.hasReferences()) {
-                        if (!local.has(id) && !hasItemState(id)) {
-                            String msg = "Target node " + id
-                                    + " of REFERENCE property does not exist";
-                            throw new ItemStateException(msg);
-                        }
-                    }
-                    shared.modified(refs);
-                }
+                shared.modified(refs);
             }
 
             boolean succeeded = false;
@@ -464,18 +448,6 @@
 
             /* Let the shared item listeners know about the change */
             shared.persisted();
-
-            /* notify virtual providers about node references */
-            iter = virtualRefs.iterator();
-            while (iter.hasNext()) {
-                NodeReferences refs = (NodeReferences) iter.next();
-                // if targetid is in virtual provider, transfer to its modified set
-                for (int i = 0; i < virtualProviders.length; i++) {
-                    if (virtualProviders[i].setNodeReferences(refs)) {
-                        break;
-                    }
-                }
-            }
 
             // downgrade to read lock
             acquireReadLock();

Added: incubator/jackrabbit/trunk/core/src/java/org/apache/jackrabbit/core/version/VersionItemStateProvider.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/core/src/java/org/apache/jackrabbit/core/version/VersionItemStateProvider.java?rev=267207&view=auto
==============================================================================
--- incubator/jackrabbit/trunk/core/src/java/org/apache/jackrabbit/core/version/VersionItemStateProvider.java (added)
+++ incubator/jackrabbit/trunk/core/src/java/org/apache/jackrabbit/core/version/VersionItemStateProvider.java Fri Sep  2 07:18:34 2005
@@ -0,0 +1,199 @@
+/*
+ * Copyright 2004-2005 The Apache Software Foundation or its licensors,
+ *                     as applicable.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.core.version;
+
+import org.apache.commons.collections.map.ReferenceMap;
+import org.apache.jackrabbit.Constants;
+import org.apache.jackrabbit.core.ItemId;
+import org.apache.jackrabbit.core.NodeId;
+import org.apache.jackrabbit.core.state.ItemState;
+import org.apache.jackrabbit.core.state.ItemStateException;
+import org.apache.jackrabbit.core.state.NoSuchItemStateException;
+import org.apache.jackrabbit.core.state.NodeReferences;
+import org.apache.jackrabbit.core.state.NodeReferencesId;
+import org.apache.jackrabbit.core.state.PropertyState;
+import org.apache.jackrabbit.core.state.SharedItemStateManager;
+import org.apache.jackrabbit.core.value.InternalValue;
+import org.apache.jackrabbit.core.virtual.VirtualItemStateProvider;
+import org.apache.jackrabbit.core.virtual.VirtualNodeState;
+import org.apache.jackrabbit.core.virtual.VirtualPropertyState;
+import org.apache.jackrabbit.name.QName;
+import org.apache.jackrabbit.uuid.UUID;
+import org.apache.log4j.Logger;
+
+import javax.jcr.RepositoryException;
+
+/**
+ * This Class implements a virtual item state provider.
+ */
+public class VersionItemStateProvider implements VirtualItemStateProvider,
+        Constants {
+
+    /**
+     * the default logger
+     */
+    private static Logger log = Logger.getLogger(VersionItemStateProvider.class);
+
+    /**
+     * The version manager
+     */
+    private final VersionManagerImpl vMgr;
+
+    /**
+     * The root node UUID for the version storage
+     */
+    private final NodeId historyRootId;
+
+    /**
+     * The item state manager directly on the version persistence mgr
+     */
+    private final SharedItemStateManager stateMgr;
+
+    /**
+     * Map of returned items. this is kept for invalidating
+     */
+    private ReferenceMap items = new ReferenceMap(ReferenceMap.HARD, ReferenceMap.WEAK);
+
+    /**
+     * Creates a bew vesuion manager
+     *
+     */
+    public VersionItemStateProvider(VersionManagerImpl vMgr, SharedItemStateManager stateMgr) {
+        this.vMgr = vMgr;
+        this.stateMgr = stateMgr;
+        this.historyRootId = vMgr.getHistoryRootId();
+    }
+
+    /**
+     * @inheritDoc
+     */
+    public boolean isVirtualRoot(ItemId id) {
+        return id.equals(historyRootId);
+    }
+
+    /**
+     * @inheritDoc
+     */
+    public NodeId getVirtualRootId() {
+        return historyRootId;
+    }
+
+    /**
+     * @inheritDoc
+     */
+    public VirtualPropertyState createPropertyState(VirtualNodeState parent,
+                                                    QName name, int type,
+                                                    boolean multiValued)
+            throws RepositoryException {
+        throw new IllegalStateException("VersionManager should never create a VirtualPropertyState");
+    }
+
+    /**
+     * @inheritDoc
+     */
+    public VirtualNodeState createNodeState(VirtualNodeState parent, QName name,
+                                            String uuid, QName nodeTypeName)
+            throws RepositoryException {
+        throw new IllegalStateException("VersionManager should never create a VirtualNodeState");
+    }
+
+    /**
+     * @inheritDoc
+     */
+    public synchronized ItemState getItemState(ItemId id)
+            throws NoSuchItemStateException, ItemStateException {
+        ItemState item = (ItemState) items.get(id);
+        if (item == null) {
+            item = stateMgr.getItemState(id);
+            items.put(id, item);
+
+            // attach us as listener
+            item.addListener(this);
+
+            // special check for successors
+            if (item instanceof PropertyState) {
+                PropertyState prop = (PropertyState) item;
+                if (prop.getName().equals(JCR_SUCCESSORS)) {
+                    try {
+                        InternalVersion v = vMgr.getVersion(prop.getParentUUID());
+                        if (v != null) {
+                            InternalVersion[] succs = v.getSuccessors();
+                            InternalValue[] succV = new InternalValue[succs.length];
+                            for (int i = 0; i < succs.length; i++) {
+                                succV[i] = InternalValue.create(new UUID(succs[i].getId()));
+                            }
+                            prop.setValues(succV);
+                        }
+                    } catch (RepositoryException e) {
+                        log.warn("Unable to resolve jcr:successors property for " + id);
+                    }
+                }
+            }
+        }
+        return item;
+    }
+
+    /**
+     * @inheritDoc
+     */
+    public boolean hasItemState(ItemId id) {
+        return stateMgr.hasItemState(id);
+    }
+
+    /**
+     * @inheritDoc
+     */
+    public NodeReferences getNodeReferences(NodeReferencesId id)
+            throws NoSuchItemStateException, ItemStateException {
+        return stateMgr.getNodeReferences(id);
+    }
+
+    /**
+     * @inheritDoc
+     */
+    public boolean hasNodeReferences(NodeReferencesId id) {
+        return stateMgr.hasNodeReferences(id);
+    }
+
+    /**
+     * @inheritDoc
+     */
+    public void stateCreated(ItemState created) {
+        // ignore
+    }
+
+    /**
+     * @inheritDoc
+     */
+    public void stateModified(ItemState modified) {
+        // ignore
+    }
+
+    /**
+     * @inheritDoc
+     */
+    public void stateDestroyed(ItemState destroyed) {
+        items.remove(destroyed.getId());
+    }
+
+    /**
+     * @inheritDoc
+     */
+    public void stateDiscarded(ItemState discarded) {
+        items.remove(discarded.getId());
+    }
+}

Propchange: incubator/jackrabbit/trunk/core/src/java/org/apache/jackrabbit/core/version/VersionItemStateProvider.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/jackrabbit/trunk/core/src/java/org/apache/jackrabbit/core/version/VersionItemStateProvider.java
------------------------------------------------------------------------------
    svn:keywords = author date id revision

Modified: incubator/jackrabbit/trunk/core/src/java/org/apache/jackrabbit/core/version/VersionManagerImpl.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/core/src/java/org/apache/jackrabbit/core/version/VersionManagerImpl.java?rev=267207&r1=267206&r2=267207&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/core/src/java/org/apache/jackrabbit/core/version/VersionManagerImpl.java (original)
+++ incubator/jackrabbit/trunk/core/src/java/org/apache/jackrabbit/core/version/VersionManagerImpl.java Fri Sep  2 07:18:34 2005
@@ -67,8 +67,7 @@
 /**
  * This Class implements a VersionManager.
  */
-public class VersionManagerImpl implements VersionManager,
-        VirtualItemStateProvider, Constants {
+public class VersionManagerImpl implements VersionManager, Constants {
 
     /**
      * the default logger
@@ -91,6 +90,11 @@
     private LocalItemStateManager stateMgr;
 
     /**
+     * the virtual item state provider that exposes the version storage
+     */
+    private final VersionItemStateProvider versProvider;
+
+    /**
      * the persistent root node of the version histories
      */
     private final NodeStateEx historyRoot;
@@ -151,20 +155,20 @@
             stateMgr = new LocalItemStateManager(sharedStateMgr, null);
             NodeState nodeState = (NodeState) stateMgr.getItemState(new NodeId(VERSION_STORAGE_NODE_UUID));
             historyRoot = new NodeStateEx(stateMgr, ntReg, nodeState, JCR_VERSIONSTORAGE);
+
+            // create the virtual item state provider
+            versProvider = new VersionItemStateProvider(this, sharedStateMgr);
+
         } catch (ItemStateException e) {
             throw new RepositoryException(e);
         }
     }
 
     /**
-     * returns the virtual item state provider that exposes the internal versions
-     * as items.
-     *
-     * @param base
-     * @return
+     * {@inheritDoc}
      */
-    public synchronized ItemStateManager getItemStateProvider(ItemStateManager base) {
-        return stateMgr;
+    public VirtualItemStateProvider getVirtualItemStateProvider() {
+        return versProvider;
     }
 
     /**
@@ -748,13 +752,6 @@
     }
 
     /**
-     * {@inheritDoc}
-     */
-    public VirtualItemStateProvider getVirtualItemStateProvider() {
-        return this;
-    }
-
-    /**
      * invalidates the item
      *
      * @param id
@@ -780,94 +777,13 @@
     }
 
 
-    //--------------------------------------------------------------------------
-    //--------------------------------------------------------------------------
-
-    public boolean isVirtualRoot(ItemId id) {
-        return id.equals(historyRoot.getState().getId());
-    }
-
-    public NodeId getVirtualRootId() {
+    /**
+     * returns the id of the version history root node
+     *
+     * @return the id of the version history root node
+     */
+    NodeId getHistoryRootId() {
         return (NodeId) historyRoot.getState().getId();
     }
 
-    public VirtualPropertyState createPropertyState(VirtualNodeState parent, QName name, int type, boolean multiValued) throws RepositoryException {
-        throw new IllegalStateException("VersionManager should never create a VirtualPropertyState");
-    }
-
-    public VirtualNodeState createNodeState(VirtualNodeState parent, QName name, String uuid, QName nodeTypeName) throws RepositoryException {
-        throw new IllegalStateException("VersionManager should never create a VirtualNodeState");
-    }
-
-    public boolean setNodeReferences(NodeReferences refs) {
-        try {
-            InternalVersionItem item = getItem(refs.getTargetId().getUUID());
-            setItemReferences(item, refs.getReferences());
-            return true;
-        } catch (RepositoryException e) {
-            log.error("Error while setting references: " + e.toString());
-            return false;
-        }
-    }
-
-    public synchronized ItemState getItemState(ItemId id)
-            throws NoSuchItemStateException, ItemStateException {
-        ItemState item = (ItemState) items.get(id);
-        if (item == null) {
-            item = stateMgr.getItemState(id);
-            items.put(id, item);
-
-            // special check for successors
-            if (item instanceof PropertyState) {
-                PropertyState prop = (PropertyState) item;
-                if (prop.getName().equals(JCR_SUCCESSORS)) {
-                    try {
-                        InternalVersion v = getVersion(prop.getParentUUID());
-                        if (v != null) {
-                            InternalVersion[] succs = v.getSuccessors();
-                            InternalValue[] succV = new InternalValue[succs.length];
-                            for (int i = 0; i < succs.length; i++) {
-                                succV[i] = InternalValue.create(new UUID(succs[i].getId()));
-                            }
-                            prop.setValues(succV);
-                        }
-                    } catch (RepositoryException e) {
-                        log.warn("Unable to resolve jcr:successors property for " + id);
-                    }
-                }
-            }
-        }
-        return item;
-    }
-
-    public boolean hasItemState(ItemId id) {
-        return stateMgr.hasItemState(id);
-    }
-
-    public NodeReferences getNodeReferences(NodeReferencesId id)
-            throws NoSuchItemStateException, ItemStateException {
-        return stateMgr.getNodeReferences(id);
-    }
-
-    public boolean hasNodeReferences(NodeReferencesId id) {
-        return stateMgr.hasNodeReferences(id);
-    }
-
-    public void stateCreated(ItemState created) {
-        stateMgr.stateCreated(created);
-    }
-
-    public void stateModified(ItemState modified) {
-        stateMgr.stateModified(modified);
-    }
-
-    public void stateDestroyed(ItemState destroyed) {
-        items.remove(destroyed.getId());
-        stateMgr.stateDestroyed(destroyed);
-    }
-
-    public void stateDiscarded(ItemState discarded) {
-        items.remove(discarded.getId());
-        stateMgr.stateDiscarded(discarded);
-    }
 }

Modified: incubator/jackrabbit/trunk/core/src/java/org/apache/jackrabbit/core/virtual/AbstractVISProvider.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/core/src/java/org/apache/jackrabbit/core/virtual/AbstractVISProvider.java?rev=267207&r1=267206&r2=267207&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/core/src/java/org/apache/jackrabbit/core/virtual/AbstractVISProvider.java (original)
+++ incubator/jackrabbit/trunk/core/src/java/org/apache/jackrabbit/core/virtual/AbstractVISProvider.java Fri Sep  2 07:18:34 2005
@@ -393,13 +393,6 @@
     /**
      * {@inheritDoc}
      */
-    public boolean setNodeReferences(NodeReferences refs) {
-        return false;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
     public void stateCreated(ItemState created) {
     }
 

Modified: incubator/jackrabbit/trunk/core/src/java/org/apache/jackrabbit/core/virtual/VirtualItemStateProvider.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/core/src/java/org/apache/jackrabbit/core/virtual/VirtualItemStateProvider.java?rev=267207&r1=267206&r2=267207&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/core/src/java/org/apache/jackrabbit/core/virtual/VirtualItemStateProvider.java (original)
+++ incubator/jackrabbit/trunk/core/src/java/org/apache/jackrabbit/core/virtual/VirtualItemStateProvider.java Fri Sep  2 07:18:34 2005
@@ -74,14 +74,4 @@
                                             String uuid, QName nodeTypeName)
             throws RepositoryException;
 
-    /**
-     * Informs this provider that the node references to one of its states has
-     * changed.
-     *
-     * @param refs
-     * @return <code>true</code> if the reference target is one of its items.
-     */
-    boolean setNodeReferences(NodeReferences refs);
-
-
 }