/*
* #%L
* Alfresco Records Management Module
* %%
* Copyright (C) 2005 - 2016 Alfresco Software Limited
* %%
* This file is part of the Alfresco software.
* -
* If the software was purchased under a paid Alfresco license, the terms of
* the paid license agreement will prevail. Otherwise, the software is
* provided under the following open source license terms:
* -
* 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 <http://www.gnu.org/licenses/>.
* #L%
*/
package org.alfresco.module.org_alfresco_module_rm.action;
import static org.apache.commons.lang.StringUtils.leftPad;
import java.io.Serializable;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.alfresco.module.org_alfresco_module_rm.admin.RecordsManagementAdminService;
import org.alfresco.module.org_alfresco_module_rm.audit.RecordsManagementAuditService;
import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService;
import org.alfresco.module.org_alfresco_module_rm.event.RecordsManagementEventService;
import org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanComponentKind;
import org.alfresco.module.org_alfresco_module_rm.freeze.FreezeService;
import org.alfresco.module.org_alfresco_module_rm.hold.HoldService;
import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel;
import org.alfresco.module.org_alfresco_module_rm.model.security.ModelSecurityService;
import org.alfresco.module.org_alfresco_module_rm.record.RecordService;
import org.alfresco.module.org_alfresco_module_rm.recordfolder.RecordFolderService;
import org.alfresco.module.org_alfresco_module_rm.vital.VitalRecordService;
import org.alfresco.repo.action.executer.ActionExecuterAbstractBase;
import org.alfresco.service.cmr.action.Action;
import org.alfresco.service.cmr.action.ActionDefinition;
import org.alfresco.service.cmr.action.ActionService;
import org.alfresco.service.cmr.action.ParameterDefinition;
import org.alfresco.service.cmr.dictionary.DictionaryService;
import org.alfresco.service.cmr.repository.ContentService;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.cmr.security.OwnableService;
import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.service.transaction.TransactionService;
import org.alfresco.util.PropertyCheck;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.extensions.surf.util.I18NUtil;
import org.springframework.util.StringUtils;
/**
* Records management action executer base class
*
* @author Roy Wetherall
*/
public abstract class RMActionExecuterAbstractBase extends PropertySubActionExecuterAbstractBase
implements RecordsManagementAction,
RecordsManagementModel,
BeanNameAware
{
/** Namespace service */
private NamespaceService namespaceService;
/** Used to control transactional behaviour including post-commit auditing */
private TransactionService transactionService;
/** Node service */
private NodeService nodeService;
/** Dictionary service */
private DictionaryService dictionaryService;
/** Content service */
private ContentService contentService;
/** Action service */
private ActionService actionService;
/** Records management action service */
private RecordsManagementAuditService recordsManagementAuditService;
/** Records management action service */
private RecordsManagementActionService recordsManagementActionService;
/** Record service */
private RecordService recordService;
/** Disposition service */
private DispositionService dispositionService;
/** Vital record service */
private VitalRecordService vitalRecordService;
/** Records management event service */
private RecordsManagementEventService recordsManagementEventService;
/** Records management action service */
private RecordsManagementAdminService recordsManagementAdminService;
/** Ownable service **/
private OwnableService ownableService;
/** Freeze service */
private FreezeService freezeService;
/** Model security service */
private ModelSecurityService modelSecurityService;
/** Record folder service */
private RecordFolderService recordFolderService;
/** Hold service */
private HoldService holdService;
/** List of kinds for which this action is applicable */
protected Set<FilePlanComponentKind> applicableKinds = new HashSet<FilePlanComponentKind>();
/**
* Get the transaction service
*
* @return The transaction service
*/
protected TransactionService getTransactionService()
{
return this.transactionService;
}
/**
* Set the transaction service
*
* @param transactionService The transaction service
*/
public void setTransactionService(TransactionService transactionService)
{
this.transactionService = transactionService;
}
/**
* Gets the namespace service
*
* @return The namespace service
*/
protected NamespaceService getNamespaceService()
{
return this.namespaceService;
}
/**
* Set the namespace service
*
* @param namespaceService The namespace service
*/
public void setNamespaceService(NamespaceService namespaceService)
{
this.namespaceService = namespaceService;
}
/**
* Gets the node service
*
* @return The node service
*/
protected NodeService getNodeService()
{
return this.nodeService;
}
/**
* Set the node service
*
* @param nodeService The node service
*/
public void setNodeService(NodeService nodeService)
{
this.nodeService = nodeService;
}
/**
* Gets the dictionary service
*
* @return The dictionary service
*/
protected DictionaryService getDictionaryService()
{
return this.dictionaryService;
}
/**
* Set the dictionary service
*
* @param dictionaryService The dictionary service
*/
public void setDictionaryService(DictionaryService dictionaryService)
{
this.dictionaryService = dictionaryService;
}
/**
* Gets the content service
*
* @return The content service
*/
protected ContentService getContentService()
{
return this.contentService;
}
/**
* Set the content service
*
* @param contentService The content service
*/
public void setContentService(ContentService contentService)
{
this.contentService = contentService;
}
/**
* Gets the action service
*
* @return The action service
*/
protected ActionService getActionService()
{
return this.actionService;
}
/**
* Set action service
*
* @param actionService The action service
*/
public void setActionService(ActionService actionService)
{
this.actionService = actionService;
}
/**
* Gets the records management audit service
*
* @return The records management audit service
*/
protected RecordsManagementAuditService getRecordsManagementAuditService()
{
return this.recordsManagementAuditService;
}
/**
* Set the audit service that action details will be sent to
*
* @param recordsManagementAuditService The audit service that action details will be sent to
*/
public void setRecordsManagementAuditService(RecordsManagementAuditService recordsManagementAuditService)
{
this.recordsManagementAuditService = recordsManagementAuditService;
}
/**
* Gets the records management action service
*
* @return The records management action service
*/
protected RecordsManagementActionService getRecordsManagementActionService()
{
return this.recordsManagementActionService;
}
/**
* Set records management service
*
* @param recordsManagementActionService The records management service
*/
public void setRecordsManagementActionService(RecordsManagementActionService recordsManagementActionService)
{
this.recordsManagementActionService = recordsManagementActionService;
}
/**
* Gets the disposition service
*
* @return The disposition service
*/
protected DispositionService getDispositionService()
{
return this.dispositionService;
}
/**
* Set the disposition service
*
* @param dispositionService The disposition service
*/
public void setDispositionService(DispositionService dispositionService)
{
this.dispositionService = dispositionService;
}
/**
* Gets the vital record service
*
* @return The vital record service
*/
protected VitalRecordService getVitalRecordService()
{
return this.vitalRecordService;
}
/**
* Sets the vital record service
*
* @param vitalRecordService vital record service
*/
public void setVitalRecordService(VitalRecordService vitalRecordService)
{
this.vitalRecordService = vitalRecordService;
}
/**
* Gets the records management event service
*
* @return The records management event service
*/
protected RecordsManagementEventService getRecordsManagementEventService()
{
return this.recordsManagementEventService;
}
/**
* Set the records management event service
*
* @param recordsManagementEventService The records management event service
*/
public void setRecordsManagementEventService(RecordsManagementEventService recordsManagementEventService)
{
this.recordsManagementEventService = recordsManagementEventService;
}
/**
* Gets the ownable service
*
* @return The ownable service
*/
protected OwnableService getOwnableService()
{
return this.ownableService;
}
/**
* Set the ownable service
*
* @param ownableService The ownable service
*/
public void setOwnableService(OwnableService ownableService)
{
this.ownableService = ownableService;
}
/**
* Gets the freeze service
*
* @return The freeze service
*/
protected FreezeService getFreezeService()
{
return this.freezeService;
}
/**
* Set freeze service
*
* @param freezeService freeze service
*/
public void setFreezeService(FreezeService freezeService)
{
this.freezeService = freezeService;
}
/**
* Gets the record service
*
* @return The record service
*/
protected RecordService getRecordService()
{
return this.recordService;
}
/**
* Set record service
*
* @param recordService record service
*/
public void setRecordService(RecordService recordService)
{
this.recordService = recordService;
}
/**
* Gets the records management admin service
*
* @return The records management admin service
*/
protected RecordsManagementAdminService getRecordsManagementAdminService()
{
return recordsManagementAdminService;
}
/**
* Sets the records management admin service
*
* @param recordsManagementAdminService records management admin service
*/
public void setRecordsManagementAdminService(RecordsManagementAdminService recordsManagementAdminService)
{
this.recordsManagementAdminService = recordsManagementAdminService;
}
/**
* Gets the model security service
*
* @return The model security service
*/
protected ModelSecurityService getModelSecurityService()
{
return this.modelSecurityService;
}
/**
* Sets the model security service
*
* @param modelSecurityService model security service
*/
public void setModelSecurityService(ModelSecurityService modelSecurityService)
{
this.modelSecurityService = modelSecurityService;
}
/**
* Gets the record folder service
*
* @return The record folder service
*/
protected RecordFolderService getRecordFolderService()
{
return this.recordFolderService;
}
/**
* Sets the record folder service
*
* @param recordFolderService record folder service
*/
public void setRecordFolderService(RecordFolderService recordFolderService)
{
this.recordFolderService = recordFolderService;
}
/**
* Gets the hold service
*
* @return The hold service
*/
protected HoldService getHoldService()
{
return this.holdService;
}
/**
* Sets the hold service
*
* @param holdService hold service
*/
public void setHoldService(HoldService holdService)
{
this.holdService = holdService;
}
/**
* Sets the applicable kinds
*
* @param applicableKinds kinds that this action is applicable for
*/
public void setApplicableKinds(String[] applicableKinds)
{
for(String kind : applicableKinds)
{
this.applicableKinds.add(FilePlanComponentKind.valueOf(kind));
}
}
/**
* @see org.alfresco.repo.action.executer.ActionExecuterAbstractBase#createActionDefinition(java.lang.String)
*/
@Override
protected ActionDefinition createActionDefinition(String name)
{
return new RecordsManagementActionDefinitionImpl(name);
}
/**
* @see org.alfresco.repo.action.executer.ActionExecuterAbstractBase#getActionDefinition()
*/
@Override
public ActionDefinition getActionDefinition()
{
ActionDefinition actionDefinition = super.getActionDefinition();
((RecordsManagementActionDefinitionImpl)this.actionDefinition).setApplicableKinds(applicableKinds);
return actionDefinition;
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.action.RecordsManagementAction#getRecordsManagementActionDefinition()
*/
@Override
public RecordsManagementActionDefinition getRecordsManagementActionDefinition()
{
return (RecordsManagementActionDefinition)getActionDefinition();
}
/**
* Init method
*/
@Override
public void init()
{
PropertyCheck.mandatory(this, "namespaceService", namespaceService);
PropertyCheck.mandatory(this, "transactionService", transactionService);
PropertyCheck.mandatory(this, "nodeService", nodeService);
PropertyCheck.mandatory(this, "dictionaryService", dictionaryService);
PropertyCheck.mandatory(this, "contentService", contentService);
PropertyCheck.mandatory(this, "actionService", actionService);
PropertyCheck.mandatory(this, "transactionService", transactionService);
PropertyCheck.mandatory(this, "recordsManagementAuditService", recordsManagementAuditService);
PropertyCheck.mandatory(this, "recordsManagementActionService", recordsManagementActionService);
PropertyCheck.mandatory(this, "recordsManagementAdminService", recordsManagementAdminService);
PropertyCheck.mandatory(this, "recordsManagementEventService", recordsManagementEventService);
super.init();
}
/**
* Indicates whether this records management action is public or not
*
* @return boolean true if public, false otherwise
*/
@Override
public boolean isPublicAction()
{
return publicAction;
}
/**
* @see org.alfresco.repo.action.CommonResourceAbstractBase#setBeanName(java.lang.String)
*/
@Override
public void setBeanName(String name)
{
this.name = name;
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.action.RecordsManagementAction#getName()
*/
public String getName()
{
return this.name;
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.action.RecordsManagementAction#getLabel()
*/
public String getLabel()
{
String label = I18NUtil.getMessage(this.getTitleKey());
if (label == null)
{
// default to the name of the action with first letter capitalised
label = StringUtils.capitalize(this.name);
}
return label;
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.action.RecordsManagementAction#getDescription()
*/
public String getDescription()
{
String desc = I18NUtil.getMessage(this.getDescriptionKey());
if (desc == null)
{
// default to the name of the action with first letter capitalised
desc = StringUtils.capitalize(this.name);
}
return desc;
}
/**
* By default an action is not a disposition action
*
* @see org.alfresco.module.org_alfresco_module_rm.action.RecordsManagementAction#isDispositionAction()
*/
public boolean isDispositionAction()
{
return false;
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.action.RecordsManagementAction#execute(org.alfresco.service.cmr.repository.NodeRef, java.util.Map)
*/
public RecordsManagementActionResult execute(NodeRef filePlanComponent, Map<String, Serializable> parameters)
{
// Create the action
Action action = this.actionService.createAction(name);
action.setParameterValues(parameters);
// disable model security whilst we execute the RM rule
modelSecurityService.disable();
try
{
// Execute the action
actionService.executeAction(action, filePlanComponent);
}
finally
{
modelSecurityService.enable();
}
// Get the result
Object value = action.getParameterValue(ActionExecuterAbstractBase.PARAM_RESULT);
return new RecordsManagementActionResult(value);
}
/**
* Function to pad a string with zero '0' characters to the required length
*
* @param s String to pad with leading zero '0' characters
* @param len Length to pad to
*
* @return padded string or the original if already at >= len characters
*
* @deprecated As of 2.1, replaced by {@link org.apache.commons.lang.StringUtils.leftPad}
*/
@Deprecated
protected String padString(String s, int len)
{
return leftPad(s, len);
}
/**
* By default there are no parameters.
*
* @see org.alfresco.repo.action.ParameterizedItemAbstractBase#addParameterDefinitions(java.util.List)
*/
@Override
protected void addParameterDefinitions(List<ParameterDefinition> paramList)
{
// No parameters
}
/**
* By default, rmActions do not provide an implicit target nodeRef.
*/
public NodeRef getImplicitTargetNodeRef()
{
return null;
}
}