blob: 0f18d5a2a2f21448875aee3a806aa6bca04fc6b3 [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.source;
import org.apache.avalon.framework.activity.Disposable;
import org.apache.avalon.framework.component.ComponentException;
import org.apache.avalon.framework.component.ComponentManager;
import org.apache.avalon.framework.component.Composable;
import org.apache.avalon.framework.configuration.Configurable;
import org.apache.avalon.framework.configuration.Configuration;
import org.apache.avalon.framework.configuration.ConfigurationException;
import org.apache.avalon.framework.context.Context;
import org.apache.avalon.framework.context.ContextException;
import org.apache.avalon.framework.context.Contextualizable;
import org.apache.avalon.framework.logger.AbstractLogEnabled;
import org.apache.avalon.framework.logger.LogEnabled;
import org.apache.cocoon.ProcessingException;
import org.apache.cocoon.components.url.URLFactory;
import org.apache.cocoon.environment.Environment;
import org.apache.cocoon.environment.Source;
import org.apache.cocoon.util.ClassUtils;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
/**
* @deprecated The Avalon Excalibur Source Resolving is now used.
*
* @author <a href="mailto:cziegeler@apache.org">Carsten Ziegeler</a>
* @version CVS $Id$
*/
public final class SourceHandlerImpl extends AbstractLogEnabled
implements Configurable, Disposable, Composable, Contextualizable, SourceHandler {
/** The component manager */
private ComponentManager manager;
/** The url factory */
private URLFactory urlFactory;
/** The special Source factories */
private Map sourceFactories;
/** The context */
private Context context;
/**
* Configure the SourceFactories
*/
public void configure(final Configuration conf)
throws ConfigurationException {
try {
if (this.getLogger().isDebugEnabled()) {
getLogger().debug("Getting the SourceFactories");
}
HashMap factories = new HashMap();
Configuration[] configs = conf.getChildren("protocol");
SourceFactory sourceFactory = null;
String protocol = null;
for (int i = 0; i < configs.length; i++) {
protocol = configs[i].getAttribute("name");
if (factories.containsKey(protocol)) {
throw new ConfigurationException("SourceFactory defined twice for protocol: " + protocol);
}
if (this.getLogger().isDebugEnabled()) {
getLogger().debug("\tfor protocol: " + protocol + " " + configs[i].getAttribute("class"));
}
sourceFactory = (SourceFactory) ClassUtils.newInstance(configs[i].getAttribute("class"));
this.init(sourceFactory, configs[i]);
factories.put(protocol, sourceFactory);
}
this.sourceFactories = java.util.Collections.synchronizedMap(factories);
} catch (ConfigurationException e) {
throw e;
} catch (Exception e) {
throw new ConfigurationException("Could not get parameters because: " +
e.getMessage());
}
}
/**
* Get the context
*/
public void contextualize(Context context)
throws ContextException {
this.context = context;
}
/**
* Set the current <code>ComponentManager</code> instance used by this
* <code>Composable</code>.
*/
public void compose(ComponentManager manager)
throws ComponentException {
this.manager = manager;
this.urlFactory = (URLFactory)this.manager.lookup(URLFactory.ROLE);
}
/**
* Dispose
*/
public void dispose() {
this.manager.release(this.urlFactory);
final Iterator iter = this.sourceFactories.values().iterator();
SourceFactory current;
while (iter.hasNext()) {
current = (SourceFactory) iter.next();
this.deinit(current);
}
this.sourceFactories = null;
}
/**
* Get a <code>Source</code> object.
*/
public Source getSource(Environment environment, String location)
throws ProcessingException, MalformedURLException, IOException {
final int protocolEnd = location.indexOf(':');
if (protocolEnd != -1) {
final String protocol = location.substring(0, protocolEnd);
final SourceFactory sourceFactory = (SourceFactory)this.sourceFactories.get(protocol);
if (sourceFactory != null) {
return sourceFactory.getSource(environment, location);
}
}
// default implementation
Source result = new URLSource(this.urlFactory.getURL(location), this.manager);
if (result instanceof LogEnabled) {
((LogEnabled)result).enableLogging(getLogger());
}
return result;
}
/**
* Get a <code>Source</code> object.
*/
public Source getSource(Environment environment, URL base, String location)
throws ProcessingException, MalformedURLException, IOException {
final String protocol = base.getProtocol();
final SourceFactory sourceFactory = (SourceFactory)this.sourceFactories.get(protocol);
if (sourceFactory != null) {
return sourceFactory.getSource(environment, base, location);
}
// default implementation
return new URLSource(this.urlFactory.getURL(base, location), this.manager);
}
/**
* Add a factory
*/
public void addFactory(String protocol, SourceFactory factory)
throws ProcessingException {
try {
this.init(factory, null);
SourceFactory oldFactory = (SourceFactory)this.sourceFactories.put(protocol, factory);
if (oldFactory != null) {
deinit(oldFactory);
}
} catch (ComponentException e) {
throw new ProcessingException("cannot initialize factory: " + factory, e);
} catch (ContextException e) {
throw new ProcessingException("cannot initialize factory: " + factory, e);
} catch (ConfigurationException e) {
throw new ProcessingException("cannot configure factory: " + factory, e);
}
}
/**
* Init a source factory
*/
private void init(SourceFactory factory, Configuration config)
throws ContextException, ComponentException, ConfigurationException {
if (factory instanceof LogEnabled) {
((LogEnabled) factory).enableLogging(getLogger());
}
if (factory instanceof Contextualizable) {
((Contextualizable) factory).contextualize (this.context);
}
if (factory instanceof Composable) {
((Composable) factory).compose(this.manager);
}
if (config != null && factory instanceof Configurable) {
((Configurable) factory).configure(config);
}
}
/**
* Deinit a source factory
*/
private void deinit(SourceFactory factory) {
if (factory instanceof Disposable) {
((Disposable) factory).dispose();
}
}
}