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.source.impl;
018:
019: import org.apache.avalon.framework.activity.Disposable;
020: import org.apache.avalon.framework.component.ComponentException;
021: import org.apache.avalon.framework.component.ComponentManager;
022: import org.apache.avalon.framework.component.Composable;
023: import org.apache.avalon.framework.configuration.Configurable;
024: import org.apache.avalon.framework.configuration.Configuration;
025: import org.apache.avalon.framework.configuration.ConfigurationException;
026: import org.apache.avalon.framework.context.Context;
027: import org.apache.avalon.framework.context.ContextException;
028: import org.apache.avalon.framework.context.Contextualizable;
029: import org.apache.avalon.framework.logger.AbstractLogEnabled;
030: import org.apache.avalon.framework.logger.LogEnabled;
031: import org.apache.avalon.framework.thread.ThreadSafe;
032: import org.apache.cocoon.components.url.URLFactory;
033: import org.apache.cocoon.util.ClassUtils;
034: import org.apache.excalibur.source.Source;
035: import org.apache.excalibur.source.SourceFactory;
036: import org.apache.excalibur.source.impl.URLSource;
037:
038: import java.io.IOException;
039: import java.net.MalformedURLException;
040: import java.net.URL;
041: import java.util.Map;
042:
043: /**
044: * This class wraps a Cocoon URLFactory and makes it
045: * usable within the Avalon Excalibur source resolving architecure.
046: * The main purpose is to avoid recoding existing factories.
047: *
048: * @author <a href="mailto:cziegeler@apache.org">Carsten Ziegeler</a>
049: * @version CVS $Id: URLFactoryWrapper.java 433543 2006-08-22 06:22:54Z crossley $
050: */
051:
052: public final class URLFactoryWrapper extends AbstractLogEnabled
053: implements SourceFactory, ThreadSafe, Configurable, Disposable,
054: Composable, Contextualizable {
055: /** The <code>ComponentManager</code> */
056: private ComponentManager manager;
057:
058: /** The special Source factories */
059: private URLFactory urlFactory;
060:
061: /** The context */
062: private Context context;
063:
064: /**
065: * Configure the SourceFactories
066: */
067: public void configure(final Configuration conf)
068: throws ConfigurationException {
069:
070: try {
071: final Configuration factoryConf = conf
072: .getChild("url-factory");
073: final String className = factoryConf.getAttribute("class");
074: if (this .getLogger().isDebugEnabled()) {
075: this .getLogger().debug(
076: "Getting the URLFactory " + className);
077: }
078: this .urlFactory = (URLFactory) ClassUtils
079: .newInstance(className);
080: this .init(this .urlFactory, factoryConf);
081: } catch (ConfigurationException e) {
082: throw e;
083: } catch (Exception e) {
084: throw new ConfigurationException(
085: "Could not get parameters because: "
086: + e.getMessage(), e);
087: }
088: }
089:
090: /**
091: * Get the context
092: */
093: public void contextualize(Context context) throws ContextException {
094: this .context = context;
095: }
096:
097: /**
098: * Set the current <code>ComponentManager</code> instance used by this
099: * <code>Composable</code>.
100: */
101: public void compose(ComponentManager manager)
102: throws ComponentException {
103: this .manager = manager;
104: }
105:
106: /**
107: * Dispose
108: */
109: public void dispose() {
110: if (this .urlFactory != null) {
111: this .deinit(this .urlFactory);
112: }
113: this .urlFactory = null;
114: }
115:
116: /**
117: * Get a <code>Source</code> object.
118: * @param parameters This is optional.
119: */
120: public Source getSource(String location, Map parameters)
121: throws MalformedURLException, IOException {
122: if (this .getLogger().isDebugEnabled()) {
123: this .getLogger().debug(
124: "Creating source object for " + location);
125: }
126:
127: final int protocolPos = location.indexOf("://");
128: final URL url = this .urlFactory.getURL(location
129: .substring(protocolPos + 3));
130: final URLSource source = new org.apache.excalibur.source.impl.URLSource();
131: source.init(url, parameters);
132: return source;
133: }
134:
135: /**
136: * Init a url factory
137: */
138: private void init(URLFactory factory, Configuration config)
139: throws ContextException, ComponentException,
140: ConfigurationException {
141: if (factory instanceof LogEnabled) {
142: ((LogEnabled) factory).enableLogging(getLogger());
143: }
144: if (factory instanceof Contextualizable) {
145: ((Contextualizable) factory).contextualize(this .context);
146: }
147: if (factory instanceof Composable) {
148: ((Composable) factory).compose(this .manager);
149: }
150: if (config != null && factory instanceof Configurable) {
151: ((Configurable) factory).configure(config);
152: }
153: }
154:
155: /**
156: * Deinit a url factory
157: */
158: private void deinit(URLFactory factory) {
159: if (factory instanceof Disposable) {
160: ((Disposable) factory).dispose();
161: }
162: }
163:
164: /**
165: * Release a {@link Source} object.
166: */
167: public void release(Source source) {
168: if (null != source) {
169: if (this .getLogger().isDebugEnabled()) {
170: this .getLogger().debug(
171: "Releasing source " + source.getURI());
172: }
173: // do simply nothing
174: }
175: }
176:
177: }
|