You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tapestry.apache.org by Martin Carel <ma...@pricerunner.com> on 2006/02/05 18:32:25 UTC
Avoiding query string parameters with same name in URI
Hi!
I have had problems lately with the fact that the DirectLink component
uses service parameters with all the same parameter names
(ServiceConstants.PARAMETER, that is, "sp"). This is in fact a problem
for me, as I have a servlet filter which wraps any request and puts all
the query string values into a Map (so if query string parameters have
the same name, only one gets in the Map). Right now, I cannot afford to
change this (probably problematic) behaviour.
The contrib:Table component uses for instance 2 service parameters
(sp=value1&sp=value2) for its sorting and paging features. Somehow, I
needed to have different query string parameter names for each service
parameters. So I had the courage to do a *really ugly* patch in
LinkFactoryImpl, which so far meets my needs (sorting and paging now
works fine with my contrib:Table). Here is what it looks like:
protected void squeezeServiceParameters(Map parameters)
{
Object[] serviceParameters = (Object[])
parameters.get(ServiceConstants.PARAMETER);
if (serviceParameters == null)
return;
String[] squeezed = squeeze(serviceParameters);
//** BEGIN patch **
if(squeezed.length == 2){
parameters.put(ServiceConstants.PARAMETER + "1", squeezed[0]);
parameters.put(ServiceConstants.PARAMETER + "2", squeezed[1]);
parameters.remove(ServiceConstants.PARAMETER);
}else
//** END patch **
parameters.put(ServiceConstants.PARAMETER, squeezed);
}
public Object[] extractListenerParameters(IRequestCycle cycle)
{
String[] squeezed =
cycle.getParameters(ServiceConstants.PARAMETER);
//** BEGIN patch **
String s1 = cycle.getParameter(ServiceConstants.PARAMETER + "1");
if(s1 != null){
String s2 = cycle.getParameter(ServiceConstants.PARAMETER + "2");
squeezed = new String[]{s1, s2};
}
//** END patch **
if (Tapestry.size(squeezed) == 0)
return EMPTY;
try
{
return _dataSqueezer.unsqueeze(squeezed);
}
catch (Exception ex)
{
throw new ApplicationRuntimeException(ex);
}
}
If you would have a better solution for me, which would enable different
query string parameter names for service parameters (instead of reusing
"sp"), I'm open to your suggestions! Otherwise, would you see how my
patch could break some other code elsewhere?
/Martin
---------------------------------------------------------------------
To unsubscribe, e-mail: tapestry-user-unsubscribe@jakarta.apache.org
For additional commands, e-mail: tapestry-user-help@jakarta.apache.org
Re: Avoiding query string parameters with same name in URI
Posted by Martin Carel <ma...@pricerunner.com>.
Hi folks!
This is no more an issue for me.
The problematic behaviour from the filter preventing the possibility to
have several query string parameters with the same name has been fixed.
In consequences, I removed my ugly patch!
/Martin
Martin Carel wrote:
> Hi!
>
> I have had problems lately with the fact that the DirectLink component
> uses service parameters with all the same parameter names
> (ServiceConstants.PARAMETER, that is, "sp"). This is in fact a problem
> for me, as I have a servlet filter which wraps any request and puts
> all the query string values into a Map (so if query string parameters
> have the same name, only one gets in the Map). Right now, I cannot
> afford to change this (probably problematic) behaviour.
>
> The contrib:Table component uses for instance 2 service parameters
> (sp=value1&sp=value2) for its sorting and paging features. Somehow, I
> needed to have different query string parameter names for each service
> parameters. So I had the courage to do a *really ugly* patch in
> LinkFactoryImpl, which so far meets my needs (sorting and paging now
> works fine with my contrib:Table). Here is what it looks like:
>
> protected void squeezeServiceParameters(Map parameters)
> {
> Object[] serviceParameters = (Object[])
> parameters.get(ServiceConstants.PARAMETER);
>
> if (serviceParameters == null)
> return;
>
> String[] squeezed = squeeze(serviceParameters);
>
> //** BEGIN patch **
> if(squeezed.length == 2){
> parameters.put(ServiceConstants.PARAMETER + "1", squeezed[0]);
> parameters.put(ServiceConstants.PARAMETER + "2", squeezed[1]);
> parameters.remove(ServiceConstants.PARAMETER);
> }else
> //** END patch **
> parameters.put(ServiceConstants.PARAMETER, squeezed);
> }
>
> public Object[] extractListenerParameters(IRequestCycle cycle)
> {
> String[] squeezed =
> cycle.getParameters(ServiceConstants.PARAMETER);
> //** BEGIN patch **
> String s1 = cycle.getParameter(ServiceConstants.PARAMETER + "1");
> if(s1 != null){ String s2 =
> cycle.getParameter(ServiceConstants.PARAMETER + "2");
> squeezed = new String[]{s1, s2};
> }
> //** END patch **
> if (Tapestry.size(squeezed) == 0)
> return EMPTY;
> try
> {
> return _dataSqueezer.unsqueeze(squeezed);
> }
> catch (Exception ex)
> {
> throw new ApplicationRuntimeException(ex);
> }
> }
>
>
> If you would have a better solution for me, which would enable
> different query string parameter names for service parameters (instead
> of reusing "sp"), I'm open to your suggestions! Otherwise, would you
> see how my patch could break some other code elsewhere?
>
> /Martin
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: tapestry-user-unsubscribe@jakarta.apache.org
> For additional commands, e-mail: tapestry-user-help@jakarta.apache.org
>
---------------------------------------------------------------------
To unsubscribe, e-mail: tapestry-user-unsubscribe@jakarta.apache.org
For additional commands, e-mail: tapestry-user-help@jakarta.apache.org