From 568086c76cd75a7f62bd8f4ebfbb6eed1e0c15f7 Mon Sep 17 00:00:00 2001 From: Dave Ward Date: Tue, 12 Oct 2010 17:07:14 +0000 Subject: [PATCH] Merged V3.3-BUG-FIX to HEAD 23054: Merged BRANCHES/DEV/BELARUS/V3.3-BUG-FIX-2010_10_04 to BRANCHES/DEV/V3.3-BUG-FIX: 23044: ALF-5112 : Bug fix for ALF-3962 is incomplete (can cause fix-up of version history to be incorrectly ordered - in case where versions have the same frozen modified date) - merged with some updates, eg. force unit test to exercise the fix 23058: ALF-4379: Don't mix up email recipients for different actions git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@23059 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../repo/version/Version2ServiceImpl.java | 17 ++++++- .../repo/version/VersionServiceImplTest.java | 44 ++++++++++++++++--- 2 files changed, 55 insertions(+), 6 deletions(-) diff --git a/source/java/org/alfresco/repo/version/Version2ServiceImpl.java b/source/java/org/alfresco/repo/version/Version2ServiceImpl.java index ba2b6333b6..c4c97a91e9 100644 --- a/source/java/org/alfresco/repo/version/Version2ServiceImpl.java +++ b/source/java/org/alfresco/repo/version/Version2ServiceImpl.java @@ -959,7 +959,22 @@ public class Version2ServiceImpl extends VersionServiceImpl implements VersionSe int result = v1.getFrozenModifiedDate().compareTo(v2.getFrozenModifiedDate()); if (result == 0) { - result = v1.getFrozenStateNodeRef().getId().compareTo(v2.getFrozenStateNodeRef().getId()); + Long dbid1 = (Long)nodeService.getProperty(v1.getFrozenStateNodeRef(), ContentModel.PROP_NODE_DBID); + Long dbid2 = (Long)nodeService.getProperty(v2.getFrozenStateNodeRef(), ContentModel.PROP_NODE_DBID); + + if (dbid1 != null && dbid2 != null) + { + result = dbid1.compareTo(dbid2); + } + else + { + result = 0; + + if (logger.isWarnEnabled()) + { + logger.warn("node-dbid property is missing for versions: " + v1.toString() + " or " + v2.toString()); + } + } } return result; } diff --git a/source/java/org/alfresco/repo/version/VersionServiceImplTest.java b/source/java/org/alfresco/repo/version/VersionServiceImplTest.java index 7654f5ac20..575a81a124 100644 --- a/source/java/org/alfresco/repo/version/VersionServiceImplTest.java +++ b/source/java/org/alfresco/repo/version/VersionServiceImplTest.java @@ -33,6 +33,7 @@ import org.alfresco.model.ContentModel; import org.alfresco.repo.security.authentication.AuthenticationComponent; import org.alfresco.repo.security.authentication.AuthenticationUtil; import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback; +import org.alfresco.repo.version.common.VersionUtil; import org.alfresco.service.ServiceRegistry; import org.alfresco.service.cmr.model.FileFolderService; import org.alfresco.service.cmr.model.FileInfo; @@ -1167,20 +1168,37 @@ public class VersionServiceImplTest extends BaseVersionStoreTest public void testALF_3962() { NodeRef versionableNode = createNode(true, QName.createQName("http://www.alfresco.org/model/action/1.0", "action")); - // crete some versions of content without version label policy + + // create some versions of content without version label policy createVersion(versionableNode); createVersion(versionableNode); createVersion(versionableNode); - + + // create some more versions and force them to have same frozen modified date + Version ver = createVersion(versionableNode); + Date frozenModifiedDate = ver.getFrozenModifiedDate(); + + ver = createVersion(versionableNode); + NodeRef versionNodeRef = VersionUtil.convertNodeRef(ver.getFrozenStateNodeRef()); + this.dbNodeService.setProperty(versionNodeRef, Version2Model.PROP_QNAME_FROZEN_MODIFIED, frozenModifiedDate); + + ver = createVersion(versionableNode); + versionNodeRef = VersionUtil.convertNodeRef(ver.getFrozenStateNodeRef()); + this.dbNodeService.setProperty(versionNodeRef, Version2Model.PROP_QNAME_FROZEN_MODIFIED, frozenModifiedDate); + // corrupt versions Collection versions = versionService.getVersionHistory(versionableNode).getAllVersions(); + + List oldVersions = new ArrayList(versions.size()); for (Version version : versions) { // update version with corrupted label - NodeRef versionNodeRef = new NodeRef(StoreRef.PROTOCOL_WORKSPACE, version.getFrozenStateNodeRef().getStoreRef().getIdentifier(), version.getFrozenStateNodeRef() - .getId()); + versionNodeRef = VersionUtil.convertNodeRef(version.getFrozenStateNodeRef()); this.dbNodeService.setProperty(versionNodeRef, Version2Model.PROP_QNAME_VERSION_LABEL, "0"); + + // cache results + oldVersions.add(version); } this.nodeService.setProperty(versionableNode, ContentModel.PROP_VERSION_LABEL, "0"); @@ -1188,17 +1206,33 @@ public class VersionServiceImplTest extends BaseVersionStoreTest versionService.createVersion(versionableNode, this.versionProperties); versions = versionService.getVersionHistory(versionableNode).getAllVersions(); + List newVersions = new ArrayList(versions.size()); for (Version version : versions) { assertFalse(version.getVersionLabel().equals("0")); + newVersions.add(version); } // check live node assertFalse(this.nodeService.getProperty(versionableNode, ContentModel.PROP_VERSION_LABEL).toString().equals("0")); + //check order + for (int i = 0; i < oldVersions.size(); i++) + { + Version oldVersion = oldVersions.get(i); + Version newVersion = newVersions.get(i + 1); + + assertEquals(oldVersion.getFrozenModifiedDate(), newVersion.getFrozenModifiedDate()); + + assertEquals(oldVersion.getVersionLabel(), newVersion.getVersionLabel()); + String nodeDbidKey = ContentModel.PROP_NODE_DBID.getLocalName(); + assertEquals(oldVersion.getVersionProperty(nodeDbidKey), newVersion.getVersionProperty(nodeDbidKey)); + String nodeUuidKey = ContentModel.PROP_NODE_UUID.getLocalName(); + assertEquals(oldVersion.getVersionProperty(nodeUuidKey), newVersion.getVersionProperty(nodeUuidKey)); + } } - + public static void main(String ... args) { try