| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package org.apache.cocoon.portal.layout.renderer.impl; |
| |
| import java.util.Iterator; |
| |
| import org.apache.avalon.framework.activity.Disposable; |
| 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.context.Context; |
| import org.apache.avalon.framework.context.ContextException; |
| import org.apache.avalon.framework.context.Contextualizable; |
| import org.apache.avalon.framework.logger.AbstractLogEnabled; |
| import org.apache.avalon.framework.service.ServiceException; |
| import org.apache.avalon.framework.service.ServiceManager; |
| import org.apache.avalon.framework.service.ServiceSelector; |
| import org.apache.avalon.framework.service.Serviceable; |
| import org.apache.avalon.framework.thread.ThreadSafe; |
| import org.apache.cocoon.components.ContextHelper; |
| import org.apache.cocoon.portal.PortalService; |
| import org.apache.cocoon.portal.layout.Layout; |
| import org.apache.cocoon.portal.layout.renderer.Renderer; |
| import org.apache.cocoon.portal.layout.renderer.aspect.RendererAspect; |
| import org.apache.cocoon.portal.layout.renderer.aspect.impl.DefaultRendererContext; |
| import org.apache.cocoon.portal.layout.renderer.aspect.impl.RendererAspectChain; |
| import org.xml.sax.ContentHandler; |
| import org.xml.sax.SAXException; |
| |
| /** |
| * Container for chain of aspect renderers. All aspect renderers are applied in order |
| * of appearance. |
| * |
| * <h2>Configuration</h2> |
| * <table><tbody> |
| * <tr><th>aspects</th><td>List of aspect renderers to apply. See |
| * {@link org.apache.cocoon.portal.layout.renderer.aspect.impl.RendererAspectChain}</td> |
| * <td></td><td>Configuration</td><td><code>EmptyConfiguration</code></td></tr> |
| * </tbody></table> |
| * |
| * @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> |
| * |
| * @version CVS $Id$ |
| */ |
| public class AspectRenderer |
| extends AbstractLogEnabled |
| implements Renderer, Serviceable, Configurable, Disposable, ThreadSafe, Contextualizable { |
| |
| protected ServiceManager manager; |
| |
| protected RendererAspectChain chain; |
| |
| protected ServiceSelector aspectSelector; |
| |
| protected Context context; |
| |
| /* (non-Javadoc) |
| * @see org.apache.avalon.framework.service.Serviceable#service(org.apache.avalon.framework.service.ServiceManager) |
| */ |
| public void service(ServiceManager manager) throws ServiceException { |
| this.manager = manager; |
| this.aspectSelector = (ServiceSelector) this.manager.lookup( RendererAspect.ROLE+"Selector"); |
| } |
| |
| /** |
| * Stream out raw layout |
| */ |
| public void toSAX(Layout layout, PortalService service, ContentHandler handler) throws SAXException { |
| Boolean isRenderable = service.isRenderable(); |
| DefaultRendererContext renderContext = new DefaultRendererContext(this.chain, layout, service); |
| renderContext.setObjectModel(ContextHelper.getObjectModel(this.context)); |
| renderContext.invokeNext(layout, service, handler); |
| service.setRenderable(isRenderable); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.apache.avalon.framework.configuration.Configurable#configure(org.apache.avalon.framework.configuration.Configuration) |
| */ |
| public void configure(Configuration conf) throws ConfigurationException { |
| this.chain = new RendererAspectChain(); |
| this.chain.configure(this.aspectSelector, conf.getChild("aspects")); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.apache.avalon.framework.activity.Disposable#dispose() |
| */ |
| public void dispose() { |
| if (this.manager != null) { |
| if ( this.chain != null) { |
| this.chain.dispose( this.aspectSelector ); |
| } |
| this.manager.release( this.aspectSelector ); |
| this.aspectSelector = null; |
| this.manager = null; |
| } |
| } |
| |
| /** |
| * Return the aspects required for this renderer |
| */ |
| public Iterator getAspectDescriptions() { |
| return this.chain.getAspectDescriptionIterator(); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.apache.avalon.framework.context.Contextualizable#contextualize(org.apache.avalon.framework.context.Context) |
| */ |
| public void contextualize(Context context) throws ContextException { |
| this.context = context; |
| } |
| |
| } |