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