cziegeler 2003/06/15 09:56:09
Modified: src/blocks/portal/java/org/apache/cocoon/portal/layout/renderer/aspect/impl WindowAspect.java RendererAspectChain.java DefaultRendererContext.java CompositeContentAspect.java XSLTAspect.java TabContentAspect.java AbstractAspect.java src/blocks/portal/java/org/apache/cocoon/portal/layout/renderer/aspect RendererAspectContext.java RendererAspect.java Log: Prepared configurations for renderer aspects allows: - validation during configuration time - improved performance Making XSLT Processor configurable Revision Changes Path 1.3 +25 -7 cocoon-2.1/src/blocks/portal/java/org/apache/cocoon/portal/layout/renderer/aspect/impl/WindowAspect.java Index: WindowAspect.java =================================================================== RCS file: /home/cvs/cocoon-2.1/src/blocks/portal/java/org/apache/cocoon/portal/layout/renderer/aspect/impl/WindowAspect.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- WindowAspect.java 22 May 2003 15:19:38 -0000 1.2 +++ WindowAspect.java 15 Jun 2003 16:56:08 -0000 1.3 @@ -53,6 +53,8 @@ import java.util.Iterator; import java.util.Map; +import org.apache.avalon.framework.parameters.ParameterException; +import org.apache.avalon.framework.parameters.Parameters; import org.apache.cocoon.portal.PortalService; import org.apache.cocoon.portal.coplet.CopletInstanceData; import org.apache.cocoon.portal.layout.Layout; @@ -72,10 +74,6 @@ */ public final class WindowAspect extends AbstractAspect { - protected String getTagName(RendererAspectContext context) { - return context.getAspectParameters().getParameter("tag-name", "window"); - } - /* (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) */ @@ -84,7 +82,9 @@ PortalService service, ContentHandler contenthandler) throws SAXException { + final PreparedConfiguration config = (PreparedConfiguration)context.getAspectConfiguration(); final CopletInstanceData copletInstanceData = ((CopletLayout)layout).getCopletInstanceData(); + AttributesImpl attributes = new AttributesImpl(); Map parameter = layout.getParameters(); Map.Entry entry; @@ -92,14 +92,32 @@ entry = (Map.Entry) iter.next(); attributes.addCDATAAttribute((String)entry.getKey(), (String)entry.getValue()); } - XMLUtils.startElement(contenthandler, this.getTagName(context), attributes); + XMLUtils.startElement(contenthandler, config.tagName, attributes); int status = copletInstanceData.getStatus(); XMLUtils.createElement(contenthandler, "title", copletInstanceData.getCopletData().getTitle()); XMLUtils.createElement(contenthandler, "status", "" + status); context.invokeNext( layout, service, contenthandler ); - XMLUtils.endElement(contenthandler, this.getTagName(context)); + XMLUtils.endElement(contenthandler, config.tagName); + } + + protected class PreparedConfiguration { + public String tagName; + + public void takeValues(PreparedConfiguration from) { + this.tagName = from.tagName; + } + } + + /* (non-Javadoc) + * @see org.apache.cocoon.portal.layout.renderer.aspect.RendererAspect#prepareConfiguration(org.apache.avalon.framework.parameters.Parameters) + */ + public Object prepareConfiguration(Parameters configuration) + throws ParameterException { + PreparedConfiguration pc = new PreparedConfiguration(); + pc.tagName = configuration.getParameter("tag-name", "window"); + return pc; } } 1.3 +8 -4 cocoon-2.1/src/blocks/portal/java/org/apache/cocoon/portal/layout/renderer/aspect/impl/RendererAspectChain.java Index: RendererAspectChain.java =================================================================== RCS file: /home/cvs/cocoon-2.1/src/blocks/portal/java/org/apache/cocoon/portal/layout/renderer/aspect/impl/RendererAspectChain.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- RendererAspectChain.java 14 Jun 2003 17:55:43 -0000 1.2 +++ RendererAspectChain.java 15 Jun 2003 16:56:09 -0000 1.3 @@ -59,6 +59,7 @@ import org.apache.avalon.framework.component.ComponentSelector; import org.apache.avalon.framework.configuration.Configuration; import org.apache.avalon.framework.configuration.ConfigurationException; +import org.apache.avalon.framework.parameters.ParameterException; import org.apache.avalon.framework.parameters.Parameters; import org.apache.cocoon.portal.layout.renderer.aspect.RendererAspect; @@ -88,16 +89,19 @@ final String role = current.getAttribute("type"); try { RendererAspect rAspect = (RendererAspect) selector.select(role); - Parameters aspectConfiguration = Parameters.fromConfiguration(current); this.aspects.add(rAspect); - this.configs.add(aspectConfiguration); + Parameters aspectConfiguration = Parameters.fromConfiguration(current); + Object compiledConf = rAspect.prepareConfiguration(aspectConfiguration); + this.configs.add(compiledConf); - Iterator descriptionIterator = rAspect.getAspectDescriptions(aspectConfiguration); + Iterator descriptionIterator = rAspect.getAspectDescriptions(compiledConf); if ( descriptionIterator != null ) { while ( descriptionIterator.hasNext() ) { this.aspectDescriptions.add( descriptionIterator.next() ); } } + } catch (ParameterException pe) { + throw new ConfigurationException("Unable to configure renderer aspect " + role, pe); } catch (ComponentException se) { throw new ConfigurationException("Unable to lookup aspect " + role, se); } 1.2 +4 -5 cocoon-2.1/src/blocks/portal/java/org/apache/cocoon/portal/layout/renderer/aspect/impl/DefaultRendererContext.java Index: DefaultRendererContext.java =================================================================== RCS file: /home/cvs/cocoon-2.1/src/blocks/portal/java/org/apache/cocoon/portal/layout/renderer/aspect/impl/DefaultRendererContext.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- DefaultRendererContext.java 7 May 2003 06:22:22 -0000 1.1 +++ DefaultRendererContext.java 15 Jun 2003 16:56:09 -0000 1.2 @@ -54,7 +54,6 @@ import java.util.Iterator; import java.util.Map; -import org.apache.avalon.framework.parameters.Parameters; import org.apache.cocoon.portal.PortalService; import org.apache.cocoon.portal.layout.Layout; import org.apache.cocoon.portal.layout.renderer.aspect.RendererAspect; @@ -75,7 +74,7 @@ private Iterator iterator; private Iterator configIterator; - private Parameters config; + private Object config; private Map attributes; public DefaultRendererContext(RendererAspectChain chain) { @@ -92,7 +91,7 @@ ContentHandler handler) throws SAXException { if (iterator.hasNext()) { - this.config = (Parameters) this.configIterator.next(); + this.config = this.configIterator.next(); final RendererAspect aspect = (RendererAspect) iterator.next(); aspect.toSAX(this, layout, service, handler); } @@ -102,7 +101,7 @@ /* (non-Javadoc) * @see org.apache.cocoon.portal.layout.renderer.RendererAspectContext#getConfiguration() */ - public Parameters getAspectParameters() { + public Object getAspectConfiguration() { return this.config; } 1.3 +25 -8 cocoon-2.1/src/blocks/portal/java/org/apache/cocoon/portal/layout/renderer/aspect/impl/CompositeContentAspect.java Index: CompositeContentAspect.java =================================================================== RCS file: /home/cvs/cocoon-2.1/src/blocks/portal/java/org/apache/cocoon/portal/layout/renderer/aspect/impl/CompositeContentAspect.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- CompositeContentAspect.java 22 May 2003 15:19:38 -0000 1.2 +++ CompositeContentAspect.java 15 Jun 2003 16:56:09 -0000 1.3 @@ -53,6 +53,8 @@ import java.util.Iterator; import java.util.Map; +import org.apache.avalon.framework.parameters.ParameterException; +import org.apache.avalon.framework.parameters.Parameters; import org.apache.cocoon.portal.PortalService; import org.apache.cocoon.portal.layout.Item; import org.apache.cocoon.portal.layout.Layout; @@ -73,10 +75,6 @@ protected static final String ITEM_STRING = "item"; - protected String getTagName(RendererAspectContext context) { - return context.getAspectParameters().getParameter("tag-name", "composite"); - } - /* (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) */ @@ -85,7 +83,8 @@ PortalService service, ContentHandler handler) throws SAXException { - + PreparedConfiguration config = (PreparedConfiguration)context.getAspectConfiguration(); + AttributesImpl attributes = new AttributesImpl(); Map parameter = layout.getParameters(); Map.Entry entry; @@ -93,9 +92,9 @@ entry = (Map.Entry) iter.next(); attributes.addCDATAAttribute((String)entry.getKey(), (String)entry.getValue()); } - XMLUtils.startElement(handler, this.getTagName(context), attributes); + XMLUtils.startElement(handler, config.tagName, attributes); super.toSAX(context, layout, service, handler); - XMLUtils.endElement(handler, this.getTagName(context)); + XMLUtils.endElement(handler, config.tagName); } @@ -125,5 +124,23 @@ XMLUtils.endElement(handler, ITEM_STRING); } + + protected class PreparedConfiguration { + public String tagName; + + public void takeValues(PreparedConfiguration from) { + this.tagName = from.tagName; + } + } + + /* (non-Javadoc) + * @see org.apache.cocoon.portal.layout.renderer.aspect.RendererAspect#prepareConfiguration(org.apache.avalon.framework.parameters.Parameters) + */ + public Object prepareConfiguration(Parameters configuration) + throws ParameterException { + PreparedConfiguration pc = new PreparedConfiguration(); + pc.tagName = configuration.getParameter("tag-name", "composite"); + return pc; + } } 1.5 +33 -6 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.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- XSLTAspect.java 14 Jun 2003 17:55:43 -0000 1.4 +++ XSLTAspect.java 15 Jun 2003 16:56:09 -0000 1.5 @@ -57,6 +57,8 @@ import org.apache.avalon.framework.component.Component; import org.apache.avalon.framework.component.ComponentException; +import org.apache.avalon.framework.parameters.ParameterException; +import org.apache.avalon.framework.parameters.Parameters; import org.apache.cocoon.components.variables.VariableResolver; import org.apache.cocoon.components.variables.VariableResolverFactory; import org.apache.cocoon.portal.PortalService; @@ -90,13 +92,15 @@ PortalService service, ContentHandler handler) throws SAXException { + PreparedConfiguration config = (PreparedConfiguration)context.getAspectConfiguration(); + XSLTProcessor processor = null; Source stylesheet = null; SourceResolver resolver = null; try { resolver = (SourceResolver) this.manager.lookup(SourceResolver.ROLE); - stylesheet = resolver.resolveURI(this.getStylesheetURI(context, layout)); - processor = (XSLTProcessor) this.manager.lookup(XSLTProcessorImpl.ROLE); + stylesheet = resolver.resolveURI(this.getStylesheetURI(config, layout)); + processor = (XSLTProcessor) this.manager.lookup(config.xsltRole); TransformerHandler transformer = processor.getTransformerHandler(stylesheet); SAXResult result = new SAXResult(new IncludeXMLConsumer((handler))); if (handler instanceof LexicalHandler) { @@ -122,10 +126,11 @@ } } - protected String getStylesheetURI(RendererAspectContext context, Layout layout) { + protected String getStylesheetURI(PreparedConfiguration config, Layout layout) { + // FIXME Get the stylesheet either from a layout attribute or another aspect - String stylesheet = context.getAspectParameters().getParameter("style", "NOTFOUND"); - // TODO make this more faster + String stylesheet = config.stylesheet; + // TODO make this faster VariableResolverFactory factory = null; try { factory = (VariableResolverFactory) this.manager.lookup(VariableResolverFactory.ROLE); @@ -143,4 +148,26 @@ return stylesheet; } + protected class PreparedConfiguration { + public String stylesheet; + public String xsltRole; + + public void takeValues(PreparedConfiguration from) { + this.stylesheet = from.stylesheet; + this.xsltRole = from.xsltRole; + } + } + + /* (non-Javadoc) + * @see org.apache.cocoon.portal.layout.renderer.aspect.RendererAspect#prepareConfiguration(org.apache.avalon.framework.parameters.Parameters) + */ + 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); + return pc; + } + } + 1.8 +37 -8 cocoon-2.1/src/blocks/portal/java/org/apache/cocoon/portal/layout/renderer/aspect/impl/TabContentAspect.java Index: TabContentAspect.java =================================================================== RCS file: /home/cvs/cocoon-2.1/src/blocks/portal/java/org/apache/cocoon/portal/layout/renderer/aspect/impl/TabContentAspect.java,v retrieving revision 1.7 retrieving revision 1.8 diff -u -r1.7 -r1.8 --- TabContentAspect.java 14 Jun 2003 17:55:43 -0000 1.7 +++ TabContentAspect.java 15 Jun 2003 16:56:09 -0000 1.8 @@ -55,6 +55,7 @@ import java.util.Map; import org.apache.avalon.framework.component.ComponentException; +import org.apache.avalon.framework.parameters.ParameterException; import org.apache.avalon.framework.parameters.Parameters; import org.apache.cocoon.portal.PortalService; import org.apache.cocoon.portal.aspect.impl.DefaultAspectDescription; @@ -75,7 +76,8 @@ * * @version CVS $Id$ */ -public class TabContentAspect extends CompositeContentAspect { +public class TabContentAspect + extends CompositeContentAspect { /* (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) @@ -86,6 +88,8 @@ ContentHandler handler) throws SAXException { if (layout instanceof CompositeLayout) { + TabPreparedConfiguration config = (TabPreparedConfiguration)context.getAspectConfiguration(); + AttributesImpl attributes = new AttributesImpl(); Map parameter = layout.getParameters(); Map.Entry entry; @@ -93,7 +97,7 @@ entry = (Map.Entry) iter.next(); attributes.addCDATAAttribute((String)entry.getKey(), (String)entry.getValue()); } - XMLUtils.startElement(handler, this.getTagName(context), attributes); + XMLUtils.startElement(handler, config.tagName, attributes); PortalService portalService = null; try { @@ -102,7 +106,7 @@ CompositeLayout tabLayout = (CompositeLayout) layout; // selected tab - Integer data = (Integer) layout.getAspectData(context.getAspectParameters().getParameter("aspect-name", "tab")); + Integer data = (Integer) layout.getAspectData(config.aspectName); int selected = data.intValue(); // loop over all tabs @@ -130,7 +134,7 @@ } finally { this.manager.release(portalService); } - XMLUtils.endElement(handler, this.getTagName(context)); + XMLUtils.endElement(handler, config.tagName); } else { throw new SAXException("Wrong layout type, TabLayout expected: " + layout.getClass().getName()); } @@ -142,14 +146,39 @@ * Return the aspects required for this renderer * @return An iterator for the aspect descriptions or null. */ - public Iterator getAspectDescriptions(Parameters configuration) { + public Iterator getAspectDescriptions(Object configuration) { + TabPreparedConfiguration pc = (TabPreparedConfiguration)configuration; + DefaultAspectDescription desc = new DefaultAspectDescription(); - desc.setName(configuration.getParameter("aspect-name", "tab")); + desc.setName(pc.aspectName); desc.setClassName("java.lang.Integer"); - desc.setPersistence(configuration.getParameter("store", "session")); + desc.setPersistence(pc.store); desc.setAutoCreate(true); return Collections.singletonList(desc).iterator(); + } + + protected class TabPreparedConfiguration extends PreparedConfiguration { + public String aspectName; + public String store; + + public void takeValues(TabPreparedConfiguration from) { + super.takeValues(from); + this.aspectName = from.aspectName; + this.store = from.store; + } + } + + /* (non-Javadoc) + * @see org.apache.cocoon.portal.layout.renderer.aspect.RendererAspect#prepareConfiguration(org.apache.avalon.framework.parameters.Parameters) + */ + public Object prepareConfiguration(Parameters configuration) + throws ParameterException { + TabPreparedConfiguration pc = new TabPreparedConfiguration(); + pc.takeValues((PreparedConfiguration)super.prepareConfiguration(configuration)); + pc.aspectName = configuration.getParameter("aspect-name", "tab"); + pc.store = configuration.getParameter("store"); + return pc; } } 1.4 +11 -2 cocoon-2.1/src/blocks/portal/java/org/apache/cocoon/portal/layout/renderer/aspect/impl/AbstractAspect.java Index: AbstractAspect.java =================================================================== RCS file: /home/cvs/cocoon-2.1/src/blocks/portal/java/org/apache/cocoon/portal/layout/renderer/aspect/impl/AbstractAspect.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- AbstractAspect.java 14 Jun 2003 17:55:43 -0000 1.3 +++ AbstractAspect.java 15 Jun 2003 16:56:09 -0000 1.4 @@ -56,6 +56,7 @@ import org.apache.avalon.framework.component.ComponentManager; import org.apache.avalon.framework.component.Composable; import org.apache.avalon.framework.logger.AbstractLogEnabled; +import org.apache.avalon.framework.parameters.ParameterException; import org.apache.avalon.framework.parameters.Parameters; import org.apache.avalon.framework.thread.ThreadSafe; import org.apache.cocoon.portal.layout.renderer.aspect.RendererAspect; @@ -84,8 +85,16 @@ * Return the aspects required for this renderer * @return An iterator for the aspect descriptions or null. */ - public Iterator getAspectDescriptions(Parameters configuration) { + public Iterator getAspectDescriptions(Object preparedConf) { return null; + } + + /* (non-Javadoc) + * @see org.apache.cocoon.portal.layout.renderer.aspect.RendererAspect#prepareConfiguration(org.apache.avalon.framework.parameters.Parameters) + */ + public Object prepareConfiguration(Parameters configuration) + throws ParameterException { + return configuration; } } 1.3 +3 -4 cocoon-2.1/src/blocks/portal/java/org/apache/cocoon/portal/layout/renderer/aspect/RendererAspectContext.java Index: RendererAspectContext.java =================================================================== RCS file: /home/cvs/cocoon-2.1/src/blocks/portal/java/org/apache/cocoon/portal/layout/renderer/aspect/RendererAspectContext.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- RendererAspectContext.java 7 May 2003 20:24:03 -0000 1.2 +++ RendererAspectContext.java 15 Jun 2003 16:56:09 -0000 1.3 @@ -50,7 +50,6 @@ */ package org.apache.cocoon.portal.layout.renderer.aspect; -import org.apache.avalon.framework.parameters.Parameters; import org.apache.cocoon.portal.PortalService; import org.apache.cocoon.portal.layout.Layout; import org.xml.sax.ContentHandler; @@ -75,9 +74,9 @@ throws SAXException; /** - * Get the [EMAIL PROTECTED] Parameters} of the aspect. + * Get the "compiled" configuration of the aspect. */ - Parameters getAspectParameters(); + Object getAspectConfiguration(); /** * Set an attribute 1.4 +18 -3 cocoon-2.1/src/blocks/portal/java/org/apache/cocoon/portal/layout/renderer/aspect/RendererAspect.java Index: RendererAspect.java =================================================================== RCS file: /home/cvs/cocoon-2.1/src/blocks/portal/java/org/apache/cocoon/portal/layout/renderer/aspect/RendererAspect.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- RendererAspect.java 14 Jun 2003 17:55:44 -0000 1.3 +++ RendererAspect.java 15 Jun 2003 16:56:09 -0000 1.4 @@ -53,6 +53,7 @@ import java.util.Iterator; import org.apache.avalon.framework.component.Component; +import org.apache.avalon.framework.parameters.ParameterException; import org.apache.avalon.framework.parameters.Parameters; import org.apache.cocoon.portal.PortalService; import org.apache.cocoon.portal.layout.Layout; @@ -60,7 +61,8 @@ import org.xml.sax.SAXException; /** - * A renderer aspect extends a renderer with a distinct functionality + * A renderer aspect extends a renderer with a distinct functionality. + * A renderer aspect has to be thread safe! * * @author <a href="mailto:[EMAIL PROTECTED]">Carsten Ziegeler</a> * @author <a href="mailto:[EMAIL PROTECTED]">Volker Schmitt</a> @@ -85,6 +87,19 @@ * Return the aspects required for this renderer * @return An iterator for the aspect descriptions or null. */ - Iterator getAspectDescriptions(Parameters configuration); + Iterator getAspectDescriptions(Object preparedConfiguration); + /** + * Compile the configuration. + * A renderer aspect can "compile" the configuration in + * order to increase performance. + * If the renderer does not want to compile it should + * simply return the configuration. + * The "compiled" configuration is passed to the + * [EMAIL PROTECTED] #getAspectDescriptions(Object)} method and + * is available during streaming via the context object. + * This method can also be used for validation the configuration. + */ + Object prepareConfiguration(Parameters configuration) + throws ParameterException; }