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.input;
018:
019: import java.util.HashMap;
020: import java.util.Iterator;
021: import java.util.Map;
022:
023: import org.apache.avalon.framework.component.Component;
024: import org.apache.avalon.framework.configuration.Configurable;
025: import org.apache.avalon.framework.configuration.Configuration;
026: import org.apache.avalon.framework.configuration.ConfigurationException;
027: import org.apache.avalon.framework.context.Context;
028: import org.apache.avalon.framework.context.ContextException;
029: import org.apache.avalon.framework.context.Contextualizable;
030: import org.apache.avalon.framework.logger.AbstractLogEnabled;
031: import org.apache.avalon.framework.thread.ThreadSafe;
032: import org.apache.cocoon.components.ChainedConfiguration;
033: import org.apache.cocoon.components.SitemapConfigurable;
034: import org.apache.cocoon.components.SitemapConfigurationHolder;
035: import org.apache.cocoon.util.Settings;
036: import org.apache.cocoon.util.SettingsHelper;
037:
038: /**
039: * This "component" is a trick to get global variables on a per
040: * sitemap base
041: *
042: * @deprecated This component will be replaced by a better version in 2.2.
043: * @author <a href="mailto:cziegeler@apache.org">Carsten Ziegeler</a>
044: * @version $Id: SitemapVariableHolder.java 433543 2006-08-22 06:22:54Z crossley $
045: */
046: public final class SitemapVariableHolder extends AbstractLogEnabled
047: implements Component, Configurable, Contextualizable,
048: SitemapConfigurable, ThreadSafe {
049:
050: public static final String ROLE = SitemapVariableHolder.class
051: .getName();
052:
053: /**
054: * Stores (global) configuration parameters as <code>key</code> /
055: * <code>value</code> pairs from the component configuration
056: */
057: private Map globalValues;
058:
059: /** Manager for sitemap/sub sitemap configuration */
060: private SitemapConfigurationHolder holder;
061:
062: private Context context;
063:
064: /**
065: * @see org.apache.avalon.framework.context.Contextualizable#contextualize(org.apache.avalon.framework.context.Context)
066: */
067: public void contextualize(Context context) throws ContextException {
068: this .context = context;
069: }
070:
071: /**
072: * Configures the database access helper.
073: *
074: * Takes all elements nested in component declaration and stores
075: * them as key-value pairs in <code>settings</code>. Nested
076: * configuration option are not catered for. This way global
077: * configuration options can be used.
078: *
079: * For nested configurations override this function.
080: * */
081: public void configure(Configuration conf)
082: throws ConfigurationException {
083: this .globalValues = new HashMap();
084: Settings settings = SettingsHelper.getSettings(this .context);
085: final Iterator iter = settings.getProperties().iterator();
086: while (iter.hasNext()) {
087: final String key = (String) iter.next();
088: final String value = settings.getProperty(key);
089: this .globalValues.put(key, value);
090: }
091: final Configuration[] parameters = conf.getChildren();
092: for (int i = 0; i < parameters.length; i++) {
093: final String key = parameters[i].getName();
094: final String value = parameters[i].getValue();
095: this .globalValues.put(key, value);
096: }
097: }
098:
099: /**
100: * Set the <code>Configuration</code> from a sitemap
101: */
102: public void configure(SitemapConfigurationHolder holder) {
103: this .holder = holder;
104: }
105:
106: /**
107: * Get a value
108: */
109: public Object get(String key) {
110: return this .getValues().get(key);
111: }
112:
113: /**
114: * Get keys
115: */
116: public Iterator getKeys() {
117: return this .getValues().keySet().iterator();
118: }
119:
120: protected Map getValues() {
121: Map values = (Map) this .holder.getPreparedConfiguration();
122: if (null == values) {
123: values = new HashMap(this .globalValues);
124: ChainedConfiguration conf = this .holder.getConfiguration();
125: if (conf != null) {
126: this .prepare(conf, values);
127: this .holder.setPreparedConfiguration(conf, values);
128: }
129: }
130: return values;
131: }
132:
133: protected void prepare(ChainedConfiguration conf, Map values) {
134: ChainedConfiguration parent = conf.getParent();
135: if (null != parent) {
136: this .prepare(parent, values);
137: }
138: final Configuration[] parameters = conf.getChildren();
139: final int len = parameters.length;
140: for (int i = 0; i < len; i++) {
141: final String key = parameters[i].getName();
142: final String value = parameters[i].getValue("");
143: if (key != null && value != null) {
144: values.put(key, value);
145: }
146: }
147: }
148: }
|