diff --git a/amps/ags/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/version/RecordableVersionServiceImpl.java b/amps/ags/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/version/RecordableVersionServiceImpl.java index a22c06cd4d..75994cab18 100644 --- a/amps/ags/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/version/RecordableVersionServiceImpl.java +++ b/amps/ags/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/version/RecordableVersionServiceImpl.java @@ -434,6 +434,7 @@ public class RecordableVersionServiceImpl extends Version2ServiceImpl QName.createQName(Version2Model.NAMESPACE_URI, Version2Model.CHILD_VERSIONS + "-" + versionNumber), sourceTypeRef, null); + nodeService.setChildAssociationIndex(childAssocRef, getAllVersions(versionHistoryRef).size()); versionNodeRef = childAssocRef.getChildRef(); // add aspect with the standard version properties to the 'version' node @@ -808,6 +809,7 @@ public class RecordableVersionServiceImpl extends Version2ServiceImpl QName.createQName(Version2Model.NAMESPACE_URI, Version2Model.CHILD_VERSIONS + "-" + versionNumber), sourceTypeRef, null); + nodeService.setChildAssociationIndex(childAssocRef, getAllVersions(versionHistoryRef).size()); NodeRef versionNodeRef = childAssocRef.getChildRef(); // add aspect with the standard version properties to the 'version' node diff --git a/repository/src/main/java/org/alfresco/repo/version/Version2ServiceImpl.java b/repository/src/main/java/org/alfresco/repo/version/Version2ServiceImpl.java index 7bce9cbc61..5bbf5b7b64 100644 --- a/repository/src/main/java/org/alfresco/repo/version/Version2ServiceImpl.java +++ b/repository/src/main/java/org/alfresco/repo/version/Version2ServiceImpl.java @@ -508,6 +508,7 @@ public class Version2ServiceImpl extends VersionServiceImpl implements VersionSe nodeDetails.getProperties()); versionNodeRef = childAssocRef.getChildRef(); + nodeService.setChildAssociationIndex(childAssocRef, getAllVersions(versionHistoryRef).size()); // NOTE: special ML case - see also MultilingualContentServiceImpl.makeMLContainer if (sourceTypeRef.equals(ContentModel.TYPE_MULTILINGUAL_CONTAINER)) diff --git a/repository/src/test/java/org/alfresco/repo/version/VersionServiceImplTest.java b/repository/src/test/java/org/alfresco/repo/version/VersionServiceImplTest.java index 69b1e368be..a5e73074ba 100644 --- a/repository/src/test/java/org/alfresco/repo/version/VersionServiceImplTest.java +++ b/repository/src/test/java/org/alfresco/repo/version/VersionServiceImplTest.java @@ -39,7 +39,6 @@ import java.util.Properties; import java.util.Set; import javax.transaction.UserTransaction; -import junit.framework.AssertionFailedError; import org.alfresco.model.ApplicationModel; import org.alfresco.model.ContentModel; @@ -94,6 +93,8 @@ import org.springframework.test.annotation.Commit; import org.springframework.test.context.transaction.TestTransaction; import org.springframework.transaction.annotation.Transactional; +import junit.framework.AssertionFailedError; + /** * versionService test class. * @@ -575,6 +576,46 @@ public class VersionServiceImplTest extends BaseVersionStoreTest } } + /** + * When IDs are out of order the comparator only fixes the order we retrieve versions. Any operation fails due to + * the head version not being the latest. (MNT-22715) + */ + @Test + public void testVersionIndex() + { + NodeRef versionableNode = nodeService.createNode(rootNodeRef, ContentModel.ASSOC_CHILDREN, + QName.createQName("{test}MyVersionableNodeTestIndex"), ContentModel.TYPE_CONTENT, null).getChildRef(); + nodeService.addAspect(versionableNode, ContentModel.ASPECT_VERSIONABLE, new HashMap()); + Version version1 = createVersion(versionableNode); + Version version2 = createVersion(versionableNode); + Version version3 = createVersion(versionableNode); + + VersionHistory vh = versionService.getVersionHistory(versionableNode); + assertEquals("Version History does not contain 3 versions", 3, vh.getAllVersions().size()); + + NodeRef root = nodeService.getPrimaryParent(vh.getRootVersion().getFrozenStateNodeRef()).getParentRef(); + NodeRef versionHistoryNode = dbNodeService.getChildByName(root, Version2Model.CHILD_QNAME_VERSION_HISTORIES, + versionableNode.getId()); + + // getChildAssocs orders by assoc_index first and then by ID. Version History relies on this. + List vhChildAssocs = nodeService.getChildAssocs(versionHistoryNode); + int index = 0; + for (ChildAssociationRef vhChildAssoc : vhChildAssocs) + { + // Unset indexes are -1 + assertFalse("Index is not set", vhChildAssoc.getNthSibling() < 0); + assertTrue("Index is not increasing as expected", vhChildAssoc.getNthSibling() > index); + index = vhChildAssoc.getNthSibling(); + } + + assertEquals("1st version is not 1st assoc", version1.getFrozenStateNodeRef().getId(), + vhChildAssocs.get(0).getChildRef().getId()); + assertEquals("2nd version is not 2nd assoc", version2.getFrozenStateNodeRef().getId(), + vhChildAssocs.get(1).getChildRef().getId()); + assertEquals("3rd version is not 3rd assoc", version3.getFrozenStateNodeRef().getId(), + vhChildAssocs.get(2).getChildRef().getId()); + } + /** * Sets the versionService to be one that has is db ids out of order * so would normally have versions displayed in the wrong order.