diff --git a/config/alfresco/action-services-context.xml b/config/alfresco/action-services-context.xml
index de0f73bfc2..3275543a5d 100644
--- a/config/alfresco/action-services-context.xml
+++ b/config/alfresco/action-services-context.xml
@@ -509,6 +509,15 @@
false
+
+
+
+
+
+
+
+ false
+
diff --git a/source/java/org/alfresco/repo/action/ActionServiceImplTest.java b/source/java/org/alfresco/repo/action/ActionServiceImplTest.java
index 5c1d1b11bb..59fd4afb9f 100644
--- a/source/java/org/alfresco/repo/action/ActionServiceImplTest.java
+++ b/source/java/org/alfresco/repo/action/ActionServiceImplTest.java
@@ -34,11 +34,13 @@ import org.alfresco.repo.action.evaluator.ComparePropertyValueEvaluator;
import org.alfresco.repo.action.evaluator.InCategoryEvaluator;
import org.alfresco.repo.action.evaluator.NoConditionEvaluator;
import org.alfresco.repo.action.evaluator.compare.ComparePropertyValueOperation;
+import org.alfresco.repo.action.executer.ActionExecuter;
import org.alfresco.repo.action.executer.AddFeaturesActionExecuter;
import org.alfresco.repo.action.executer.CheckInActionExecuter;
import org.alfresco.repo.action.executer.CheckOutActionExecuter;
import org.alfresco.repo.action.executer.CompositeActionExecuter;
import org.alfresco.repo.action.executer.MoveActionExecuter;
+import org.alfresco.repo.action.executer.ScriptActionExecuter;
import org.alfresco.repo.content.MimetypeMap;
import org.alfresco.repo.transaction.TransactionUtil;
import org.alfresco.service.cmr.action.Action;
@@ -47,8 +49,10 @@ import org.alfresco.service.cmr.action.ActionConditionDefinition;
import org.alfresco.service.cmr.action.ActionDefinition;
import org.alfresco.service.cmr.action.CompositeAction;
import org.alfresco.service.cmr.repository.ContentData;
+import org.alfresco.service.cmr.repository.ContentWriter;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService;
+import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.service.namespace.QName;
import org.alfresco.service.transaction.TransactionService;
import org.alfresco.util.BaseAlfrescoSpringTest;
@@ -649,6 +653,36 @@ public class ActionServiceImplTest extends BaseAlfrescoSpringTest
assertEquals(action3, savedAction2.getAction(1));
assertEquals(action4, savedAction2.getAction(2));
}
+
+ /**
+ * Test the action result parameter
+ */
+ public void testActionResult()
+ {
+ // Create the script node reference
+ NodeRef script = this.nodeService.createNode(
+ this.folder,
+ ContentModel.ASSOC_CONTAINS,
+ QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, "testScript.js"),
+ ContentModel.TYPE_CONTENT).getChildRef();
+ this.nodeService.setProperty(script, ContentModel.PROP_NAME, "testScript.js");
+ ContentWriter contentWriter = this.contentService.getWriter(script, ContentModel.PROP_CONTENT, true);
+ contentWriter.setMimetype("text/plain");
+ contentWriter.setEncoding("UTF-8");
+ contentWriter.putContent("\"VALUE\";");
+
+ // Create the action
+ Action action1 = this.actionService.createAction(ScriptActionExecuter.NAME);
+ action1.setParameterValue(ScriptActionExecuter.PARAM_SCRIPTREF, script);
+
+ // Execute the action
+ this.actionService.executeAction(action1, this.nodeRef);
+
+ // Get the result
+ String result = (String)action1.getParameterValue(ActionExecuter.PARAM_RESULT);
+ assertNotNull(result);
+ assertEquals("VALUE", result);
+ }
/** ===================================================================================
* Test asynchronous actions
diff --git a/source/java/org/alfresco/repo/action/executer/ActionExecuter.java b/source/java/org/alfresco/repo/action/executer/ActionExecuter.java
index 9d96552e90..a1d2494159 100644
--- a/source/java/org/alfresco/repo/action/executer/ActionExecuter.java
+++ b/source/java/org/alfresco/repo/action/executer/ActionExecuter.java
@@ -29,10 +29,15 @@ import org.alfresco.service.cmr.action.ActionDefinition;
import org.alfresco.service.cmr.repository.NodeRef;
/**
+ * Action executer interface
+ *
* @author Roy Wetherall
*/
public interface ActionExecuter
{
+ /** Standard action result parameter name */
+ public static String PARAM_RESULT = "result";
+
/**
* Get the action definition for the action
*
diff --git a/source/java/org/alfresco/repo/action/executer/CountChildrenActionExecuter.java b/source/java/org/alfresco/repo/action/executer/CountChildrenActionExecuter.java
new file mode 100644
index 0000000000..8edd57e0d7
--- /dev/null
+++ b/source/java/org/alfresco/repo/action/executer/CountChildrenActionExecuter.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2005-2007 Alfresco Software Limited.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program 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 General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+ * As a special exception to the terms and conditions of version 2.0 of
+ * the GPL, you may redistribute this Program in connection with Free/Libre
+ * and Open Source Software ("FLOSS") applications as described in Alfresco's
+ * FLOSS exception. You should have recieved a copy of the text describing
+ * the FLOSS exception, and it is also available here:
+ * http://www.alfresco.com/legal/licensing
+ */
+package org.alfresco.repo.action.executer;
+
+import java.util.List;
+
+import org.alfresco.service.cmr.action.Action;
+import org.alfresco.service.cmr.action.ParameterDefinition;
+import org.alfresco.service.cmr.repository.NodeRef;
+import org.alfresco.service.cmr.repository.NodeService;
+
+/**
+ * Action executer that counts the number of children the actioned upon node has.
+ * This provides as example of how actions can return results.
+ *
+ * @author Roy Wetherall
+ */
+public class CountChildrenActionExecuter extends ActionExecuterAbstractBase
+{
+ /**
+ * Action constants
+ */
+ public static final String NAME = "count-children";
+
+ /**
+ * The node service
+ */
+ private NodeService nodeService;
+
+ /**
+ * Set the node service
+ *
+ * @param nodeService the node service
+ */
+ public void setNodeService(NodeService nodeService)
+ {
+ this.nodeService = nodeService;
+ }
+
+ /**
+ * @see org.alfresco.repo.action.executer.ActionExecuter#execute(org.alfresco.service.cmr.repository.NodeRef, NodeRef)
+ */
+ public void executeImpl(Action ruleAction, NodeRef actionedUponNodeRef)
+ {
+ if (this.nodeService.exists(actionedUponNodeRef) == true)
+ {
+ // Get the parent node
+ int count = this.nodeService.getChildAssocs(actionedUponNodeRef).size();
+ ruleAction.setParameterValue(PARAM_RESULT, Integer.valueOf(count));
+ }
+ }
+
+ /**
+ * @see org.alfresco.repo.action.ParameterizedItemAbstractBase#addParameterDefinitions(java.util.List)
+ */
+ @Override
+ protected void addParameterDefinitions(List paramList)
+ {
+ }
+
+}
diff --git a/source/java/org/alfresco/repo/action/executer/ScriptActionExecuter.java b/source/java/org/alfresco/repo/action/executer/ScriptActionExecuter.java
index e8532ece56..29fef29d57 100644
--- a/source/java/org/alfresco/repo/action/executer/ScriptActionExecuter.java
+++ b/source/java/org/alfresco/repo/action/executer/ScriptActionExecuter.java
@@ -24,6 +24,7 @@
*/
package org.alfresco.repo.action.executer;
+import java.io.Serializable;
import java.util.List;
import java.util.Map;
@@ -149,10 +150,11 @@ public class ScriptActionExecuter extends ActionExecuterAbstractBase
ScriptAction scriptAction = new ScriptAction(this.serviceRegistry, action, this.actionDefinition);
model.put("action", scriptAction);
+ Object result = null;
if (this.scriptLocation == null)
{
// execute the script against the default model
- this.serviceRegistry.getScriptService().executeScript(
+ result = this.serviceRegistry.getScriptService().executeScript(
scriptRef,
ContentModel.PROP_CONTENT,
model);
@@ -160,7 +162,13 @@ public class ScriptActionExecuter extends ActionExecuterAbstractBase
else
{
// execute the script at the specified script location
- this.serviceRegistry.getScriptService().executeScript(this.scriptLocation, model);
+ result = this.serviceRegistry.getScriptService().executeScript(this.scriptLocation, model);
+ }
+
+ // Set the result
+ if (result != null)
+ {
+ action.setParameterValue(PARAM_RESULT, (Serializable)result);
}
}
}