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/01/21 12:55:03 UTC

svn commit: r125924 - in incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core: . state state/xml version version/persistence

Author: tripod
Date: Fri Jan 21 03:55:02 2005
New Revision: 125924

URL: http://svn.apache.org/viewcvs?view=rev&rev=125924
Log:
- use seperate persistence manager for versioning
Modified:
   incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/NodeImpl.java
   incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/RepositoryImpl.java
   incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/PersistentNodeState.java
   incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/xml/XMLPersistenceManager.java
   incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/VersionItemStateProvider.java
   incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/persistence/InternalFrozenNodeImpl.java
   incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/persistence/NativePVM.java
   incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/persistence/PersistentNode.java

Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/NodeImpl.java
Url: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/NodeImpl.java?view=diff&rev=125924&p1=incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/NodeImpl.java&r1=125923&p2=incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/NodeImpl.java&r2=125924
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/NodeImpl.java	(original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/NodeImpl.java	Fri Jan 21 03:55:02 2005
@@ -2339,17 +2339,30 @@
             throws VersionException, UnsupportedRepositoryOperationException,
             RepositoryException {
 
+        // check if versionable
+        checkVersionable();
+
+        // check if checked out
         if (!isCheckedOut()) {
-            String msg = "Unable to checkin node. Is not checked-out. " + safeGetJCRPath();
+            String msg = safeGetJCRPath() + ": Node is already checked-in. ignoring.";
             log.debug(msg);
-            throw new VersionException(msg);
+            return getBaseVersion();
         }
+
         // check transient state
         if (isModified()) {
             String msg = "Unable to checkin node. Not allowed on transient node. " + safeGetJCRPath();
             log.debug(msg);
-            throw new IllegalStateException(msg);
+            throw new InvalidItemStateException(msg);
         }
+
+        // check if not merge failed
+        if (hasProperty(ItemImpl.PROPNAME_MERGE_FAILED) && getProperty(ItemImpl.PROPNAME_MERGE_FAILED).getValues().length>0) {
+            String msg = "Unable to checkin node. Clear 'jcr:mergeFailed' first. " + safeGetJCRPath();
+            log.debug(msg);
+            throw new VersionException(msg);
+        }
+
         Version v = session.versionMgr.checkin(this);
         Property prop = internalSetProperty(VersionManager.PROPNAME_IS_CHECKED_OUT, InternalValue.create(false));
         prop.save();
@@ -2365,11 +2378,23 @@
      */
     public void checkout()
             throws UnsupportedRepositoryOperationException, RepositoryException {
+        // check if versionable
+        checkVersionable();
+
+        // check if already checked out
         if (isCheckedOut()) {
-            String msg = "Unable to checkout node. Is not checked-in. " + safeGetJCRPath();
+            String msg = safeGetJCRPath() + ": Node is already checked-out. ignoring.";
             log.debug(msg);
-            throw new VersionException(msg);
+            return;
+        }
+
+        // check transient state
+        if (isModified()) {
+            String msg = "Unable to checkout node. Not allowed on transient node. " + safeGetJCRPath();
+            log.debug(msg);
+            throw new InvalidItemStateException(msg);
         }
+
         Property prop = internalSetProperty(VersionManager.PROPNAME_IS_CHECKED_OUT, InternalValue.create(true));
         prop.save();
         prop = internalSetProperty(VersionManager.PROPNAME_PREDECESSORS,
@@ -2679,7 +2704,7 @@
         // search nearest ancestor that is versionable
         NodeImpl node = this;
         while (!node.hasProperty(VersionManager.PROPNAME_IS_CHECKED_OUT)) {
-            if (node.isRepositoryRoot() || !inherit) {
+            if (!inherit || node.isRepositoryRoot()) {
                 return true;
             }
             node = (NodeImpl) node.getParent();
@@ -2700,16 +2725,18 @@
     public void restore(String versionName)
             throws VersionException, UnsupportedRepositoryOperationException,
             RepositoryException {
+        boolean removeExisting = true;
 
-        if (!isCheckedOut()) {
-            String msg = "Unable to restore version. Node is not checked-out " + safeGetJCRPath();
-            log.debug(msg);
-            throw new VersionException(msg);
+        // check if transient
+        if (session.hasPendingChanges()) {
+            String msg = "Unable to restore version. Session has pending changes.";
+            log.error(msg);
+            throw new InvalidItemStateException(msg);
         }
 
         GenericVersionSelector gvs = new GenericVersionSelector();
         gvs.setName(versionName);
-        internalRestore(getVersionHistory().getVersion(versionName), gvs);
+        internalRestore(getVersionHistory().getVersion(versionName), gvs, removeExisting);
         save();
     }
 
@@ -2718,18 +2745,20 @@
      */
     public void restore(Version version)
             throws UnsupportedRepositoryOperationException, RepositoryException {
+        boolean removeExisting = true;
 
-        if (!isCheckedOut()) {
-            String msg = "Unable to restore version. Node is not checked-out " + safeGetJCRPath();
-            log.debug(msg);
-            throw new VersionException(msg);
+        // check if transient
+        if (session.hasPendingChanges()) {
+            String msg = "Unable to restore version. Session has pending changes.";
+            log.error(msg);
+            throw new InvalidItemStateException(msg);
         }
 
         // check if 'own' version
         if (!version.getParent().getUUID().equals(getVersionHistory().getUUID())) {
             throw new VersionException("Unable to restore version. Not same version history.");
         }
-        internalRestore(version, new GenericVersionSelector(version.getCreated()));
+        internalRestore(version, new GenericVersionSelector(version.getCreated()), removeExisting);
         save();
     }
 
@@ -2741,22 +2770,24 @@
             throws PathNotFoundException, ItemExistsException,
             ConstraintViolationException, UnsupportedRepositoryOperationException,
             RepositoryException {
+        boolean removeExisting = true;
+
+        // check if transient
+        if (session.hasPendingChanges()) {
+            String msg = "Unable to restore version. Session has pending changes.";
+            log.error(msg);
+            throw new InvalidItemStateException(msg);
+        }
 
         // if node exists, do a 'normal' restore
         if (hasNode(relPath)) {
             getNode(relPath).restore(version);
+        } else {
+            // recreate node from frozen state
+            NodeImpl node = addNode(relPath, ((VersionImpl) version).getFrozenNode());
+            node.internalRestore(version, new GenericVersionSelector(version.getCreated()), removeExisting);
+            node.getParent().save();
         }
-
-        // recreate node from frozen state
-        NodeImpl node = addNode(relPath, ((VersionImpl) version).getFrozenNode());
-        if (!node.isCheckedOut()) {
-            String msg = "Unable to restore version. Node is not checked-out " + node.safeGetJCRPath();
-            log.debug(msg);
-            throw new VersionException(msg);
-        }
-
-        node.internalRestore(version, new GenericVersionSelector(version.getCreated()));
-        node.getParent().save();
     }
 
     /**
@@ -2764,18 +2795,20 @@
      */
     public void restoreByLabel(String versionLabel)
             throws UnsupportedRepositoryOperationException, RepositoryException {
+        boolean removeExisting = false;
 
-        if (!isCheckedOut()) {
-            String msg = "Unable to restore version. Node is not checked-out " + safeGetJCRPath();
-            log.debug(msg);
-            throw new VersionException(msg);
+        // check if transient
+        if (session.hasPendingChanges()) {
+            String msg = "Unable to restore version. Session has pending changes.";
+            log.error(msg);
+            throw new InvalidItemStateException(msg);
         }
 
         Version v = getVersionHistory().getVersionByLabel(versionLabel);
         if (v == null) {
             throw new VersionException("No version for label " + versionLabel + " found.");
         }
-        internalRestore(v, new GenericVersionSelector(versionLabel));
+        internalRestore(v, new GenericVersionSelector(versionLabel), removeExisting);
         save();
     }
 
@@ -2886,9 +2919,54 @@
      *
      * @throws RepositoryException
      */
-    private void internalRestore(Version version, VersionSelector vsel)
+    private void internalRestore(Version version, VersionSelector vsel, boolean removeExisting)
             throws UnsupportedRepositoryOperationException, RepositoryException {
-        internalRestore(((VersionImpl) version).getInternalVersion(), vsel);
+        internalRestore(((VersionImpl) version).getInternalVersion(), vsel, removeExisting);
+    }
+
+    /**
+     * Checks if any frozen uuid in the given frozen node or its descendants
+     * collides with the one in the workspace. if 'removeExisting' is true,
+     * collisions will be removed, otherwise an ItemExistsException is thrown.
+     * If a frozen version history is already restored outside this nodes
+     * subtree, a exception is thrown, too, if the removeExisting is true.
+     * @param f
+     * @param removeExisting
+     * @throws RepositoryException
+     */
+    private void checkUUIDCollisions(InternalFrozenNode f, boolean removeExisting)
+            throws RepositoryException {
+
+        if (itemMgr.itemExists(new NodeId(f.getFrozenUUID()))) {
+            NodeImpl node = (NodeImpl) session.getNodeByUUID(f.getFrozenUUID());
+            if (removeExisting) {
+                node.remove();
+            } else {
+                throw new ItemExistsException("Unable to restore. UUID collides with " + node.safeGetJCRPath());
+            }
+        }
+        InternalFreeze[] fs = f.getFrozenChildNodes();
+        for (int i=0; i<fs.length; i++) {
+            if (fs[i] instanceof InternalFrozenNode) {
+                checkUUIDCollisions((InternalFrozenNode) fs[i], removeExisting);
+            } else if (!removeExisting) {
+                InternalFrozenVersionHistory fh = (InternalFrozenVersionHistory) fs[i];
+                VersionHistory history = (VersionHistory) session.getNodeByUUID(fh.getVersionHistoryId());
+                String nodeId = history.getName(); // this is implementation detail!
+
+                // check if representing vh already exists somewhere
+                if (itemMgr.itemExists(new NodeId(nodeId))) {
+                    NodeImpl n = (NodeImpl) session.getNodeByUUID(nodeId);
+                    try {
+                        if (!n.getPrimaryPath().isDescendantOf(getPrimaryPath())) {
+                            throw new ItemExistsException("Unable to restore. Same node already restored at " + n.safeGetJCRPath());
+                        }
+                    } catch (MalformedPathException e) {
+                        throw new RepositoryException(e);
+                    }
+                }
+            }
+        }
     }
 
     /**
@@ -2897,17 +2975,23 @@
      * @param version
      * @param vsel    the version selector that will select the correct version for
      *                OPV=Version childnodes.
-     * @throws UnsupportedRepositoryOperationException
+     * @param removeExisting
      *
      * @throws RepositoryException
      */
-    private void internalRestore(InternalVersion version, VersionSelector vsel)
-            throws UnsupportedRepositoryOperationException, RepositoryException {
+    private void internalRestore(InternalVersion version, VersionSelector vsel, boolean removeExisting)
+            throws RepositoryException {
+
+        // first check, if any uuid conflicts would occurr
+        checkUUIDCollisions(version.getFrozenNode(), removeExisting);
+
+        // set jcr:isCheckedOut property to true, in order to avoid any conflicts
+        internalSetProperty(VersionManager.PROPNAME_IS_CHECKED_OUT, InternalValue.create(true));
 
         // 1. The child node and properties of N will be changed, removed or
         //    added to, depending on their corresponding copies in V and their
         //    own OnParentVersion attributes (see 7.2.8, below, for details).
-        restoreFrozenState(version.getFrozenNode(), vsel);
+        restoreFrozenState(version.getFrozenNode(), vsel, removeExisting);
 
         // 2. N�s jcr:baseVersion property will be changed to point to V.
         internalSetProperty(VersionManager.PROPNAME_BASE_VERSION, InternalValue.create(new UUID(version.getId())));
@@ -2927,7 +3011,7 @@
      * @param freeze
      * @throws RepositoryException
      */
-    void restoreFrozenState(InternalFrozenNode freeze, VersionSelector vsel)
+    void restoreFrozenState(InternalFrozenNode freeze, VersionSelector vsel, boolean removeExisting)
             throws RepositoryException {
         // check uuid
         if (isNodeType(NodeTypeRegistry.MIX_REFERENCEABLE)) {
@@ -2977,15 +3061,11 @@
         for (int i = 0; i < props.length; i++) {
             PropertyState prop = props[i];
             propNames.add(prop.getName());
-            if (prop.getValues().length == 1) {
-                try {
-                    internalSetProperty(props[i].getName(), prop.getValues()[0]);
-                    continue;
-                } catch (RepositoryException e) {
-                    // ignore and try multiple below
-                }
+            if (prop.isMultiValued()) {
+                internalSetProperty(props[i].getName(), prop.getValues());
+            } else {
+                internalSetProperty(props[i].getName(), prop.getValues()[0]);
             }
-            internalSetProperty(props[i].getName(), prop.getValues());
         }
         // remove properties that do not exist the the frozen representation
         PropertyIterator piter = getProperties();
@@ -3007,27 +3087,51 @@
 
         // restore the frozen nodes
         InternalFreeze[] frozenNodes = freeze.getFrozenChildNodes();
+
+        // first delete all non frozen version histories
+        NodeIterator iter = getNodes();
+        while (iter.hasNext()) {
+            NodeImpl n = (NodeImpl) iter.nextNode();
+            // this is a bit lousy
+            boolean found = false;
+            for (int i=0; i<frozenNodes.length; i++) {
+                InternalFreeze child = frozenNodes[i];
+                if (child instanceof InternalFrozenVersionHistory) {
+                    if (n.internalGetUUID().equals(child.getId())) {
+                        found = true;
+                        break;
+                    }
+                }
+            }
+            if (!found) {
+                n.remove();
+            }
+        }
         for (int i = 0; i < frozenNodes.length; i++) {
             InternalFreeze child = frozenNodes[i];
             if (child instanceof InternalFrozenNode) {
                 InternalFrozenNode f = (InternalFrozenNode) child;
-                // if frozen node exist, replace
-                // todo: make work for same name siblings
-                if (hasNode(f.getName())) {
-                    getNode(f.getName()).remove();
-                }
                 NodeImpl n = addNode(f.getName(), f);
-                n.restoreFrozenState(f, vsel);
+                n.restoreFrozenState(f, vsel, removeExisting);
             } else if (child instanceof InternalFrozenVersionHistory) {
-                // check if child already exists
-                if (hasNode(child.getName())) {
-                    // do nothing
+                InternalFrozenVersionHistory f = (InternalFrozenVersionHistory) child;
+                VersionHistory history = (VersionHistory) session.getNodeByUUID(f.getVersionHistoryId());
+                String nodeId = history.getName(); // this is implementation detail!
+
+                // check if representing vh already exists somewhere
+                if (itemMgr.itemExists(new NodeId(nodeId))) {
+                    NodeImpl n = (NodeImpl) session.getNodeByUUID(nodeId);
+                    if (hasNode(n.getQName())) {
+                        // so order at end
+                        orderBefore(n.getName(), "");
+                    } else {
+                        session.move(n.getPath(), getPath()+ "/" + n.getName());
+                    }
                 } else {
                     // get desired version from version selector
-                    VersionHistory history = (VersionHistory) session.getNodeByUUID(((InternalFrozenVersionHistory) child).getVersionHistoryId());
                     InternalVersion v = ((VersionImpl) vsel.select(history)).getInternalVersion();
                     NodeImpl node = addNode(child.getName(), v.getFrozenNode());
-                    node.internalRestore(v, vsel);
+                    node.internalRestore(v, vsel, removeExisting);
                 }
             }
         }

Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/RepositoryImpl.java
Url: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/RepositoryImpl.java?view=diff&rev=125924&p1=incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/RepositoryImpl.java&r1=125923&p2=incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/RepositoryImpl.java&r2=125924
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/RepositoryImpl.java	(original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/RepositoryImpl.java	Fri Jan 21 03:55:02 2005
@@ -28,6 +28,7 @@
 import org.apache.jackrabbit.core.nodetype.NodeTypeRegistry;
 import org.apache.jackrabbit.core.observation.ObservationManagerFactory;
 import org.apache.jackrabbit.core.state.*;
+import org.apache.jackrabbit.core.state.xml.XMLPersistenceManager;
 import org.apache.jackrabbit.core.state.tx.TransactionManager;
 import org.apache.jackrabbit.core.state.tx.XASessionImpl;
 import org.apache.jackrabbit.core.util.uuid.UUID;
@@ -152,6 +153,7 @@
         }
         versionStore = new BasedFileSystem(repStore, fsRootPath);
 
+
         FileSystemResource uuidFile = new FileSystemResource(metaDataStore, "rootUUID");
         try {
             if (uuidFile.exists()) {
@@ -278,9 +280,14 @@
         }
 
         // init version manager
-        // todo: as soon as dynamic workspaces are available, base on system ws
-        SessionImpl verSession = getSystemSession(repConfig.getDefaultWorkspaceName());
-        pvMgr = new NativePVM(verSession);
+        // todo: improve configurability
+        XMLPersistenceManager pm = new XMLPersistenceManager();
+        try {
+            pm.init(versionStore, repConfig.getHomeDir()+"/versions");
+        } catch (Exception e) {
+            throw new RepositoryException(e);
+        }
+        pvMgr = new NativePVM(pm, getNodeTypeRegistry());
         vMgr = new VersionManagerImpl(pvMgr);
 
         // finally register shutdown hook

Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/PersistentNodeState.java
Url: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/PersistentNodeState.java?view=diff&rev=125924&p1=incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/PersistentNodeState.java&r1=125923&p2=incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/PersistentNodeState.java&r2=125924
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/PersistentNodeState.java	(original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/PersistentNodeState.java	Fri Jan 21 03:55:02 2005
@@ -113,7 +113,7 @@
      *
      * @return persistence manager
      */
-    protected PersistenceManager getPersistenceManager() {
+    public PersistenceManager getPersistenceManager() {
         return persistMgr;
     }
 

Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/xml/XMLPersistenceManager.java
Url: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/xml/XMLPersistenceManager.java?view=diff&rev=125924&p1=incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/xml/XMLPersistenceManager.java&r1=125923&p2=incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/xml/XMLPersistenceManager.java&r2=125924
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/xml/XMLPersistenceManager.java	(original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/xml/XMLPersistenceManager.java	Fri Jan 21 03:55:02 2005
@@ -342,11 +342,18 @@
      * @see PersistenceManager#init
      */
     public void init(PMContext context) throws Exception {
+        init(context.getWorkspaceConfig().getFileSystem(),
+                context.getWorkspaceConfig().getHomeDir());
+    }
+
+    /**
+     * @see PersistenceManager#init
+     */
+    public void init(FileSystem wspFS, String homeDir) throws Exception {
         if (initialized) {
             throw new IllegalStateException("already initialized");
         }
 
-        FileSystem wspFS = context.getWorkspaceConfig().getFileSystem();
         itemStateStore = new BasedFileSystem(wspFS, "/data");
 
         //blobStore = new BasedFileSystem(wspFS, "/blobs");
@@ -356,7 +363,7 @@
          * todo make blob store configurable
          */
         LocalFileSystem blobFS = new LocalFileSystem();
-        blobFS.setPath(context.getWorkspaceConfig().getHomeDir() + "/blobs");
+        blobFS.setPath(homeDir + "/blobs");
         blobFS.init();
         blobStore = blobFS;
 

Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/VersionItemStateProvider.java
Url: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/VersionItemStateProvider.java?view=diff&rev=125924&p1=incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/VersionItemStateProvider.java&r1=125923&p2=incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/VersionItemStateProvider.java&r2=125924
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/VersionItemStateProvider.java	(original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/VersionItemStateProvider.java	Fri Jan 21 03:55:02 2005
@@ -186,6 +186,7 @@
                     state = new VersionNodeState(this, v, vi.getParent().getId());
                     state.setDefinitionId(NDEF_VERSION);
                     state.setPropertyValue(VersionManager.PROPNAME_CREATED, InternalValue.create(v.getCreated()));
+                    // todo: do not read frozen stuff from frozen node instance here, rather put to version
                     state.setPropertyValue(VersionManager.PROPNAME_FROZEN_UUID, InternalValue.create(v.getFrozenNode().getFrozenUUID()));
                     state.setPropertyValue(VersionManager.PROPNAME_FROZEN_PRIMARY_TYPE, InternalValue.create(v.getFrozenNode().getFrozenPrimaryType()));
                     state.setPropertyValues(VersionManager.PROPNAME_FROZEN_MIXIN_TYPES, PropertyType.NAME, InternalValue.create(v.getFrozenNode().getFrozenMixinTypes()));

Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/persistence/InternalFrozenNodeImpl.java
Url: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/persistence/InternalFrozenNodeImpl.java?view=diff&rev=125924&p1=incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/persistence/InternalFrozenNodeImpl.java&r1=125923&p2=incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/persistence/InternalFrozenNodeImpl.java&r2=125924
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/persistence/InternalFrozenNodeImpl.java	(original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/persistence/InternalFrozenNodeImpl.java	Fri Jan 21 03:55:02 2005
@@ -267,7 +267,7 @@
                 switch (opv) {
                     case OnParentVersionAction.ABORT:
                         parent.reload();
-                        throw new RepositoryException("Checkin aborted due to OPV in " + prop.safeGetJCRPath());
+                        throw new VersionException("Checkin aborted due to OPV in " + prop.safeGetJCRPath());
                     case OnParentVersionAction.COMPUTE:
                     case OnParentVersionAction.IGNORE:
                     case OnParentVersionAction.INITIALIZE:
@@ -287,7 +287,7 @@
                 int opv = forceCopy ? OnParentVersionAction.COPY : child.getDefinition().getOnParentVersion();
                 switch (opv) {
                     case OnParentVersionAction.ABORT:
-                        throw new RepositoryException("Checkin aborted due to OPV in " + child.safeGetJCRPath());
+                        throw new VersionException("Checkin aborted due to OPV in " + child.safeGetJCRPath());
                     case OnParentVersionAction.COMPUTE:
                     case OnParentVersionAction.IGNORE:
                     case OnParentVersionAction.INITIALIZE:

Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/persistence/NativePVM.java
Url: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/persistence/NativePVM.java?view=diff&rev=125924&p1=incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/persistence/NativePVM.java&r1=125923&p2=incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/persistence/NativePVM.java&r2=125924
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/persistence/NativePVM.java	(original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/persistence/NativePVM.java	Fri Jan 21 03:55:02 2005
@@ -20,13 +20,8 @@
 import org.apache.jackrabbit.core.version.*;
 import org.apache.jackrabbit.core.*;
 import org.apache.jackrabbit.core.util.uuid.UUID;
-import org.apache.jackrabbit.core.nodetype.NodeTypeManagerImpl;
 import org.apache.jackrabbit.core.nodetype.NodeTypeRegistry;
-import org.apache.jackrabbit.core.nodetype.NodeDefId;
-import org.apache.jackrabbit.core.state.PersistentItemStateProvider;
-import org.apache.jackrabbit.core.state.PersistentNodeState;
-import org.apache.jackrabbit.core.state.ItemStateException;
-import org.apache.jackrabbit.core.state.NodeState;
+import org.apache.jackrabbit.core.state.*;
 import org.apache.commons.collections.ReferenceMap;
 
 import javax.jcr.RepositoryException;
@@ -126,11 +121,6 @@
     private PersistentItemStateProvider stateMgr;
 
     /**
-     * the nodetype manager for the version storage
-     */
-    private NodeTypeManagerImpl ntMgr;
-
-    /**
      * mapping from virtual uuids to persistent ids of the persistent nodes
      * key=externalId, value=PersistentId
      */
@@ -155,36 +145,15 @@
     /**
      * Creates a new PersistentVersionManager.
      *
-     * @param session
+     * @param pMgr
+     * @param ntReg
      * @throws javax.jcr.RepositoryException
      */
-    public NativePVM(SessionImpl session) throws RepositoryException {
-        this.stateMgr = ((WorkspaceImpl) session.getWorkspace()).getPersistentStateManager();
-        this.ntMgr = session.getNodeTypeManager();
-
+    public NativePVM(PersistenceManager pMgr, NodeTypeRegistry ntReg) throws RepositoryException {
         try {
-            NodeImpl systemRoot = ((RepositoryImpl) session.getRepository()).getSystemRootNode(session);
-            // enable this to make the persistence storage visible
-            if (true) {
-                // check for versionhistory root
-                if (!systemRoot.hasNode(VERSION_HISTORY_ROOT_NAME)) {
-                    // if not exist, create
-                    systemRoot.addNode(VERSION_HISTORY_ROOT_NAME, NodeTypeRegistry.NT_UNSTRUCTURED);
-                    systemRoot.save();
-                }
-                PersistentNodeState nodeState = (PersistentNodeState) stateMgr.getItemState(new NodeId(systemRoot.getNode(VERSION_HISTORY_ROOT_NAME).internalGetUUID()));
-                historyRoot = new PersistentNode(stateMgr, ntMgr, nodeState);
-            } else {
-                if (!stateMgr.hasItemState(PERSISTENT_ROOT_ID)) {
-                    PersistentNodeState nodeState = stateMgr.createNodeState(PERSISTENT_ROOT_ID.getUUID(), NodeTypeRegistry.NT_UNSTRUCTURED, null);
-                    nodeState.setDefinitionId(new NodeDefId(ntMgr.getRootNodeDefinition().unwrap()));
-                    nodeState.store();
-                    historyRoot = new PersistentNode(stateMgr, ntMgr, nodeState);
-                } else {
-                    PersistentNodeState nodeState = (PersistentNodeState) stateMgr.getItemState(PERSISTENT_ROOT_ID);
-                    historyRoot = new PersistentNode(stateMgr, ntMgr, nodeState);
-                }
-            }
+            this.stateMgr = new PersistentItemStateManager(pMgr, PERSISTENT_ROOT_ID.getUUID(), ntReg);
+            PersistentNodeState nodeState = (PersistentNodeState) stateMgr.getItemState(PERSISTENT_ROOT_ID);
+            historyRoot = new PersistentNode(stateMgr, nodeState);
             initVirtualIds(historyRoot.getState());
             log.info("loaded " + idsByExternal.size() + " virtual ids.");
         } catch (ItemStateException e) {

Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/persistence/PersistentNode.java
Url: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/persistence/PersistentNode.java?view=diff&rev=125924&p1=incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/persistence/PersistentNode.java&r1=125923&p2=incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/persistence/PersistentNode.java&r2=125924
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/persistence/PersistentNode.java	(original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/version/persistence/PersistentNode.java	Fri Jan 21 03:55:02 2005
@@ -25,8 +25,6 @@
 import javax.jcr.RepositoryException;
 import javax.jcr.nodetype.ConstraintViolationException;
 import javax.jcr.nodetype.NoSuchNodeTypeException;
-import javax.jcr.nodetype.NodeDef;
-import javax.jcr.nodetype.PropertyDef;
 import java.util.HashSet;
 import java.util.List;
 
@@ -47,11 +45,6 @@
     private final PersistentItemStateProvider stateMgr;
 
     /**
-     * the node type manager
-     */
-    private final NodeTypeManagerImpl ntMgr;
-
-    /**
      * the cached name
      */
     private QName name = null;
@@ -60,15 +53,12 @@
      * Creates a new persistent node
      *
      * @param statemgr
-     * @param ntMgr
      * @param nodeState
      */
     protected PersistentNode(PersistentItemStateProvider statemgr,
-                             NodeTypeManagerImpl ntMgr,
                              PersistentNodeState nodeState) {
         this.nodeState = nodeState;
         this.stateMgr = statemgr;
-        this.ntMgr = ntMgr;
     }
 
 
@@ -236,12 +226,10 @@
             }
         } else {
             try {
-                PropertyDefImpl def = getApplicablePropertyDef(name, type, multiValued);
                 PersistentPropertyState propState = stateMgr.createPropertyState(nodeState.getUUID(), name);
                 propState.setType(type);
                 propState.setMultiValued(multiValued);
-                propState.setDefinitionId(new PropDefId(def.unwrap()));
-
+                propState.setDefinitionId(PropDefId.valueOf("0"));
                 // need to store nodestate
                 nodeState.addPropertyEntry(name);
                 if (nodeState.getStatus()==ItemState.STATUS_EXISTING) {
@@ -255,58 +243,6 @@
     }
 
     /**
-     * retrieves the property definition for the given contraints
-     *
-     * @param propertyName
-     * @param type
-     * @param multiValued
-     * @return
-     * @throws RepositoryException
-     */
-    protected PropertyDefImpl getApplicablePropertyDef(QName propertyName,
-                                                       int type, boolean multiValued)
-            throws RepositoryException {
-        PropDef pd = getEffectiveNodeType().getApplicablePropertyDef(propertyName, type, multiValued);
-        return ntMgr.getPropDef(new PropDefId(pd));
-    }
-
-    /**
-     * Retrieves the node definition for the given contraints.
-     *
-     * @param nodeName
-     * @param nodeTypeName
-     * @return
-     * @throws RepositoryException
-     */
-    protected NodeDefImpl getApplicableChildNodeDef(QName nodeName, QName nodeTypeName)
-            throws RepositoryException {
-        ChildNodeDef cnd = getEffectiveNodeType().getApplicableChildNodeDef(nodeName, nodeTypeName);
-        return ntMgr.getNodeDef(new NodeDefId(cnd));
-    }
-
-    /**
-     * Returns the effective (i.e. merged and resolved) node type representation
-     * of this node's primary and mixin node types.
-     *
-     * @return the effective node type
-     * @throws RepositoryException
-     */
-    protected EffectiveNodeType getEffectiveNodeType() throws RepositoryException {
-        // build effective node type of mixins & primary type
-        NodeTypeRegistry ntReg = ntMgr.getNodeTypeRegistry();
-        // existing mixin's
-        HashSet set = new HashSet(nodeState.getMixinTypeNames());
-        // primary type
-        set.add(nodeState.getNodeTypeName());
-        try {
-            return ntReg.getEffectiveNodeType((QName[]) set.toArray(new QName[set.size()]));
-        } catch (NodeTypeConflictException ntce) {
-            String msg = "internal error: failed to build effective node type for node " + nodeState.getUUID();
-            throw new RepositoryException(msg, ntce);
-        }
-    }
-
-    /**
      * checks if the given child node exists.
      *
      * @param name
@@ -362,7 +298,7 @@
         }
         try {
             PersistentNodeState state = (PersistentNodeState) stateMgr.getItemState(new NodeId(entry.getUUID()));
-            return new PersistentNode(stateMgr, ntMgr, state);
+            return new PersistentNode(stateMgr, state);
         } catch (ItemStateException e) {
             throw new RepositoryException("Unable to getNode: " + e.toString());
         }
@@ -378,7 +314,7 @@
     protected PersistentNode getNodeByUUID(String uuid) throws RepositoryException {
         try {
             PersistentNodeState state = (PersistentNodeState) stateMgr.getItemState(new NodeId(uuid));
-            return new PersistentNode(stateMgr, ntMgr, state);
+            return new PersistentNode(stateMgr, state);
         } catch (ItemStateException e) {
             throw new RepositoryException("Unable to getNode: " + e.toString());
         }
@@ -396,37 +332,18 @@
      */
     protected PersistentNode addNode(QName nodeName, QName nodeTypeName)
             throws NoSuchNodeTypeException, ConstraintViolationException, RepositoryException {
-        NodeTypeImpl nodeType = ntMgr.getNodeType(nodeTypeName);
-        NodeDefImpl def;
-        try {
-            def = getApplicableChildNodeDef(name, nodeType == null ? null : nodeType.getQName());
-        } catch (RepositoryException re) {
-            // hack, use nt:unstructured as parent
-            NodeTypeRegistry ntReg = ntMgr.getNodeTypeRegistry();
-            EffectiveNodeType ent = ntReg.getEffectiveNodeType(NodeTypeRegistry.NT_UNSTRUCTURED);
-            ChildNodeDef cnd = ent.getApplicableChildNodeDef(name, nodeTypeName);
-            def = ntMgr.getNodeDef(new NodeDefId(cnd));
-        }
-
-        if (nodeType == null) {
-            // use default node type
-            nodeType = (NodeTypeImpl) def.getDefaultPrimaryType();
-        }
-        return createChildNode(nodeName, def, nodeType, null);
+        return createChildNode(nodeName, nodeTypeName, null);
     }
 
     /**
      * creates a new child node
      *
      * @param name
-     * @param def
-     * @param nodeType
      * @param uuid
      * @return
      * @throws RepositoryException
      */
-    private PersistentNode createChildNode(QName name, NodeDefImpl def,
-                                           NodeTypeImpl nodeType, String uuid)
+    private PersistentNode createChildNode(QName name, QName nodeTypeName, String uuid)
             throws RepositoryException {
 
         String parentUUID = nodeState.getUUID();
@@ -436,37 +353,20 @@
             if (uuid == null) {
                 uuid = UUID.randomUUID().toString();	// version 4 uuid
             }
-            state = stateMgr.createNodeState(uuid, nodeType.getQName(), parentUUID);
-            state.setDefinitionId(new NodeDefId(def.unwrap()));
+            state = stateMgr.createNodeState(uuid, nodeTypeName, parentUUID);
+            state.setDefinitionId(NodeDefId.valueOf("0"));
         } catch (ItemStateException ise) {
             String msg = "failed to add child node " + name + " to " + parentUUID;
             throw new RepositoryException(msg, ise);
         }
 
         // create Node instance wrapping new node state
-        PersistentNode node = new PersistentNode(stateMgr, ntMgr, state);
+        PersistentNode node = new PersistentNode(stateMgr, state);
         // add new child node entry
         nodeState.addChildNodeEntry(name, state.getUUID());
         if (nodeState.getStatus()==ItemState.STATUS_EXISTING) {
             nodeState.setStatus(ItemState.STATUS_EXISTING_MODIFIED);
         }
-
-        // add 'auto-create' properties defined in node type
-        PropertyDef[] pda = nodeType.getAutoCreatePropertyDefs();
-        for (int i = 0; i < pda.length; i++) {
-            PropertyDefImpl pd = (PropertyDefImpl) pda[i];
-            node.getOrCreatePropertyState(pd.getQName(), pd.getRequiredType(), pd.isMultiple());
-        }
-
-        // recursively add 'auto-create' child nodes defined in node type
-        NodeDef[] nda = nodeType.getAutoCreateNodeDefs();
-        for (int i = 0; i < nda.length; i++) {
-            NodeDefImpl nd = (NodeDefImpl) nda[i];
-            node.createChildNode(nd.getQName(), nd, (NodeTypeImpl) nd.getDefaultPrimaryType(), null);
-        }
-
-        // store primary type
-        node.setPropertyValue(ItemImpl.PROPNAME_PRIMARYTYPE, InternalValue.create(nodeType.getQName()));
         return node;
     }
 
@@ -483,7 +383,7 @@
             for (int i = 0; i < entries.size(); i++) {
                 NodeState.ChildNodeEntry entry = (NodeState.ChildNodeEntry) entries.get(i);
                 PersistentNodeState state = (PersistentNodeState) stateMgr.getItemState(new NodeId(entry.getUUID()));
-                children[i] = new PersistentNode(stateMgr, ntMgr, state);
+                children[i] = new PersistentNode(stateMgr, state);
             }
             return children;
         } catch (ItemStateException e) {
@@ -586,8 +486,7 @@
     protected void copyFrom(PropertyImpl prop) throws RepositoryException {
         if (prop.getDefinition().isMultiple()) {
             InternalValue[] values = prop.internalGetValues();
-            int type = values.length>0 ? values[0].getType() : prop.getDefinition().getRequiredType();
-            setPropertyValues(prop.getQName(), type, values);
+            setPropertyValues(prop.getQName(), values[0].getType(), values);
         } else {
             setPropertyValue(prop.getQName(), prop.internalGetValue());
         }