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.STASH, new TreeMap<Class, PluginModuleCreator>(comparator));
31          creatorRegistry.put(PluginModuleCreatorRegistry.REFAPP, new TreeMap<Class, PluginModuleCreator>(comparator));
32      }
33  
34      @Override
35      public void registerModuleCreator(String productId, PluginModuleCreator moduleCreator)
36      {
37          Map<Class, PluginModuleCreator> moduleMap = creatorRegistry.get(productId);
38          if (null != moduleMap)
39          {
40              moduleMap.put(moduleCreator.getClass(), moduleCreator);
41          }
42      }
43  
44      @Override
45      public <T extends PluginModuleCreator> T getModuleCreator(String productId, Class<T> creatorClass)
46      {
47          Map<Class, PluginModuleCreator> moduleMap = creatorRegistry.get(productId);
48          T creator = null;
49          if (null != moduleMap)
50          {
51              creator = creatorClass.cast(moduleMap.get(creatorClass));
52          }
53  
54          return creator;
55      }
56  
57      @Override
58      public Map<Class, PluginModuleCreator> getModuleCreatorsForProduct(String productId)
59      {
60          SortedMap<Class, PluginModuleCreator> moduleMap = creatorRegistry.get(productId);
61          if (null != moduleMap)
62          {
63              moduleMap = Collections.unmodifiableSortedMap(moduleMap);
64          }
65  
66          return moduleMap;
67      }
68  
69      private class ModuleNameComparator implements Comparator<Class>
70      {
71          @Override
72          public int compare(Class class1, Class class2)
73          {
74              return class1.getSimpleName()
75                      .compareTo(class2.getSimpleName());
76          }
77      }
78  }