PageRenderTime 38ms CodeModel.GetById 9ms RepoModel.GetById 0ms app.codeStats 0ms

/automation-module/src/main/java/com/atlassian/plugin/automation/config/AORuleConfigStore.java

https://bitbucket.org/atlassianlabs/automation
Java | 239 lines | 201 code | 33 blank | 5 comment | 20 complexity | 25653de4e519722aa7df9cc7bfbbeb7f MD5 | raw file
  1. package com.atlassian.plugin.automation.config;
  2. import com.atlassian.activeobjects.external.ActiveObjects;
  3. import com.atlassian.plugin.automation.core.Rule;
  4. import com.atlassian.plugin.automation.core.action.ActionConfiguration;
  5. import com.atlassian.plugin.automation.core.trigger.TriggerConfiguration;
  6. import com.atlassian.plugin.spring.scanner.annotation.imports.ComponentImport;
  7. import com.google.common.collect.Maps;
  8. import net.java.ao.DBParam;
  9. import net.java.ao.Query;
  10. import javax.inject.Inject;
  11. import javax.inject.Named;
  12. import java.util.List;
  13. import java.util.Map;
  14. import static com.atlassian.plugin.automation.config.ao.CurrentSchema.ActionConfigEntity;
  15. import static com.atlassian.plugin.automation.config.ao.CurrentSchema.ActionConfigValueEntity;
  16. import static com.atlassian.plugin.automation.config.ao.CurrentSchema.ActionEntity;
  17. import static com.atlassian.plugin.automation.config.ao.CurrentSchema.RuleEntity;
  18. import static com.atlassian.plugin.automation.config.ao.CurrentSchema.TriggerConfigEntity;
  19. import static com.atlassian.plugin.automation.config.ao.CurrentSchema.TriggerConfigValueEntity;
  20. import static com.atlassian.plugin.automation.config.ao.CurrentSchema.TriggerEntity;
  21. import static com.google.common.collect.Lists.newArrayList;
  22. /**
  23. * Persists rules in active objects
  24. */
  25. @Named
  26. public class AORuleConfigStore implements RuleConfigStore
  27. {
  28. private final ActiveObjects ao;
  29. @Inject
  30. public AORuleConfigStore(@ComponentImport final ActiveObjects ao)
  31. {
  32. this.ao = ao;
  33. }
  34. @Override
  35. public Iterable<Rule> getRules()
  36. {
  37. final List<Rule> rules = newArrayList();
  38. for (RuleEntity ruleEntity : ao.find(RuleEntity.class, Query.select().order("RULE_NAME ASC")))
  39. {
  40. rules.add(transformRule(ruleEntity));
  41. }
  42. return rules;
  43. }
  44. @Override
  45. public Rule getRule(final int ruleId)
  46. {
  47. final RuleEntity ruleEntity = ao.get(RuleEntity.class, ruleId);
  48. Rule ret = null;
  49. if (ruleEntity != null)
  50. {
  51. ret = transformRule(ruleEntity);
  52. }
  53. return ret;
  54. }
  55. @Override
  56. public Rule getRule(final String name)
  57. {
  58. final RuleEntity[] ruleEntity = ao.find(RuleEntity.class, Query.select().where("RULE_NAME = ?", name));
  59. Rule ret = null;
  60. if (ruleEntity != null && ruleEntity.length == 1)
  61. {
  62. ret = transformRule(ruleEntity[0]);
  63. }
  64. return ret;
  65. }
  66. @Override
  67. public Rule addRule(final Rule rule)
  68. {
  69. final RuleEntity ruleEntity = ao.create(RuleEntity.class,
  70. new DBParam("RULE_NAME", rule.getName()),
  71. new DBParam("ENABLED", rule.isEnabled()),
  72. new DBParam("ACTOR", rule.getActor()));
  73. createRuleChildren(rule, ruleEntity);
  74. return transformRule(ruleEntity);
  75. }
  76. @Override
  77. public Rule delete(final int ruleId)
  78. {
  79. final Rule deletedRule = getRule(ruleId);
  80. final RuleEntity ruleEntity = ao.get(RuleEntity.class, ruleId);
  81. deleteRuleChildren(ruleEntity);
  82. ao.delete(ruleEntity);
  83. return deletedRule;
  84. }
  85. @Override
  86. public Rule updateRuleStatus(int ruleId, boolean status)
  87. {
  88. final RuleEntity ruleEntity = ao.get(RuleEntity.class, ruleId);
  89. ruleEntity.setEnabled(status);
  90. ruleEntity.save();
  91. return getRule(ruleId);
  92. }
  93. @Override
  94. public Rule updateRule(Rule rule)
  95. {
  96. RuleEntity ruleEntity = ao.get(RuleEntity.class, rule.getId());
  97. ruleEntity.setEnabled(rule.isEnabled());
  98. ruleEntity.setRuleName(rule.getName());
  99. ruleEntity.setActor(rule.getActor());
  100. ruleEntity.save();
  101. deleteRuleChildren(ruleEntity);
  102. createRuleChildren(rule, ruleEntity);
  103. // refresh the rule entity
  104. ruleEntity = ao.get(RuleEntity.class, rule.getId());
  105. return transformRule(ruleEntity);
  106. }
  107. private Rule transformRule(RuleEntity ruleEntity)
  108. {
  109. List<ActionConfiguration> actions = newArrayList();
  110. for (ActionEntity actionEntity : ruleEntity.getActions())
  111. {
  112. Map<String, List<String>> actionParams = getActionConfigParams(actionEntity.getActionConfiguration());
  113. actions.add(new DefaultAutomationConfiguration(actionEntity.getID(), actionEntity.getCompleteModuleKey(), actionParams));
  114. }
  115. // at some stage we may want to introduce ordering here: https://servicedog.atlassian.net/browse/ATM-69
  116. TriggerEntity triggerEntity = ruleEntity.getTrigger();
  117. Map<String, List<String>> triggerParams = getTriggerConfigParams(triggerEntity.getTriggerConfiguration());
  118. TriggerConfiguration triggerConfiguration;
  119. triggerConfiguration = new DefaultAutomationConfiguration(triggerEntity.getID(), triggerEntity.getCompleteModuleKey(),
  120. triggerParams);
  121. return new DefaultRule(ruleEntity.getID(), ruleEntity.getRuleName(), ruleEntity.getActor(), triggerConfiguration, actions, ruleEntity.getEnabled());
  122. }
  123. private Map<String, List<String>> getTriggerConfigParams(final TriggerConfigEntity[] triggerConfigurations)
  124. {
  125. final Map<String, List<String>> params = Maps.newHashMap();
  126. for (TriggerConfigEntity configEntity : triggerConfigurations)
  127. {
  128. final List<String> values = newArrayList();
  129. for (TriggerConfigValueEntity configValueEntity : configEntity.getTriggerConfigValues())
  130. {
  131. values.add(configValueEntity.getParamValue());
  132. }
  133. params.put(configEntity.getParamKey(), values);
  134. }
  135. return params;
  136. }
  137. private Map<String, List<String>> getActionConfigParams(final ActionConfigEntity[] actionConfigurations)
  138. {
  139. final Map<String, List<String>> params = Maps.newHashMap();
  140. for (ActionConfigEntity configEntity : actionConfigurations)
  141. {
  142. final List<String> values = newArrayList();
  143. for (ActionConfigValueEntity configValueEntity : configEntity.getActionConfigValues())
  144. {
  145. values.add(configValueEntity.getParamValue());
  146. }
  147. params.put(configEntity.getParamKey(), values);
  148. }
  149. return params;
  150. }
  151. private void deleteRuleChildren(RuleEntity ruleEntity)
  152. {
  153. final TriggerConfigEntity[] triggerConfigurations = ruleEntity.getTrigger().getTriggerConfiguration();
  154. for (TriggerConfigEntity triggerConfigEntity : triggerConfigurations)
  155. {
  156. ao.delete(triggerConfigEntity.getTriggerConfigValues());
  157. }
  158. ao.delete(triggerConfigurations);
  159. ao.delete(ruleEntity.getTrigger());
  160. for (ActionEntity actionEntity : ruleEntity.getActions())
  161. {
  162. final ActionConfigEntity[] actionConfigurations = actionEntity.getActionConfiguration();
  163. for (ActionConfigEntity actionConfigEntity : actionConfigurations)
  164. {
  165. ao.delete(actionConfigEntity.getActionConfigValues());
  166. }
  167. ao.delete(actionConfigurations);
  168. ao.delete(actionEntity);
  169. }
  170. }
  171. private void createRuleChildren(Rule rule, RuleEntity ruleEntity)
  172. {
  173. TriggerConfiguration triggerConfiguration = rule.getTriggerConfiguration();
  174. TriggerEntity triggerEntity = ao.create(TriggerEntity.class, new DBParam("RULE_ENTITY_ID", ruleEntity.getID()),
  175. new DBParam("COMPLETE_MODULE_KEY", triggerConfiguration.getModuleKey()));
  176. storeTriggerConfiguration(triggerConfiguration, new DBParam("TRIGGER_ENTITY_ID", triggerEntity.getID()));
  177. for (ActionConfiguration action : rule.getActionsConfiguration())
  178. {
  179. ActionEntity actionEntity = ao.create(ActionEntity.class, new DBParam("RULE_ENTITY_ID", ruleEntity.getID()),
  180. new DBParam("COMPLETE_MODULE_KEY", action.getModuleKey()));
  181. storeActionConfiguration(action, new DBParam("ACTION_ENTITY_ID", actionEntity.getID()));
  182. }
  183. }
  184. private void storeActionConfiguration(ActionConfiguration configuration, DBParam foreignKey)
  185. {
  186. for (Map.Entry<String, List<String>> configEntry : configuration.getParameters().entrySet())
  187. {
  188. final ActionConfigEntity configEntity = ao.create(ActionConfigEntity.class, new DBParam("PARAM_KEY", configEntry.getKey()), foreignKey);
  189. for (String paramValue : configEntry.getValue())
  190. {
  191. ao.create(ActionConfigValueEntity.class, new DBParam(ActionConfigEntity.ACTION_CONFIG_ID, configEntity.getID()), new DBParam("PARAM_VALUE", paramValue));
  192. }
  193. }
  194. }
  195. private void storeTriggerConfiguration(TriggerConfiguration configuration, DBParam foreignKey)
  196. {
  197. for (Map.Entry<String, List<String>> configEntry : configuration.getParameters().entrySet())
  198. {
  199. final TriggerConfigEntity configEntity = ao.create(TriggerConfigEntity.class, new DBParam("PARAM_KEY", configEntry.getKey()), foreignKey);
  200. for (String paramValue : configEntry.getValue())
  201. {
  202. ao.create(TriggerConfigValueEntity.class, new DBParam(TriggerConfigEntity.TRIGGER_CONFIG_ID, configEntity.getID()), new DBParam("PARAM_VALUE", paramValue));
  203. }
  204. }
  205. }
  206. }