/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.core.portal.datasource.executor;
import java.util.Map;
import com.google.common.base.Strings;
import com.enonic.cms.core.portal.datasource.DataSourceException;
import com.enonic.cms.core.portal.datasource.el.ExpressionFunctionsExecutor;
import com.enonic.cms.core.portal.datasource.handler.DataSourceRequest;
import com.enonic.cms.core.portal.datasource.xml.DataSourceElement;
final class DataSourceRequestFactory
{
private final ExpressionFunctionsExecutor evaluator;
private final DataSourceExecutorContext context;
public DataSourceRequestFactory( final ExpressionFunctionsExecutor evaluator, final DataSourceExecutorContext context )
{
this.evaluator = evaluator;
this.context = context;
}
public DataSourceRequest createRequest( final DataSourceElement element )
{
final DataSourceRequest request = new DataSourceRequest();
request.setPreviewContext( context.getPreviewContext() );
request.setName( element.getName() );
request.setPortalInstanceKey( context.getPortalInstanceKey() );
request.setSiteKey( context.getSite() != null ? context.getSite().getKey() : null );
request.setUser( context.getUser() );
request.setCache( element.isCache() );
request.setVerticalSession( context.getVerticalSession() );
request.setHttpRequest( context.getHttpRequest() );
evaluateParameters( request, element );
return request;
}
private void evaluateParameters( final DataSourceRequest req, final DataSourceElement element )
{
for ( final Map.Entry<String, String> param : element.getParameters().entrySet() )
{
final String name = param.getKey();
final String value = param.getValue();
try
{
req.addParam( name, evaluateParameter( value ) );
}
catch ( final Exception e )
{
throw new DataSourceException( "Failed to evaluate expression [{0}] for [{1}.{2}]", value, req.getName(), name ).withCause(
e );
}
}
}
private String evaluateParameter( final String value )
{
if ( !Strings.isNullOrEmpty( value ) && value.contains( "${" ) )
{
return this.evaluator.evaluate( value );
}
return value;
}
}