001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: */
017: package org.apache.cocoon.portal.generation;
018:
019: import java.util.Map;
020:
021: import org.apache.avalon.framework.parameters.ParameterException;
022: import org.apache.avalon.framework.service.ServiceException;
023: import org.apache.avalon.framework.service.ServiceManager;
024: import org.apache.cocoon.environment.ObjectModelHelper;
025: import org.apache.cocoon.generation.ServiceableGenerator;
026: import org.apache.cocoon.portal.Constants;
027: import org.apache.cocoon.portal.PortalService;
028: import org.apache.cocoon.portal.coplet.CopletInstanceData;
029: import org.xml.sax.SAXException;
030:
031: /**
032: * Abstract generator implementation that provides a method getCopletInstanceData().
033: * There are two possibilities how the generator obtains the information required for
034: * getting the coplet instance data:<br><br>
035: * 1) If it is used within a coplet pipeline and this pipeline is called using the "cocoon:" protocol,
036: * all required information are passed automatically.<br>
037: * 2) Otherwise the portal name and the coplet id must be passed to the generator
038: * as paremeters in the following way:
039: *
040: * <pre><map:generator type="coplet">
041: * <map:parameter name="portalName" type="exampleportal"/>
042: * <map:parameter name="copletId" type="examplecoplet"/>
043: * </map:generator></pre>
044: *
045: * @author <a href="mailto:cziegeler@s-und-n.de">Carsten Ziegeler</a>
046: * @version CVS $Id: AbstractCopletTransformer.java 30941 2004-07-29 19:56:58Z vgritsenko $
047: */
048: public abstract class AbstractCopletGenerator extends
049: ServiceableGenerator {
050:
051: /**
052: * Parameter name.
053: */
054: public static final String COPLET_ID_PARAM = "copletId";
055:
056: /**
057: * Parameter name.
058: */
059: public static final String PORTAL_NAME_PARAM = "portalName";
060:
061: /** The portal service. @since 2.1.8 */
062: protected PortalService portalService;
063:
064: /**
065: * Try to get the coplet instance data belonging to the current request
066: * @return The coplet instance data
067: * @throws SAXException If an errors occurs or the instance data is not available
068: */
069: protected CopletInstanceData getCopletInstanceData()
070: throws SAXException {
071: CopletInstanceData cid = this .getCopletInstanceData(null);
072: if (cid == null) {
073: throw new SAXException(
074: "Could not find coplet instance data for the current pipeline.");
075: }
076: return cid;
077: }
078:
079: /**
080: * Get the portal service
081: */
082: protected PortalService getPortalService() {
083: return this .portalService;
084: }
085:
086: /**
087: * Try to get the coplet instance data with the given id
088: * @param copletId The id of the coplet instance or null if this transformer
089: * is used inside a coplet pipeline
090: * @return The coplet instance data or null
091: * @throws SAXException If an error occurs
092: */
093: protected CopletInstanceData getCopletInstanceData(String copletId)
094: throws SAXException {
095: final Map context = (Map) objectModel
096: .get(ObjectModelHelper.PARENT_CONTEXT);
097:
098: if (copletId == null) {
099: // determine coplet id
100: if (context != null) {
101: copletId = (String) context
102: .get(Constants.COPLET_ID_KEY);
103: } else {
104: copletId = (String) objectModel
105: .get(Constants.COPLET_ID_KEY);
106: if (copletId == null) {
107: try {
108: copletId = this .parameters
109: .getParameter(COPLET_ID_PARAM);
110:
111: } catch (ParameterException e) {
112: throw new SAXException(
113: "copletId must be passed as parameter or in the object model within the parent context.");
114: }
115: }
116: }
117: }
118: if (copletId == null) {
119: throw new SAXException(
120: "copletId must be passed as parameter or in the object model within the parent context.");
121: }
122:
123: CopletInstanceData object = this .getPortalService()
124: .getComponentManager().getProfileManager()
125: .getCopletInstanceData(copletId);
126:
127: return object;
128: }
129:
130: /**
131: * @see org.apache.avalon.framework.activity.Disposable#dispose()
132: */
133: public void dispose() {
134: if (this .manager != null) {
135: this .manager.release(this .portalService);
136: this .portalService = null;
137: }
138: super .dispose();
139: }
140:
141: /**
142: * @see org.apache.avalon.framework.service.Serviceable#service(org.apache.avalon.framework.service.ServiceManager)
143: */
144: public void service(ServiceManager manager) throws ServiceException {
145: super .service(manager);
146: this .portalService = (PortalService) this.manager
147: .lookup(PortalService.ROLE);
148: }
149: }
|