/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.core;
import java.util.Collection;
import java.util.Collections;
import java.util.Map;
import java.util.SortedMap;
import java.util.TreeMap;
import org.apache.commons.lang.StringUtils;
import org.springframework.util.Assert;
public class RequestParameters
{
private SortedMap<String, Param> parameters;
public RequestParameters()
{
this.parameters = new TreeMap<String, Param>();
}
public RequestParameters( Map<String, String[]> params )
{
this();
if ( params != null )
{
for ( Map.Entry<String, String[]> entry : params.entrySet() )
{
this.parameters.put( entry.getKey(), new Param( entry.getKey(), entry.getValue() ) );
}
}
}
public RequestParameters( RequestParameters requestParameters )
{
parameters = new TreeMap<String, Param>();
for ( Param param : requestParameters.parameters.values() )
{
parameters.put( param.getName(), param );
}
}
public Collection<Param> getParameters()
{
return parameters.values();
}
public Param getParameter( String paramName )
{
return parameters.get( paramName );
}
public int getParameterCount()
{
return this.parameters.size();
}
public String[] getParameterNames()
{
return this.parameters.keySet().toArray( new String[this.parameters.size()] );
}
public boolean hasParameter( String name )
{
return this.parameters.containsKey( name );
}
public String getParameterValue( String name )
{
final Param param = this.parameters.get( name );
if ( param == null )
{
return null;
}
return param.getFirstValue();
}
public String[] getParameterValues( String name )
{
final Param param = this.parameters.get( name );
if ( param == null )
{
return null;
}
return param.getValues();
}
public String getParameterValuesAsCommaSeparatedString( String parameterName )
{
Param param = parameters.get( parameterName );
if ( param == null )
{
return null;
}
return param.getParameterValuesAsCommaSeparatedString();
}
public void setParameterValue( String name, String value )
{
if ( value != null )
{
setParameterValues( name, new String[]{value} );
}
}
public void setParameterValues( String name, String[] values )
{
if ( ( values != null ) && ( values.length > 0 ) )
{
this.parameters.put( name, new Param( name, values ) );
}
else
{
this.parameters.remove( name );
}
}
public void setParam( Param param )
{
this.parameters.put( param.getName(), param );
}
public void addParameterValue( String name, String value )
{
if ( value != null )
{
addParameterValues( name, new String[]{value} );
}
}
public void addParameterValues( String name, String[] values )
{
if ( ( values != null ) && ( values.length > 0 ) )
{
Param existingParam = this.parameters.get( name );
if ( existingParam != null )
{
this.parameters.put( name, existingParam.addValues( values ) );
}
else
{
this.parameters.put( name, new Param( name, values ) );
}
}
}
public void removeParameter( String name )
{
this.parameters.remove( name );
}
public RequestParameters copy()
{
return new RequestParameters( this );
}
public boolean hasParameters()
{
return parameters.size() > 0;
}
/**
* Return the parameters formatted as in a http request.
*/
public String getAsString( boolean startWithQuestionMark )
{
RequestParametersToStringBuilder builder = new RequestParametersToStringBuilder();
builder.setStartWithQuestionMark( startWithQuestionMark );
return builder.toString( this );
}
public SortedMap<String, Param> getAsMap()
{
return Collections.unmodifiableSortedMap( parameters );
}
public SortedMap<String, String[]> getAsMapWithStringValues()
{
SortedMap<String, String[]> map = new TreeMap<String, String[]>();
for ( Param param : parameters.values() )
{
map.put( param.getName(), param.getValues() );
}
return map;
}
public class Param
{
private String name;
private String[] values;
public Param( String name, String value )
{
Assert.notNull( name, "name cannot be null" );
Assert.notNull( value, "value cannot be null" );
this.name = name;
this.values = new String[]{value};
}
public Param( String name, String[] values )
{
Assert.notNull( name, "name cannot be null" );
Assert.notNull( values, "values cannot be null" );
this.name = name;
this.values = values;
}
public String getName()
{
return name;
}
public String[] getValues()
{
return values;
}
public Param addValues( String[] values )
{
String[] existingValueArray = this.values;
String[] newValueArray = new String[existingValueArray.length + values.length];
System.arraycopy( existingValueArray, 0, newValueArray, 0, existingValueArray.length );
System.arraycopy( values, 0, newValueArray, existingValueArray.length, values.length );
return new Param( name, newValueArray );
}
public String getFirstValue()
{
if ( values.length == 0 )
{
return null;
}
return values[0];
}
public boolean isEmpty()
{
if ( values.length == 0 )
{
return true;
}
for ( String v : values )
{
if ( !StringUtils.isEmpty( v ) )
{
return false;
}
}
return true;
}
public String getParameterValuesAsCommaSeparatedString()
{
StringBuffer s = new StringBuffer( "" );
for ( int i = 0; i < values.length; i++ )
{
String v = values[i];
s.append( v );
if ( i < values.length - 1 )
{
s.append( "," );
}
}
return s.toString();
}
public String toString()
{
if ( isEmpty() )
{
return "[]";
}
StringBuffer s = new StringBuffer();
s.append( "[" );
for ( int i = 0; i < values.length; i++ )
{
String v = values[i];
s.append( v );
if ( i < values.length - 1 )
{
s.append( "," );
}
}
s.append( "]" );
return s.toString();
}
}
}