Return-Path: Delivered-To: apmail-incubator-jackrabbit-commits-archive@www.apache.org Received: (qmail 31793 invoked from network); 12 Oct 2005 12:44:31 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (209.237.227.199) by minotaur.apache.org with SMTP; 12 Oct 2005 12:44:31 -0000 Received: (qmail 9999 invoked by uid 500); 12 Oct 2005 12:44:31 -0000 Mailing-List: contact jackrabbit-commits-help@incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: jackrabbit-dev@incubator.apache.org Delivered-To: mailing list jackrabbit-commits@incubator.apache.org Received: (qmail 9988 invoked by uid 500); 12 Oct 2005 12:44:31 -0000 Delivered-To: apmail-incubator-jackrabbit-cvs@incubator.apache.org Received: (qmail 9985 invoked by uid 99); 12 Oct 2005 12:44:30 -0000 X-ASF-Spam-Status: No, hits=-9.4 required=10.0 tests=ALL_TRUSTED,NO_REAL_NAME X-Spam-Check-By: apache.org Received: from [209.237.227.194] (HELO minotaur.apache.org) (209.237.227.194) by apache.org (qpsmtpd/0.29) with SMTP; Wed, 12 Oct 2005 05:44:30 -0700 Received: (qmail 31696 invoked by uid 65534); 12 Oct 2005 12:44:10 -0000 Message-ID: <20051012124410.31695.qmail@minotaur.apache.org> Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r314862 - /incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/BatchedItemOperations.java Date: Wed, 12 Oct 2005 12:44:10 -0000 To: jackrabbit-cvs@incubator.apache.org From: stefan@apache.org X-Mailer: svnmailer-1.0.5 X-Virus-Checked: Checked by ClamAV on apache.org X-Spam-Rating: minotaur.apache.org 1.6.2 0/1000/N Author: stefan Date: Wed Oct 12 05:44:07 2005 New Revision: 314862 URL: http://svn.apache.org/viewcvs?rev=314862&view=rev Log: JCR-238 workspace.copy causes 2 nodes in the same workspace to have the same version history Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/BatchedItemOperations.java Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/BatchedItemOperations.java URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/BatchedItemOperations.java?rev=314862&r1=314861&r2=314862&view=diff ============================================================================== --- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/BatchedItemOperations.java (original) +++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/BatchedItemOperations.java Wed Oct 12 05:44:07 2005 @@ -1,6 +1,6 @@ /* * Copyright 2004-2005 The Apache Software Foundation or its licensors, - * as applicable. + * as applicable. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -34,6 +34,7 @@ import org.apache.jackrabbit.core.state.UpdatableItemStateManager; import org.apache.jackrabbit.core.util.ReferenceChangeTracker; import org.apache.jackrabbit.core.value.InternalValue; +import org.apache.jackrabbit.core.version.VersionManager; import org.apache.jackrabbit.name.MalformedPathException; import org.apache.jackrabbit.name.NamespaceResolver; import org.apache.jackrabbit.name.Path; @@ -51,6 +52,7 @@ import javax.jcr.lock.LockException; import javax.jcr.nodetype.ConstraintViolationException; import javax.jcr.version.VersionException; +import javax.jcr.version.VersionHistory; import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; @@ -1592,6 +1594,7 @@ NodeId id; EffectiveNodeType ent = getEffectiveNodeType(srcState); boolean referenceable = ent.includesNodeType(QName.MIX_REFERENCEABLE); + boolean versionable = ent.includesNodeType(QName.MIX_VERSIONABLE); switch (flag) { case COPY: // always create new uuid @@ -1715,6 +1718,37 @@ PropertyState newChildState = copyPropertyState(srcChildState, uuid, propName); + + if (versionable && flag == COPY) { + /** + * a versionable node is being copied: + * copied properties declared by mix:versionable need to be + * adjusted accordingly. + */ + // jcr:versionHistory + if (!propName.equals(QName.JCR_VERSIONHISTORY)) { + VersionHistory vh = getOrCreateVersionHistory(newState); + newChildState.setValues(new InternalValue[]{InternalValue.create(new UUID(vh.getUUID()))}); + } + + // jcr:baseVersion + if (!propName.equals(QName.JCR_BASEVERSION)) { + VersionHistory vh = getOrCreateVersionHistory(newState); + newChildState.setValues(new InternalValue[]{InternalValue.create(new UUID(vh.getRootVersion().getUUID()))}); + } + + // jcr:predecessors + if (!propName.equals(QName.JCR_PREDECESSORS)) { + VersionHistory vh = getOrCreateVersionHistory(newState); + newChildState.setValues(new InternalValue[]{InternalValue.create(new UUID(vh.getRootVersion().getUUID()))}); + } + + // jcr:isCheckedOut + if (!propName.equals(QName.JCR_ISCHECKEDOUT)) { + newChildState.setValues(new InternalValue[]{InternalValue.create(true)}); + } + } + if (newChildState.getType() == PropertyType.REFERENCE) { refTracker.processedReference(newChildState); } @@ -1775,5 +1809,24 @@ } } return newState; + } + + /** + * Returns the version history of the given node state. A new + * version history will be created if doesn't exist yet. + * + * @param node node state + * @return the version history of the target node state + * @throws RepositoryException if an error occurs + */ + private VersionHistory getOrCreateVersionHistory(NodeState node) + throws RepositoryException { + VersionManager vMgr = session.getVersionManager(); + VersionHistory vh = vMgr.getVersionHistory(session, node); + if (vh == null) { + // create a new version history + vh = vMgr.createVersionHistory(session, node); + } + return vh; } }