diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/patch/rm-patch-v22-context.xml b/rm-server/config/alfresco/module/org_alfresco_module_rm/patch/rm-patch-v22-context.xml index 9ffd7cd3f2..7b68e88c1c 100755 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/patch/rm-patch-v22-context.xml +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/patch/rm-patch-v22-context.xml @@ -7,43 +7,57 @@ - + class="org.alfresco.module.org_alfresco_module_rm.patch.v22.RMv22ReportTemplatePatch"> + - + - + class="org.alfresco.module.org_alfresco_module_rm.patch.v22.RMv22CapabilityPatch"> + - + - - - + + + - + - - - + + + - + + + + + + + + + + ${rm.ghosting.enabled} + + + \ No newline at end of file diff --git a/rm-server/config/alfresco/templates/webscripts/org/alfresco/rma/dispositionactiondefinition.lib.ftl b/rm-server/config/alfresco/templates/webscripts/org/alfresco/rma/dispositionactiondefinition.lib.ftl index 33df310043..a780a72024 100644 --- a/rm-server/config/alfresco/templates/webscripts/org/alfresco/rma/dispositionactiondefinition.lib.ftl +++ b/rm-server/config/alfresco/templates/webscripts/org/alfresco/rma/dispositionactiondefinition.lib.ftl @@ -6,10 +6,11 @@ "index": ${action.index}, "name": "${action.name}", "label": "${action.label}", + <#if (action.name == "destroy") && action.ghostOnDestroy??>"ghostOnDestroy": "${action.ghostOnDestroy}", <#if action.description??>"description": "${action.description}", <#if action.period??>"period": "${action.period}", <#if action.periodProperty??>"periodProperty": "${action.periodProperty}", - <#if action.location??>"location": "${action.location}", + <#if action.location??>"location": "${action.location}", <#if action.events??>"events": [<#list action.events as event>"${event}"<#if event_has_next>,], "eligibleOnFirstCompleteEvent": ${action.eligibleOnFirstCompleteEvent?string} } diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/impl/CopyMoveFileToBaseAction.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/impl/CopyMoveFileToBaseAction.java index 726656bdb3..fe57413f1d 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/impl/CopyMoveFileToBaseAction.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/impl/CopyMoveFileToBaseAction.java @@ -18,6 +18,7 @@ import org.alfresco.service.cmr.model.FileFolderService; import org.alfresco.service.cmr.model.FileNotFoundException; import org.alfresco.service.cmr.repository.ChildAssociationRef; import org.alfresco.service.cmr.repository.NodeRef; +import org.alfresco.service.namespace.QName; import org.springframework.util.StringUtils; /** @@ -84,12 +85,18 @@ public abstract class CopyMoveFileToBaseAction extends RMActionExecuterAbstractB (!ACTION_FILETO.equals(action.getActionDefinitionName()) || !recordService.isFiled(actionedUponNodeRef)) && (!(ACTION_FILETO.equals(action.getActionDefinitionName()) && RecordsManagementModel.TYPE_UNFILED_RECORD_CONTAINER.equals(nodeService.getType(actionedUponNodeRef))))) { - boolean targetIsUnfiledRecord = - !ACTION_FILETO.equals(action.getActionDefinitionName()) && ( - ((ContentModel.TYPE_CONTENT.equals(nodeService.getType(actionedUponNodeRef)) || RecordsManagementModel.TYPE_NON_ELECTRONIC_DOCUMENT.equals(nodeService.getType(actionedUponNodeRef))) && - !recordService.isFiled(actionedUponNodeRef)) || - RecordsManagementModel.TYPE_UNFILED_RECORD_CONTAINER.equals(nodeService.getType(actionedUponNodeRef)) - ); + boolean targetIsUnfiledRecord; + if (ACTION_FILETO.equals(action.getActionDefinitionName())) + { + targetIsUnfiledRecord = false; + } + else + { + QName actionedUponType = nodeService.getType(actionedUponNodeRef); + targetIsUnfiledRecord = (dictionaryService.isSubClass(actionedUponType, ContentModel.TYPE_CONTENT) && !recordService + .isFiled(actionedUponNodeRef)) + || RecordsManagementModel.TYPE_UNFILED_RECORD_FOLDER.equals(actionedUponType); + } // first look to see if the destination record folder has been specified NodeRef recordFolder = (NodeRef)action.getParameterValue(PARAM_DESTINATION_RECORD_FOLDER); diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/impl/DestroyAction.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/impl/DestroyAction.java index 44f67d1afa..6d0321bb49 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/impl/DestroyAction.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/impl/DestroyAction.java @@ -27,6 +27,8 @@ import org.alfresco.model.ContentModel; import org.alfresco.model.RenditionModel; import org.alfresco.module.org_alfresco_module_rm.action.RMDispositionActionExecuterAbstractBase; import org.alfresco.module.org_alfresco_module_rm.capability.CapabilityService; +import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionActionDefinition; +import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionSchedule; import org.alfresco.repo.content.cleanup.EagerContentStoreCleaner; import org.alfresco.service.cmr.action.Action; import org.alfresco.service.cmr.dictionary.DataTypeDefinition; @@ -35,6 +37,7 @@ import org.alfresco.service.cmr.repository.ContentData; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.security.AccessStatus; import org.alfresco.service.namespace.QName; +import org.apache.commons.lang.StringUtils; /** * Destroy action. @@ -123,8 +126,7 @@ public class DestroyAction extends RMDispositionActionExecuterAbstractBase { executeRecordLevelDisposition(action, record); } - - if (ghostingEnabled) + if (isGhostOnDestroySetForAction(action, recordFolder)) { nodeService.addAspect(recordFolder, ASPECT_GHOSTED, Collections. emptyMap()); } @@ -139,32 +141,22 @@ public class DestroyAction extends RMDispositionActionExecuterAbstractBase */ @Override protected void executeRecordLevelDisposition(Action action, NodeRef record) - { - doDestroy(record); - } - - /** - * Do the content destroy - * - * @param nodeRef - */ - private void doDestroy(NodeRef nodeRef) { // Clear the content - clearAllContent(nodeRef); + clearAllContent(record); // Clear thumbnail content - clearThumbnails(nodeRef); + clearThumbnails(record); - if (ghostingEnabled) + if (isGhostOnDestroySetForAction(action, record)) { // Add the ghosted aspect - nodeService.addAspect(nodeRef, ASPECT_GHOSTED, null); + nodeService.addAspect(record, ASPECT_GHOSTED, null); } else { // If ghosting is not enabled, delete the node - nodeService.deleteNode(nodeRef); + nodeService.deleteNode(record); } } @@ -237,4 +229,36 @@ public class DestroyAction extends RMDispositionActionExecuterAbstractBase eagerContentStoreCleaner.registerOrphanedContentUrl(contentData.getContentUrl(), true); } } + + /** + * Return true if the ghost on destroy property is set against the + * definition for the passed action on the specified node + * + * @param action + * @param nodeRef + * @return + */ + private boolean isGhostOnDestroySetForAction(Action action, NodeRef nodeRef) + { + boolean ghostOnDestroy = this.ghostingEnabled; + String actionDefinitionName = action.getActionDefinitionName(); + if (!StringUtils.isEmpty(actionDefinitionName)) + { + DispositionSchedule dispositionSchedule = this.dispositionService.getDispositionSchedule(nodeRef); + if (dispositionSchedule != null) + { + DispositionActionDefinition actionDefinition = dispositionSchedule + .getDispositionActionDefinitionByName(actionDefinitionName); + if (actionDefinition != null) + { + String ghostOnDestroyProperty = actionDefinition.getGhostOnDestroy(); + if (ghostOnDestroyProperty != null) + { + ghostOnDestroy = "ghost".equals(actionDefinition.getGhostOnDestroy()); + } + } + } + } + return ghostOnDestroy; + } } diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionActionDefinition.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionActionDefinition.java index bdac5e0218..977944bafd 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionActionDefinition.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionActionDefinition.java @@ -38,75 +38,86 @@ public interface DispositionActionDefinition * @return NodeRef of disposition action definition */ NodeRef getNodeRef(); - + /** * Get disposition action id * - * @return String id + * @return String id */ String getId(); - + /** * Get the index of the action within the disposition instructions * - * @return int disposition action index + * @return int disposition action index */ int getIndex(); - + /** * Get the name of disposition action * - * @return String name + * @return String name */ String getName(); - + /** * Get the display label of the disposition action * * @return String name's display label */ String getLabel(); - + /** * Get the description of the disposition action * - * @return String description + * @return String description */ String getDescription(); - + /** * Get the period for the disposition action * - * @return Period disposition period + * @return Period disposition period */ Period getPeriod(); - + /** * Property to which the period is relative to * - * @return QName property name + * @return QName property name */ QName getPeriodProperty(); - + /** * List of events for the disposition * - * @return List list of events + * @return List list of events */ List getEvents(); - + /** - * Indicates whether the disposition action is eligible when the earliest event is complete, otherwise - * all events must be complete before eligibility. + * Indicates whether the disposition action is eligible when the earliest + * event is complete, otherwise all events must be complete before + * eligibility. * - * @return boolean true if eligible on first action complete, false otherwise + * @return boolean true if eligible on first action complete, false + * otherwise */ boolean eligibleOnFirstCompleteEvent(); - + /** * Get the location of the disposition (can be null) * - * @return String disposition location + * @return String disposition location */ String getLocation(); + + /** + * Get the ghost on destroy from the disposition + * + * @return boolean the gost on destroy flag (on applicable to destroy + * actions) + */ + String getGhostOnDestroy(); + } diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionActionDefinitionImpl.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionActionDefinitionImpl.java index c7e7423c02..200fb52637 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionActionDefinitionImpl.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionActionDefinitionImpl.java @@ -63,6 +63,9 @@ public class DispositionActionDefinitionImpl implements DispositionActionDefinit /** Action index */ private int index; + /** Ghost on detroy */ + private String ghostOnDestroy; + /** * Constructor * @@ -83,6 +86,7 @@ public class DispositionActionDefinitionImpl implements DispositionActionDefinit /** * @see org.alfresco.module.org_alfresco_module_rm.disposition.DispositionActionDefinition#getNodeRef() */ + @Override public NodeRef getNodeRef() { return this.dispositionActionNodeRef; @@ -91,6 +95,7 @@ public class DispositionActionDefinitionImpl implements DispositionActionDefinit /** * @see org.alfresco.module.org_alfresco_module_rm.disposition.DispositionActionDefinition#getIndex() */ + @Override public int getIndex() { return this.index; @@ -99,6 +104,7 @@ public class DispositionActionDefinitionImpl implements DispositionActionDefinit /** * @see org.alfresco.module.org_alfresco_module_rm.disposition.DispositionActionDefinition#getId() */ + @Override public String getId() { return this.dispositionActionNodeRef.getId(); @@ -107,6 +113,7 @@ public class DispositionActionDefinitionImpl implements DispositionActionDefinit /** * @see org.alfresco.module.org_alfresco_module_rm.disposition.DispositionActionDefinition#getDescription() */ + @Override public String getDescription() { if (description == null) @@ -119,6 +126,7 @@ public class DispositionActionDefinitionImpl implements DispositionActionDefinit /** * @see org.alfresco.module.org_alfresco_module_rm.disposition.DispositionActionDefinition#getName() */ + @Override public String getName() { if (name == null) @@ -131,6 +139,7 @@ public class DispositionActionDefinitionImpl implements DispositionActionDefinit /** * @see org.alfresco.module.org_alfresco_module_rm.disposition.DispositionActionDefinition#getLabel() */ + @Override public String getLabel() { if (label == null) @@ -152,6 +161,7 @@ public class DispositionActionDefinitionImpl implements DispositionActionDefinit /** * @see org.alfresco.module.org_alfresco_module_rm.disposition.DispositionActionDefinition#getPeriod() */ + @Override public Period getPeriod() { return (Period)nodeService.getProperty(this.dispositionActionNodeRef, PROP_DISPOSITION_PERIOD); @@ -160,6 +170,7 @@ public class DispositionActionDefinitionImpl implements DispositionActionDefinit /** * @see org.alfresco.module.org_alfresco_module_rm.disposition.DispositionActionDefinition#getPeriodProperty() */ + @Override public QName getPeriodProperty() { QName result = null; @@ -174,6 +185,7 @@ public class DispositionActionDefinitionImpl implements DispositionActionDefinit /** * @see org.alfresco.module.org_alfresco_module_rm.disposition.DispositionActionDefinition#getEvents() */ + @Override @SuppressWarnings("unchecked") public List getEvents() { @@ -198,6 +210,7 @@ public class DispositionActionDefinitionImpl implements DispositionActionDefinit /** * @see org.alfresco.module.org_alfresco_module_rm.disposition.DispositionActionDefinition#eligibleOnFirstCompleteEvent() */ + @Override public boolean eligibleOnFirstCompleteEvent() { boolean result = true; @@ -212,8 +225,23 @@ public class DispositionActionDefinitionImpl implements DispositionActionDefinit /** * @see org.alfresco.module.org_alfresco_module_rm.disposition.DispositionActionDefinition#getLocation() */ + @Override public String getLocation() { return (String)nodeService.getProperty(this.dispositionActionNodeRef, PROP_DISPOSITION_LOCATION); } + + /** + * @see org.alfresco.module.org_alfresco_module_rm.disposition.DispositionActionDefinition#getGhostOnDestroy() + */ + @Override + public String getGhostOnDestroy() + { + if (ghostOnDestroy == null) + { + ghostOnDestroy = (String) nodeService.getProperty(this.dispositionActionNodeRef, + PROP_DISPOSITION_ACTION_GHOST_ON_DESTROY); + } + return ghostOnDestroy; + } } diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/model/RecordsManagementModel.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/model/RecordsManagementModel.java index 4da2ae6f80..f27690894e 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/model/RecordsManagementModel.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/model/RecordsManagementModel.java @@ -89,6 +89,7 @@ public interface RecordsManagementModel extends RecordsManagementCustomModel QName PROP_DISPOSITION_EVENT = QName.createQName(RM_URI, "dispositionEvent"); QName PROP_DISPOSITION_EVENT_COMBINATION = QName.createQName(RM_URI, "dispositionEventCombination"); QName PROP_DISPOSITION_LOCATION = QName.createQName(RM_URI, "dispositionLocation"); + QName PROP_DISPOSITION_ACTION_GHOST_ON_DESTROY = QName.createQName(RM_URI, "dispositionActionGhostOnDestroy"); // Records folder QName TYPE_RECORD_FOLDER = QName.createQName(RM_URI, "recordFolder"); diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v22/RMv22GhostOnDestroyDispositionActionPatch.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v22/RMv22GhostOnDestroyDispositionActionPatch.java new file mode 100644 index 0000000000..53a94e5448 --- /dev/null +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v22/RMv22GhostOnDestroyDispositionActionPatch.java @@ -0,0 +1,175 @@ +/* + * Copyright (C) 2005-2013 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.module.org_alfresco_module_rm.patch.v22; + +import java.io.Serializable; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionActionDefinition; +import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionSchedule; +import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService; +import org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService; +import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel; +import org.alfresco.module.org_alfresco_module_rm.patch.AbstractModulePatch; +import org.alfresco.service.cmr.repository.ChildAssociationRef; +import org.alfresco.service.cmr.repository.NodeRef; +import org.alfresco.service.cmr.repository.NodeService; +import org.alfresco.service.namespace.QName; + +/** + * Sets the ghost on destroy property for existing destroy disposition actions + * to the value specified in the global properties file + * + * @author Mark Hibbins + * @since 2.2 + */ +public class RMv22GhostOnDestroyDispositionActionPatch extends AbstractModulePatch +{ + /** Disposition service */ + private DispositionService dispositionService; + + /** File plan service */ + private FilePlanService filePlanService; + + /** Node service */ + private NodeService nodeService; + + /** Ghost on destroy setting */ + private boolean ghostingEnabled; + + /** + * @param dispositionService disposition service + */ + public void setDispositionService(DispositionService dispositionService) + { + this.dispositionService = dispositionService; + } + + /** + * @param filePlanService file plan service + */ + public void setFilePlanService(FilePlanService filePlanService) + { + this.filePlanService = filePlanService; + } + + /** + * @param nodeService file plan service + */ + public void setNodeService(NodeService nodeService) + { + this.nodeService = nodeService; + } + + /** + * @param ghostingEnabled Ghost on destroy setting from + * alfresco-global.properties + */ + public void setGhostingEnabled(boolean ghostingEnabled) + { + this.ghostingEnabled = ghostingEnabled; + } + + /** + * @see org.alfresco.module.org_alfresco_module_rm.patch.AbstractModulePatch#applyInternal() + */ + @Override + public void applyInternal() + { + Set filePlans = filePlanService.getFilePlans(); + for (NodeRef filePlan : filePlans) + { + processFilePlan(filePlan); + } + } + + /** + * Apply the patch to each file plan + * + * @param filePlan + */ + private void processFilePlan(NodeRef filePlan) + { + Set dispositionSchedules = new HashSet(); + getDispositionSchedules(filePlan, dispositionSchedules); + for (DispositionSchedule dispositionSchedule : dispositionSchedules) + { + processDispositionSchedule(dispositionSchedule); + } + } + + /** + * Add the disposition schedule associated with the node ref to the passed + * set of disposition schedule then call this method recursively for this + * node's children + * + * @param nodeRef + * @param dispositionSchedules + */ + private void getDispositionSchedules(NodeRef nodeRef, Set dispositionSchedules) + { + DispositionSchedule dispositionSchedule = this.dispositionService.getDispositionSchedule(nodeRef); + if (dispositionSchedule != null) + { + dispositionSchedules.add(dispositionSchedule); + } + + List children = nodeService.getChildAssocs(nodeRef); + for (ChildAssociationRef childAssoc : children) + { + getDispositionSchedules(childAssoc.getChildRef(), dispositionSchedules); + } + } + + /** + * Patch the specified disposition schedule. To do this add the host on + * destroy to any action definition that doesn't already have it defined and + * set the value to the value set in the global properties file. Leave any + * action definitions that have this property already defined untouched. + * + * @param dispositionSchedule + */ + private void processDispositionSchedule(DispositionSchedule dispositionSchedule) + { + List actionDefinitions = dispositionSchedule.getDispositionActionDefinitions(); + for(DispositionActionDefinition actionDefinition : actionDefinitions) + { + String actionName = (String) nodeService.getProperty(actionDefinition.getNodeRef(), + RecordsManagementModel.PROP_DISPOSITION_ACTION_NAME); + if ("destroy".equals(actionName)) + { + // we only want to add the ghost on destroy property to action + // definitions that do not already have it defined + String ghostOnDestroyValue = (String) nodeService.getProperty(actionDefinition.getNodeRef(), + RecordsManagementModel.PROP_DISPOSITION_ACTION_GHOST_ON_DESTROY); + if (ghostOnDestroyValue == null) + { + Map props = new HashMap(1); + props.put(RecordsManagementModel.PROP_DISPOSITION_ACTION_GHOST_ON_DESTROY, + this.ghostingEnabled ? "ghost" : "destroy"); + this.dispositionService.updateDispositionActionDefinition(actionDefinition, props); + } + } + } + } +} diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/script/DispositionAbstractBase.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/script/DispositionAbstractBase.java index c35e1e3dc5..25156f0321 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/script/DispositionAbstractBase.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/script/DispositionAbstractBase.java @@ -140,6 +140,11 @@ public class DispositionAbstractBase extends AbstractRmWebScript model.put("location", actionDef.getLocation()); } + if (actionDef.getGhostOnDestroy() != null) + { + model.put("ghostOnDestroy", actionDef.getGhostOnDestroy()); + } + List events = actionDef.getEvents(); if (events != null && events.size() > 0) { diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/script/DispositionActionDefinitionPost.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/script/DispositionActionDefinitionPost.java index 0e8d5ade25..3a6c1812ec 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/script/DispositionActionDefinitionPost.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/script/DispositionActionDefinitionPost.java @@ -29,14 +29,14 @@ import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionActionD import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionSchedule; import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel; import org.alfresco.service.namespace.QName; -import org.springframework.extensions.webscripts.Cache; -import org.springframework.extensions.webscripts.Status; -import org.springframework.extensions.webscripts.WebScriptException; -import org.springframework.extensions.webscripts.WebScriptRequest; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import org.json.JSONTokener; +import org.springframework.extensions.webscripts.Cache; +import org.springframework.extensions.webscripts.Status; +import org.springframework.extensions.webscripts.WebScriptException; +import org.springframework.extensions.webscripts.WebScriptRequest; /** * Implementation for Java backed webscript to create a new dispositon action definition. @@ -141,6 +141,18 @@ public class DispositionActionDefinitionPost extends DispositionAbstractBase props.put(RecordsManagementModel.PROP_DISPOSITION_EVENT, (Serializable)eventsList); } + if (json.has("name") && "destroy".equals(json.getString("name"))) + { + if (json.has("ghostOnDestroy")) + { + props.put(RecordsManagementModel.PROP_DISPOSITION_ACTION_GHOST_ON_DESTROY, "ghost"); + } + else + { + props.put(RecordsManagementModel.PROP_DISPOSITION_ACTION_GHOST_ON_DESTROY, "delete"); + } + } + // add the action definition to the schedule return this.dispositionService.addDispositionActionDefinition(schedule, props); } diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/script/DispositionActionDefinitionPut.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/script/DispositionActionDefinitionPut.java index 1a1b112f38..bd6c6ab918 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/script/DispositionActionDefinitionPut.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/script/DispositionActionDefinitionPut.java @@ -29,17 +29,18 @@ import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionActionD import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionSchedule; import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel; import org.alfresco.service.namespace.QName; -import org.springframework.extensions.webscripts.Cache; -import org.springframework.extensions.webscripts.Status; -import org.springframework.extensions.webscripts.WebScriptException; -import org.springframework.extensions.webscripts.WebScriptRequest; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import org.json.JSONTokener; +import org.springframework.extensions.webscripts.Cache; +import org.springframework.extensions.webscripts.Status; +import org.springframework.extensions.webscripts.WebScriptException; +import org.springframework.extensions.webscripts.WebScriptRequest; /** - * Implementation for Java backed webscript to update an existing dispositon action definition. + * Implementation for Java backed webscript to update an existing dispositon + * action definition. * * @author Gavin Cornwell */ @@ -53,17 +54,17 @@ public class DispositionActionDefinitionPut extends DispositionAbstractBase { // parse the request to retrieve the schedule object DispositionSchedule schedule = parseRequestForSchedule(req); - + // parse the request to retrieve the action definition object DispositionActionDefinition actionDef = parseRequestForActionDefinition(req, schedule); - // retrieve the rest of the post body and update the action definition + // retrieve the rest of the post body and update the action definition JSONObject json = null; try { json = new JSONObject(new JSONTokener(req.getContent().getContent())); actionDef = updateActionDefinition(actionDef, json); - } + } catch (IOException iox) { throw new WebScriptException(Status.STATUS_BAD_REQUEST, @@ -74,13 +75,13 @@ public class DispositionActionDefinitionPut extends DispositionAbstractBase throw new WebScriptException(Status.STATUS_BAD_REQUEST, "Could not parse JSON from req.", je); } - + // create model object with just the action data Map model = new HashMap(1); model.put("action", createActionDefModel(actionDef, req.getURL())); return model; } - + /** * Updates a dispositionActionDefinition node in the repo. * @@ -94,40 +95,40 @@ public class DispositionActionDefinitionPut extends DispositionAbstractBase { // create the properties for the action definition Map props = new HashMap(8); - + if (json.has("name")) { props.put(RecordsManagementModel.PROP_DISPOSITION_ACTION_NAME, json.getString("name")); } - + if (json.has("description")) { props.put(RecordsManagementModel.PROP_DISPOSITION_DESCRIPTION, json.getString("description")); } - + if (json.has("period")) { props.put(RecordsManagementModel.PROP_DISPOSITION_PERIOD, json.getString("period")); } - + if (json.has("periodProperty")) { QName periodProperty = QName.createQName(json.getString("periodProperty"), this.namespaceService); props.put(RecordsManagementModel.PROP_DISPOSITION_PERIOD_PROPERTY, periodProperty); } - + if (json.has("eligibleOnFirstCompleteEvent")) { - props.put(RecordsManagementModel.PROP_DISPOSITION_EVENT_COMBINATION, + props.put(RecordsManagementModel.PROP_DISPOSITION_EVENT_COMBINATION, json.getBoolean("eligibleOnFirstCompleteEvent") ? "or" : "and"); } - + if (json.has("location")) { - props.put(RecordsManagementModel.PROP_DISPOSITION_LOCATION, + props.put(RecordsManagementModel.PROP_DISPOSITION_LOCATION, json.getString("location")); } - + if (json.has("events")) { JSONArray events = json.getJSONArray("events"); @@ -138,8 +139,20 @@ public class DispositionActionDefinitionPut extends DispositionAbstractBase } props.put(RecordsManagementModel.PROP_DISPOSITION_EVENT, (Serializable)eventsList); } - + + if (json.has("name") && "destroy".equals(json.getString("name"))) + { + if (json.has("ghostOnDestroy")) + { + props.put(RecordsManagementModel.PROP_DISPOSITION_ACTION_GHOST_ON_DESTROY, "ghost"); + } + else + { + props.put(RecordsManagementModel.PROP_DISPOSITION_ACTION_GHOST_ON_DESTROY, "delete"); + } + } + // update the action definition return this.dispositionService.updateDispositionActionDefinition(actionDef, props); - } + } } \ No newline at end of file