package org.codehaus.plexus.component.registry;
import junit.framework.TestCase;
import org.codehaus.plexus.DefaultPlexusContainer;
import org.codehaus.plexus.PlexusContainer;
import org.codehaus.plexus.component.repository.ComponentDescriptor;
import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
public class DefaultComponentRegistryTest
extends TestCase
{
public void testConcurrentDisposeAndLookup()
throws Exception
{
final PlexusContainer plexus = new DefaultPlexusContainer();
ComponentDescriptor<TestSynchronizedComponent> descriptor = new ComponentDescriptor<TestSynchronizedComponent>(
TestSynchronizedComponent.class, plexus.getContainerRealm() );
descriptor.setRole( TestSynchronizedComponent.class.getCanonicalName() );
descriptor.setImplementation( TestSynchronizedComponent.class.getCanonicalName() );
plexus.addComponentDescriptor( descriptor );
TestSynchronizedComponent component = plexus.lookup( TestSynchronizedComponent.class );
class LookupThread extends Thread
{
private TestSynchronizedComponent component;
@Override
public synchronized void run()
{
try
{
this.component = plexus.lookup( TestSynchronizedComponent.class );
}
catch ( ComponentLookupException e )
{
// expected
}
}
public synchronized TestSynchronizedComponent getComponent()
{
return component;
}
}
LookupThread lookupThread = new LookupThread();
component.setLookupThread( lookupThread );
plexus.dispose();
assertNull( lookupThread.getComponent() );
}
}