cziegeler 2003/07/28 23:30:07
Modified: src/blocks/portal/conf portal.samplesxconf portal.xconf src/blocks/portal/samples/profiles/mapping layout.xml src/blocks/portal/java/org/apache/cocoon/portal/profile/impl AbstractProfileManager.java StaticProfileManager.java MapProfileLS.java Added: src/blocks/portal/java/org/apache/cocoon/portal/layout/renderer/aspect/impl ParameterAspect.java Log: Bug fixes and improvements from Volker Revision Changes Path 1.2 +32 -0 cocoon-2.1/src/blocks/portal/conf/portal.samplesxconf Index: portal.samplesxconf =================================================================== RCS file: /home/cvs/cocoon-2.1/src/blocks/portal/conf/portal.samplesxconf,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- portal.samplesxconf 18 Jul 2003 14:41:44 -0000 1.1 +++ portal.samplesxconf 29 Jul 2003 06:30:06 -0000 1.2 @@ -65,6 +65,19 @@ </aspects> </renderer> <renderer name="link" class="org.apache.cocoon.portal.layout.renderer.impl.DefaultLinkRenderer" logger="portal"/> + <renderer name="decorated-frame" class="org.apache.cocoon.portal.layout.renderer.impl.AspectRenderer" logger="portal"> + <aspects> + <aspect type="xslt"> + <parameter name="style" value="{global:skin}styles/frame.xsl"/> + </aspect> + <aspect type="parameter"> + <parameter name="tag-name" value="frame"/> + </aspect> + <aspect type="frame"> + <parameter name="store" value="request"/> + </aspect> + </aspects> + </renderer> </component> <!-- Layout factory configuration --> @@ -102,6 +115,25 @@ <renderer name="window"/> </renderers> </layout> + <layout name="link" + class="org.apache.cocoon.portal.layout.impl.LinkLayout" + create-id="true"> + <renderers default="link"> + <renderer name="link"/> + </renderers> + <aspects> + <aspect name="link-layout-key" + class="java.lang.String" + store="session" + auto-create="false"> + </aspect> + <aspect name="link-layout-id" + class="java.lang.String" + store="session" + auto-create="false"> + </aspect> + </aspects> + </layout> </layouts> </component> 1.21 +3 -1 cocoon-2.1/src/blocks/portal/conf/portal.xconf Index: portal.xconf =================================================================== RCS file: /home/cvs/cocoon-2.1/src/blocks/portal/conf/portal.xconf,v retrieving revision 1.20 retrieving revision 1.21 diff -u -r1.20 -r1.21 --- portal.xconf 18 Jul 2003 14:41:44 -0000 1.20 +++ portal.xconf 29 Jul 2003 06:30:06 -0000 1.21 @@ -7,13 +7,14 @@ <aspect name="action-counter" class="org.apache.cocoon.portal.event.aspect.impl.ActionCounterEventAspect"/> <aspect name="request-parameter" class="org.apache.cocoon.portal.event.aspect.impl.RequestParameterEventAspect"/> <aspect name="frame" class="org.apache.cocoon.portal.event.aspect.impl.FrameEventAspect"/> - <aspect name="full-screen-coplet" class="org.apache.cocoon.portal.event.aspect.impl.FullScreenCopletEventAspect"/> + <aspect name="link" class="org.apache.cocoon.portal.event.aspect.impl.LinkEventAspect" /> <aspect name="full-screen-coplet" class="org.apache.cocoon.portal.event.aspect.impl.FullScreenCopletEventAspect"/> </component> <component class="org.apache.cocoon.portal.event.impl.DefaultEventManager" logger="portal" role="org.apache.cocoon.portal.event.EventManager"> <event-aspects> <aspect type="action-counter"/> <aspect type="frame"/> + <aspect type="link"/> <aspect type="full-screen-coplet"/> <aspect type="request-parameter"/> </event-aspects> @@ -61,6 +62,7 @@ <aspect name="coplet" class="org.apache.cocoon.portal.layout.renderer.aspect.impl.DefaultCopletAspect"/> <aspect name="frame" class="org.apache.cocoon.portal.layout.renderer.aspect.impl.FrameAspect"/> <aspect name="xslt" class="org.apache.cocoon.portal.layout.renderer.aspect.impl.XSLTAspect"/> + <aspect class="org.apache.cocoon.portal.layout.renderer.aspect.impl.ParameterAspect" name="parameter"/> </component> <!-- Aspect Storage configuration --> 1.13 +3 -0 cocoon-2.1/src/blocks/portal/samples/profiles/mapping/layout.xml Index: layout.xml =================================================================== RCS file: /home/cvs/cocoon-2.1/src/blocks/portal/samples/profiles/mapping/layout.xml,v retrieving revision 1.12 retrieving revision 1.13 diff -u -r1.12 -r1.13 --- layout.xml 27 May 2003 14:07:16 -0000 1.12 +++ layout.xml 29 Jul 2003 06:30:06 -0000 1.13 @@ -41,6 +41,9 @@ <class name="org.apache.cocoon.portal.layout.impl.LinkLayout" extends="org.apache.cocoon.portal.layout.AbstractLayout"> <map-to xml="link-layout" /> + <field name="layoutKey" type="java.lang.String"> + <bind-xml name="layout-key" node="attribute" /> + </field> <field name="layoutId" type="java.lang.String"> <bind-xml name="layout-id" node="attribute" /> </field> 1.3 +14 -7 cocoon-2.1/src/blocks/portal/java/org/apache/cocoon/portal/profile/impl/AbstractProfileManager.java Index: AbstractProfileManager.java =================================================================== RCS file: /home/cvs/cocoon-2.1/src/blocks/portal/java/org/apache/cocoon/portal/profile/impl/AbstractProfileManager.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- AbstractProfileManager.java 18 Jul 2003 14:41:45 -0000 1.2 +++ AbstractProfileManager.java 29 Jul 2003 06:30:07 -0000 1.3 @@ -54,6 +54,9 @@ import org.apache.avalon.framework.component.ComponentException; import org.apache.avalon.framework.component.ComponentManager; import org.apache.avalon.framework.component.Composable; +import org.apache.avalon.framework.configuration.Configurable; +import org.apache.avalon.framework.configuration.Configuration; +import org.apache.avalon.framework.configuration.ConfigurationException; import org.apache.avalon.framework.logger.AbstractLogEnabled; import org.apache.avalon.framework.thread.ThreadSafe; import org.apache.cocoon.portal.PortalService; @@ -69,10 +72,10 @@ */ public abstract class AbstractProfileManager extends AbstractLogEnabled - implements Composable, ProfileManager, ThreadSafe { + implements Composable, Configurable, ProfileManager, ThreadSafe { + + protected String defaultLayoutKey; - public static final String DEFAULT_LAYOUT_KEY = "portal"; - protected ComponentManager manager; /** @@ -111,7 +114,7 @@ service = (PortalService)this.manager.lookup(PortalService.ROLE); String defaultLayoutKey = (String)service.getAttribute("default-layout-key"); if ( defaultLayoutKey == null ) { - return DEFAULT_LAYOUT_KEY; + return this.defaultLayoutKey; } return defaultLayoutKey; } catch (ComponentException ce) { @@ -155,5 +158,9 @@ } } - -} \ No newline at end of file + public void configure(Configuration configuration) throws ConfigurationException { + Configuration child = configuration.getChild("default-layout-key"); + // get configured default LayoutKey + this.defaultLayoutKey = child.getValue("portal"); + } +} 1.7 +167 -130 cocoon-2.1/src/blocks/portal/java/org/apache/cocoon/portal/profile/impl/StaticProfileManager.java Index: StaticProfileManager.java =================================================================== RCS file: /home/cvs/cocoon-2.1/src/blocks/portal/java/org/apache/cocoon/portal/profile/impl/StaticProfileManager.java,v retrieving revision 1.6 retrieving revision 1.7 diff -u -r1.6 -r1.7 --- StaticProfileManager.java 18 Jul 2003 14:41:45 -0000 1.6 +++ StaticProfileManager.java 29 Jul 2003 06:30:07 -0000 1.7 @@ -58,12 +58,12 @@ import org.apache.avalon.framework.CascadingRuntimeException; import org.apache.avalon.framework.component.Component; -import org.apache.avalon.framework.component.ComponentException; import org.apache.avalon.framework.configuration.Configurable; import org.apache.avalon.framework.configuration.Configuration; import org.apache.avalon.framework.configuration.ConfigurationException; import org.apache.cocoon.portal.PortalService; import org.apache.cocoon.portal.coplet.CopletData; +import org.apache.cocoon.portal.coplet.CopletFactory; import org.apache.cocoon.portal.coplet.CopletInstanceData; import org.apache.cocoon.portal.layout.CompositeLayout; import org.apache.cocoon.portal.layout.Item; @@ -71,6 +71,7 @@ import org.apache.cocoon.portal.layout.LayoutFactory; import org.apache.cocoon.portal.profile.ProfileLS; import org.apache.commons.collections.SequencedHashMap; +import org.apache.commons.collections.StaticBucketMap; import org.apache.excalibur.source.SourceValidity; /** @@ -81,53 +82,43 @@ * * @version CVS $Id$ */ -public class StaticProfileManager - extends AbstractProfileManager - implements Configurable { - +public class StaticProfileManager extends AbstractProfileManager implements Configurable +{ protected String profilesPath; - protected String defaultLayoutGroup = null; + protected StaticBucketMap copletInstanceDataManagers = new StaticBucketMap(); - protected static final String LAYOUTKEY_PREFIX = - StaticProfileManager.class.getName() + "/Layout/"; + protected static final String LAYOUTKEY_PREFIX = StaticProfileManager.class.getName() + "/Layout/"; /** * @see org.apache.cocoon.portal.profile.ProfileManager#getPortalLayout(String, String) */ - public Layout getPortalLayout(String layoutKey, String layoutID) { + public Layout getPortalLayout(String layoutKey, String layoutID) + { PortalService service = null; ProfileLS adapter = null; - try { + try + { service = (PortalService) this.manager.lookup(PortalService.ROLE); - if (null == layoutID) { - Layout l = - (Layout) service.getTemporaryAttribute("DEFAULT_LAYOUT"); - if (null != l) { + if (layoutKey == null) + { + Layout l = getEntryLayout(); + if (null != l) + { return l; } + layoutKey = getDefaultLayoutKey(); } - String serviceKey = null; - if (layoutKey == null) { - layoutKey = defaultLayoutGroup; // Default group to load - } - serviceKey = - LAYOUTKEY_PREFIX + service.getPortalName() + "/" + layoutKey; - if (layoutID == null) { - // look for the default key - // it is set with the id of the root layoutId of a layoutGroup - layoutID = - (String) service.getAttribute(serviceKey + "defaultKey"); - } - + String serviceKey = LAYOUTKEY_PREFIX + layoutKey; Object[] objects = (Object[]) service.getAttribute(serviceKey); // check if the layout is already cached and still valid int valid = SourceValidity.INVALID; SourceValidity sourceValidity = null; - if (objects != null) { + if (objects != null) + { sourceValidity = (SourceValidity) objects[1]; valid = sourceValidity.isValid(); Layout layout = null; @@ -136,60 +127,56 @@ if (layout != null) return layout; } - adapter = (ProfileLS) this.manager.lookup(ProfileLS.ROLE); + + CopletInstanceDataManager copletInstanceDataManager = getCopletInstanceDataManager(service); Map parameters = new HashMap(); parameters.put("profiletype", "layout"); - + parameters.put("objectmap", copletInstanceDataManager.getCopletInstanceData()); + Map map = new SequencedHashMap(); map.put("base", this.profilesPath); map.put("portalname", service.getPortalName()); map.put("profile", "layout"); map.put("groupKey", layoutKey); + adapter = (ProfileLS) this.manager.lookup(ProfileLS.ROLE); SourceValidity newValidity = adapter.getValidity(map, parameters); - if (valid == SourceValidity.UNKNOWN) { - if (sourceValidity.isValid(newValidity) - == SourceValidity.VALID) { - // XXX what if objects is null ? Could it be ? + if (valid == SourceValidity.UNKNOWN) + { + if (sourceValidity.isValid(newValidity) == SourceValidity.VALID) + { return (Layout) ((Map) objects[0]).get(layoutID); } } // get Layout specified in the map Layout layout = (Layout) adapter.loadProfile(map, parameters); - Map layouts = null; - if (objects != null) { - layouts = (Map) objects[0]; - } else { - layouts = new HashMap(); - } - // save the root layout as default of an group if no key is given - service.setAttribute(serviceKey + "defaultKey", layout.getId()); + Map layouts = new HashMap(); + + layouts.put(null, layout); //save root with null as key cacheLayouts(layouts, layout); LayoutFactory factory = service.getComponentManager().getLayoutFactory(); factory.prepareLayout(layout); // store the new values in the service - if (newValidity != null) { + if (newValidity != null) + { objects = new Object[] { layouts, newValidity }; service.setAttribute(serviceKey, objects); } - // is the default layout wanted ? - if ((layout.getId().equals(layoutID)) || layoutID == null) { - return layout; - } - - // or a layout in the group ? return (Layout) layouts.get(layoutID); - - } catch (Exception ce) { + } + catch (Exception ce) + { throw new CascadingRuntimeException("Unable to get layout.", ce); - } finally { + } + finally + { this.manager.release(service); - this.manager.release((Component)adapter); + this.manager.release((Component) adapter); } } @@ -197,17 +184,22 @@ * @param layoutMap * @param layout */ - private void cacheLayouts(Map layoutMap, Layout layout) { - if (layout != null) { - if (layout.getId() != null) { + private void cacheLayouts(Map layoutMap, Layout layout) + { + if (layout != null) + { + if (layout.getId() != null) + { String layoutId = layout.getId(); layoutMap.put(layoutId, layout); } - if (layout instanceof CompositeLayout) { + if (layout instanceof CompositeLayout) + { // step through all it's child layouts and cache them too CompositeLayout cl = (CompositeLayout) layout; Iterator i = cl.getItems().iterator(); - while (i.hasNext()) { + while (i.hasNext()) + { Item current = (Item) i.next(); this.cacheLayouts(layoutMap, current.getLayout()); } @@ -216,104 +208,149 @@ } - public CopletInstanceData getCopletInstanceData(String copletID) { + private CopletInstanceDataManager getCopletInstanceDataManager(PortalService service) throws Exception + { + String portalName = service.getPortalName(); + CopletInstanceDataManager copletInstanceDataManager = + (CopletInstanceDataManager) this.copletInstanceDataManagers.get(portalName); + if (copletInstanceDataManager != null) + return copletInstanceDataManager; + + ProfileLS adapter = null; + try + { + adapter = (ProfileLS) this.manager.lookup(ProfileLS.ROLE); + + Map parameters = new HashMap(); + parameters.put("profiletype", "copletbasedata"); + parameters.put("objectmap", null); + + Map map = new SequencedHashMap(); + map.put("base", this.profilesPath); + map.put("portalname", service.getPortalName()); + map.put("profile", "coplet"); + map.put("name", "basedata"); + CopletBaseDataManager copletBaseDataManager = (CopletBaseDataManager) adapter.loadProfile(map, parameters); + + //CopletData + parameters.clear(); + parameters.put("profiletype", "copletdata"); + parameters.put("objectmap", copletBaseDataManager.getCopletBaseData()); + + map.clear(); + map.put("base", this.profilesPath); + map.put("portalname", service.getPortalName()); + map.put("profile", "coplet"); + map.put("name", "data"); + CopletDataManager copletDataManager = (CopletDataManager) adapter.loadProfile(map, parameters); + + //CopletInstanceData + parameters.clear(); + parameters.put("profiletype", "copletinstancedata"); + parameters.put("objectmap", copletDataManager.getCopletData()); + + map.clear(); + map.put("base", this.profilesPath); + map.put("portalname", service.getPortalName()); + map.put("profile", "coplet"); + map.put("name", "instancedata"); + copletInstanceDataManager = (CopletInstanceDataManager) adapter.loadProfile(map, parameters); + + CopletFactory copletFactory = service.getComponentManager().getCopletFactory(); + Iterator iterator = copletDataManager.getCopletData().values().iterator(); + while (iterator.hasNext()) + { + CopletData cd = (CopletData) iterator.next(); + copletFactory.prepare(cd); + } + iterator = copletInstanceDataManager.getCopletInstanceData().values().iterator(); + while (iterator.hasNext()) + { + CopletInstanceData cid = (CopletInstanceData) iterator.next(); + copletFactory.prepare(cid); + } + + this.copletInstanceDataManagers.put(portalName, copletInstanceDataManager); + return copletInstanceDataManager; + } + finally + { + this.manager.release(service); + this.manager.release((Component) adapter); + } + } + + public CopletInstanceData getCopletInstanceData(String copletID) + { PortalService service = null; - String attribute = null; - try { + try + { service = (PortalService) this.manager.lookup(PortalService.ROLE); - - attribute = - StaticProfileManager.class.getName() - + "/" - + service.getPortalName() - + "/CopletInstanceData"; - CopletInstanceDataManager copletInstanceDataManager = - (CopletInstanceDataManager) service.getAttribute(attribute); - - return copletInstanceDataManager.getCopletInstanceData(copletID); - } catch (ComponentException e) { - throw new CascadingRuntimeException( - "Unable to lookup portal service.", - e); - } finally { + return getCopletInstanceDataManager(service).getCopletInstanceData(copletID); + } + catch (Exception e) + { + throw new CascadingRuntimeException("Error in getCopletInstanceData", e); + } + finally + { this.manager.release(service); } } - public List getCopletInstanceData(CopletData data) { + public List getCopletInstanceData(CopletData data) + { List coplets = new ArrayList(); PortalService service = null; - String attribute = null; - try { + try + { service = (PortalService) this.manager.lookup(PortalService.ROLE); - - attribute = - StaticProfileManager.class.getName() - + "/" - + service.getPortalName() - + "/CopletInstanceData"; - CopletInstanceDataManager copletInstanceDataManager = - (CopletInstanceDataManager) service.getAttribute(attribute); - - Iterator iter = - copletInstanceDataManager - .getCopletInstanceData() - .values() - .iterator(); - while (iter.hasNext()) { + Iterator iter = getCopletInstanceDataManager(service).getCopletInstanceData().values().iterator(); + while (iter.hasNext()) + { CopletInstanceData current = (CopletInstanceData) iter.next(); - if (current.getCopletData().equals(data)) { + if (current.getCopletData().equals(data)) + { coplets.add(current); } } return coplets; - } catch (ComponentException e) { - throw new CascadingRuntimeException( - "Unable to lookup portal service.", - e); - } finally { + } + catch (Exception e) + { + throw new CascadingRuntimeException("Error in getCopletInstanceData", e); + } + finally + { this.manager.release(service); } } - public void register(CopletInstanceData coplet) { - } - - public void unregister(CopletInstanceData coplet) { + public void register(CopletInstanceData coplet) + { } - public void register(Layout layout) { + public void unregister(CopletInstanceData coplet) + { } - public void unregister(Layout layout) { + public void register(Layout layout) + { } - public void saveUserProfiles() { + public void unregister(Layout layout) + { } - public void configure(Configuration configuration) - throws ConfigurationException { - Configuration child = configuration.getChild("default-layout-group"); - if (child != null) { - // get configured default LayoutGroup - defaultLayoutGroup = child.getValue(); - } - - if (this.defaultLayoutGroup == null) { - // if none is configured set it to "portal" - this.defaultLayoutGroup = "portal"; - } - child = configuration.getChild("profiles-path"); - if (child != null) { - this.profilesPath = child.getValue(); - } - if ( this.profilesPath == null ) { - this.profilesPath = "context://samples/simple-portal/profiles"; - } + public void saveUserProfiles() + { } - public Layout getPortalLayout(String key) { - return getPortalLayout(null, key); + public void configure(Configuration configuration) throws ConfigurationException + { + super.configure(configuration); + Configuration child = configuration.getChild("profiles-path"); + this.profilesPath = child.getValue("cocoon:/profiles"); + //this.profilesPath = "context://samples/simple-portal/profiles"; } - } 1.2 +2 -2 cocoon-2.1/src/blocks/portal/java/org/apache/cocoon/portal/profile/impl/MapProfileLS.java Index: MapProfileLS.java =================================================================== RCS file: /home/cvs/cocoon-2.1/src/blocks/portal/java/org/apache/cocoon/portal/profile/impl/MapProfileLS.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- MapProfileLS.java 10 Jul 2003 13:16:59 -0000 1.1 +++ MapProfileLS.java 29 Jul 2003 06:30:07 -0000 1.2 @@ -112,7 +112,7 @@ if ( !first) { buffer.append('/'); } - first = true; + first = false; } String append = entry.getValue().toString(); if ( "?".equals(append) ) { 1.1 cocoon-2.1/src/blocks/portal/java/org/apache/cocoon/portal/layout/renderer/aspect/impl/ParameterAspect.java Index: ParameterAspect.java =================================================================== /* ============================================================================ The Apache Software License, Version 1.1 ============================================================================ Copyright (C) 1999-2002 The Apache Software Foundation. All rights reserved. Redistribution and use in source and binary forms, with or without modifica- tion, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The end-user documentation included with the redistribution, if any, must include the following acknowledgment: "This product includes software developed by the Apache Software Foundation (http://www.apache.org/)." Alternately, this acknowledgment may appear in the software itself, if and wherever such third-party acknowledgments normally appear. 4. The names "Apache Cocoon" and "Apache Software Foundation" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact [EMAIL PROTECTED] 5. Products derived from this software may not be called "Apache", nor may "Apache" appear in their name, without prior written permission of the Apache Software Foundation. THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU- DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. This software consists of voluntary contributions made by many individuals on behalf of the Apache Software Foundation and was originally created by Stefano Mazzocchi <[EMAIL PROTECTED]>. For more information on the Apache Software Foundation, please see <http://www.apache.org/>. */ package org.apache.cocoon.portal.layout.renderer.aspect.impl; 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.Layout; import org.apache.cocoon.portal.layout.renderer.aspect.RendererAspectContext; import org.apache.cocoon.xml.AttributesImpl; import org.apache.cocoon.xml.XMLUtils; import org.xml.sax.ContentHandler; import org.xml.sax.SAXException; /** * * @author <a href="mailto:[EMAIL PROTECTED]">Volker Schmitt</a> * * @version CVS $Id: ParameterAspect.java,v 1.1 2003/07/29 06:30:07 cziegeler Exp $ */ public final class ParameterAspect extends AbstractAspect { /* (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, Layout layout, PortalService service, ContentHandler contenthandler) throws SAXException { final PreparedConfiguration config = (PreparedConfiguration)context.getAspectConfiguration(); Map parameter = layout.getParameters(); if (parameter.size() > 0) { AttributesImpl attributes = new AttributesImpl(); Map.Entry entry; for (Iterator iter = parameter.entrySet().iterator(); iter.hasNext();) { entry = (Map.Entry) iter.next(); attributes.addCDATAAttribute((String)entry.getKey(), (String)entry.getValue()); } XMLUtils.startElement(contenthandler, config.tagName, attributes); } else { XMLUtils.startElement(contenthandler, config.tagName); } context.invokeNext( layout, service, contenthandler ); 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", "parameter"); return pc; } }