blob: 2f81f8bb4a8d877fac10e11bfb63d19ae503e385 [file] [log] [blame]
/*
* 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.components.modules.output;
import java.util.Map;
import org.apache.avalon.framework.configuration.Configuration;
import org.apache.cocoon.environment.ObjectModelHelper;
import org.apache.cocoon.environment.Request;
/**
* Abstraction layer to encapsulate different output
* destinations. This module outputs to a request attribute
* java.util.Map object that contains all the attributes that were
* set. Configuration option <key-prefix> defaults to
* "org.apache.cocoon.components.modules.output.OutputModule"
*
* @author <a href="mailto:haul@apache.org">Christian Haul</a>
* @version CVS $Id$
*/
public class RequestAttributeMap extends AbstractOutputModule {
public final String PREFIX = "org.apache.cocoon.components.modules.output.OutputModule";
public final String TRANS_PREFIX = "org.apache.cocoon.components.modules.output.OutputModule.RequestAttributeMap.transient";
/**
* communicate an attribute value to further processing logic.
* @param modeConf column's mode configuration from resource
* description. This argument is optional.
* @param objectModel The objectModel
* @param name The attribute's label, consisting of "table.column"
* or "table.column[index]" in case of multiple attributes of the
* same spec.
* @param value The attriute's value.
* */
public void setAttribute( Configuration modeConf, Map objectModel, String name, Object value ) {
if (getLogger().isDebugEnabled())
getLogger().debug("setting transient ['"+name+"'] to ['"+value+"']");
super.transientSetAttribute(objectModel, TRANS_PREFIX, name, value );
}
/**
* If a database transaction needs to rollback, this is called to
* inform the further processing logic about this fact. All
* already set attribute values are invalidated. <em>This is difficult
* because only the request object can be used to synchronize this
* and build some kind of transaction object. Beaware that sending
* your data straight to some beans or other entities could result
* in data corruption!</em>
* */
public void rollback( Configuration modeConf, Map objectModel, Exception e ) {
if (getLogger().isDebugEnabled())
getLogger().debug("rolling back");
super.rollback(objectModel, TRANS_PREFIX);
}
/**
* Signal that the database transaction completed
* successfully. See notes on @link{rollback}.
* */
public void commit( Configuration modeConf, Map objectModel ) {
if (getLogger().isDebugEnabled())
getLogger().debug("prepare commit");
Map aMap = super.prepareCommit(objectModel,TRANS_PREFIX);
if (aMap == null) {
// nothing to do
return;
}
String prefix = (String) this.settings.get("key-prefix", PREFIX);
Request request = ObjectModelHelper.getRequest(objectModel);
Object temp = request.getAttribute(prefix);
Map old = null;
if (temp == null) {
old = aMap;
} else {
old = (Map) temp;
old.putAll(aMap);
}
request.setAttribute(prefix, old);
if (getLogger().isDebugEnabled())
getLogger().debug("done commit to ['"+prefix+"']");
}
}