/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.core.portal.page;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import org.jdom.Document;
import org.jdom.Element;
import com.enonic.cms.core.structure.portlet.PortletKey;
public abstract class PageRequestBase
implements PageRequest
{
/**
* Browser/platform constants.
*/
private final static String MSIE = "msie";
private final static String OPERA = "opera";
private final static String MOZILLA = "mozilla";
private final static String WINDOWS = "windows";
private final static String MAC = "mac";
private final static String UNIX = "unix";
private final static String UNKNOWN = "unknown";
private boolean actionRequest;
private PortletKey currentPortletKey;
private Map<String, String[]> getLocalParameterMap()
{
Map<String, String[]> map = getParameterMap();
Map<String, String[]> result = new HashMap<String, String[]>();
for ( String key : map.keySet() )
{
result.put( key, map.get( key ) );
}
return result;
}
public final String[] getHeaderNames()
{
Set<String> keys = getHeaderMap().keySet();
return keys.toArray( new String[keys.size()] );
}
public final String getHeader( String name )
{
return getHeaderMap().get( name );
}
public final String[] getParameterNames()
{
Set<String> names = getLocalParameterMap().keySet();
return names.toArray( new String[names.size()] );
}
public final String getParameter( String name )
{
String[] values = getParameterValues( name );
if ( ( values == null ) || ( values.length == 0 ) )
{
return null;
}
else
{
return values[0];
}
}
public final String getParameter( String name, String def )
{
String value = getParameter( name );
return value != null ? value : def;
}
public final String[] getParameterValues( String name )
{
return getLocalParameterMap().get( name );
}
public final String getClientType()
{
String userAgent = getHeader( "user-agent" );
if ( userAgent == null )
{
return UNKNOWN;
}
userAgent = userAgent.toLowerCase();
if ( userAgent.indexOf( MSIE ) != -1 )
{
return MSIE;
}
else if ( userAgent.indexOf( OPERA ) != -1 )
{
return OPERA;
}
else if ( userAgent.indexOf( MOZILLA ) != -1 )
{
return MOZILLA;
}
else
{
return UNKNOWN;
}
}
public final String getClientPlatform()
{
String userAgent = getHeader( "user-agent" );
if ( userAgent == null )
{
return UNKNOWN;
}
userAgent = userAgent.toLowerCase();
if ( userAgent.indexOf( "mac" ) != -1 )
{
return MAC;
}
else if ( userAgent.indexOf( "x11" ) != -1 )
{
return UNIX;
}
else if ( userAgent.indexOf( "win" ) != -1 )
{
return WINDOWS;
}
else
{
return UNKNOWN;
}
}
public final boolean isRenderRequest()
{
return !isActionRequest();
}
public final boolean isActionRequest()
{
return this.actionRequest;
}
public void setActionRequest( boolean actionRequest )
{
this.actionRequest = actionRequest;
}
public PortletKey getCurrentPortletKey()
{
return this.currentPortletKey;
}
public void setCurrentPortletKey( PortletKey value )
{
this.currentPortletKey = value;
}
public final Document getAsXml()
{
Element root = new Element( "request" );
root.addContent( new Element( "type" ).setText( isActionRequest() ? "action" : "render" ) );
root.addContent( new Element( "method" ).setText( getMethod() ) );
root.addContent( new Element( "requestUri" ).setText( getRequestUri() ) );
root.addContent( new Element( "locale" ).setText( getLocale() ) );
root.addContent( new Element( "remoteAddr" ).setText( getRemoteAddr() ) );
root.addContent( new Element( "remoteHost" ).setText( getRemoteHost() ) );
root.addContent( new Element( "profile" ).setText( getProfile() ) );
root.addContent( new Element( "clientType" ).setText( getClientType() ) );
root.addContent( new Element( "clientPlatform" ).setText( getClientPlatform() ) );
root.addContent( createHeadersXml() );
root.addContent( createParametersXml() );
return new Document( root );
}
private Element createHeadersXml()
{
Element root = new Element( "headers" );
for ( String name : getHeaderNames() )
{
root.addContent( new Element( "header" ).setAttribute( "name", name ).setText( getHeader( name ) ) );
}
return root;
}
private Element createParametersXml()
{
Element root = new Element( "parameters" );
for ( String name : getParameterNames() )
{
for ( String value : getParameterValues( name ) )
{
root.addContent( new Element( "parameter" ).setAttribute( "name", name ).setText( value ) );
}
}
return root;
}
}