package org.codehaus.plexus;
import java.net.URL;
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.component.discovery.ComponentDiscoverer;
import org.codehaus.plexus.component.discovery.ComponentDiscovererManager;
import org.codehaus.plexus.component.discovery.ComponentDiscoveryListener;
import org.codehaus.plexus.component.discovery.DefaultComponentDiscoverer;
import org.codehaus.plexus.component.discovery.DefaultComponentDiscovererManager;
import org.codehaus.plexus.component.discovery.PlexusXmlComponentDiscoverer;
import org.codehaus.plexus.component.factory.ComponentFactoryManager;
import org.codehaus.plexus.component.factory.DefaultComponentFactoryManager;
import org.codehaus.plexus.configuration.source.ConfigurationSource;
import org.codehaus.plexus.container.initialization.ContainerInitializationPhase;
import org.codehaus.plexus.container.initialization.InitializeComponentDiscovererManagerPhase;
import org.codehaus.plexus.container.initialization.InitializeComponentFactoryManagerPhase;
import org.codehaus.plexus.container.initialization.InitializeContainerConfigurationSourcePhase;
import org.codehaus.plexus.container.initialization.InitializeLoggerManagerPhase;
import org.codehaus.plexus.container.initialization.InitializeSystemPropertiesPhase;
import org.codehaus.plexus.container.initialization.InitializeUserConfigurationSourcePhase;
import org.codehaus.plexus.container.initialization.InitializeComponentRegistryPhase;
import org.codehaus.plexus.lifecycle.BasicLifecycleHandler;
import org.codehaus.plexus.lifecycle.DefaultLifecycleHandlerManager;
import org.codehaus.plexus.lifecycle.LifecycleHandler;
import org.codehaus.plexus.lifecycle.LifecycleHandlerManager;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.ConfigurablePhase;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.ContextualizePhase;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.DisposePhase;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializePhase;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.LogDisablePhase;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.LogEnablePhase;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.StartPhase;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.StopPhase;
/** @author Jason van Zyl */
public class DefaultContainerConfiguration
implements ContainerConfiguration
{
private String name;
private Map<Object, Object> context;
private ClassWorld classWorld;
private ClassRealm realm;
private String containerConfiguration;
private URL containerConfigurationURL;
private ConfigurationSource configurationSource;
private List<Class> componentDiscoverers = new ArrayList<Class>();
private List<Class> componentDiscoveryListeners = new ArrayList<Class>();
public ContainerConfiguration setName( String name )
{
this.name = name;
return this;
}
public ContainerConfiguration setContext( Map<Object, Object> context )
{
this.context = context;
return this;
}
public ContainerConfiguration setClassWorld( ClassWorld classWorld )
{
this.classWorld = classWorld;
return this;
}
public ContainerConfiguration setRealm( ClassRealm realm )
{
this.realm = realm;
return this;
}
public ContainerConfiguration setContainerConfiguration( String containerConfiguration )
{
this.containerConfiguration = containerConfiguration;
return this;
}
public String getContainerConfiguration()
{
return containerConfiguration;
}
public ContainerConfiguration setContainerConfigurationURL( URL containerConfiguration )
{
this.containerConfigurationURL = containerConfiguration;
return this;
}
public URL getContainerConfigurationURL()
{
return containerConfigurationURL;
}
public String getName()
{
return name;
}
public Map<Object, Object> getContext()
{
return context;
}
public ClassWorld getClassWorld()
{
return classWorld;
}
public ClassRealm getRealm()
{
return realm;
}
// Programmatic Container Initialization and Setup
public ContainerConfiguration setInitializationPhases( ContainerInitializationPhase[] initializationPhases )
{
this.initializationPhases = initializationPhases;
return this;
}
public ContainerInitializationPhase[] getInitializationPhases()
{
return initializationPhases;
}
private ContainerInitializationPhase[] initializationPhases =
{
new InitializeComponentRegistryPhase(),
new InitializeComponentFactoryManagerPhase(),
new InitializeContainerConfigurationSourcePhase(),
new InitializeLoggerManagerPhase(),
new InitializeSystemPropertiesPhase(),
new InitializeComponentDiscovererManagerPhase(),
new InitializeUserConfigurationSourcePhase()
};
// Component discoverer
private ComponentDiscovererManager componentDiscovererManager;
public ContainerConfiguration addComponentDiscoveryListener( ComponentDiscoveryListener componentDiscoveryListener )
{
getComponentDiscovererManager().registerComponentDiscoveryListener( componentDiscoveryListener );
return this;
}
public ContainerConfiguration addComponentDiscoverer( ComponentDiscoverer componentDiscoverer )
{
((DefaultComponentDiscovererManager)getComponentDiscovererManager()).addComponentDiscoverer( componentDiscoverer );
return this;
}
public ContainerConfiguration setComponentDiscovererManager( ComponentDiscovererManager componentDiscovererManager )
{
this.componentDiscovererManager = componentDiscovererManager;
return this;
}
public ComponentDiscovererManager getComponentDiscovererManager()
{
if ( componentDiscovererManager == null )
{
componentDiscovererManager = new DefaultComponentDiscovererManager();
((DefaultComponentDiscovererManager)componentDiscovererManager).addComponentDiscoverer( new DefaultComponentDiscoverer() );
((DefaultComponentDiscovererManager)componentDiscovererManager).addComponentDiscoverer( new PlexusXmlComponentDiscoverer() );
}
return componentDiscovererManager;
}
private ComponentFactoryManager componentFactoryManager;
public ComponentFactoryManager getComponentFactoryManager()
{
if ( componentFactoryManager == null )
{
componentFactoryManager = new DefaultComponentFactoryManager();
}
return componentFactoryManager;
}
public ContainerConfiguration setComponentFactoryManager( ComponentFactoryManager componentFactoryManager )
{
this.componentFactoryManager = componentFactoryManager;
return this;
}
// Lifecycle handler manager
private LifecycleHandlerManager lifecycleHandlerManager;
public ContainerConfiguration addLifecycleHandler( LifecycleHandler lifecycleHandler )
{
getLifecycleHandlerManager().addLifecycleHandler( lifecycleHandler );
return this;
}
public ContainerConfiguration setLifecycleHandlerManager( LifecycleHandlerManager lifecycleHandlerManager )
{
this.lifecycleHandlerManager = lifecycleHandlerManager;
return this;
}
public LifecycleHandlerManager getLifecycleHandlerManager()
{
if ( lifecycleHandlerManager == null )
{
lifecycleHandlerManager = new DefaultLifecycleHandlerManager();
// Plexus
LifecycleHandler plexus = new BasicLifecycleHandler( "plexus" );
// Begin
plexus.addBeginSegment( new LogEnablePhase() );
plexus.addBeginSegment( new ContextualizePhase() );
// plexus.addBeginSegment( new AutoConfigurePhase() );
plexus.addBeginSegment( new InitializePhase() );
plexus.addBeginSegment( new StartPhase() );
// End
plexus.addEndSegment( new StopPhase() );
plexus.addEndSegment( new DisposePhase() );
plexus.addEndSegment( new LogDisablePhase() );
lifecycleHandlerManager.addLifecycleHandler( plexus );
// Basic
LifecycleHandler basic = new BasicLifecycleHandler( "basic" );
// Begin
basic.addBeginSegment( new LogEnablePhase() );
basic.addBeginSegment( new ContextualizePhase() );
// basic.addBeginSegment( new AutoConfigurePhase() );
basic.addBeginSegment( new InitializePhase() );
basic.addBeginSegment( new StartPhase() );
// End
basic.addEndSegment( new StopPhase() );
basic.addEndSegment( new DisposePhase() );
basic.addEndSegment( new LogDisablePhase() );
lifecycleHandlerManager.addLifecycleHandler( basic );
// Plexus configurable
LifecycleHandler plexusConfigurable = new BasicLifecycleHandler( "plexus-configurable" );
// Begin
plexusConfigurable.addBeginSegment( new LogEnablePhase() );
plexusConfigurable.addBeginSegment( new ContextualizePhase() );
plexusConfigurable.addBeginSegment( new ConfigurablePhase() );
plexusConfigurable.addBeginSegment( new InitializePhase() );
plexusConfigurable.addBeginSegment( new StartPhase() );
// End
plexusConfigurable.addEndSegment( new StopPhase() );
plexusConfigurable.addEndSegment( new DisposePhase() );
plexusConfigurable.addEndSegment( new LogDisablePhase() );
lifecycleHandlerManager.addLifecycleHandler( plexusConfigurable );
// Passive
LifecycleHandler passive = new BasicLifecycleHandler( "passive" );
lifecycleHandlerManager.addLifecycleHandler( passive );
// Bootstrap
LifecycleHandler bootstrap = new BasicLifecycleHandler( "bootstrap" );
bootstrap.addBeginSegment( new ContextualizePhase() );
lifecycleHandlerManager.addLifecycleHandler( bootstrap );
}
return lifecycleHandlerManager;
}
// Configuration Sources
public ContainerConfiguration setConfigurationSource( ConfigurationSource configurationSource )
{
this.configurationSource = configurationSource;
return this;
}
public ConfigurationSource getConfigurationSource()
{
return configurationSource;
}
public ContainerConfiguration addComponentDiscoverer( Class<?> clazz )
{
componentDiscoverers.add( clazz );
return this;
}
public ContainerConfiguration addComponentDiscoveryListener( Class<?> clazz )
{
componentDiscoveryListeners.add( clazz );
return this;
}
public List<Class> getComponentDiscoverers()
{
return componentDiscoverers;
}
public List<Class> getComponentDiscoveryListeners()
{
return componentDiscoveryListeners;
}
}