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 2004/11/06 13:40:33 UTC

svn commit: rev 56758 - in incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core: . version

Author: tripod
Date: Sat Nov  6 04:40:33 2004
New Revision: 56758

Modified:
   incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/RepositoryImpl.java
   incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/SessionImpl.java
   incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/PersistentVersionManager.java
   incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/VersionManager.java
Log:
- enhancing versioning to work with all workspaces

Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/RepositoryImpl.java
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/RepositoryImpl.java	(original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/RepositoryImpl.java	Sat Nov  6 04:40:33 2004
@@ -274,11 +274,15 @@
          */
 
         // check system root node of system workspace
-        SessionImpl sysSession = getSystemSession(repConfig.getDefaultWorkspaceName());
-        NodeImpl rootNode = (NodeImpl) sysSession.getRootNode();
-        if (!rootNode.hasNode(SYSTEM_ROOT_NAME)) {
-            rootNode.addNode(SYSTEM_ROOT_NAME, NodeTypeRegistry.NT_UNSTRUCTURED);
-            rootNode.save();
+        // (by now, we just create a system root node in all workspaces)
+        Iterator wspNames = wspConfigs.keySet().iterator();
+        while (wspNames.hasNext()) {
+            String wspName = (String) wspNames.next();
+            NodeImpl rootNode = (NodeImpl) getSystemSession(wspName).getRootNode();
+            if (!rootNode.hasNode(SYSTEM_ROOT_NAME)) {
+                rootNode.addNode(SYSTEM_ROOT_NAME, NodeTypeRegistry.NT_UNSTRUCTURED);
+                rootNode.save();
+            }
         }
 
         // init version manager

Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/SessionImpl.java
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/SessionImpl.java	(original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/SessionImpl.java	Sat Nov  6 04:40:33 2004
@@ -147,12 +147,12 @@
         hierMgr = itemStateMgr.getHierarchyMgr();
         itemMgr = createItemManager(itemStateMgr, hierMgr);
         accessMgr = createAccessManager(credentials, hierMgr);
-        versionMgr = rep.getPersistentVersionManager()==null?null:rep.getPersistentVersionManager().getVersionManager();
+        versionMgr = rep.getPersistentVersionManager()==null?null:rep.getPersistentVersionManager().getVersionManager(wsp);
 
         // add virtual item managers only for normal sessions
         if (!(this instanceof SystemSession)) {
             try {
-                itemStateMgr.addVirtualItemStateProvider(versionMgr.getVirtualItemStateProvider(itemStateMgr));
+                itemStateMgr.addVirtualItemStateProvider(versionMgr.getVirtualItemStateProvider(this, itemStateMgr));
             } catch (Exception e) {
                 log.error("Unable to add vmgr: " + e.toString(), e);
             }
@@ -178,12 +178,12 @@
         itemStateMgr = new SessionItemStateManager(rep.getRootNodeUUID(), wsp.getPersistentStateManager(), getNamespaceResolver());
         hierMgr = itemStateMgr.getHierarchyMgr();
         itemMgr = createItemManager(itemStateMgr, hierMgr);
-        versionMgr = rep.getPersistentVersionManager()==null?null:rep.getPersistentVersionManager().getVersionManager();
+        versionMgr = rep.getPersistentVersionManager()==null?null:rep.getPersistentVersionManager().getVersionManager(wsp);
 
         // add virtual item managers only for normal sessions
         if (!(this instanceof SystemSession)) {
             try {
-                itemStateMgr.addVirtualItemStateProvider(versionMgr.getVirtualItemStateProvider(itemStateMgr));
+                itemStateMgr.addVirtualItemStateProvider(versionMgr.getVirtualItemStateProvider(this, itemStateMgr));
             } catch (Exception e) {
                 log.error("Unable to add vmgr: " + e.toString(), e);
             }

Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/PersistentVersionManager.java
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/PersistentVersionManager.java	(original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/PersistentVersionManager.java	Sat Nov  6 04:40:33 2004
@@ -27,6 +27,7 @@
 import javax.jcr.Node;
 import javax.jcr.RepositoryException;
 import javax.jcr.Value;
+import javax.jcr.Workspace;
 import java.util.Iterator;
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -77,16 +78,6 @@
     private final PersistentNode historyRoot;
 
     /**
-     * the virtual root node of the version histories
-     */
-    private final String virtHistoryRootId;
-
-    /**
-     * the system root id
-     */
-    private final String systemRootId;
-
-    /**
      * the state manager for the version storage
      */
     private PersistentItemStateProvider stateMgr;
@@ -97,9 +88,9 @@
     private NodeTypeManagerImpl ntMgr;
 
     /**
-     * The representation version manager
+     * The representation version managers (per workspace)
      */
-    private VersionManager versionManager;
+    private HashMap versionManagers = new HashMap();
 
     /**
      * the version histories
@@ -118,17 +109,11 @@
 
         // check for versionhistory root
         NodeImpl systemRoot = ((RepositoryImpl) session.getRepository()).getSystemRootNode(session);
-        systemRootId = systemRoot.internalGetUUID();
         if (!systemRoot.hasNode(VERSION_HISTORY_ROOT_NAME)) {
             // if not exist, create
             systemRoot.addNode(VERSION_HISTORY_ROOT_NAME, NodeTypeRegistry.NT_UNSTRUCTURED);
         }
-        if (!systemRoot.hasNode(VersionManager.VERSION_HISTORY_ROOT_NAME)) {
-            // if not exist, create
-            systemRoot.addNode(VersionManager.VERSION_HISTORY_ROOT_NAME, NodeTypeRegistry.NT_UNSTRUCTURED);
-        }
         systemRoot.save();
-        virtHistoryRootId = systemRoot.getNode(VersionManager.VERSION_HISTORY_ROOT_NAME).internalGetUUID();
 
         try {
             PersistentNodeState nodeState = (PersistentNodeState) stateMgr.getItemState(new NodeId(systemRoot.getNode(VERSION_HISTORY_ROOT_NAME).internalGetUUID()));
@@ -159,6 +144,9 @@
         // create new history node in the persistent state
         InternalVersionHistory hist = InternalVersionHistory.create(this, historyRoot, uuid, historyNodeName, node);
         histories.put(hist.getId(), hist);
+
+        // notify version managers
+        onVersionHistoryModified(hist);
         return hist;
     }
 
@@ -216,8 +204,21 @@
      */
     protected void onVersionModified(InternalVersion version)  throws RepositoryException {
         // check if version manager already generated item states
-        if (versionManager!=null) {
-            versionManager.onVersionModified(version);
+        Iterator iter = versionManagers.values().iterator();
+        while (iter.hasNext()) {
+            ((VersionManager) iter.next()).onVersionModified(version);
+        }
+    }
+
+    /**
+     * is informed by the versions if they were modified
+     * @param vh
+     */
+    protected void onVersionHistoryModified(InternalVersionHistory vh)  throws RepositoryException {
+        // check if version manager already generated item states
+        Iterator iter = versionManagers.values().iterator();
+        while (iter.hasNext()) {
+            ((VersionManager) iter.next()).onVersionHistoryModified(vh);
         }
     }
 
@@ -279,11 +280,13 @@
      * returns the version manager
      * @return
      */
-    public synchronized VersionManager getVersionManager() {
-        if (versionManager==null) {
-            versionManager = new VersionManager(this, virtHistoryRootId);
+    public synchronized VersionManager getVersionManager(Workspace wsp) {
+        VersionManager vm = (VersionManager) versionManagers.get(wsp.getName());
+        if (vm==null) {
+            vm = new VersionManager(this);
+            versionManagers.put(wsp.getName(), vm);
         }
-        return versionManager;
+        return vm;
     }
 
     /**

Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/VersionManager.java
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/VersionManager.java	(original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/VersionManager.java	Sat Nov  6 04:40:33 2004
@@ -25,6 +25,7 @@
 
 import javax.jcr.RepositoryException;
 import javax.jcr.PropertyType;
+import javax.jcr.Workspace;
 import javax.jcr.nodetype.NodeDef;
 import javax.jcr.version.VersionHistory;
 import javax.jcr.version.Version;
@@ -100,11 +101,6 @@
     private final PersistentVersionManager vMgr;
 
     /**
-     * the uuid of the system root node
-     */
-    private final String rootId;
-
-    /**
      * The virtual item manager that exposes the versions to the content
      */
     private DefaultItemStateProvider virtProvider;
@@ -117,11 +113,9 @@
 
     /**
      * @param vMgr
-     * @param rootId the uuid of the version history root
      */
-    protected VersionManager(PersistentVersionManager vMgr, String rootId) {
+    protected VersionManager(PersistentVersionManager vMgr) {
         this.vMgr = vMgr;
-        this.rootId = rootId;
     }
 
     /**
@@ -130,9 +124,18 @@
      * @param base
      * @return
      */
-    public VirtualItemStateProvider getVirtualItemStateProvider(ItemStateProvider base) {
+    public VirtualItemStateProvider getVirtualItemStateProvider(SessionImpl session, ItemStateProvider base) {
         if (virtProvider==null) {
             try {
+                // check, if workspace of session has history root
+                NodeImpl systemRoot = ((RepositoryImpl) session.getRepository()).getSystemRootNode(session);
+                if (!systemRoot.hasNode(VersionManager.VERSION_HISTORY_ROOT_NAME)) {
+                    // if not exist, create
+                    systemRoot.addNode(VersionManager.VERSION_HISTORY_ROOT_NAME, NodeTypeRegistry.NT_UNSTRUCTURED);
+                }
+                systemRoot.save();
+                String rootId = systemRoot.getNode(VersionManager.VERSION_HISTORY_ROOT_NAME).internalGetUUID();
+
                 virtProvider = new DefaultItemStateProvider(vMgr.getNodeTypeManager());
                 // create a duplicate of the version history root name
                 NodeState virtRootState = (NodeState) base.getItemState(new NodeId(rootId));
@@ -162,7 +165,6 @@
      */
     public VersionHistory createVersionHistory(NodeImpl node) throws RepositoryException {
         InternalVersionHistory history = vMgr.createVersionHistory(node);
-        mapVersionHistory(history);
         return (VersionHistory) node.getSession().getNodeByUUID(history.getId());
     }
 
@@ -256,8 +258,10 @@
     public Version checkin(NodeImpl node) throws RepositoryException {
         try {
             InternalVersion version = vMgr.checkin(node);
+            vMgr.onVersionHistoryModified(version.getVersionHistory());
+
             VirtualNodeState vhNode = (VirtualNodeState) virtProvider.getItemState(new NodeId(version.getVersionHistory().getId()));
-            mapVersion(vhNode, version);
+
             // invalidate predecessors 'sucessors' properties
             InternalVersion[] pred = version.getPredecessors();
             for (int i=0; i<pred.length; i++) {
@@ -285,6 +289,16 @@
     }
 
     /**
+     * Called when a internal version history has changed its internal structure,
+     * and the structure has to be remapped to the content.
+     * @param vh
+     * @throws RepositoryException
+     */
+    protected void onVersionHistoryModified(InternalVersionHistory vh) throws RepositoryException {
+        mapVersionHistory(vh);
+    }
+
+    /**
      * Maps the version history and it's versions to the content representation.
      * @param vh
      * @throws RepositoryException
@@ -308,7 +322,12 @@
             }
 
             historyNodeName = new QName(NamespaceRegistryImpl.NS_DEFAULT_URI, uuid.substring(4));
-            VirtualNodeState vhNode = virtProvider.addNode(parent, historyNodeName, vh.getId(), NodeTypeRegistry.NT_VERSION_HISTORY, null);
+            VirtualNodeState vhNode;
+            if (parent.hasChildNodeEntry(historyNodeName)) {
+                vhNode = virtProvider.getNode(parent, historyNodeName, 1);
+            } else {
+                vhNode = virtProvider.addNode(parent, historyNodeName, vh.getId(), NodeTypeRegistry.NT_VERSION_HISTORY, null);
+            }
 
             // add the versions
             Iterator iter = vh.getVersions();
@@ -331,24 +350,27 @@
     private void mapVersion(VirtualNodeState vhNode, InternalVersion version)
             throws RepositoryException {
         try {
-            VirtualNodeState vNode = virtProvider.addNode(vhNode, version.getName(), version.getId(), NodeTypeRegistry.NT_VERSION, null);
-
-            // initialize the version
-            virtProvider.setPropertyValue(vNode, VersionManager.PROPNAME_CREATED, InternalValue.create(version.getCreated()));
-
-            // initialize the primary properties
-            InternalFrozenNode fNode = version.getFrozenNode();
-            virtProvider.setPropertyValue(vNode, VersionManager.PROPNAME_FROZEN_UUID, InternalValue.create(fNode.getFrozenUUID()));
-            virtProvider.setPropertyValue(vNode, VersionManager.PROPNAME_FROZEN_PRIMARY_TYPE, InternalValue.create(fNode.getFrozenPrimaryType()));
-            virtProvider.setPropertyValues(vNode, VersionManager.PROPNAME_FROZEN_MIXIN_TYPES, PropertyType.NAME, InternalValue.create(fNode.getFrozenMixinTypes()));
+            VirtualNodeState vNode;
+            if (vhNode.hasChildNodeEntry(version.getName())) {
+                vNode = virtProvider.getNode(vhNode, version.getName(), 1);
+            } else {
+                vNode = virtProvider.addNode(vhNode, version.getName(), version.getId(), NodeTypeRegistry.NT_VERSION, null);
+                // initialize the version
+                virtProvider.setPropertyValue(vNode, VersionManager.PROPNAME_CREATED, InternalValue.create(version.getCreated()));
+
+                // initialize the primary properties
+                InternalFrozenNode fNode = version.getFrozenNode();
+                virtProvider.setPropertyValue(vNode, VersionManager.PROPNAME_FROZEN_UUID, InternalValue.create(fNode.getFrozenUUID()));
+                virtProvider.setPropertyValue(vNode, VersionManager.PROPNAME_FROZEN_PRIMARY_TYPE, InternalValue.create(fNode.getFrozenPrimaryType()));
+                virtProvider.setPropertyValues(vNode, VersionManager.PROPNAME_FROZEN_MIXIN_TYPES, PropertyType.NAME, InternalValue.create(fNode.getFrozenMixinTypes()));
+                if (!version.isRootVersion()) {
+                    // don't map for root verion
+                    mapFrozenNode(vNode, PersistentVersionManager.NODENAME_FROZEN, fNode);
+                }
+            }
 
             // map dynamic ones
             mapDynamicProperties(vNode, version);
-
-            if (!version.isRootVersion()) {
-                // don't map for root verion
-                mapFrozenNode(vNode, PersistentVersionManager.NODENAME_FROZEN, fNode);
-            }
 
         } catch (ItemStateException e) {
             throw new RepositoryException(e);