| /* |
| * 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.impl; |
| |
| 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.avalon.framework.thread.ThreadSafe; |
| import org.apache.cocoon.components.url.URLFactory; |
| import org.apache.cocoon.util.ClassUtils; |
| import org.apache.excalibur.source.Source; |
| import org.apache.excalibur.source.SourceFactory; |
| import org.apache.excalibur.source.impl.URLSource; |
| |
| import java.io.IOException; |
| import java.net.MalformedURLException; |
| import java.net.URL; |
| import java.util.Map; |
| |
| /** |
| * This class wraps a Cocoon URLFactory and makes it |
| * usable within the Avalon Excalibur source resolving architecure. |
| * The main purpose is to avoid recoding existing factories. |
| * |
| * @author <a href="mailto:cziegeler@apache.org">Carsten Ziegeler</a> |
| * @version CVS $Id$ |
| */ |
| |
| public final class URLFactoryWrapper |
| extends AbstractLogEnabled |
| implements SourceFactory, |
| ThreadSafe, |
| Configurable, |
| Disposable, |
| Composable, |
| Contextualizable |
| { |
| /** The <code>ComponentManager</code> */ |
| private ComponentManager manager; |
| |
| /** The special Source factories */ |
| private URLFactory urlFactory; |
| |
| /** The context */ |
| private Context context; |
| |
| /** |
| * Configure the SourceFactories |
| */ |
| public void configure(final Configuration conf) |
| throws ConfigurationException { |
| |
| try { |
| final Configuration factoryConf = conf.getChild("url-factory"); |
| final String className = factoryConf.getAttribute("class"); |
| if (this.getLogger().isDebugEnabled()) { |
| this.getLogger().debug("Getting the URLFactory " + className); |
| } |
| this.urlFactory = (URLFactory)ClassUtils.newInstance(className); |
| this.init(this.urlFactory, factoryConf); |
| } catch (ConfigurationException e) { |
| throw e; |
| } catch (Exception e) { |
| throw new ConfigurationException("Could not get parameters because: " + |
| e.getMessage(), e); |
| } |
| } |
| |
| /** |
| * 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; |
| } |
| |
| /** |
| * Dispose |
| */ |
| public void dispose() { |
| if (this.urlFactory != null) { |
| this.deinit(this.urlFactory); |
| } |
| this.urlFactory = null; |
| } |
| |
| |
| /** |
| * Get a <code>Source</code> object. |
| * @param parameters This is optional. |
| */ |
| public Source getSource( String location, Map parameters ) |
| throws MalformedURLException, IOException |
| { |
| if( this.getLogger().isDebugEnabled() ) { |
| this.getLogger().debug( "Creating source object for " + location ); |
| } |
| |
| final int protocolPos = location.indexOf("://"); |
| final URL url = this.urlFactory.getURL(location.substring(protocolPos+3)); |
| final URLSource source = new org.apache.excalibur.source.impl.URLSource(); |
| source.init(url, parameters); |
| return source; |
| } |
| |
| /** |
| * Init a url factory |
| */ |
| private void init(URLFactory 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 url factory |
| */ |
| private void deinit(URLFactory factory) { |
| if (factory instanceof Disposable) { |
| ((Disposable) factory).dispose(); |
| } |
| } |
| |
| /** |
| * Release a {@link Source} object. |
| */ |
| public void release( Source source ) { |
| if ( null != source ) { |
| if ( this.getLogger().isDebugEnabled() ) { |
| this.getLogger().debug("Releasing source " + source.getURI()); |
| } |
| // do simply nothing |
| } |
| } |
| |
| } |