diff --git a/source/java/org/alfresco/web/scripts/AbstractWebScript.java b/source/java/org/alfresco/web/scripts/AbstractWebScript.java index 7ca67434a0..093c933074 100644 --- a/source/java/org/alfresco/web/scripts/AbstractWebScript.java +++ b/source/java/org/alfresco/web/scripts/AbstractWebScript.java @@ -29,11 +29,13 @@ import java.io.Writer; import java.util.Arrays; import java.util.Date; import java.util.HashMap; +import java.util.Iterator; import java.util.Map; import java.util.concurrent.locks.ReentrantReadWriteLock; import javax.servlet.http.HttpServletResponse; +import org.alfresco.repo.jscript.Scopeable; import org.alfresco.repo.jscript.ScriptableHashMap; import org.alfresco.repo.template.AbsoluteUrlMethod; import org.alfresco.service.ServiceRegistry; @@ -50,6 +52,8 @@ import org.alfresco.web.scripts.WebScriptDescription.RequiredAuthentication; import org.alfresco.web.scripts.WebScriptDescription.RequiredTransaction; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.mozilla.javascript.Context; +import org.mozilla.javascript.Scriptable; /** @@ -189,22 +193,79 @@ public abstract class AbstractWebScript implements WebScript // /** - * Create a map of arguments from Web Script Request + * Create a map of arguments from Web Script Request (for scripting) * * @param req Web Script Request * @return argument map */ - final protected Map createArgModel(WebScriptRequest req) + final protected Map createScriptArgs(WebScriptRequest req) { Map args = new ScriptableHashMap(); String[] names = req.getParameterNames(); for (String name : names) { - args.put(name, req.getParameter(name)); + args.put(name, req.getParameter(name)); } return args; } - + + /** + * Create a map of arguments from Web Script Request (for templating) + * + * @param req Web Script Request + * @return argument map + */ + final protected Map createTemplateArgs(WebScriptRequest req) + { + Map args = new HashMap(); + String[] names = req.getParameterNames(); + for (String name : names) + { + args.put(name, req.getParameter(name)); + } + return args; + } + + /** + * Create a map of (array) arguments from Web Script Request (for scripting) + * + * @param req Web Script Request + * @return argument map + */ + final protected Map> createScriptArgsM(WebScriptRequest req) + { + Map> args = new ScriptableHashMap>(); + String[] names = req.getParameterNames(); + for (String name : names) + { + ScriptableHashMap values = new ScriptableHashMap(); + int i = 0; + for (String value : req.getParameterValues(name)) + { + values.put(new Integer(i++).toString(), value); + } + args.put(name, values); + } + return args; + } + + /** + * Create a map of (array) arguments from Web Script Request (for scripting) + * + * @param req Web Script Request + * @return argument map + */ + final protected Map createTemplateArgsM(WebScriptRequest req) + { + Map args = new HashMap(); + String[] names = req.getParameterNames(); + for (String name : names) + { + args.put(name, req.getParameterValues(name)); + } + return args; + } + /** * Create a model for script usage * @@ -242,7 +303,8 @@ public abstract class AbstractWebScript implements WebScript } // add web script context - model.put("args", createArgModel(req)); + model.put("args", createScriptArgs(req)); + model.put("argsM", createScriptArgsM(req)); if (req instanceof WebScriptServletRequest) { model.put("formdata", new FormData(((WebScriptServletRequest)req).getHttpServletRequest())); @@ -298,7 +360,8 @@ public abstract class AbstractWebScript implements WebScript } // add web script context - model.put("args", createArgModel(req)); + model.put("args", createTemplateArgs(req)); + model.put("argsM", createTemplateArgsM(req)); model.put("guest", req.isGuest()); model.put("url", new URLModel(req)); model.put("webscript", getDescription()); diff --git a/source/java/org/alfresco/web/scripts/WebScriptRequest.java b/source/java/org/alfresco/web/scripts/WebScriptRequest.java index b68ff21253..2b9ae1871e 100644 --- a/source/java/org/alfresco/web/scripts/WebScriptRequest.java +++ b/source/java/org/alfresco/web/scripts/WebScriptRequest.java @@ -106,6 +106,17 @@ public interface WebScriptRequest * @return parameter value (or null, if parameter does not exist) */ public String getParameter(String name); + + /** + * Gets the (array) value of the named parameter + * + * Note: An array of one item is returned when a "single value" named parameter + * is requested + * + * @param name parameter name + * @return array of values (or null, if parameter does not exist) + */ + public String[] getParameterValues(String name); /** * Gets the path extension beyond the path registered for this service diff --git a/source/java/org/alfresco/web/scripts/WebScriptServletRequest.java b/source/java/org/alfresco/web/scripts/WebScriptServletRequest.java index d434dfe53e..1854f4c1f3 100644 --- a/source/java/org/alfresco/web/scripts/WebScriptServletRequest.java +++ b/source/java/org/alfresco/web/scripts/WebScriptServletRequest.java @@ -179,6 +179,14 @@ public class WebScriptServletRequest extends WebScriptRequestImpl return req.getParameter(name); } + /* (non-Javadoc) + * @see org.alfresco.web.scripts.WebScriptRequest#getArrayParameter(java.lang.String) + */ + public String[] getParameterValues(String name) + { + return req.getParameterValues(name); + } + /** * Get User Agent * diff --git a/source/java/org/alfresco/web/scripts/WebScriptURLRequest.java b/source/java/org/alfresco/web/scripts/WebScriptURLRequest.java index 46ee24699a..b2e048564c 100644 --- a/source/java/org/alfresco/web/scripts/WebScriptURLRequest.java +++ b/source/java/org/alfresco/web/scripts/WebScriptURLRequest.java @@ -24,7 +24,9 @@ */ package org.alfresco.web.scripts; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.Set; @@ -43,6 +45,7 @@ public abstract class WebScriptURLRequest extends WebScriptRequestImpl protected String pathInfo; protected String queryString; protected Map queryArgs; + protected Map> queryArgsMulti; /** Service bound to this request */ protected WebScriptMatch serviceMatch; @@ -111,14 +114,27 @@ public abstract class WebScriptURLRequest extends WebScriptRequestImpl this.pathInfo = scriptUrlParts[2]; this.queryString = scriptUrlParts[3]; this.queryArgs = new HashMap(); + this.queryArgsMulti = new HashMap>(); if (this.queryString != null) { String[] args = this.queryString.split("&"); for (String arg : args) { String[] parts = arg.split("="); - // TODO: Handle multi-value parameters - this.queryArgs.put(parts[0], parts.length == 2 ? parts[1] : ""); + if (this.queryArgs.containsKey(parts[0])) + { + List values = this.queryArgsMulti.get(parts[0]); + if (values == null) + { + values = new ArrayList(); + this.queryArgsMulti.put(parts[0], values); + } + values.add(parts.length == 2 ? parts[1] : ""); + } + else + { + this.queryArgs.put(parts[0], parts.length == 2 ? parts[1] : ""); + } } } this.serviceMatch = serviceMatch; @@ -198,4 +214,28 @@ public abstract class WebScriptURLRequest extends WebScriptRequestImpl { return queryArgs.get(name); } + + /* (non-Javadoc) + * @see org.alfresco.web.scripts.WebScriptRequest#getArrayParameter(java.lang.String) + */ + public String[] getParameterValues(String name) + { + List values = queryArgsMulti.get(name); + if (values != null) + { + String[] array = new String[values.size()]; + values.toArray(array); + return array; + } + else + { + String value = queryArgs.get(name); + if (value != null) + { + return new String[]{value}; + } + } + return null; + } + } diff --git a/source/java/org/alfresco/web/scripts/bean/KeywordSearch.java b/source/java/org/alfresco/web/scripts/bean/KeywordSearch.java index 9b973bda9a..9936647c15 100644 --- a/source/java/org/alfresco/web/scripts/bean/KeywordSearch.java +++ b/source/java/org/alfresco/web/scripts/bean/KeywordSearch.java @@ -151,7 +151,7 @@ public class KeywordSearch extends DeclarativeWebScript // construct search statement String[] terms = searchTerms.split(" "); Map statementModel = new HashMap(7, 1.0f); - statementModel.put("args", createArgModel(req)); + statementModel.put("args", createTemplateArgs(req)); statementModel.put("terms", terms); Writer queryWriter = new StringWriter(1024); renderFormatTemplate(QUERY_FORMAT, statementModel, queryWriter);