APPS-391 [AGS/WORM] Wrong error message received when updating the content store property for a locked record

This commit is contained in:
estan
2020-11-09 18:47:00 +02:00
parent a58c5ded15
commit 31cd8cc8b1
2 changed files with 63 additions and 64 deletions

View File

@@ -34,7 +34,6 @@ import org.alfresco.module.org_alfresco_module_rm.model.behaviour.AbstractDispos
import org.alfresco.module.org_alfresco_module_rm.record.RecordService; import org.alfresco.module.org_alfresco_module_rm.record.RecordService;
import org.alfresco.module.org_alfresco_module_rm.security.ExtendedSecurityService; import org.alfresco.module.org_alfresco_module_rm.security.ExtendedSecurityService;
import org.alfresco.module.org_alfresco_module_rm.util.ContentBinDuplicationUtility; import org.alfresco.module.org_alfresco_module_rm.util.ContentBinDuplicationUtility;
import org.alfresco.repo.content.ContentServicePolicies;
import org.alfresco.repo.copy.CopyBehaviourCallback; import org.alfresco.repo.copy.CopyBehaviourCallback;
import org.alfresco.repo.copy.CopyDetails; import org.alfresco.repo.copy.CopyDetails;
import org.alfresco.repo.copy.CopyServicePolicies; import org.alfresco.repo.copy.CopyServicePolicies;
@@ -77,8 +76,7 @@ public class RecordAspect extends AbstractDisposableItem
RecordsManagementPolicies.OnRemoveReference, RecordsManagementPolicies.OnRemoveReference,
NodeServicePolicies.OnMoveNodePolicy, NodeServicePolicies.OnMoveNodePolicy,
CopyServicePolicies.OnCopyCompletePolicy, CopyServicePolicies.OnCopyCompletePolicy,
NodeServicePolicies.OnUpdatePropertiesPolicy, NodeServicePolicies.OnUpdatePropertiesPolicy
ContentServicePolicies.OnContentPropertyUpdatePolicy
{ {
/** Well-known location of the scripts folder. */ /** Well-known location of the scripts folder. */
// TODO make configurable // TODO make configurable
@@ -101,7 +99,7 @@ public class RecordAspect extends AbstractDisposableItem
/** I18N */ /** I18N */
private static final String MSG_CANNOT_UPDATE_RECORD_CONTENT = "rm.service.update-record-content"; private static final String MSG_CANNOT_UPDATE_RECORD_CONTENT = "rm.service.update-record-content";
private static final String MSG_UPDATE_STORE_NAME = "rm.action.update-store-name"; private static final String MSG_WORM_RECORD_LOCKED = "rm.action.worm-record-locked";
// WORM lock aspect // WORM lock aspect
public static final String RME_URI = "http://www.alfresco.org/model/recordsmanagemententerprise/1.0"; public static final String RME_URI = "http://www.alfresco.org/model/recordsmanagemententerprise/1.0";
@@ -412,51 +410,43 @@ public class RecordAspect extends AbstractDisposableItem
}, AuthenticationUtil.getSystemUserName()); }, AuthenticationUtil.getSystemUserName());
} }
/** /**
* Behaviour to prevent content update for records * Behaviour to prevent content update for records
* *
* @see org.alfresco.repo.node.NodeServicePolicies.OnUpdatePropertiesPolicy#onUpdateProperties(NodeRef, Map, Map) * @see org.alfresco.repo.node.NodeServicePolicies.OnUpdatePropertiesPolicy#onUpdateProperties(NodeRef, Map, Map)
*/ */
@Override @Override
@Behaviour @Behaviour
( (
kind = BehaviourKind.CLASS, kind = BehaviourKind.CLASS,
notificationFrequency = NotificationFrequency.FIRST_EVENT notificationFrequency = NotificationFrequency.FIRST_EVENT
) )
public void onUpdateProperties(NodeRef nodeRef, Map<QName, Serializable> before, Map<QName, Serializable> after) public void onUpdateProperties(NodeRef nodeRef, Map<QName, Serializable> before, Map<QName, Serializable> after)
{
String storeNameAfter = (String) after.get(ContentModel.PROP_STORE_NAME);
String storeNameBefore = (String) before.get(ContentModel.PROP_STORE_NAME);
ContentData contentAfter = (ContentData) after.get(ContentModel.PROP_CONTENT);
if (storeNameAfter != null && !storeNameAfter.equals(storeNameBefore))
{ {
if (nodeService.hasAspect(nodeRef, ASPECT_WORM_LOCK)) String storeNameAfter = (String) after.get(ContentModel.PROP_STORE_NAME);
{ ContentData contentBefore = (ContentData) before.get(ContentModel.PROP_CONTENT);
// we cannot change the worm store name ContentData contentAfter = (ContentData) after.get(ContentModel.PROP_CONTENT);
throw new IntegrityException(MSG_UPDATE_STORE_NAME, null); // Check only storeNameAfter since the store name is updated before this method is triggered
} // Does not allow setting content to null when moving content between stores (case not covered by
// Does not allow setting content to null when moving content between stores (case not covered by // ContentPropertyRestrictionInterceptor)
// ContentPropertyRestrictionInterceptor) if (storeNameAfter != null)
else if (contentAfter != null) {
{ if (nodeService.hasAspect(nodeRef, ASPECT_WORM_LOCK))
return; {
} if (contentBefore != null && !contentBefore.equals(contentAfter))
} {
}
@Override throw new IntegrityException(MSG_WORM_RECORD_LOCKED, null);
@Behaviour }
( }
kind = BehaviourKind.CLASS, if (contentAfter != null)
notificationFrequency = NotificationFrequency.FIRST_EVENT {
) return;
public void onContentPropertyUpdate(NodeRef nodeRef, QName propertyQName, ContentData beforeValue, ContentData afterValue) }
{ }
// Allow creation of content but not update if (contentBefore != null && !contentBefore.equals(contentAfter))
if (beforeValue != null) {
{ throw new IntegrityException(I18NUtil.getMessage(MSG_CANNOT_UPDATE_RECORD_CONTENT), null);
throw new IntegrityException(I18NUtil.getMessage(MSG_CANNOT_UPDATE_RECORD_CONTENT), null); }
} }
}
} }

View File

@@ -26,23 +26,7 @@
*/ */
package org.alfresco.module.org_alfresco_module_rm.model.rma.aspect; package org.alfresco.module.org_alfresco_module_rm.model.rma.aspect;
import static java.util.Arrays.asList;
import static java.util.Collections.emptyList;
import static org.alfresco.model.ContentModel.PROP_CONTENT;
import static org.alfresco.model.ContentModel.PROP_STORE_NAME;
import static org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel.ASPECT_RECORD;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.mockito.MockitoAnnotations.initMocks;
import java.io.Serializable;
import java.util.Locale;
import java.util.Map;
import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap;
import org.alfresco.model.ContentModel; import org.alfresco.model.ContentModel;
import org.alfresco.module.org_alfresco_module_rm.security.ExtendedSecurityService; import org.alfresco.module.org_alfresco_module_rm.security.ExtendedSecurityService;
import org.alfresco.module.org_alfresco_module_rm.util.ContentBinDuplicationUtility; import org.alfresco.module.org_alfresco_module_rm.util.ContentBinDuplicationUtility;
@@ -57,6 +41,20 @@ import org.junit.Test;
import org.mockito.InjectMocks; import org.mockito.InjectMocks;
import org.mockito.Mock; import org.mockito.Mock;
import java.io.Serializable;
import java.util.Locale;
import java.util.Map;
import static java.util.Arrays.asList;
import static java.util.Collections.emptyList;
import static org.alfresco.model.ContentModel.PROP_CONTENT;
import static org.alfresco.model.ContentModel.PROP_STORE_NAME;
import static org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel.ASPECT_RECORD;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.mockito.MockitoAnnotations.initMocks;
/** /**
* Unit tests for the {@link RecordAspect}. * Unit tests for the {@link RecordAspect}.
* *
@@ -145,4 +143,15 @@ public class RecordAspectUnitTest
"/plain", 0L, "UTF-8", Locale.UK), PROP_STORE_NAME, "store2"); "/plain", 0L, "UTF-8", Locale.UK), PROP_STORE_NAME, "store2");
recordAspect.onUpdateProperties(NODE_REF, before, after); recordAspect.onUpdateProperties(NODE_REF, before, after);
} }
/**
* Check that an IntegrityException is thrown when content is changed
*/
@Test(expected = IntegrityException.class)
public void testOnUpdatePropertiesContentChanged()
{
Map<QName, Serializable> before = ImmutableMap.of(PROP_CONTENT, new ContentData("dummyContentUrl", "text/plain", 0L, "UTF-8", Locale.UK));
Map<QName, Serializable> after = ImmutableMap.of(PROP_CONTENT, new ContentData("dummyContentUrl2", "text" + "/plain", 0L, "UTF-8", Locale.UK));
recordAspect.onUpdateProperties(NODE_REF, before, after);
}
} }