diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/content-context.xml b/rm-server/config/alfresco/module/org_alfresco_module_rm/content-context.xml index 4e888f2697..b2abf97fca 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/content-context.xml +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/content-context.xml @@ -18,7 +18,8 @@ - + + diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/content/ContentDestructionComponent.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/content/ContentDestructionComponent.java index 7abc184357..534e7179f1 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/content/ContentDestructionComponent.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/content/ContentDestructionComponent.java @@ -28,6 +28,7 @@ import org.alfresco.module.org_alfresco_module_rm.classification.ContentClassifi import org.alfresco.module.org_alfresco_module_rm.record.RecordService; import org.alfresco.module.org_alfresco_module_rm.util.AuthenticationUtil; import org.alfresco.repo.node.NodeServicePolicies; +import org.alfresco.repo.policy.BehaviourFilter; import org.alfresco.repo.policy.annotation.Behaviour; import org.alfresco.repo.policy.annotation.BehaviourBean; import org.alfresco.repo.policy.annotation.BehaviourKind; @@ -71,6 +72,9 @@ public class ContentDestructionComponent implements NodeServicePolicies.BeforeDe /** node service */ private NodeService nodeService; + /** behaviour filter */ + private BehaviourFilter behaviourFilter; + /** indicates whether cleansing is enabled or not */ private boolean cleansingEnabled = false; @@ -130,6 +134,14 @@ public class ContentDestructionComponent implements NodeServicePolicies.BeforeDe this.cleansingEnabled = cleansingEnabled; } + /** + * @param behaviourFilter behaviour filter + */ + public void setBehaviourFilter(BehaviourFilter behaviourFilter) + { + this.behaviourFilter = behaviourFilter; + } + /** * @return true if cleansing is enabled, false otherwise */ @@ -213,7 +225,7 @@ public class ContentDestructionComponent implements NodeServicePolicies.BeforeDe if (childAssocTypes.contains(child.getTypeQName())) { // destroy renditions content - destroyContent(nodeRef, false); + destroyContent(child.getChildRef(), false); } } } @@ -222,7 +234,8 @@ public class ContentDestructionComponent implements NodeServicePolicies.BeforeDe /** * Registers all content on the given node for destruction. * - * @param nodeRef node reference + * @param nodeRef node reference + * @param clearContentProperty if true then clear content property, otherwise false */ private void registerAllContentForDestruction(NodeRef nodeRef, boolean clearContentProperty) { @@ -250,7 +263,16 @@ public class ContentDestructionComponent implements NodeServicePolicies.BeforeDe // clear the property if (clearContentProperty) { - nodeService.removeProperty(nodeRef, entry.getKey()); + // disable behaviours to ensure no side effects + behaviourFilter.disableBehaviour(); + try + { + nodeService.removeProperty(nodeRef, entry.getKey()); + } + finally + { + behaviourFilter.enableBehaviour(); + } } } } diff --git a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/destroy/DestroyContentTest.java b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/destroy/DestroyContentTest.java index 29808b932a..ab5b853127 100644 --- a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/destroy/DestroyContentTest.java +++ b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/destroy/DestroyContentTest.java @@ -18,8 +18,13 @@ */ package org.alfresco.module.org_alfresco_module_rm.test.integration.destroy; +import java.io.InputStream; +import java.io.Serializable; import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import org.alfresco.model.ContentModel; import org.alfresco.module.org_alfresco_module_rm.action.impl.CutOffAction; import org.alfresco.module.org_alfresco_module_rm.action.impl.DestroyAction; import org.alfresco.module.org_alfresco_module_rm.classification.ClassificationAspectProperties; @@ -30,10 +35,13 @@ import org.alfresco.module.org_alfresco_module_rm.test.util.CommonRMTestUtils; import org.alfresco.module.org_alfresco_module_rm.test.util.TestContentCleanser; import org.alfresco.repo.content.ContentStore; import org.alfresco.repo.content.MimetypeMap; +import org.alfresco.service.cmr.rendition.RenditionService; import org.alfresco.service.cmr.repository.ContentData; import org.alfresco.service.cmr.repository.ContentReader; import org.alfresco.service.cmr.repository.ContentWriter; import org.alfresco.service.cmr.repository.NodeRef; +import org.alfresco.service.namespace.NamespaceService; +import org.alfresco.service.namespace.QName; import org.alfresco.test.AlfrescoTest; import org.alfresco.util.GUID; @@ -51,6 +59,7 @@ public class DestroyContentTest extends BaseRMTestCase private TestContentCleanser contentCleanser; private EagerContentStoreCleaner eagerContentStoreCleaner; private ContentDestructionComponent contentDestructionComponent; + private RenditionService renditionService; @Override protected void initServices() @@ -60,6 +69,7 @@ public class DestroyContentTest extends BaseRMTestCase contentCleanser = (TestContentCleanser)applicationContext.getBean(BEAN_NAME_CONTENT_CLEANSER); eagerContentStoreCleaner = (EagerContentStoreCleaner)applicationContext.getBean("eagerContentStoreCleaner"); contentDestructionComponent = (ContentDestructionComponent)applicationContext.getBean("contentDestructionComponent"); + renditionService = (RenditionService)applicationContext.getBean("renditionService"); // set the test content store cleaner eagerContentStoreCleaner.setContentCleanser(contentCleanser); @@ -92,7 +102,14 @@ public class DestroyContentTest extends BaseRMTestCase false, true); destroyableFolder = recordFolderService.createRecordFolder(recordCategoryFolderLevel, GUID.generate()); - subRecord = utils.createRecord(destroyableFolder, GUID.generate(), GUID.generate()); + + Map props = new HashMap(1); + props.put(ContentModel.PROP_TITLE, GUID.generate()); + InputStream is = System.class.getResourceAsStream("/alfresco/test/content/Image.jpg"); + subRecord = utils.createRecord(destroyableFolder, GUID.generate(), props, MimetypeMap.MIMETYPE_IMAGE_JPEG, is); + + renditionService.render(subRecord, QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, "medium")); + utils.completeRecord(subRecord); utils.completeEvent(destroyableFolder, CommonRMTestUtils.DEFAULT_EVENT_NAME); rmActionService.executeRecordsManagementAction(destroyableFolder, CutOffAction.NAME); diff --git a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/util/CommonRMTestUtils.java b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/util/CommonRMTestUtils.java index c9abd8935e..cc69fe8034 100644 --- a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/util/CommonRMTestUtils.java +++ b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/util/CommonRMTestUtils.java @@ -18,6 +18,7 @@ */ package org.alfresco.module.org_alfresco_module_rm.test.util; +import java.io.InputStream; import java.io.Serializable; import java.util.ArrayList; import java.util.Date; @@ -190,11 +191,26 @@ public class CommonRMTestUtils implements RecordsManagementModel return dispositionSchedule; } + /** + * Helper method to create a record in a record folder. + * + * @param recordFolder record folder + * @param name name of record + * @return {@link NodeRef} record node reference + */ public NodeRef createRecord(NodeRef recordFolder, String name) { return createRecord(recordFolder, name, null, "Some test content"); } + /** + * Helper method to create a record in a record folder. + * + * @param recordFolder record folder + * @param name name of the record + * @param title title of the record + * @return {@link NodeRef} record node reference + */ public NodeRef createRecord(NodeRef recordFolder, String name, String title) { Map props = new HashMap(1); @@ -202,7 +218,56 @@ public class CommonRMTestUtils implements RecordsManagementModel return createRecord(recordFolder, name, props, "Some test content"); } + /** + * Helper method to create a record in a record folder. + * + * @param recordFolder record folder + * @param name name of record + * @param properties properties of the record + * @param content content of the record + * @return {@link NodeRef} record node reference + */ public NodeRef createRecord(NodeRef recordFolder, String name, Map properties, String content) + { + // Create the record + NodeRef record = createRecordImpl(recordFolder, name, properties); + + // Set the content + ContentWriter writer = contentService.getWriter(record, ContentModel.PROP_CONTENT, true); + writer.setMimetype(MimetypeMap.MIMETYPE_TEXT_PLAIN); + writer.setEncoding("UTF-8"); + writer.putContent(content); + + return record; + } + + /** + * Helper method to create a record in a record folder. + * + * @param recordFolder record folder + * @param name name of record + * @param properties properties of the record + * @param content content of the record + * @return {@link NodeRef} record node reference + */ + public NodeRef createRecord(NodeRef recordFolder, String name, Map properties, String mimetype, InputStream content) + { + // Create the record + NodeRef record = createRecordImpl(recordFolder, name, properties); + + // Set the content + ContentWriter writer = contentService.getWriter(record, ContentModel.PROP_CONTENT, true); + writer.setMimetype(mimetype); + writer.setEncoding("UTF-8"); + writer.putContent(content); + + return record; + } + + /** + * Helper to consolidate creation of contentless record + */ + private NodeRef createRecordImpl(NodeRef recordFolder, String name, Map properties) { // Create the document if (properties == null) @@ -213,21 +278,14 @@ public class CommonRMTestUtils implements RecordsManagementModel { properties.put(ContentModel.PROP_NAME, name); } - NodeRef recordOne = nodeService.createNode(recordFolder, + NodeRef record = nodeService.createNode(recordFolder, ContentModel.ASSOC_CONTAINS, QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, name), ContentModel.TYPE_CONTENT, - properties).getChildRef(); - - // Set the content - ContentWriter writer = contentService.getWriter(recordOne, ContentModel.PROP_CONTENT, true); - writer.setMimetype(MimetypeMap.MIMETYPE_TEXT_PLAIN); - writer.setEncoding("UTF-8"); - writer.putContent(content); - - return recordOne; + properties).getChildRef(); + return record; } - + /** * Helper method to complete record. */ diff --git a/rm-server/test/resources/alfresco/test/content/Image.jpg b/rm-server/test/resources/alfresco/test/content/Image.jpg new file mode 100644 index 0000000000..78704a099b Binary files /dev/null and b/rm-server/test/resources/alfresco/test/content/Image.jpg differ