mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-07-31 17:39:05 +00:00
APPS-391 [AGS/WORM] Wrong error message received when updating the content store property for a locked record
This commit is contained in:
@@ -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);
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user