You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by cz...@apache.org on 2003/06/15 18:56:09 UTC

cvs commit: cocoon-2.1/src/blocks/portal/java/org/apache/cocoon/portal/layout/renderer/aspect RendererAspectContext.java RendererAspect.java

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 {@link 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:cziegeler@s-und-n.de">Carsten Ziegeler</a>
    * @author <a href="mailto:volker.schmitt@basf-it-services.com">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
  +     * {@link #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;
   }