mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-08-07 17:49:17 +00:00
RM-2509: The destruction of electronic records is not possible as it gets ghosted before destruction.
* unit test added to reproduce issue git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/HEAD@109872 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
@@ -19,6 +19,7 @@
|
||||
<property name="eagerContentStoreCleaner" ref="eagerContentStoreCleaner" />
|
||||
<property name="dictionaryService" ref="dictionaryService" />
|
||||
<property name="nodeService" ref="nodeService" />
|
||||
<property name="behaviourFilter" ref="policyBehaviourFilter" />
|
||||
<property name="cleansingEnabled" value="${rm.content.cleansing.enabled}" />
|
||||
</bean>
|
||||
|
||||
|
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -223,6 +235,7 @@ public class ContentDestructionComponent implements NodeServicePolicies.BeforeDe
|
||||
* Registers all content on the given node for destruction.
|
||||
*
|
||||
* @param nodeRef node reference
|
||||
* @param clearContentProperty if true then clear content property, otherwise false
|
||||
*/
|
||||
private void registerAllContentForDestruction(NodeRef nodeRef, boolean clearContentProperty)
|
||||
{
|
||||
@@ -249,9 +262,18 @@ public class ContentDestructionComponent implements NodeServicePolicies.BeforeDe
|
||||
|
||||
// clear the property
|
||||
if (clearContentProperty)
|
||||
{
|
||||
// disable behaviours to ensure no side effects
|
||||
behaviourFilter.disableBehaviour();
|
||||
try
|
||||
{
|
||||
nodeService.removeProperty(nodeRef, entry.getKey());
|
||||
}
|
||||
finally
|
||||
{
|
||||
behaviourFilter.enableBehaviour();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -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<QName, Serializable> props = new HashMap<QName, Serializable>(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);
|
||||
|
@@ -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<QName, Serializable> props = new HashMap<QName, Serializable>(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<QName, Serializable> 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<QName, Serializable> 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<QName, Serializable> properties)
|
||||
{
|
||||
// Create the document
|
||||
if (properties == null)
|
||||
@@ -213,19 +278,12 @@ 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;
|
||||
return record;
|
||||
}
|
||||
|
||||
/**
|
||||
|
BIN
rm-server/test/resources/alfresco/test/content/Image.jpg
Normal file
BIN
rm-server/test/resources/alfresco/test/content/Image.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 762 KiB |
Reference in New Issue
Block a user