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.components.modules.output;
018:
019: import org.apache.avalon.framework.activity.Disposable;
020: import org.apache.avalon.framework.configuration.Configurable;
021: import org.apache.avalon.framework.configuration.Configuration;
022: import org.apache.avalon.framework.configuration.ConfigurationException;
023: import org.apache.avalon.framework.logger.AbstractLogEnabled;
024:
025: import org.apache.cocoon.environment.ObjectModelHelper;
026: import org.apache.cocoon.environment.Request;
027: import org.apache.cocoon.util.HashMap;
028:
029: import java.util.Map;
030:
031: /**
032: * AbstractOutputModule gives you the infrastructure for easily
033: * deploying more output modules.
034: *
035: * <p>In order to get at the logger, use <code>getLogger()</code>.</p>
036: *
037: * @author <a href="mailto:haul@apache.org">Christian Haul</a>
038: * @version CVS $Id: AbstractOutputModule.java 433543 2006-08-22 06:22:54Z crossley $
039: */
040: public abstract class AbstractOutputModule extends AbstractLogEnabled
041: implements OutputModule, Configurable, Disposable {
042:
043: /**
044: * Stores (global) configuration parameters as <code>key</code> /
045: * <code>value</code> pairs.
046: */
047: protected HashMap settings;
048:
049: /**
050: * Configures the module.
051: *
052: * <p>Takes all elements nested in component declaration and stores
053: * them as key-value pairs in <code>settings</code>. Nested
054: * configuration option are not catered for. This way global
055: * configuration options can be used.</p>
056: *
057: * <p>For nested configurations override this function.</p>
058: */
059: public void configure(Configuration conf)
060: throws ConfigurationException {
061: Configuration[] parameters = conf.getChildren();
062: // Ideally here should be length * 1.333(3) but simple +1 will do for lengths up to 3
063: this .settings = new HashMap(parameters.length + 1);
064: for (int i = 0; i < parameters.length; i++) {
065: String key = parameters[i].getName();
066: String val = parameters[i].getValue("");
067: this .settings.put(key, val);
068: }
069: }
070:
071: /**
072: * Dispose
073: */
074: public void dispose() {
075: // Implemeted so that we don't need to implement it in every subclass
076: this .settings = null;
077: }
078:
079: /**
080: * Utility method to store parameters in a map as request attribute until
081: * either {@link #rollback(Map, String)} or {@link #prepareCommit(Map, String)}
082: * is called.
083: * @param objectModel - the objectModel
084: * @param trans_place - request attribute name used for the transient data
085: * @param name - name of the attribute to set
086: * @param value - attribute value
087: */
088: protected void transientSetAttribute(Map objectModel,
089: String trans_place, String name, Object value) {
090: final Request request = ObjectModelHelper
091: .getRequest(objectModel);
092:
093: Map map = (Map) request.getAttribute(trans_place);
094: if (map == null) {
095: // Need java.util.HashMap here since JXPath does not like the extended version...
096: map = new java.util.HashMap();
097: }
098:
099: map.put(name, value);
100: request.setAttribute(trans_place, map);
101: }
102:
103: /**
104: * Clears all uncommitted transient attributes.
105: *
106: * @param objectModel - the objectModel
107: * @param trans_place - request attribute name used for the transient data
108: */
109: protected void rollback(Map objectModel, String trans_place) {
110: ObjectModelHelper.getRequest(objectModel).removeAttribute(
111: trans_place);
112: }
113:
114: /**
115: * Returns a whether an transient attribute already exists.
116: * {@link #transientSetAttribute(Map, String, String, Object)} since the last call to
117: * {@link #rollback(Map, String)} or {@link #prepareCommit(Map, String)}
118: *
119: * @param objectModel - the objectModel
120: * @param trans_place - request attribute name used for the transient data
121: */
122: protected boolean attributeExists(Map objectModel,
123: String trans_place, String name) {
124: final Request request = ObjectModelHelper
125: .getRequest(objectModel);
126:
127: Map map = (Map) request.getAttribute(trans_place);
128: if (map == null) {
129: return false;
130: }
131:
132: return map.containsKey(name);
133: }
134:
135: /**
136: * Returns a map containing all transient attributes and remove them i.e. attributes set with
137: * {@link #transientSetAttribute(Map, String, String, Object)} since the last call to
138: * {@link #rollback(Map, String)} or {@link #prepareCommit(Map, String)}
139: *
140: * @param objectModel - the objectModel
141: * @param trans_place - request attribute name used for the transient data
142: */
143: protected Map prepareCommit(Map objectModel, String trans_place) {
144: final Request request = ObjectModelHelper
145: .getRequest(objectModel);
146:
147: Map data = (Map) request.getAttribute(trans_place);
148: request.removeAttribute(trans_place);
149: return data;
150: }
151: }
|