cziegeler 2003/06/17 10:54:47
Modified: src/blocks/portal/java/org/apache/cocoon/portal/layout/renderer/aspect/impl XSLTAspect.java Log: Minor performance update, reducing todo Revision Changes Path 1.6 +53 -22 cocoon-2.1/src/blocks/portal/java/org/apache/cocoon/portal/layout/renderer/aspect/impl/XSLTAspect.java Index: XSLTAspect.java =================================================================== RCS file: /home/cvs/cocoon-2.1/src/blocks/portal/java/org/apache/cocoon/portal/layout/renderer/aspect/impl/XSLTAspect.java,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- XSLTAspect.java 15 Jun 2003 16:56:09 -0000 1.5 +++ XSLTAspect.java 17 Jun 2003 17:54:47 -0000 1.6 @@ -51,12 +51,17 @@ package org.apache.cocoon.portal.layout.renderer.aspect.impl; import java.io.IOException; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; import javax.xml.transform.sax.SAXResult; import javax.xml.transform.sax.TransformerHandler; +import org.apache.avalon.framework.activity.Disposable; import org.apache.avalon.framework.component.Component; import org.apache.avalon.framework.component.ComponentException; +import org.apache.avalon.framework.component.ComponentManager; import org.apache.avalon.framework.parameters.ParameterException; import org.apache.avalon.framework.parameters.Parameters; import org.apache.cocoon.components.variables.VariableResolver; @@ -64,6 +69,7 @@ import org.apache.cocoon.portal.PortalService; import org.apache.cocoon.portal.layout.Layout; import org.apache.cocoon.portal.layout.renderer.aspect.RendererAspectContext; +import org.apache.cocoon.sitemap.PatternException; import org.apache.cocoon.xml.IncludeXMLConsumer; import org.apache.excalibur.source.Source; import org.apache.excalibur.source.SourceResolver; @@ -82,9 +88,14 @@ * @version CVS $Id$ */ public class XSLTAspect - extends AbstractAspect { + extends AbstractAspect + implements Disposable { - /* (non-Javadoc) + protected List variables = new ArrayList(); + + protected VariableResolverFactory variableFactory; + + /* (non-Javadoc) * @see org.apache.cocoon.portal.layout.renderer.RendererAspect#toSAX(org.apache.cocoon.portal.layout.renderer.RendererAspectContext, org.apache.cocoon.portal.layout.Layout, org.apache.cocoon.portal.PortalService, org.xml.sax.ContentHandler) */ public void toSAX(RendererAspectContext context, @@ -126,30 +137,19 @@ } } - protected String getStylesheetURI(PreparedConfiguration config, Layout layout) { - + protected String getStylesheetURI(PreparedConfiguration config, Layout layout) + throws SAXException { // FIXME Get the stylesheet either from a layout attribute or another aspect - String stylesheet = config.stylesheet; - // TODO make this faster - VariableResolverFactory factory = null; try { - factory = (VariableResolverFactory) this.manager.lookup(VariableResolverFactory.ROLE); - VariableResolver resolver = null; - try { - resolver = factory.lookup( stylesheet ); - stylesheet = resolver.resolve(); - } finally { - factory.release( resolver ); - } - } catch (Exception ignore) { - } finally { - this.manager.release((Component)factory); + String stylesheet = config.stylesheet.resolve(); + return stylesheet; + } catch (PatternException pe) { + throw new SAXException("Pattern exception during variable resolving.", pe); } - return stylesheet; } protected class PreparedConfiguration { - public String stylesheet; + public VariableResolver stylesheet; public String xsltRole; public void takeValues(PreparedConfiguration from) { @@ -164,9 +164,40 @@ public Object prepareConfiguration(Parameters configuration) throws ParameterException { PreparedConfiguration pc = new PreparedConfiguration(); - pc.stylesheet = configuration.getParameter("style"); pc.xsltRole = configuration.getParameter("xslt-processor-role", XSLTProcessorImpl.ROLE); + String stylesheet = configuration.getParameter("style"); + try { + pc.stylesheet = this.variableFactory.lookup( stylesheet ); + } catch (PatternException pe) { + throw new ParameterException("Unknown pattern for stylesheet " + stylesheet, pe); + } + this.variables.add(pc.stylesheet); return pc; + } + + /* (non-Javadoc) + * @see org.apache.avalon.framework.activity.Disposable#dispose() + */ + public void dispose() { + if ( this.manager != null ) { + Iterator vars = this.variables.iterator(); + while ( vars.hasNext() ) { + this.variableFactory.release( (VariableResolver) vars.next() ); + } + this.variables.clear(); + this.manager.release((Component) this.variableFactory); + this.manager = null; + this.variableFactory = null; + } + } + + /* (non-Javadoc) + * @see org.apache.avalon.framework.component.Composable#compose(org.apache.avalon.framework.component.ComponentManager) + */ + public void compose(ComponentManager componentManager) + throws ComponentException { + super.compose(componentManager); + this.variableFactory = (VariableResolverFactory) this.manager.lookup(VariableResolverFactory.ROLE); } }