Merged 5.0.N (5.0.4) to 5.1.N (5.1.1)

120075 rmunteanu: Merged V4.2-BUG-FIX (4.2.6) to 5.0.N (5.0.4)
      120039 amukha: Merged V4.2-BUG-FIX-MNT-14688 (4.2.6) to V4.2-BUG-FIX (4.2.6)
         120019 amukha: MNT-14688: version revert on first version failure if type has aspect
            - Restoring a version now restores the node's type.
            - Added JUnit test.


git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/BRANCHES/DEV/5.1.N/root@120108 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Natalia Smintanca
2015-12-14 12:16:35 +00:00
parent 4dbb27041f
commit 03deaa808f
4 changed files with 107 additions and 16 deletions

View File

@@ -1056,16 +1056,24 @@ public class Version2ServiceImpl extends VersionServiceImpl implements VersionSe
Map<QName, Serializable> newProps = this.nodeService.getProperties(versionNodeRef);
VersionUtil.convertFrozenToOriginalProps(newProps);
Set<QName> 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<QName> propsToLeaveAlone = new ArrayList<QName>();
Collection<QName> assocsToLeaveAlone = new ArrayList<QName>();
// 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)
{
@@ -1077,6 +1085,7 @@ public class Version2ServiceImpl extends VersionServiceImpl implements VersionSe
}
}
}
}
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<QName> aspectsToRemove = new HashSet<QName>(oldAspectQNames);
aspectsToRemove.removeAll(newAspectQNames);

View File

@@ -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");

View File

@@ -1005,6 +1005,59 @@ public class VersionServiceImplTest extends BaseVersionStoreTest
}
}
/**
* Test reverting from Share with changing type
* see MNT-14688
* <li>
* <ul>1) Create a node and a version (simulates upload a doc to Share)</ul>
* <ul>2) Change the node's type to a custom with mandatory aspect</ul>
* <ul>3) Create a new version via upload</ul>
* <ul>4) Try to revert to original document and see if the type is reverted, too</ul>
* </li>
*/
@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
*/

View File

@@ -126,6 +126,17 @@
</associations>
</type>
<type name="test:contentWithMandatoryAspect">
<title>Custom content type</title>
<description>Custom content type basic parent content</description>
<parent>cm:content</parent>
<properties />
<associations />
<mandatory-aspects>
<aspect>test:mandatoryAspect</aspect>
</mandatory-aspects>
</type>
</types>
<aspects>
@@ -149,6 +160,19 @@
</properties>
</aspect>
<aspect name="test:mandatoryAspect">
<title>Custom Aspect</title>
<description>Just basic text aspect</description>
<properties>
<property name="test:mandatoryAspectText">
<title>aspect text</title>
<description>Text for aspect content</description>
<type>d:text</type>
</property>
</properties>
</aspect>
</aspects>
</model>