/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.upgrade.task.datasource;
import org.apache.commons.lang.StringUtils;
import org.jdom.Element;
import com.google.common.base.Strings;
import static com.enonic.cms.upgrade.task.datasource.JDOMDocumentHelper.copyAttributeIfExists;
import static com.enonic.cms.upgrade.task.datasource.JDOMDocumentHelper.findElement;
import static com.enonic.cms.upgrade.task.datasource.JDOMDocumentHelper.findElements;
import static com.enonic.cms.upgrade.task.datasource.JDOMDocumentHelper.getTextNode;
public final class DataSourceConverterUpgradeModel206
extends DataSourceConverter
{
public DataSourceConverterUpgradeModel206( final DataSourceConverterLogger logger )
{
super( logger );
}
public Element convert( final Element elem )
{
final Element result = new Element( "datasources" );
copyAttributeIfExists( elem, result, "result-element" );
copyAttributeIfExists( elem, result, "httpcontext", "http-context" );
copyAttributeIfExists( elem, result, "sessioncontext", "session-context" );
copyAttributeIfExists( elem, result, "cookiecontext", "cookie-context" );
for ( final Element child : findElements( elem, "datasource" ) )
{
result.addContent( convertDataSource( child ) );
}
return result;
}
private Element convertDataSource( final Element elem )
{
final Element result = new Element( "datasource" );
final String methodName = getTextNode( findElement( elem, "methodName" ) );
if ( Strings.isNullOrEmpty( methodName ) )
{
this.logger.logWarning( this.currentContext + " : method name is missing in data source. Setting to empty." );
}
result.setAttribute( "name", methodName != null ? methodName : "" );
copyAttributeIfExists( elem, result, "result-element" );
copyAttributeIfExists( elem, result, "cache" );
copyAttributeIfExists( elem, result, "condition" );
final Element parametersElem = findElement( elem, "parameters" );
for ( final Element paramElem : findElements( parametersElem, "parameter" ) )
{
result.addContent( convertParameter( paramElem ) );
}
return result;
}
private Element convertParameter( final Element elem )
{
final Element result = new Element( "parameter" );
result.setText( getParameterValue( elem ) );
return result;
}
private String getParameterValue( final Element elem )
{
final String override = elem.getAttributeValue( "override" );
final String name = elem.getAttributeValue( "name" );
String value = JDOMDocumentHelper.getTextNode( elem );
if ( !Strings.isNullOrEmpty( name ) )
{
if ( "url".equalsIgnoreCase( override ) )
{
value = composeSelect( "param", name, value );
}
else if ( "session".equalsIgnoreCase( override ) )
{
value = composeSelect( "session", name, value );
}
}
return value;
}
private String composeSelect( String prefix, String name, String value )
{
boolean isNonAlphabetChar = isNonAlphabetCharacter( name );
return isNonAlphabetChar ? composeSpecialSelect( prefix, name, value ) : composeNonSpecialSelect( prefix + "." + name, value );
}
/**
* Check for special characters
*
* @param string to process
* @return true if special character exists, false otherwise
*/
private boolean isNonAlphabetCharacter( String string )
{
final int ASCII_UPPERCASE_A = 65;
final int ASCII_UPPERCASE_Z = 90;
final int ASCII_LOWERCASE_A = 97;
final int ASCII_LOWERCASE_Z = 122;
final char[] chars = string.toCharArray();
for ( final char c : chars )
{
if ( ( c < ASCII_UPPERCASE_A ) || ( c > ASCII_UPPERCASE_Z && c < ASCII_LOWERCASE_A ) || ( c > ASCII_LOWERCASE_Z ) )
{
return true;
}
}
return false;
}
/**
* Result sequence like this:
* <parameter name="param10">${select(param['n.template'], '')}</parameter>
*/
private String composeSpecialSelect( String prefix, String left, String right )
{
final StringBuilder str = new StringBuilder();
str.append( "${select(" ).append( prefix ).append( "['" ).append( left ).append( "']" ).append( ", " );
if ( isElExpression( right ) )
{
str.append( getStrippedElExpression( right ) ).append( ")}" );
}
else
{
if ( right != null && right.contains( "\'" ) )
{
str.append( "\"" ).append( right ).append( "\")}" );
}
else
{
str.append( "'" ).append( right != null ? right : "" ).append( "')}" );
}
}
return str.toString();
}
/**
* Result sequence like this:
* <parameter name="param10">${select(param.n.template, '')}</parameter>
*/
private String composeNonSpecialSelect( final String left, final String right )
{
final StringBuilder str = new StringBuilder();
str.append( "${select(" ).append( left ).append( ", " );
if ( isElExpression( right ) )
{
str.append( getStrippedElExpression( right ) ).append( ")}" );
}
else
{
if ( right != null && right.contains( "\'" ) )
{
str.append( "\"" ).append( right ).append( "\")}" );
}
else
{
str.append( "'" ).append( right != null ? right : "" ).append( "')}" );
}
}
return str.toString();
}
private boolean isElExpression( final String right )
{
return StringUtils.startsWithIgnoreCase( right, "${" ) && StringUtils.endsWith( right, "}" );
}
private String getStrippedElExpression( String expression )
{
expression = StringUtils.stripStart( expression, "${" );
expression = StringUtils.stripEnd( expression, "}" );
return expression;
}
}