/*
* Created on 12-May-2003
*/
package net.sf.jportlet.portlets;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Iterator;
import java.util.Map;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import net.sf.jportlet.portlet.PortletAdapter;
import net.sf.jportlet.portlet.PortletConfig;
import net.sf.jportlet.portlet.PortletException;
import net.sf.jportlet.portlet.PortletLog;
import net.sf.jportlet.portlet.PortletRequest;
import net.sf.jportlet.portlet.PortletResponse;
/**
* @author <a href="mailto:tchbansi@sourceforge.net">Herve Tchepannou</a>
*/
public abstract class AbstractXslPortlet
extends PortletAdapter
{
//~ Methods ----------------------------------------------------------------
/**
* @see net.sf.jportlet.portlet.PortletAdapter#doView(net.sf.jportlet.portlet.PortletRequest, net.sf.jportlet.portlet.PortletResponse)
*/
protected void doView( PortletRequest request,
PortletResponse response )
throws PortletException,
IOException
{
InputStream xmlstream = null;
InputStream xslstream = null;
try
{
TransformerFactory factory = TransformerFactory.newInstance( );
/* XSL */
xslstream = openXslInputStream( request );
if ( xslstream == null )
{
throw new PortletException( "No XSL" );
}
StreamSource xsl = new StreamSource( xslstream );
/* XML */
xmlstream = openXmlInputStream( request );
if ( xslstream == null )
{
throw new PortletException( "No XML" );
}
StreamSource xml = new StreamSource( xmlstream );
/* Transform */
StreamResult output = new StreamResult( response.getWriter( ) );
Transformer transformer = factory.newTransformer( xsl );
Map params = getXslParameters( request, response );
if ( params != null )
{
Iterator it = params.keySet( ).iterator( );
while ( it.hasNext( ) )
{
String key = ( String ) it.next( );
transformer.setParameter( key, params.get( key ) );
}
}
transformer.transform( xml, output );
}
catch ( TransformerConfigurationException t )
{
throw new PortletException( t );
}
catch ( TransformerException t )
{
throw new PortletException( t );
}
finally
{
if ( xmlstream != null )
{
xmlstream.close( );
}
if ( xslstream != null )
{
xslstream.close( );
}
}
}
protected abstract InputStream openXmlInputStream( PortletRequest request )
throws PortletException,
IOException;
protected abstract InputStream openXslInputStream( PortletRequest request )
throws PortletException,
IOException;
protected Map getXslParameters( PortletRequest request,
PortletResponse response )
{
return null;
}
protected InputStream findInputStream( String prefix,
PortletRequest request )
throws IOException
{
String name;
String value;
PortletLog log = getLog( );
boolean debug = log.isDebugEnabled( );
PortletConfig portletConfig = getPortletConfig( );
/* URL */
name = prefix + ".url";
value = portletConfig.getInitParameter( name );
if ( debug )
{
log.debug( name + "=" + value );
}
if ( value != null )
{
return new URL( value ).openStream( );
}
else
{
/* Path */
name = prefix + ".path";
value = portletConfig.getInitParameter( name );
if ( debug )
{
log.debug( name + "=" + value );
}
if ( value != null )
{
return portletConfig.getPortletContext( ).getResourceAsStream( value, request.getClient( ), request.getLocale( ) );
}
}
return null;
}
}