View Javadoc
1   package org.codehaus.plexus.component.registry;
2   
3   import junit.framework.TestCase;
4   import org.codehaus.plexus.DefaultPlexusContainer;
5   import org.codehaus.plexus.PlexusContainer;
6   import org.codehaus.plexus.component.repository.ComponentDescriptor;
7   import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
8   
9   public class DefaultComponentRegistryTest extends TestCase {
10  
11      public void testConcurrentDisposeAndLookup() throws Exception {
12          final PlexusContainer plexus = new DefaultPlexusContainer();
13  
14          ComponentDescriptor<TestSynchronizedComponent> descriptor = new ComponentDescriptor<TestSynchronizedComponent>(
15                  TestSynchronizedComponent.class, plexus.getContainerRealm());
16          descriptor.setRole(TestSynchronizedComponent.class.getCanonicalName());
17          descriptor.setImplementation(TestSynchronizedComponent.class.getCanonicalName());
18          plexus.addComponentDescriptor(descriptor);
19  
20          TestSynchronizedComponent component = plexus.lookup(TestSynchronizedComponent.class);
21  
22          class LookupThread extends Thread {
23              private TestSynchronizedComponent component;
24  
25              @Override
26              public synchronized void run() {
27                  try {
28                      this.component = plexus.lookup(TestSynchronizedComponent.class);
29                  } catch (ComponentLookupException e) {
30                      // expected
31                  }
32              }
33  
34              public synchronized TestSynchronizedComponent getComponent() {
35                  return component;
36              }
37          }
38  
39          LookupThread lookupThread = new LookupThread();
40  
41          component.setLookupThread(lookupThread);
42  
43          plexus.dispose();
44  
45          assertNull(lookupThread.getComponent());
46      }
47  }