/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.core.xslt.portal;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import javax.xml.transform.Source;
import javax.xml.transform.TransformerException;
import javax.xml.transform.stream.StreamSource;
import com.google.common.io.ByteStreams;
import com.enonic.cms.core.resource.FileResource;
import com.enonic.cms.core.resource.FileResourceName;
import com.enonic.cms.core.resource.FileResourceService;
import com.enonic.cms.core.xslt.XsltResourceHelper;
final class XsltResourceLoader
{
private final FileResourceService resourceService;
public XsltResourceLoader( final FileResourceService resourceService )
{
this.resourceService = resourceService;
}
public Source load( final FileResourceName name )
throws TransformerException
{
final FileResource resource = this.resourceService.getResource( name );
if ( resource == null )
{
throw new TransformerException( "Failed to find resource [" + name.toString() + "]" );
}
InputStream resourceData = null;
try
{
resourceData = this.resourceService.getResourceStream( name, true );
return doGetSource( name, resourceData );
}
finally
{
if ( resourceData != null )
{
try
{
resourceData.close();
}
catch ( IOException e )
{
throw new TransformerException( "Error closing input file: " + name, e );
}
}
}
}
private Source doGetSource( final FileResourceName name, final InputStream resourceData )
throws TransformerException
{
if ( resourceData == null )
{
throw new TransformerException( "Failed to find resource data for [" + name.toString() + "]" );
}
byte[] file;
try
{
file = ByteStreams.toByteArray( resourceData );
}
catch ( IOException e )
{
throw new TransformerException( "Could not read input file: " + name, e );
}
final StreamSource source = new StreamSource();
source.setInputStream( new ByteArrayInputStream( file ) );
source.setSystemId( XsltResourceHelper.createUri( name.getPath() ) );
return source;
}
}