/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.core.resolver;
import java.util.Map;
import java.util.Set;
import org.springframework.stereotype.Component;
import com.enonic.cms.framework.xml.XMLBuilder;
import com.enonic.cms.framework.xml.XMLDocument;
@Component
public class ResolverHttpRequestInputXMLCreator
{
public final static String REQUEST_ROOT_ELEMENT_NAME = "request";
protected final static String HEADERS_ROOT_ELEMENT_NAME = "headers";
protected final static String HEADER_ELEMENT_NAME = "header";
protected final static String ATTRIBUTE_NAME = "name";
protected final static String USER_AGENT_ROOT_ELEMENT_NAME = "user-agent";
protected static final String COOKIES_ROOT_ELEMENT_NAME = "cookies";
protected static final String COOKIE_ELEMENT_NAME = "cookie";
protected static final String REFERRER_ELEMENT_NAME = "referrer";
protected static final String IP_ELEMENT_NAME = "ip";
protected static final String PARAMETER_ELEMENT_NAME = "parameter";
protected static final String ACCEPT_ROOT_ELEMENT_NAME = "accept";
protected static final String QUALITY_ELEMENT_NAME = "quality";
protected static final String LANGUAGE_ELEMENT_NAME = "language";
protected static final String VIRTUAL_HOST_ELEMENT_NAME = "virtualhost";
protected static final String URI_REQUEST_ATTRIBUTE_NAME = "uri";
protected static final String PARAMETERS_ROOT_ELEMENT_NAME = "parameters";
protected static final String PORT_ELEMENT_NAME = "port";
protected static final String RESOURCEPATH_ELEMENT_NAME = "resourcepath";
protected static final String PROTOCOL_ELEMENT_NAME = "protocol";
public XMLDocument buildResolverInputXML( ResolverHttpRequestInput resolverHttpRequestInput )
{
XMLBuilder xmlDoc = new XMLBuilder();
xmlDoc.startElement( REQUEST_ROOT_ELEMENT_NAME );
if ( resolverHttpRequestInput != null )
{
addUserAgent( resolverHttpRequestInput, xmlDoc );
addReferrer( resolverHttpRequestInput, xmlDoc );
addIP( resolverHttpRequestInput, xmlDoc );
addURI( resolverHttpRequestInput, xmlDoc );
addProtocol( resolverHttpRequestInput, xmlDoc );
addVirtualHostAndPort( resolverHttpRequestInput, xmlDoc );
addResourcePath( resolverHttpRequestInput, xmlDoc );
addParameters( resolverHttpRequestInput, xmlDoc );
addAccept( resolverHttpRequestInput, xmlDoc );
addCookies( resolverHttpRequestInput, xmlDoc );
addHttpHeaders( resolverHttpRequestInput, xmlDoc );
}
xmlDoc.endElement();
return xmlDoc.getDocument();
}
private void addUserAgent( ResolverHttpRequestInput resolverHttpRequestInput, XMLBuilder xmlDoc )
{
addElement( xmlDoc, USER_AGENT_ROOT_ELEMENT_NAME, resolverHttpRequestInput.getUserAgent() );
}
private void addReferrer( ResolverHttpRequestInput resolverHttpRequestInput, XMLBuilder xmlDoc )
{
addElement( xmlDoc, REFERRER_ELEMENT_NAME, resolverHttpRequestInput.getReferrer() );
}
private void addIP( ResolverHttpRequestInput resolverHttpRequestInput, XMLBuilder xmlDoc )
{
addElement( xmlDoc, IP_ELEMENT_NAME, resolverHttpRequestInput.getIp() );
}
private void addProtocol( ResolverHttpRequestInput resolverHttpRequestInput, XMLBuilder xmlDoc )
{
addElement( xmlDoc, PROTOCOL_ELEMENT_NAME, resolverHttpRequestInput.getProtocol() );
}
private void addAccept( ResolverHttpRequestInput resolverHttpRequestInput, XMLBuilder xmlDoc )
{
xmlDoc.startElement( ACCEPT_ROOT_ELEMENT_NAME );
Map<String, String> acceptLanguageMap = resolverHttpRequestInput.getAcceptLanguages();
Set<String> acceptLanguages = acceptLanguageMap.keySet();
for ( String acceptLanguage : acceptLanguages )
{
String quality = acceptLanguageMap.get( acceptLanguage );
if ( quality != null )
{
addAttributeElement( xmlDoc, LANGUAGE_ELEMENT_NAME, QUALITY_ELEMENT_NAME, quality, acceptLanguage );
}
else
{
addElement( xmlDoc, LANGUAGE_ELEMENT_NAME, acceptLanguage );
}
}
xmlDoc.endElement();
}
private void addCookies( ResolverHttpRequestInput resolverHttpRequestInput, XMLBuilder xmlDoc )
{
xmlDoc.startElement( COOKIES_ROOT_ELEMENT_NAME );
Map<String, String> cookieMap = resolverHttpRequestInput.getCookies();
Set<String> cookieNames = cookieMap.keySet();
for ( String cookieName : cookieNames )
{
addAttributeElement( xmlDoc, COOKIE_ELEMENT_NAME, ATTRIBUTE_NAME, cookieName, cookieMap.get( cookieName ) );
}
xmlDoc.endElement();
}
private void addHttpHeaders( ResolverHttpRequestInput resolverHttpRequestInput, XMLBuilder xmlDoc )
{
xmlDoc.startElement( HEADERS_ROOT_ELEMENT_NAME );
Map<String, String> headerMap = resolverHttpRequestInput.getHttpHeaders();
Set<String> headerNames = headerMap.keySet();
for ( String headerName : headerNames )
{
addAttributeElement( xmlDoc, HEADER_ELEMENT_NAME, ATTRIBUTE_NAME, headerName, headerMap.get( headerName ) );
}
xmlDoc.endElement();
}
private void addURI( ResolverHttpRequestInput resolverHttpRequestInput, XMLBuilder xmlDoc )
{
addElement( xmlDoc, URI_REQUEST_ATTRIBUTE_NAME, resolverHttpRequestInput.getUri() );
}
private void addResourcePath( ResolverHttpRequestInput resolverHttpRequestInput, XMLBuilder xmlDoc )
{
addElement( xmlDoc, RESOURCEPATH_ELEMENT_NAME, resolverHttpRequestInput.getResourcePath() );
}
private void addVirtualHostAndPort( ResolverHttpRequestInput resolverHttpRequestInput, XMLBuilder xmlDoc )
{
addElement( xmlDoc, VIRTUAL_HOST_ELEMENT_NAME, resolverHttpRequestInput.getVirtualHost() );
Integer port = resolverHttpRequestInput.getPort();
if ( port != null )
{
addElement( xmlDoc, PORT_ELEMENT_NAME, port.toString() );
}
}
private void addParameters( ResolverHttpRequestInput resolverHttpRequestInput, XMLBuilder xmlDoc )
{
xmlDoc.startElement( PARAMETERS_ROOT_ELEMENT_NAME );
Map<String, String> parameterMap = resolverHttpRequestInput.getParameters();
Set<String> parameterNames = parameterMap.keySet();
for ( String parameterName : parameterNames )
{
addAttributeElement( xmlDoc, PARAMETER_ELEMENT_NAME, ATTRIBUTE_NAME, parameterName, parameterMap.get( parameterName ) );
}
xmlDoc.endElement();
}
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();
}
}