View Javadoc
1   package com.atlassian.sal.testresources.component;
2   
3   import com.atlassian.sal.api.component.ComponentLocator;
4   
5   import java.util.ArrayList;
6   import java.util.Arrays;
7   import java.util.Collection;
8   import java.util.HashMap;
9   import java.util.List;
10  import java.util.Map;
11  
12  /**
13   * Mock implementation of the component locator for testing
14   */
15  public class MockComponentLocator extends ComponentLocator {
16      Map<Class<?>, Object> components = new HashMap<Class<?>, Object>();
17  
18      public MockComponentLocator(final Object... objects) {
19          if (objects != null && objects.length > 0) {
20              for (final Object o : objects) {
21                  add(o);
22              }
23          }
24      }
25  
26      public MockComponentLocator add(final Class<?> cls, final Object obj) {
27          components.put(cls, obj);
28          return this;
29      }
30  
31      public MockComponentLocator add(final Object obj) {
32          final List<Class> interfaces = new ArrayList<Class>();
33          Class<?> cls = obj.getClass();
34          while (cls != null) {
35              // get all interfaces of this class
36              interfaces.addAll(Arrays.asList(cls.getInterfaces()));
37              // get a superclass
38              interfaces.add(cls);
39              cls = cls.getSuperclass();
40          }
41          // register this component with all its interfaces and supers
42          for (final Class<?> iface : interfaces) {
43              components.put(iface, obj);
44          }
45          return this;
46      }
47  
48      @Override
49      protected <T> T getComponentInternal(final Class<T> iface) {
50          return (T) components.get(iface);
51      }
52  
53      public static MockComponentLocator create(final Object... objects) {
54          final MockComponentLocator mockComponentLocator = new MockComponentLocator(objects);
55          ComponentLocator.setComponentLocator(mockComponentLocator);
56          return mockComponentLocator;
57      }
58  
59      @Override
60      protected <T> Collection<T> getComponentsInternal(final Class<T> iface) {
61          return null;
62      }
63  
64      @Override
65      protected <T> T getComponentInternal(final Class<T> iface, final String componentId) {
66          return getComponentInternal(iface);
67      }
68  
69  
70  }