Merged V2.1 to HEAD

6386: Fix for AR-1649
   6387: Fix for AR-1645
   6388: Updated Polish messages
   6389: Updated security providers
   6392: Add support to log in as guest with any password (if guest is allowed)
   6393: AR-1562 : Cannot directly exit/disable Alfresco JavaScript Debugger window
   6394: Allow creation of PropertyValue persisted properties without knowing the type QName
   6397: Log Serializable properties don't cause infinte waits
   6398: Build fix and tidy up for authentication chaining
            Resolved conflicted state of 'root\projects\repository\source\java\org\alfresco\repo\security\authentication\AuthenticationUtil.java'
   6402: AR-1643 Web Script args object does not handle multi-value arguments
   6407: Removed use of QName "{}silly" as a data type definition.


git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@6728 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Derek Hulley
2007-09-10 15:41:43 +00:00
parent af8a90ab45
commit 4196f83edb
5 changed files with 131 additions and 9 deletions

View File

@@ -29,11 +29,13 @@ import java.io.Writer;
import java.util.Arrays; import java.util.Arrays;
import java.util.Date; import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.Iterator;
import java.util.Map; import java.util.Map;
import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import org.alfresco.repo.jscript.Scopeable;
import org.alfresco.repo.jscript.ScriptableHashMap; import org.alfresco.repo.jscript.ScriptableHashMap;
import org.alfresco.repo.template.AbsoluteUrlMethod; import org.alfresco.repo.template.AbsoluteUrlMethod;
import org.alfresco.service.ServiceRegistry; 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.alfresco.web.scripts.WebScriptDescription.RequiredTransaction;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; 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 * @param req Web Script Request
* @return argument map * @return argument map
*/ */
final protected Map<String, String> createArgModel(WebScriptRequest req) final protected Map<String, String> createScriptArgs(WebScriptRequest req)
{ {
Map<String, String> args = new ScriptableHashMap<String, String>(); Map<String, String> args = new ScriptableHashMap<String, String>();
String[] names = req.getParameterNames(); String[] names = req.getParameterNames();
for (String name : names) for (String name : names)
{ {
args.put(name, req.getParameter(name)); args.put(name, req.getParameter(name));
} }
return args; return args;
} }
/**
* Create a map of arguments from Web Script Request (for templating)
*
* @param req Web Script Request
* @return argument map
*/
final protected Map<String, String> createTemplateArgs(WebScriptRequest req)
{
Map<String, String> args = new HashMap<String, String>();
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<String, Map<String, String>> createScriptArgsM(WebScriptRequest req)
{
Map<String, Map<String, String>> args = new ScriptableHashMap<String, Map<String, String>>();
String[] names = req.getParameterNames();
for (String name : names)
{
ScriptableHashMap<String, String> values = new ScriptableHashMap<String, String>();
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<String, String[]> createTemplateArgsM(WebScriptRequest req)
{
Map<String, String[]> args = new HashMap<String, String[]>();
String[] names = req.getParameterNames();
for (String name : names)
{
args.put(name, req.getParameterValues(name));
}
return args;
}
/** /**
* Create a model for script usage * Create a model for script usage
* *
@@ -242,7 +303,8 @@ public abstract class AbstractWebScript implements WebScript
} }
// add web script context // add web script context
model.put("args", createArgModel(req)); model.put("args", createScriptArgs(req));
model.put("argsM", createScriptArgsM(req));
if (req instanceof WebScriptServletRequest) if (req instanceof WebScriptServletRequest)
{ {
model.put("formdata", new FormData(((WebScriptServletRequest)req).getHttpServletRequest())); model.put("formdata", new FormData(((WebScriptServletRequest)req).getHttpServletRequest()));
@@ -298,7 +360,8 @@ public abstract class AbstractWebScript implements WebScript
} }
// add web script context // 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("guest", req.isGuest());
model.put("url", new URLModel(req)); model.put("url", new URLModel(req));
model.put("webscript", getDescription()); model.put("webscript", getDescription());

View File

@@ -106,6 +106,17 @@ public interface WebScriptRequest
* @return parameter value (or null, if parameter does not exist) * @return parameter value (or null, if parameter does not exist)
*/ */
public String getParameter(String name); 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 * Gets the path extension beyond the path registered for this service

View File

@@ -179,6 +179,14 @@ public class WebScriptServletRequest extends WebScriptRequestImpl
return req.getParameter(name); 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 * Get User Agent
* *

View File

@@ -24,7 +24,9 @@
*/ */
package org.alfresco.web.scripts; package org.alfresco.web.scripts;
import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
@@ -43,6 +45,7 @@ public abstract class WebScriptURLRequest extends WebScriptRequestImpl
protected String pathInfo; protected String pathInfo;
protected String queryString; protected String queryString;
protected Map<String, String> queryArgs; protected Map<String, String> queryArgs;
protected Map<String, List<String>> queryArgsMulti;
/** Service bound to this request */ /** Service bound to this request */
protected WebScriptMatch serviceMatch; protected WebScriptMatch serviceMatch;
@@ -111,14 +114,27 @@ public abstract class WebScriptURLRequest extends WebScriptRequestImpl
this.pathInfo = scriptUrlParts[2]; this.pathInfo = scriptUrlParts[2];
this.queryString = scriptUrlParts[3]; this.queryString = scriptUrlParts[3];
this.queryArgs = new HashMap<String, String>(); this.queryArgs = new HashMap<String, String>();
this.queryArgsMulti = new HashMap<String, List<String>>();
if (this.queryString != null) if (this.queryString != null)
{ {
String[] args = this.queryString.split("&"); String[] args = this.queryString.split("&");
for (String arg : args) for (String arg : args)
{ {
String[] parts = arg.split("="); String[] parts = arg.split("=");
// TODO: Handle multi-value parameters if (this.queryArgs.containsKey(parts[0]))
this.queryArgs.put(parts[0], parts.length == 2 ? parts[1] : ""); {
List<String> values = this.queryArgsMulti.get(parts[0]);
if (values == null)
{
values = new ArrayList<String>();
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; this.serviceMatch = serviceMatch;
@@ -198,4 +214,28 @@ public abstract class WebScriptURLRequest extends WebScriptRequestImpl
{ {
return queryArgs.get(name); return queryArgs.get(name);
} }
/* (non-Javadoc)
* @see org.alfresco.web.scripts.WebScriptRequest#getArrayParameter(java.lang.String)
*/
public String[] getParameterValues(String name)
{
List<String> 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;
}
} }

View File

@@ -151,7 +151,7 @@ public class KeywordSearch extends DeclarativeWebScript
// construct search statement // construct search statement
String[] terms = searchTerms.split(" "); String[] terms = searchTerms.split(" ");
Map<String, Object> statementModel = new HashMap<String, Object>(7, 1.0f); Map<String, Object> statementModel = new HashMap<String, Object>(7, 1.0f);
statementModel.put("args", createArgModel(req)); statementModel.put("args", createTemplateArgs(req));
statementModel.put("terms", terms); statementModel.put("terms", terms);
Writer queryWriter = new StringWriter(1024); Writer queryWriter = new StringWriter(1024);
renderFormatTemplate(QUERY_FORMAT, statementModel, queryWriter); renderFormatTemplate(QUERY_FORMAT, statementModel, queryWriter);