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