diff --git a/config/alfresco/script-services-context.xml b/config/alfresco/script-services-context.xml
index fbbd6777a0..66e51cc9eb 100644
--- a/config/alfresco/script-services-context.xml
+++ b/config/alfresco/script-services-context.xml
@@ -2,9 +2,38 @@
+
+
+
+
+
+
+
+
+
+
+ logger
+
+
+
+
+
+ utils
+
+
+
+
+
+ actions
+
+
+
+
+
+
diff --git a/source/java/org/alfresco/repo/jscript/Actions.java b/source/java/org/alfresco/repo/jscript/Actions.java
index 9021fe1abf..a0f4734e97 100644
--- a/source/java/org/alfresco/repo/jscript/Actions.java
+++ b/source/java/org/alfresco/repo/jscript/Actions.java
@@ -35,7 +35,7 @@ import org.mozilla.javascript.Wrapper;
*
* @author davidc
*/
-public final class Actions implements Scopeable
+public final class Actions extends BaseScriptImplementation implements Scopeable
{
/** Repository Service Registry */
private ServiceRegistry services;
@@ -44,14 +44,13 @@ public final class Actions implements Scopeable
private Scriptable scope;
/**
- * Constructor
+ * Set the service registry
*
- * @param services
- * repository service registry
+ * @param serviceRegistry the service registry
*/
- public Actions(ServiceRegistry services)
+ public void setServiceRegistry(ServiceRegistry serviceRegistry)
{
- this.services = services;
+ this.services = serviceRegistry;
}
/**
@@ -61,7 +60,7 @@ public final class Actions implements Scopeable
{
this.scope = scope;
}
-
+
/**
* Gets the list of registered action names
*
@@ -216,6 +215,9 @@ public final class Actions implements Scopeable
}
}
services.getActionService().executeAction(action, node.getNodeRef());
+
+ // Reset the actioned upon node
+ node.reset();
}
/**
diff --git a/source/java/org/alfresco/repo/jscript/BaseScriptImplementation.java b/source/java/org/alfresco/repo/jscript/BaseScriptImplementation.java
new file mode 100644
index 0000000000..3183d2f16d
--- /dev/null
+++ b/source/java/org/alfresco/repo/jscript/BaseScriptImplementation.java
@@ -0,0 +1,57 @@
+/**
+ *
+ */
+package org.alfresco.repo.jscript;
+
+import org.alfresco.service.cmr.repository.ScriptImplementation;
+import org.alfresco.service.cmr.repository.ScriptService;
+
+/**
+ * Abstract base class for a script implementation
+ *
+ * @author Roy Wetherall
+ */
+public abstract class BaseScriptImplementation implements ScriptImplementation
+{
+ /** The script service */
+ private ScriptService scriptService;
+
+ /** The name of the script */
+ private String scriptName;
+
+ /**
+ * Sets the script service
+ *
+ * @param scriptService the script service
+ */
+ public void setScriptService(ScriptService scriptService)
+ {
+ this.scriptService = scriptService;
+ }
+
+ /**
+ * Registers this script with the script service
+ */
+ public void register()
+ {
+ this.scriptService.registerScript(this);
+ }
+
+ /**
+ * Sets the script name
+ *
+ * @param scriptName the script name
+ */
+ public void setScriptName(String scriptName)
+ {
+ this.scriptName = scriptName;
+ }
+
+ /**
+ * @see org.alfresco.service.cmr.repository.ScriptImplementation#getScriptName()
+ */
+ public String getScriptName()
+ {
+ return this.scriptName;
+ }
+}
diff --git a/source/java/org/alfresco/repo/jscript/Node.java b/source/java/org/alfresco/repo/jscript/Node.java
index 62feb409bf..5d5195833c 100644
--- a/source/java/org/alfresco/repo/jscript/Node.java
+++ b/source/java/org/alfresco/repo/jscript/Node.java
@@ -1738,7 +1738,7 @@ public class Node implements Serializable, Scopeable
/**
* Reset the Node cached state
*/
- private void reset()
+ public void reset()
{
this.name = null;
this.type = null;
diff --git a/source/java/org/alfresco/repo/jscript/RhinoScriptService.java b/source/java/org/alfresco/repo/jscript/RhinoScriptService.java
index e711e7eb4e..e92b887c91 100644
--- a/source/java/org/alfresco/repo/jscript/RhinoScriptService.java
+++ b/source/java/org/alfresco/repo/jscript/RhinoScriptService.java
@@ -21,7 +21,9 @@ import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.StringReader;
+import java.util.ArrayList;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import org.alfresco.error.AlfrescoRuntimeException;
@@ -30,6 +32,7 @@ import org.alfresco.service.ServiceRegistry;
import org.alfresco.service.cmr.repository.ContentReader;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.ScriptException;
+import org.alfresco.service.cmr.repository.ScriptImplementation;
import org.alfresco.service.cmr.repository.ScriptService;
import org.alfresco.service.cmr.repository.TemplateImageResolver;
import org.alfresco.service.namespace.QName;
@@ -51,6 +54,8 @@ public class RhinoScriptService implements ScriptService
/** Repository Service Registry */
private ServiceRegistry services;
+ /** List of global scripts */
+ private List globalScripts = new ArrayList(5);
/**
* Set the Service Registry
@@ -62,6 +67,14 @@ public class RhinoScriptService implements ScriptService
this.services = services;
}
+ /**
+ * @see org.alfresco.service.cmr.repository.ScriptService#registerScript(java.lang.Object)
+ */
+ public void registerScript(ScriptImplementation script)
+ {
+ this.globalScripts.add(script);
+ }
+
/**
* @see org.alfresco.service.cmr.repository.ScriptService#executeScript(java.lang.String, java.util.Map)
*/
@@ -217,10 +230,11 @@ public class RhinoScriptService implements ScriptService
model = new HashMap();
}
- // add useful util objects
- model.put("actions", new Actions(services));
- model.put("logger", new ScriptLogger());
- model.put("utils", new ScriptUtils());
+ // add the global scripts
+ for (ScriptImplementation script : this.globalScripts)
+ {
+ model.put(script.getScriptName(), script);
+ }
// insert supplied object model into root of the default scope
for (String key : model.keySet())
diff --git a/source/java/org/alfresco/repo/jscript/ScriptLogger.java b/source/java/org/alfresco/repo/jscript/ScriptLogger.java
index 2f885ff474..29c21d1dfc 100644
--- a/source/java/org/alfresco/repo/jscript/ScriptLogger.java
+++ b/source/java/org/alfresco/repo/jscript/ScriptLogger.java
@@ -21,7 +21,7 @@ import org.apache.log4j.Logger;
/**
* @author Kevin Roast
*/
-public final class ScriptLogger
+public final class ScriptLogger extends BaseScriptImplementation
{
private static final Logger logger = Logger.getLogger(ScriptLogger.class);
diff --git a/source/java/org/alfresco/repo/jscript/ScriptUtils.java b/source/java/org/alfresco/repo/jscript/ScriptUtils.java
index 853b3fe593..a96d3288e7 100644
--- a/source/java/org/alfresco/repo/jscript/ScriptUtils.java
+++ b/source/java/org/alfresco/repo/jscript/ScriptUtils.java
@@ -23,7 +23,7 @@ import org.mozilla.javascript.Scriptable;
*
* @author Kevin Roast
*/
-public final class ScriptUtils implements Scopeable
+public final class ScriptUtils extends BaseScriptImplementation implements Scopeable
{
/** Root scope for this object */
private Scriptable scope;
diff --git a/source/java/org/alfresco/service/cmr/action/ActionService.java b/source/java/org/alfresco/service/cmr/action/ActionService.java
index 171051fc94..b34b500e8f 100644
--- a/source/java/org/alfresco/service/cmr/action/ActionService.java
+++ b/source/java/org/alfresco/service/cmr/action/ActionService.java
@@ -202,7 +202,7 @@ public interface ActionService
* @param nodeRef the node reference
* @param action the action
*/
- @Auditable(key = Auditable.Key.ARG_1, parameters = {"nodeRef", "action" })
+ @Auditable(key = Auditable.Key.ARG_0, parameters = {"nodeRef", "action" })
void saveAction(NodeRef nodeRef, Action action);
/**
@@ -211,7 +211,7 @@ public interface ActionService
* @param nodeRef the node reference
* @return the list of actions
*/
- @Auditable(key = Auditable.Key.ARG_1, parameters = {"nodeRef"})
+ @Auditable(key = Auditable.Key.ARG_0, parameters = {"nodeRef"})
List getActions(NodeRef nodeRef);
/**
diff --git a/source/java/org/alfresco/service/cmr/repository/ScriptImplementation.java b/source/java/org/alfresco/service/cmr/repository/ScriptImplementation.java
new file mode 100644
index 0000000000..cb8353abba
--- /dev/null
+++ b/source/java/org/alfresco/service/cmr/repository/ScriptImplementation.java
@@ -0,0 +1,20 @@
+/**
+ *
+ */
+package org.alfresco.service.cmr.repository;
+
+/**
+ * Interface to represent a server side script implementation
+ *
+ * @author Roy Wetherall
+ *
+ */
+public interface ScriptImplementation
+{
+ /**
+ * Returns the name of the script
+ *
+ * @return the name of the script
+ */
+ String getScriptName();
+}
diff --git a/source/java/org/alfresco/service/cmr/repository/ScriptService.java b/source/java/org/alfresco/service/cmr/repository/ScriptService.java
index ad742600f5..80112477f7 100644
--- a/source/java/org/alfresco/service/cmr/repository/ScriptService.java
+++ b/source/java/org/alfresco/service/cmr/repository/ScriptService.java
@@ -83,4 +83,12 @@ public interface ScriptService
@Auditable(parameters = {"script", "model"})
public Object executeScriptString(String script, Map model)
throws ScriptException;
+
+ /**
+ * Registers a script implementation with the script service
+ *
+ * @param script the script implementation
+ */
+ @Auditable(parameters = {"script"})
+ public void registerScript(ScriptImplementation script);
}