1   package com.atlassian.plugins.codegen;
2   
3   import java.util.Collections;
4   import java.util.Comparator;
5   import java.util.HashMap;
6   import java.util.Map;
7   import java.util.SortedMap;
8   import java.util.TreeMap;
9   
10  import com.atlassian.plugins.codegen.modules.PluginModuleCreator;
11  import com.atlassian.plugins.codegen.modules.PluginModuleCreatorRegistry;
12  
13  /**
14   * @since 3.6
15   */
16  public class PluginModuleCreatorRegistryImpl implements PluginModuleCreatorRegistry
17  {
18  
19      private final Map<String, SortedMap<Class, PluginModuleCreator>> creatorRegistry;
20  
21      public PluginModuleCreatorRegistryImpl()
22      {
23          ModuleNameComparator comparator = new ModuleNameComparator();
24          this.creatorRegistry = new HashMap<String, SortedMap<Class, PluginModuleCreator>>();
25          creatorRegistry.put(PluginModuleCreatorRegistry.JIRA, new TreeMap<Class, PluginModuleCreator>(comparator));
26          creatorRegistry.put(PluginModuleCreatorRegistry.BAMBOO, new TreeMap<Class, PluginModuleCreator>(comparator));
27          creatorRegistry.put(PluginModuleCreatorRegistry.CONFLUENCE, new TreeMap<Class, PluginModuleCreator>(comparator));
28          creatorRegistry.put(PluginModuleCreatorRegistry.CROWD, new TreeMap<Class, PluginModuleCreator>(comparator));
29          creatorRegistry.put(PluginModuleCreatorRegistry.FECRU, new TreeMap<Class, PluginModuleCreator>(comparator));
30          creatorRegistry.put(PluginModuleCreatorRegistry.REFAPP, new TreeMap<Class, PluginModuleCreator>(comparator));
31      }
32  
33      @Override
34      public void registerModuleCreator(String productId, PluginModuleCreator moduleCreator)
35      {
36          Map<Class, PluginModuleCreator> moduleMap = creatorRegistry.get(productId);
37          if (null != moduleMap)
38          {
39              moduleMap.put(moduleCreator.getClass(), moduleCreator);
40          }
41      }
42  
43      @Override
44      public <T extends PluginModuleCreator> T getModuleCreator(String productId, Class<T> creatorClass)
45      {
46          Map<Class, PluginModuleCreator> moduleMap = creatorRegistry.get(productId);
47          T creator = null;
48          if (null != moduleMap)
49          {
50              creator = creatorClass.cast(moduleMap.get(creatorClass));
51          }
52  
53          return creator;
54      }
55  
56      @Override
57      public Map<Class, PluginModuleCreator> getModuleCreatorsForProduct(String productId)
58      {
59          SortedMap<Class, PluginModuleCreator> moduleMap = creatorRegistry.get(productId);
60          if (null != moduleMap)
61          {
62              moduleMap = Collections.unmodifiableSortedMap(moduleMap);
63          }
64  
65          return moduleMap;
66      }
67  
68      private class ModuleNameComparator implements Comparator<Class>
69      {
70          @Override
71          public int compare(Class class1, Class class2)
72          {
73              return class1.getSimpleName()
74                      .compareTo(class2.getSimpleName());
75          }
76      }
77  }