Author: cziegeler Date: Thu Oct 7 06:07:26 2004 New Revision: 53964 Added: cocoon/branches/BRANCH_2_1_X/src/blocks/portal/java/org/apache/cocoon/portal/generation/AbstractCopletGenerator.java Modified: cocoon/branches/BRANCH_2_1_X/src/blocks/portal/java/org/apache/cocoon/portal/LinkService.java cocoon/branches/BRANCH_2_1_X/src/blocks/portal/java/org/apache/cocoon/portal/impl/DefaultLinkService.java cocoon/branches/BRANCH_2_1_X/src/blocks/portal/java/org/apache/cocoon/portal/transformation/AbstractCopletTransformer.java Log: Minor improvements
Modified: cocoon/branches/BRANCH_2_1_X/src/blocks/portal/java/org/apache/cocoon/portal/LinkService.java ============================================================================== --- cocoon/branches/BRANCH_2_1_X/src/blocks/portal/java/org/apache/cocoon/portal/LinkService.java (original) +++ cocoon/branches/BRANCH_2_1_X/src/blocks/portal/java/org/apache/cocoon/portal/LinkService.java Thu Oct 7 06:07:26 2004 @@ -33,6 +33,12 @@ String DEFAULT_REQUEST_EVENT_PARAMETER_NAME = "cocoon-portal-event"; + static class ParameterDescription { + public final String parameters; + public ParameterDescription(String parameters) { + this.parameters = parameters; + } + } /** * Get the uri for this coplet containing the additional event * @param event The event to add (null is also allowed for convenience) @@ -41,8 +47,8 @@ String getLinkURI(Event event); /** - * Get the uri for this coplet containing the additional events - * @param events The events to add + * Get the uri for this coplet containing the additional events. + * @param events The events to add: These can either be [EMAIL PROTECTED] Event}s or [EMAIL PROTECTED] #ParameterDescription}s. * @return A URI */ String getLinkURI(List events); Added: cocoon/branches/BRANCH_2_1_X/src/blocks/portal/java/org/apache/cocoon/portal/generation/AbstractCopletGenerator.java ============================================================================== --- (empty file) +++ cocoon/branches/BRANCH_2_1_X/src/blocks/portal/java/org/apache/cocoon/portal/generation/AbstractCopletGenerator.java Thu Oct 7 06:07:26 2004 @@ -0,0 +1,155 @@ +/* + * Copyright 1999-2002,2004 The Apache Software Foundation. + * + * Licensed 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.generation; + +import java.util.Map; + +import org.apache.avalon.framework.parameters.ParameterException; +import org.apache.avalon.framework.service.ServiceException; +import org.apache.cocoon.environment.ObjectModelHelper; +import org.apache.cocoon.generation.ServiceableGenerator; +import org.apache.cocoon.portal.Constants; +import org.apache.cocoon.portal.PortalService; +import org.apache.cocoon.portal.coplet.CopletInstanceData; +import org.xml.sax.SAXException; + +/** + * Abstract generator implementation that provides a method getCopletInstanceData(). + * There are two possibilities how the generator obtains the information required for + * getting the coplet instance data:<br><br> + * 1) If it is used within a coplet pipeline and this pipeline is called using the "cocoon:" protocol, + * all required information are passed automatically.<br> + * 2) Otherwise the portal name and the coplet id must be passed to the generator + * as paremeters in the following way: + * + * <pre><map:generator type="coplet"> + * <map:parameter name="portalName" type="exampleportal"/> + * <map:parameter name="copletId" type="examplecoplet"/> + * </map:generator></pre> + * + * @author <a href="mailto:[EMAIL PROTECTED]">Carsten Ziegeler</a> + * @version CVS $Id: AbstractCopletTransformer.java 30941 2004-07-29 19:56:58Z vgritsenko $ + */ +public abstract class AbstractCopletGenerator +extends ServiceableGenerator { + + /** + * Parameter name. + */ + public static final String COPLET_ID_PARAM = "copletId"; + + /** + * Parameter name. + */ + public static final String PORTAL_NAME_PARAM = "portalName"; + + /** The portal service */ + private PortalService _portalService; + + /** + * Try to get the coplet instance data belonging to the current request + * @return The coplet instance data + * @throws SAXException If an errors occurs or the instance data is not available + */ + protected CopletInstanceData getCopletInstanceData() + throws SAXException { + CopletInstanceData cid = this.getCopletInstanceData(null); + if ( cid == null ) { + throw new SAXException("Could not find coplet instance data for the current pipeline."); + } + return cid; + } + + + /** + * Get the portal service + */ + protected PortalService getPortalService() + throws SAXException { + if ( this._portalService == null ) { + try { + this._portalService = (PortalService)this.manager.lookup(PortalService.ROLE); + + if ( this._portalService.getPortalName() == null ) { + // set portal name + String portalName = this.parameters.getParameter(PORTAL_NAME_PARAM, + (String)this.objectModel.get(Constants.PORTAL_NAME_KEY)); + if ( portalName == null ) { + final Map context = (Map)this.objectModel.get(ObjectModelHelper.PARENT_CONTEXT); + if ( context != null ) { + portalName = (String) context.get(Constants.PORTAL_NAME_KEY); + } + } + if ( portalName == null ) { + throw new SAXException("portalName must be passed as parameter or in the object model."); + } + this._portalService.setPortalName(portalName); + } + } catch (ServiceException se) { + throw new SAXException("Unable to get portal service.", se); + } + } + return this._portalService; + } + + + /** + * Try to get the coplet instance data with the given id + * @param copletId The id of the coplet instance or null if this transformer + * is used inside a coplet pipeline + * @return The coplet instance data or null + * @throws SAXException If an error occurs + */ + protected CopletInstanceData getCopletInstanceData(String copletId) + throws SAXException { + final Map context = (Map)objectModel.get(ObjectModelHelper.PARENT_CONTEXT); + + if ( copletId == null ) { + // determine coplet id + if (context != null) { + copletId = (String)context.get(Constants.COPLET_ID_KEY); + } else { + copletId = (String)objectModel.get(Constants.COPLET_ID_KEY); + if ( copletId == null ) { + try { + copletId = this.parameters.getParameter(COPLET_ID_PARAM); + + } catch (ParameterException e) { + throw new SAXException("copletId must be passed as parameter or in the object model within the parent context."); + } + } + } + } + if (copletId == null) { + throw new SAXException("copletId must be passed as parameter or in the object model within the parent context."); + } + + CopletInstanceData object = this.getPortalService().getComponentManager().getProfileManager().getCopletInstanceData( copletId ); + + return object; + } + + /* (non-Javadoc) + * @see org.apache.avalon.excalibur.pool.Recyclable#recycle() + */ + public void recycle() { + if ( this._portalService != null ) { + this.manager.release( this._portalService ); + this._portalService = null; + } + super.recycle(); + } +} Modified: cocoon/branches/BRANCH_2_1_X/src/blocks/portal/java/org/apache/cocoon/portal/impl/DefaultLinkService.java ============================================================================== --- cocoon/branches/BRANCH_2_1_X/src/blocks/portal/java/org/apache/cocoon/portal/impl/DefaultLinkService.java (original) +++ cocoon/branches/BRANCH_2_1_X/src/blocks/portal/java/org/apache/cocoon/portal/impl/DefaultLinkService.java Thu Oct 7 06:07:26 2004 @@ -175,7 +175,7 @@ Iterator eventIterator = events.iterator(); boolean found = false; while (!found && eventIterator.hasNext()) { - Event inEvent = (Event)eventIterator.next(); + final Object inEvent = eventIterator.next(); if ( inEvent instanceof ComparableEvent && current.equalsEvent((ComparableEvent)inEvent)) { found = true; @@ -195,8 +195,18 @@ // now add events iter = events.iterator(); while ( iter.hasNext()) { - final Event current = (Event)iter.next(); - hasParams = this.addEvent(buffer, current, hasParams); + final Object current = iter.next(); + if ( current instanceof Event ) { + hasParams = this.addEvent(buffer, (Event)current, hasParams); + } else if ( current instanceof ParameterDescription ) { + if ( hasParams ) { + buffer.append('&'); + } else { + buffer.append('?'); + hasParams = true; + } + buffer.append(((ParameterDescription)current).parameters); + } } return buffer.toString(); } Modified: cocoon/branches/BRANCH_2_1_X/src/blocks/portal/java/org/apache/cocoon/portal/transformation/AbstractCopletTransformer.java ============================================================================== --- cocoon/branches/BRANCH_2_1_X/src/blocks/portal/java/org/apache/cocoon/portal/transformation/AbstractCopletTransformer.java (original) +++ cocoon/branches/BRANCH_2_1_X/src/blocks/portal/java/org/apache/cocoon/portal/transformation/AbstractCopletTransformer.java Thu Oct 7 06:07:26 2004 @@ -41,7 +41,7 @@ * </map:transform></pre> * * @author <a href="mailto:[EMAIL PROTECTED]">Carsten Ziegeler</a> - * @version CVS $Id: AbstractCopletTransformer.java,v 1.9 2004/03/16 09:16:59 cziegeler Exp $ + * @version CVS $Id$ */ public abstract class AbstractCopletTransformer extends AbstractSAXTransformer { @@ -122,11 +122,14 @@ if (context != null) { copletId = (String)context.get(Constants.COPLET_ID_KEY); } else { - try { - copletId = this.parameters.getParameter(COPLET_ID_PARAM); + copletId = (String)objectModel.get(Constants.COPLET_ID_KEY); + if ( copletId == null ) { + try { + copletId = this.parameters.getParameter(COPLET_ID_PARAM); - } catch (ParameterException e) { - throw new SAXException("copletId must be passed as parameter or in the object model within the parent context."); + } catch (ParameterException e) { + throw new SAXException("copletId must be passed as parameter or in the object model within the parent context."); + } } } }