package org.codehaus.plexus.container.initialization;
/*
* 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 org.codehaus.plexus.ComponentRegistry;
import org.codehaus.plexus.DefaultComponentRegistry;
import org.codehaus.plexus.component.manager.PerLookupComponentManagerFactory;
import org.codehaus.plexus.component.manager.SingletonComponentManagerFactory;
import org.codehaus.plexus.component.repository.ComponentDescriptor;
import org.codehaus.plexus.component.repository.exception.ComponentRepositoryException;
import org.codehaus.plexus.component.repository.io.PlexusTools;
import org.codehaus.plexus.configuration.PlexusConfiguration;
import org.codehaus.plexus.configuration.PlexusConfigurationException;
import org.codehaus.plexus.lifecycle.LifecycleHandlerManager;
/**
* @author Jason van Zyl
*/
public class InitializeComponentRegistryPhase implements ContainerInitializationPhase
{
public void execute( ContainerInitializationContext context )
throws ContainerInitializationException
{
LifecycleHandlerManager lifecycleHandlerManager = getLifecycleHandlerManager( context );
ComponentRegistry componentRegistry = new DefaultComponentRegistry( context.getContainer(),
lifecycleHandlerManager );
componentRegistry.registerComponentManagerFactory( new PerLookupComponentManagerFactory() );
componentRegistry.registerComponentManagerFactory( new SingletonComponentManagerFactory() );
initializeComponentRegistry( componentRegistry, context );
context.getContainer().setComponentRegistry( componentRegistry );
}
private void initializeComponentRegistry( ComponentRegistry componentRegistry,
ContainerInitializationContext context )
throws ContainerInitializationException
{
// Add the components defined in the container xml configuration
try
{
PlexusConfiguration configuration = context.getContainerXmlConfiguration();
PlexusConfiguration[] componentConfigurations = configuration.getChild( "components" ).getChildren(
"component" );
for ( PlexusConfiguration componentConfiguration : componentConfigurations )
{
ComponentDescriptor<?> componentDescriptor = PlexusTools.buildComponentDescriptor(
componentConfiguration, context.getContainer().getContainerRealm() );
if ( componentDescriptor != null )
{
componentRegistry.addComponentDescriptor( componentDescriptor );
}
}
}
catch ( PlexusConfigurationException e )
{
throw new ContainerInitializationException( "Error initializing component repository: " +
"Cannot unmarshall component descriptor: ", e );
}
catch ( ComponentRepositoryException e )
{
throw new ContainerInitializationException( "Error initializing component repository: ", e );
}
}
private LifecycleHandlerManager getLifecycleHandlerManager( ContainerInitializationContext context )
{
LifecycleHandlerManager lifecycleHandlerManager = context.getContainerConfiguration().getLifecycleHandlerManager();
lifecycleHandlerManager.initialize();
return lifecycleHandlerManager;
}
}