/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.core.resolver;
import java.util.Enumeration;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.enonic.esl.util.StringUtil;
import com.enonic.cms.framework.xml.XMLBuilder;
import com.enonic.cms.core.Attribute;
import com.enonic.cms.core.SiteURLResolver;
import com.enonic.cms.core.structure.SitePath;
@Component
public class ResolverHttpRequestInputCreator
{
public static final String USER_AGENT_HEADER_NAME = "user-agent";
public static final String ACCEPT_LANGUAGE_HEADER_NAME = "accept-language";
public static final String REFERER_HEADER_NAME = "referer";
private SiteURLResolver siteUrlResolver;
public ResolverHttpRequestInput createResolverHttpRequestInput( HttpServletRequest request )
{
ResolverHttpRequestInput resolverHttpRequestInput = new ResolverHttpRequestInput();
if ( request != null )
{
addUserAgent( request, resolverHttpRequestInput );
addReferrer( request, resolverHttpRequestInput );
addIP( request, resolverHttpRequestInput );
addURI( request, resolverHttpRequestInput );
addProtocol( request, resolverHttpRequestInput );
addVirtualHostAndPort( request, resolverHttpRequestInput );
addResourcePath( request, resolverHttpRequestInput );
addParameters( request, resolverHttpRequestInput );
addAccept( request, resolverHttpRequestInput );
addCookies( request, resolverHttpRequestInput );
addHttpHeaders( request, resolverHttpRequestInput );
}
return resolverHttpRequestInput;
}
private void addUserAgent( HttpServletRequest request, ResolverHttpRequestInput resolverHttpRequestInput )
{
resolverHttpRequestInput.setUserAgent( request.getHeader( USER_AGENT_HEADER_NAME ) );
}
private void addReferrer( HttpServletRequest request, ResolverHttpRequestInput resolverHttpRequestInput )
{
resolverHttpRequestInput.setReferrer( request.getHeader( REFERER_HEADER_NAME ) );
}
private void addIP( HttpServletRequest request, ResolverHttpRequestInput resolverHttpRequestInput )
{
resolverHttpRequestInput.setIp( request.getRemoteAddr() );
}
private void addURI( HttpServletRequest request, ResolverHttpRequestInput resolverHttpRequestInput )
{
String uri = buildUrlForVerticalContextQueryString( request );
resolverHttpRequestInput.setUri( uri );
}
private void addProtocol( HttpServletRequest request, ResolverHttpRequestInput resolverHttpRequestInput )
{
resolverHttpRequestInput.setProtocol( request.getProtocol() );
}
private void addVirtualHostAndPort( HttpServletRequest request, ResolverHttpRequestInput resolverHttpRequestInput )
{
String server = request.getServerName();
resolverHttpRequestInput.setVirtualHost( server );
Integer port = request.getServerPort();
if ( port != null )
{
resolverHttpRequestInput.setPort( port );
}
}
private void addResourcePath( HttpServletRequest request, ResolverHttpRequestInput resolverHttpRequestInput )
{
String servletPath = buildServletPathForVerticalContextQueryString( request );
resolverHttpRequestInput.setResourcePath( servletPath );
}
private void addParameters( HttpServletRequest request, ResolverHttpRequestInput resolverHttpRequestInput )
{
Enumeration parameterNames = request.getParameterNames();
while ( parameterNames.hasMoreElements() )
{
String parameterName = (String) parameterNames.nextElement();
resolverHttpRequestInput.addParameter( parameterName, request.getParameter( parameterName ) );
}
}
private void addAccept( HttpServletRequest request, ResolverHttpRequestInput resolverHttpRequestInput )
{
String acceptLanguage = request.getHeader( ACCEPT_LANGUAGE_HEADER_NAME );
if ( acceptLanguage != null )
{
String[] languages = StringUtil.splitString( acceptLanguage, "," );
for ( String language : languages )
{
if ( language.indexOf( ";" ) > 0 )
{
String quality = language.substring( language.indexOf( ";" ) + 3 );
String languageValue = language.substring( 0, language.indexOf( ";" ) );
resolverHttpRequestInput.addAcceptLanguage( languageValue, quality );
}
else
{
resolverHttpRequestInput.addAcceptLanguage( language, null );
}
}
}
}
private void addCookies( HttpServletRequest request, ResolverHttpRequestInput resolverHttpRequestInput )
{
Cookie[] cookies = request.getCookies();
if ( cookies != null )
{
for ( Cookie cookie : cookies )
{
String cookieName = cookie.getName();
resolverHttpRequestInput.addCookie( cookieName, cookie.getValue() );
}
}
}
private void addHttpHeaders( HttpServletRequest request, ResolverHttpRequestInput resolverHttpRequestInput )
{
Enumeration headerNames = request.getHeaderNames();
while ( headerNames != null && headerNames.hasMoreElements() )
{
String headerName = (String) headerNames.nextElement();
resolverHttpRequestInput.addHttpHeader( headerName, request.getHeader( headerName ) );
}
}
//FIXME Disse to metodene metodene er helt like, hvorfor?
private String buildUrlForVerticalContextQueryString( HttpServletRequest request )
{
SitePath sitePath = (SitePath) request.getAttribute( Attribute.ORIGINAL_SITEPATH );
if ( sitePath != null )
{
return siteUrlResolver.createUrl( request, sitePath, true );
}
return "";
}
private String buildServletPathForVerticalContextQueryString( HttpServletRequest request )
{
SitePath sitePath = (SitePath) request.getAttribute( Attribute.ORIGINAL_SITEPATH );
if ( sitePath != null )
{
return siteUrlResolver.createUrl( request, sitePath, true );
}
return "";
}
protected void addElement( XMLBuilder xmlDoc, String elementName, String value )
{
xmlDoc.startElement( elementName );
xmlDoc.addContent( value );
xmlDoc.endElement();
}
protected void addAttributeElement( XMLBuilder xmlDoc, String element, String attributeName, String elementName, String value )
{
xmlDoc.startElement( element );
xmlDoc.setAttribute( attributeName, elementName );
xmlDoc.addContent( value );
xmlDoc.endElement();
}
@Autowired
public void setSiteUrlResolver( SiteURLResolver siteUrlResolver )
{
this.siteUrlResolver = siteUrlResolver;
}
}