/* * #%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.script; import java.io.IOException; import java.io.Serializable; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.alfresco.module.org_alfresco_module_rm.action.RecordsManagementActionResult; import org.alfresco.module.org_alfresco_module_rm.action.RecordsManagementActionService; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeService; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import org.json.JSONTokener; import org.springframework.extensions.surf.util.ISO8601DateFormat; import org.springframework.extensions.webscripts.Cache; import org.springframework.extensions.webscripts.DeclarativeWebScript; import org.springframework.extensions.webscripts.Status; import org.springframework.extensions.webscripts.WebScriptException; import org.springframework.extensions.webscripts.WebScriptRequest; /** * This class provides the implementation for the rmaction webscript. * * @author Neil McErlean */ public class RmActionPost extends DeclarativeWebScript { private static Log logger = LogFactory.getLog(RmActionPost.class); private static final String PARAM_NAME = "name"; private static final String PARAM_NODE_REF = "nodeRef"; private static final String PARAM_NODE_REFS = "nodeRefs"; private static final String PARAM_PARAMS = "params"; private NodeService nodeService; private RecordsManagementActionService rmActionService; public void setNodeService(NodeService nodeService) { this.nodeService = nodeService; } public void setRecordsManagementActionService(RecordsManagementActionService rmActionService) { this.rmActionService = rmActionService; } @SuppressWarnings("unchecked") @Override public Map<String, Object> executeImpl(WebScriptRequest req, Status status, Cache cache) { String reqContentAsString; try { reqContentAsString = req.getContent().getContent(); } catch (IOException iox) { throw new WebScriptException(Status.STATUS_BAD_REQUEST, "Could not read content from req.", iox); } String actionName = null; List<NodeRef> targetNodeRefs = new ArrayList<NodeRef>(1); Map<String, Serializable> actionParams = new HashMap<String, Serializable>(3); try { JSONObject jsonObj = new JSONObject(new JSONTokener(reqContentAsString)); // Get the action name if (jsonObj.has(PARAM_NAME)) { actionName = jsonObj.getString(PARAM_NAME); } // Get the target references if (jsonObj.has(PARAM_NODE_REF)) { NodeRef nodeRef = new NodeRef(jsonObj.getString(PARAM_NODE_REF)); targetNodeRefs.add(nodeRef); } if (jsonObj.has(PARAM_NODE_REFS)) { JSONArray jsonArray = jsonObj.getJSONArray(PARAM_NODE_REFS); if (jsonArray.length() != 0) { targetNodeRefs = new ArrayList<NodeRef>(jsonArray.length()); for (int i = 0; i < jsonArray.length(); i++) { NodeRef nodeRef = new NodeRef(jsonArray.getString(i)); targetNodeRefs.add(nodeRef); } } } // params are optional. if (jsonObj.has(PARAM_PARAMS)) { JSONObject paramsObj = jsonObj.getJSONObject(PARAM_PARAMS); for (Iterator<String> iter = paramsObj.keys(); iter.hasNext(); ) { String nextKeyString = iter.next(); Object nextValue = paramsObj.get(nextKeyString); // Check for date values if ((nextValue instanceof JSONObject) && ((JSONObject)nextValue).has("iso8601")) { String dateStringValue = ((JSONObject)nextValue).getString("iso8601"); nextValue = ISO8601DateFormat.parse(dateStringValue); } actionParams.put(nextKeyString, (Serializable)nextValue); } } } catch (JSONException exception) { throw new WebScriptException(Status.STATUS_BAD_REQUEST, "Unable to parse request JSON.", exception); } // validate input: check for mandatory params. // Some RM actions can be posted without a nodeRef. if (actionName == null) { throw new WebScriptException(Status.STATUS_BAD_REQUEST, "A mandatory parameter has not been provided in URL"); } // Check that all the nodes provided exist and build report string StringBuilder targetNodeRefsString = new StringBuilder(30); boolean firstTime = true; for (NodeRef targetNodeRef : targetNodeRefs) { if (!nodeService.exists(targetNodeRef)) { throw new WebScriptException(Status.STATUS_NOT_FOUND, "The targetNode does not exist (" + targetNodeRef.toString() + ")"); } // Build the string if (firstTime) { firstTime = false; } else { targetNodeRefsString.append(", "); } targetNodeRefsString.append(targetNodeRef.toString()); } // Proceed to execute the specified action on the specified node. if (logger.isDebugEnabled()) { StringBuilder msg = new StringBuilder(); msg.append("Executing Record Action ") .append(actionName) .append(", (") .append(targetNodeRefsString.toString()) .append("), ") .append(actionParams); logger.debug(msg.toString()); } Map<String, Object> model = new HashMap<String, Object>(); if (targetNodeRefs.isEmpty()) { RecordsManagementActionResult result = this.rmActionService.executeRecordsManagementAction(actionName, actionParams); if (result.getValue() != null) { model.put("result", result.getValue().toString()); } } else { Map<NodeRef, RecordsManagementActionResult> resultMap = this.rmActionService.executeRecordsManagementAction(targetNodeRefs, actionName, actionParams); Map<String, String> results = new HashMap<String, String>(resultMap.size()); for (Map.Entry<NodeRef, RecordsManagementActionResult> entry : resultMap.entrySet()) { Object value = entry.getValue().getValue(); if (value != null) { results.put(entry.getKey().toString(), value.toString()); } } model.put("results", results); } model.put("message", "Successfully queued action [" + actionName + "] on " + targetNodeRefsString.toString()); return model; } }