Btw, why don't you use input modules instead? You could do something like this:
<map:generate src="http:/hmyserver/result?fieldtype=aFieldType&{request.queryString}"/> You can also use XPath functions to perform some special handling, e.g.: {request:translate(queryString, '&', ';')} - this will replace all ampersands by a semicolon. Konstantin ----- Original Message ----- From: "SAXESS - Hussayn Dabbous" <[EMAIL PROTECTED]> To: <[EMAIL PROTECTED]> Sent: Tuesday, February 11, 2003 14:16 Subject: enhancement of RequestParamAction > Hy, all; > > i had a problem with RequestParamAction (cocoon-2.0.4). I enclose > the Source of a slightly modified version of RequestParamAction > that solves my problem. The class is named ExtendedRequestParamAction, > i did a little of refactoring and a bit on the documentation > of the class. In case it makes sense, i would be glad if someone > could replace the body of RequestParamAction with the body of my > modified class, which is fully compatible to the original. > (I don't know how to apply a patch myself ...) > > In the following i explain, why i made the modifications: > > The problem: > ------------ > > I want to use the requestQuery of an incoming request in my sitemap > as follows: > > <map:match pattern="*/canvas/search_mask"> > <map:act type="request" > > <map:parameter name="default.fieldtype" value="required"/> > <map:generate src="http:/hmyserver/result{requestQuery}"/> > </map:act> > <map:serialize type = "xml"/> > </map:match> > > This would forward the GET parameters of the original request to the > HTTP call for the src in map:generate. > In addition i want to forward the parameter fieldtype. How would i do > this with RequestParamAction ? > > The RequestParamAction can't help me there because: > > 1.) It won't add the fieldtype to the requestQuery automatically. > so i must add it myself, e.g. like this: > > <map:generate > src="http:/hmyserver/result{requestQuery}&fieldtype={fieldtype}"/> > > This fails, if {requestQuery} happens to be empty. Due to the > treatment of requestQuery in the code i would miss the > beginning "?" of my querylist in that case. > > <map:generate > src="http:/hmyserver/result?fieldtype={fieldtype}&{requestQuery}"/> > > wouldn't work either. In this case i would end with duplicate "?", > if requestQuery is NOT empty. > > 2.) I could use the parameters="true": > > <map:act type="request" > > <map:parameter name="default.fieldtype" value="required"/> > <map:parameter name="parameters" value="true"/> > <map:generate ... > > Then i need to know exactly, which parameters are given in the > original request and i would need to specify each parameter > in the sitemap, which i don't want (i even don't know, which > parameters are enclosed in the list). > > > the solution > ------------ > > In order to get around this problem i added a new parameter named > "usedefaults". If this parameter is given in the sitemap, then > all default parameters, which are not allready set in the query are > automatically added to the requestQuery string. > > By this i can now setup my sitemap as follows: > > <map:match pattern="*/canvas/search_mask"> > <map:act type="request" > > <map:parameter name="usedefault" value="true"/> > <map:parameter name="default.fieldtype" value="required"/> > <map:generate src="http:/hmyserver/result.jsp{requestQuery}"/> > </map:act> > <map:serialize type = "xml"/> > </map:match> > > and i am shure, fieldtype is enclosed in the requestQuery, either > from the request itself, or added by the action. > > limitations > ----------- > > default parameters are always added after the original queryString, > hence i have no control of the insertion place in the queryList. This > may be necessary in some pathological cases. > > > regards, Hussayn > ---------------------------------------------------------------------------- ---- > /* > > ============================================================================ > The Apache Software License, Version 1.1 > ============================================================================ > > Copyright (C) 1999-2002 The Apache Software Foundation. All rights reserved. > > Redistribution and use in source and binary forms, with or without modifica- > tion, are permitted provided that the following conditions are met: > > 1. Redistributions of source code must retain the above copyright notice, > this list of conditions and the following disclaimer. > > 2. Redistributions in binary form must reproduce the above copyright notice, > this list of conditions and the following disclaimer in the documentation > and/or other materials provided with the distribution. > > 3. The end-user documentation included with the redistribution, if any, must > include the following acknowledgment: "This product includes software > developed by the Apache Software Foundation (http://www.apache.org/)." > Alternately, this acknowledgment may appear in the software itself, if > and wherever such third-party acknowledgments normally appear. > > 4. The names "Apache Cocoon" and "Apache Software Foundation" must not be > used to endorse or promote products derived from this software without > prior written permission. For written permission, please contact > [EMAIL PROTECTED] > > 5. Products derived from this software may not be called "Apache", nor may > "Apache" appear in their name, without prior written permission of the > Apache Software Foundation. > > THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, > INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND > FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE > APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, > INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU- > DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS > OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON > ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT > (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF > THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. > > This software consists of voluntary contributions made by many individuals > on behalf of the Apache Software Foundation and was originally created by > Stefano Mazzocchi <[EMAIL PROTECTED]>. For more information on the Apache > Software Foundation, please see <http://www.apache.org/>. > > */ > package org.apache.cocoon.acting; > > /* > * Standard imports > */ > import org.apache.avalon.framework.parameters.Parameters; > import org.apache.avalon.framework.thread.ThreadSafe; > import org.apache.cocoon.Constants; > import org.apache.cocoon.environment.ObjectModelHelper; > import org.apache.cocoon.environment.Redirector; > import org.apache.cocoon.environment.Request; > import org.apache.cocoon.environment.SourceResolver; > > import java.util.Enumeration; > import java.util.HashMap; > import java.util.Map; > > /** > * This action makes some request details available to the sitemap via parameter > * substitution. Within this action context following parameters get available: > * > * > * OUPTUT PARAMETERS > * ================= > * output parameters available within the action context: > * > * {context} - is the context path of the servlet (usually "/cocoon") > * {requestURI} - is the requested URI without parameters > * {requestQuery} - is the query string like "?param1=test" if there are > * GET params available > * > * These parameters are always available. > * > * > * CONTROL PARAMETERS > * ================== > * The action can be further controlled via sitemap arameters: > * > * sitemap parameters: > * > * parameters="true" - all request parameters are made available as > * sitemap params using their names. > * usedefaults="true" - default values (see below) will be added to > * requestQuery if not allready exisiting in requestQuery > * > * All control parameters can be used in parallel. > * > * > * CREATING DEFAULT VALUES > * ======================= > * Default values can be set for request parameters, by including > * sitemap parameters following the syntax "default.<parameter-name>". > * > * > * Sitemap definition: > * > * <pre> > * <map:action name="request" src="org.apache.cocoon.acting.ExtendedRequestParamAction"/> > * </pre> > * > * <p> > * > * Example use: > * > * <pre> > * <map:match pattern="some-resource"> > * <map:act type="request"> > * <map:parameter name="parameters" value="true"/> > * <map:parameter name="default.dest" value="invalid-destination.html"/> > * <map:redirect-to uri="{context}/somewhereelse/{dest}"/> > * </map:act> > * </map:match> > * </pre> > * > * Redirection is only one example, another use: > * > * <pre> > * <map:match pattern="some-resource"> > * <map:act type="request"> > * <map:parameter name="parameters" value="true"/> > * <map:generate src="users/menu-{id}.xml"/> > * </map:act> > * <map:transform src="menus/personalisation.xsl"/> > * <map:serialize/> > * </map:match> > * </pre> > * > * etc, etc. > * > * @author <a href="mailto:[EMAIL PROTECTED]">Marcus Crafter</a> > * @author <a href="mailto:[EMAIL PROTECTED]">Torsten Curdt</a> > * @author <a href="mailto:[EMAIL PROTECTED]">Hussayn Dabbous</a> > */ > public class ExtendedRequestParamAction extends ComposerAction implements ThreadSafe { > > public final static String MAP_URI = "requestURI"; > public final static String MAP_QUERY = "requestQuery"; > public final static String MAP_CONTEXTPATH = "context"; > > public final static String PARAM_PARAMETERS = "parameters"; > public final static String PARAM_USEDEFAULTS = "usedefaults"; > public final static String PARAM_DEFAULT_PREFIX = "default."; > > > public Map act( Redirector redirector, SourceResolver resolver, Map objectModel, String source, Parameters param ) > throws Exception > { > > Request request = ObjectModelHelper.getRequest(objectModel); > if (request == null) { > getLogger().error("RequestInfoAction: no request object!"); > return(null); > } > > Map map = new HashMap(); > > map.put(MAP_URI, request.getRequestURI()); > map.put(MAP_CONTEXTPATH, request.getContextPath()); > > String query = request.getQueryString(); > > boolean usedefaults = ("true".equalsIgnoreCase(param.getParameter(PARAM_USEDEFAULTS, null))); > boolean setparams = ("true".equalsIgnoreCase(param.getParameter(PARAM_PARAMETERS, null))); > if (setparams){ > Enumeration e = request.getParameterNames(); > while(e.hasMoreElements()){ > String name = (String) e.nextElement(); > String value = request.getParameter(name); > > if (value != null && !map.containsKey(name)){ > map.put(name, value); > } > } > } > > if(setparams || usedefaults) { > String[] paramNames = param.getNames(); > for (int i=0; i< paramNames.length; i++) { > if (paramNames[i].startsWith(PARAM_DEFAULT_PREFIX) && > (request.getParameter(paramNames[i].substring(PARAM_DEFAULT_PREFIX.length()) ) == null)) { > String name = paramNames[i].substring(PARAM_DEFAULT_PREFIX.length()); > String value= param.getParameter(paramNames[i]); > if(setparams) map.put(name, value); > if(usedefaults){ > if(query==null) query=""; else query +="&"; > query += name+"="+value; > } > } > } > } > > if (query != null && query.length() > 0){ > map.put(MAP_QUERY, "?" + query); > } > else{ > map.put(MAP_QUERY, ""); > } > return(map); > } > } > > ---------------------------------------------------------------------------- ---- > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, email: [EMAIL PROTECTED] --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, email: [EMAIL PROTECTED]