![JAR search and dependency download from the Maven repository](/logo.png)
org.codehaus.plexus.DefaultPlexusContainer Maven / Gradle / Ivy
package org.codehaus.plexus;
/*
* Copyright 2001-2006 Codehaus Foundation.
*
* Licensed 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.
*/
import static org.codehaus.plexus.PlexusConstants.PLEXUS_DEFAULT_HINT;
import static org.codehaus.plexus.component.CastUtils.cast;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.codehaus.plexus.classworlds.ClassWorld;
import org.codehaus.plexus.classworlds.realm.ClassRealm;
import org.codehaus.plexus.classworlds.realm.DuplicateRealmException;
import org.codehaus.plexus.classworlds.realm.NoSuchRealmException;
import org.codehaus.plexus.component.composition.CycleDetectedInComponentGraphException;
import org.codehaus.plexus.component.discovery.ComponentDiscoverer;
import org.codehaus.plexus.component.discovery.ComponentDiscovererManager;
import org.codehaus.plexus.component.discovery.ComponentDiscoveryEvent;
import org.codehaus.plexus.component.discovery.ComponentDiscoveryListener;
import org.codehaus.plexus.component.factory.ComponentFactoryManager;
import org.codehaus.plexus.component.repository.ComponentDescriptor;
import org.codehaus.plexus.component.repository.ComponentSetDescriptor;
import org.codehaus.plexus.component.repository.exception.ComponentLifecycleException;
import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
import org.codehaus.plexus.component.repository.io.PlexusTools;
import org.codehaus.plexus.configuration.PlexusConfiguration;
import org.codehaus.plexus.configuration.PlexusConfigurationException;
import org.codehaus.plexus.configuration.PlexusConfigurationMerger;
import org.codehaus.plexus.configuration.source.ConfigurationSource;
import org.codehaus.plexus.configuration.xml.XmlPlexusConfiguration;
import org.codehaus.plexus.container.initialization.ContainerInitializationContext;
import org.codehaus.plexus.container.initialization.ContainerInitializationPhase;
import org.codehaus.plexus.context.Context;
import org.codehaus.plexus.context.ContextException;
import org.codehaus.plexus.context.ContextMapAdapter;
import org.codehaus.plexus.context.DefaultContext;
import org.codehaus.plexus.logging.AbstractLogEnabled;
import org.codehaus.plexus.logging.Logger;
import org.codehaus.plexus.logging.LoggerManager;
import org.codehaus.plexus.util.IOUtil;
import org.codehaus.plexus.util.InterpolationFilterReader;
import org.codehaus.plexus.util.ReaderFactory;
/**
* Default implementation of PlexusContainer and MutablePlexusContainer.
* @author Jason van Zyl
* @author Kenney Westerhof
*/
public class DefaultPlexusContainer
extends AbstractLogEnabled
implements MutablePlexusContainer
{
protected static final String DEFAULT_CONTAINER_NAME = "default";
protected static final String DEFAULT_REALM_NAME = "plexus.core";
/**
* Arbitrary data associated with the container. Data in the container has highest precedence when configuring
* a component to create.
*/
protected Context containerContext;
protected PlexusConfiguration configuration;
// todo: don't use a reader
protected Reader configurationReader;
protected ClassWorld classWorld;
protected ClassRealm containerRealm;
// ----------------------------------------------------------------------------
// Core components
// ----------------------------------------------------------------------------
private ComponentRegistry componentRegistry;
/**
* Simple index (registry) of ComponentDiscovers and ComponentDiscoveryListener.
*/
protected ComponentDiscovererManager componentDiscovererManager;
/**
* Trivial class to look-up ComponentFactory instances in this container.
*/
protected ComponentFactoryManager componentFactoryManager;
/**
* Generic logger interface.
*/
protected LoggerManager loggerManager;
/**
* Converts a ComponentDescriptor into PlexusConfiguration.
*/
protected ConfigurationSource configurationSource;
// ----------------------------------------------------------------------------
//
// ----------------------------------------------------------------------------
// TODO: Is there a more threadpool-friendly way to do this?
private ThreadLocal lookupRealm = new ThreadLocal();
public void addComponent( Object component, String role )
{
addComponent( component, role, PLEXUS_DEFAULT_HINT );
}
public void addComponent( T component, Class> role, String roleHint )
{
addComponent( component, role.getName(), roleHint );
}
public void addComponent( Object component, String role, String roleHint )
{
if ( roleHint == null )
{
roleHint = PLEXUS_DEFAULT_HINT;
}
getComponentRegistry().addComponent( component, role, roleHint );
}
public ClassRealm setLookupRealm( ClassRealm realm )
{
ClassRealm oldRealm = lookupRealm.get();
lookupRealm.set( realm );
return oldRealm;
}
public ClassRealm getLookupRealm()
{
return lookupRealm.get();
}
// ----------------------------------------------------------------------
// Constructors
// ----------------------------------------------------------------------
public DefaultPlexusContainer()
throws PlexusContainerException
{
construct( new DefaultContainerConfiguration() );
}
public DefaultPlexusContainer( ContainerConfiguration c )
throws PlexusContainerException
{
construct( c );
}
public ClassRealm createChildRealm( String id )
{
try
{
return containerRealm.createChildRealm( id );
}
catch ( DuplicateRealmException e )
{
try
{
return classWorld.getRealm( id );
}
catch ( NoSuchRealmException e1 )
{
return null;
}
}
}
private void construct( ContainerConfiguration c )
throws PlexusContainerException
{
configurationSource = c.getConfigurationSource();
// ----------------------------------------------------------------------------
// ClassWorld
// ----------------------------------------------------------------------------
classWorld = c.getClassWorld();
// Make sure we have a valid ClassWorld
if ( classWorld == null )
{
classWorld = new ClassWorld( DEFAULT_REALM_NAME, Thread.currentThread().getContextClassLoader() );
}
containerRealm = c.getRealm();
if ( containerRealm == null )
{
try
{
containerRealm = classWorld.getRealm( DEFAULT_REALM_NAME );
}
catch ( NoSuchRealmException e )
{
containerRealm = (ClassRealm) classWorld.getRealms().iterator().next();
if ( containerRealm == null )
{
System.err.println( "No container realm! Expect errors." );
new Throwable().printStackTrace();
}
}
}
setLookupRealm( containerRealm );
// ----------------------------------------------------------------------------
// Context
// ----------------------------------------------------------------------------
if ( c.getContext() != null )
{
containerContext = new DefaultContext( c.getContext() );
}
else
{
containerContext = new DefaultContext();
}
// ----------------------------------------------------------------------------
// Configuration
// ----------------------------------------------------------------------------
InputStream in = null;
if ( c.getContainerConfiguration() != null )
{
in = toStream( c.getContainerConfiguration() );
}
try
{
if ( c.getContainerConfigurationURL() != null )
{
in = c.getContainerConfigurationURL().openStream();
}
}
catch ( IOException e )
{
throw new PlexusContainerException( "Error reading configuration URL", e );
}
try
{
configurationReader = in == null ? null : ReaderFactory.newXmlReader( in );
}
catch ( IOException e )
{
throw new PlexusContainerException( "Error reading configuration file", e );
}
try
{
initialize( c );
start();
}
finally
{
IOUtil.close( configurationReader );
}
for( Class clazz : c.getComponentDiscoverers() )
{
try
{
ComponentDiscoverer cd = (ComponentDiscoverer) lookup( clazz );
componentDiscovererManager.addComponentDiscoverer( cd );
}
catch ( ComponentLookupException e )
{
}
}
for( Class clazz : c.getComponentDiscoveryListeners() )
{
try
{
ComponentDiscoveryListener cdl = (ComponentDiscoveryListener) lookup( clazz );
componentDiscovererManager.registerComponentDiscoveryListener( cdl );
}
catch ( ComponentLookupException e )
{
}
}
}
// ----------------------------------------------------------------------------
// Lookup
// ----------------------------------------------------------------------------
private Class> getInterfaceClass( String role, String hint )
{
ComponentDescriptor> cd;
if ( hint == null )
{
cd = getComponentDescriptor( role );
}
else
{
cd = getComponentDescriptor( role, hint );
}
if ( cd != null )
{
try
{
ClassRealm realm = getLookupRealm();
if ( realm != null )
{
return realm.loadClass( role );
}
else
{
ClassLoader loader = cd.getImplementationClass().getClassLoader();
if ( loader != null )
{
return loader.loadClass( role );
}
}
}
catch ( ClassNotFoundException e )
{
return Object.class;
}
}
return Object.class;
}
private Class> getRoleClass( String role )
{
return getInterfaceClass( role, null );
}
private Class> getRoleClass( String role, String hint )
{
return getInterfaceClass( role, hint );
}
public Object lookup( String role ) throws ComponentLookupException
{
return componentRegistry.lookup( getRoleClass( role ), role, PLEXUS_DEFAULT_HINT );
}
public Object lookup( String role, String roleHint ) throws ComponentLookupException
{
return componentRegistry.lookup( getRoleClass( role, roleHint ), role, roleHint );
}
public T lookup( Class type ) throws ComponentLookupException
{
return componentRegistry.lookup( type, type.getName(), PLEXUS_DEFAULT_HINT );
}
public T lookup( Class type, String roleHint ) throws ComponentLookupException
{
return componentRegistry.lookup( type, type.getName(), roleHint );
}
public T lookup( Class type, String role, String roleHint ) throws ComponentLookupException
{
return componentRegistry.lookup( type, role, roleHint );
}
public List
© 2015 - 2025 Weber Informatics LLC | Privacy Policy