diff --git a/source/java/org/alfresco/repo/version/Version2ServiceImpl.java b/source/java/org/alfresco/repo/version/Version2ServiceImpl.java index 46e1c707a2..e586532fcc 100644 --- a/source/java/org/alfresco/repo/version/Version2ServiceImpl.java +++ b/source/java/org/alfresco/repo/version/Version2ServiceImpl.java @@ -1056,27 +1056,36 @@ public class Version2ServiceImpl extends VersionServiceImpl implements VersionSe Map newProps = this.nodeService.getProperties(versionNodeRef); VersionUtil.convertFrozenToOriginalProps(newProps); Set newAspectQNames = this.nodeService.getAspects(versionNodeRef); - + QName newNodeTypeQName = nodeService.getType(versionNodeRef); + // RevertDetails - given to policy behaviours VersionRevertDetailsImpl revertDetails = new VersionRevertDetailsImpl(); revertDetails.setNodeRef(nodeRef); - revertDetails.setNodeType(oldNodeTypeQName); + revertDetails.setNodeType(newNodeTypeQName); // Do we want to maintain any existing property values? Collection propsToLeaveAlone = new ArrayList(); Collection assocsToLeaveAlone = new ArrayList(); - - TypeDefinition typeDef = dictionaryService.getType(oldNodeTypeQName); - if(typeDef != null) - { - for(QName assocName : typeDef.getAssociations().keySet()) - { - if(getRevertAssocAction(oldNodeTypeQName, assocName, revertDetails) == RevertAssocAction.IGNORE) - { - assocsToLeaveAlone.add(assocName); - } - } - } + + // The VersionRevertCallback was added in r50122 on HEAD-QA branch in ACE-1001 + // If it is required to preserve this callback when the type is changed, + // this part should be reimplemented. + // see MNT-14688 + if (newNodeTypeQName.equals(oldNodeTypeQName)) + { + // The node did not change the type, check the associations + TypeDefinition typeDef = dictionaryService.getType(oldNodeTypeQName); + if(typeDef != null) + { + for(QName assocName : typeDef.getAssociations().keySet()) + { + if(getRevertAssocAction(oldNodeTypeQName, assocName, revertDetails) == RevertAssocAction.IGNORE) + { + assocsToLeaveAlone.add(assocName); + } + } + } + } for (QName aspect : oldAspectQNames) { @@ -1110,6 +1119,9 @@ public class Version2ServiceImpl extends VersionServiceImpl implements VersionSe //Restore forum properties this.nodeService.addProperties(nodeRef, forumProps); + // Restore the type + this.nodeService.setType(nodeRef, newNodeTypeQName); + Set aspectsToRemove = new HashSet(oldAspectQNames); aspectsToRemove.removeAll(newAspectQNames); diff --git a/source/test-java/org/alfresco/repo/version/BaseVersionStoreTest.java b/source/test-java/org/alfresco/repo/version/BaseVersionStoreTest.java index 1532bc8266..1a330bf97e 100644 --- a/source/test-java/org/alfresco/repo/version/BaseVersionStoreTest.java +++ b/source/test-java/org/alfresco/repo/version/BaseVersionStoreTest.java @@ -96,6 +96,8 @@ public abstract class BaseVersionStoreTest extends BaseSpringTest */ protected static final String TEST_NAMESPACE = "http://www.alfresco.org/test/versionstorebasetest/1.0"; protected static final QName TEST_TYPE_QNAME = QName.createQName(TEST_NAMESPACE, "testtype"); + protected static final QName TEST_TYPE_WITH_MANDATORY_ASPECT_QNAME = QName.createQName(TEST_NAMESPACE, "contentWithMandatoryAspect"); + protected static final QName TEST_MANDATORY_ASPECT_QNAME = QName.createQName(TEST_NAMESPACE, "mandatoryAspect"); protected static final QName TEST_ASPECT_QNAME = QName.createQName(TEST_NAMESPACE, "testaspect"); protected static final QName PROP_1 = QName.createQName(TEST_NAMESPACE, "prop1"); protected static final QName PROP_2 = QName.createQName(TEST_NAMESPACE, "prop2"); diff --git a/source/test-java/org/alfresco/repo/version/VersionServiceImplTest.java b/source/test-java/org/alfresco/repo/version/VersionServiceImplTest.java index 91ebf92990..92b41259a2 100644 --- a/source/test-java/org/alfresco/repo/version/VersionServiceImplTest.java +++ b/source/test-java/org/alfresco/repo/version/VersionServiceImplTest.java @@ -1004,7 +1004,60 @@ public class VersionServiceImplTest extends BaseVersionStoreTest fail("Transaction failed: " + e); } } - + + /** + * Test reverting from Share with changing type + * see MNT-14688 + *
  • + *
      1) Create a node and a version (simulates upload a doc to Share)
    + *
      2) Change the node's type to a custom with mandatory aspect
    + *
      3) Create a new version via upload
    + *
      4) Try to revert to original document and see if the type is reverted, too
    + *
  • + */ + @SuppressWarnings("unused") + public void testScriptNodeRevertWithChangeType() + { + CheckOutCheckInService checkOutCheckInService = + (CheckOutCheckInService) applicationContext.getBean("checkOutCheckInService"); + + // Create a versionable node + NodeRef versionableNode = createNewVersionableNode(); + Version version1 = createVersion(versionableNode); + //Set new type + nodeService.setType(versionableNode, TEST_TYPE_WITH_MANDATORY_ASPECT_QNAME); + // Create a new version + NodeRef checkedOut = checkOutCheckInService.checkout(versionableNode); + ContentWriter contentWriter = this.contentService.getWriter(checkedOut, ContentModel.PROP_CONTENT, true); + assertNotNull(contentWriter); + contentWriter.putContent(UPDATED_CONTENT_1); + nodeService.setProperty(checkedOut, PROP_1, VALUE_1); + checkOutCheckInService.checkin(checkedOut, null, contentWriter.getContentUrl(), false); + Version version2 = createVersion(versionableNode); + + // Create a ScriptNode as used in Share + ServiceRegistry services = applicationContext.getBean(ServiceRegistry.class); + ScriptNode scriptNode = new ScriptNode(versionableNode, services); + assertEquals("0.2", nodeService.getProperty(scriptNode.getNodeRef(), ContentModel.PROP_VERSION_LABEL)); + assertEquals(TEST_TYPE_WITH_MANDATORY_ASPECT_QNAME, nodeService.getType(scriptNode.getNodeRef())); + + // Revert to version1 + ScriptNode newNode = scriptNode.revert("History", false, version1.getVersionLabel()); + assertEquals("0.3", nodeService.getProperty(newNode.getNodeRef(), ContentModel.PROP_VERSION_LABEL)); + assertEquals(TEST_TYPE_QNAME, nodeService.getType(newNode.getNodeRef())); + + // All done + setComplete(); + try + { + endTransaction(); + } + catch(Throwable e) + { + fail("Transaction failed: " + e); + } + } + /** * Test restore */ diff --git a/source/test-resources/org/alfresco/repo/version/VersionStoreBaseTest_model.xml b/source/test-resources/org/alfresco/repo/version/VersionStoreBaseTest_model.xml index a91fd872c8..589100ff7d 100644 --- a/source/test-resources/org/alfresco/repo/version/VersionStoreBaseTest_model.xml +++ b/source/test-resources/org/alfresco/repo/version/VersionStoreBaseTest_model.xml @@ -126,6 +126,17 @@ + + Custom content type + Custom content type basic parent content + cm:content + + + + test:mandatoryAspect + + + @@ -149,6 +160,19 @@ - + + + Custom Aspect + Just basic text aspect + + + aspect text + Text for aspect content + d:text + + + + +