/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.core.xslt.admin;
import java.io.IOException;
import java.io.StringWriter;
import java.io.Writer;
import java.util.Map;
import javax.servlet.http.HttpServletResponse;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.URIResolver;
import javax.xml.transform.dom.DOMResult;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.jdom.transform.JDOMSource;
import com.google.common.io.Closeables;
import com.enonic.cms.core.xslt.XsltProcessor;
import com.enonic.cms.core.xslt.XsltProcessorException;
public final class AdminXsltProcessorHelper
{
private final AdminXsltProcessorFactory factory;
private AdminXsltProcessor processor;
private Source input;
public AdminXsltProcessorHelper( final AdminXsltProcessorFactory factory )
{
this.factory = factory;
}
public AdminXsltProcessorHelper stylesheet( final Source xsl, final URIResolver resolver )
{
this.processor = this.factory.createProcessor( xsl, resolver );
return this;
}
public AdminXsltProcessorHelper input( final Source input )
{
this.input = input;
return this;
}
public AdminXsltProcessorHelper input( final org.jdom.Document input )
{
return input( new JDOMSource( input ) );
}
public AdminXsltProcessorHelper input( final org.w3c.dom.Document input )
{
return input( new DOMSource( input ) );
}
public AdminXsltProcessorHelper param( final String key, final Object value )
{
return param( key, value, false );
}
public AdminXsltProcessorHelper param( final String key, final Object value, boolean convertToString )
{
this.processor.setParameter( key, convertToString ? value.toString() : value );
return this;
}
public AdminXsltProcessorHelper params( final Map<?, ?> map )
{
return params( map, false );
}
public AdminXsltProcessorHelper params( final Map<?, ?> map, boolean convertToString )
{
if ( map != null )
{
for ( final Object key : map.keySet() )
{
param( (String) key, map.get( key ), convertToString );
}
}
return this;
}
public String process()
{
final StringWriter out = new StringWriter();
try
{
process( out );
}
finally
{
Closeables.closeQuietly( out );
}
return out.toString();
}
public org.w3c.dom.Document processDom()
{
final DOMResult result = new DOMResult();
process( result );
return (org.w3c.dom.Document) result.getNode();
}
public void process( final Result result )
{
final XsltProcessor processor = processor();
processor.process( this.input, result );
}
public void process( final Writer writer )
{
final StreamResult result = new StreamResult( writer );
process( result );
}
public void process( final HttpServletResponse response )
{
try
{
response.setContentType( this.processor.getContentType() );
process( response.getWriter() );
}
catch ( IOException e )
{
throw new XsltProcessorException( e );
}
}
public AdminXsltProcessor processor()
{
return this.processor;
}
}