/activeobjects-plugin/src/main/java/com/atlassian/activeobjects/admin/ActiveObjectsPluginToTablesMapping.java

https://bitbucket.org/activeobjects/ao-plugin · Java · 98 lines · 84 code · 14 blank · 0 comment · 2 complexity · 37794479d0dac6982cbee57099a23180 MD5 · raw file

  1. package com.atlassian.activeobjects.admin;
  2. import com.atlassian.sal.api.pluginsettings.PluginSettings;
  3. import com.atlassian.sal.api.pluginsettings.PluginSettingsFactory;
  4. import com.google.common.collect.Maps;
  5. import com.google.gson.Gson;
  6. import com.google.gson.reflect.TypeToken;
  7. import java.lang.reflect.Type;
  8. import java.util.List;
  9. import java.util.Map;
  10. import java.util.concurrent.locks.ReadWriteLock;
  11. import java.util.concurrent.locks.ReentrantReadWriteLock;
  12. import static com.google.common.base.Preconditions.*;
  13. public final class ActiveObjectsPluginToTablesMapping implements PluginToTablesMapping
  14. {
  15. private static final String KEY = ActiveObjectsPluginToTablesMapping.class.getName();
  16. private static final Type MAPPINGS_TYPE = new TypeToken<Map<String, PluginInfo>>()
  17. {
  18. }.getType();
  19. private final ReadWriteLock lock = new ReentrantReadWriteLock();
  20. private final PluginSettings settings;
  21. private Map<String, PluginInfo> mappings;
  22. public ActiveObjectsPluginToTablesMapping(PluginSettingsFactory factory)
  23. {
  24. this.settings = checkNotNull(factory).createGlobalSettings();
  25. this.mappings = getMappingFromSettings();
  26. }
  27. @Override
  28. public void add(PluginInfo pluginInfo, List<String> tableNames)
  29. {
  30. lock.writeLock().lock();
  31. try
  32. {
  33. doAdd(pluginInfo, tableNames);
  34. }
  35. finally
  36. {
  37. lock.writeLock().unlock();
  38. }
  39. }
  40. @Override
  41. public PluginInfo get(String tableName)
  42. {
  43. lock.readLock().lock();
  44. try
  45. {
  46. return doGet(tableName);
  47. }
  48. finally
  49. {
  50. lock.readLock().unlock();
  51. }
  52. }
  53. private void doAdd(PluginInfo pluginInfo, List<String> tableNames)
  54. {
  55. final Map<String, PluginInfo> newMappings = Maps.newHashMap(mappings);
  56. for (String tableName : tableNames)
  57. {
  58. newMappings.put(tableName, pluginInfo);
  59. }
  60. putMapInSettings(newMappings);
  61. this.mappings = newMappings;
  62. }
  63. private PluginInfo doGet(String tableName)
  64. {
  65. return mappings.get(tableName);
  66. }
  67. private void putMapInSettings(Map<String, PluginInfo> newMappings)
  68. {
  69. settings.put(KEY, new Gson().toJson(newMappings));
  70. }
  71. public Map<String, PluginInfo> getMappingFromSettings()
  72. {
  73. lock.readLock().lock();
  74. try
  75. {
  76. final Map<String, PluginInfo> map = new Gson().fromJson((String) settings.get(KEY), MAPPINGS_TYPE);
  77. return map != null ? map : Maps.<String, PluginInfo>newHashMap();
  78. }
  79. finally
  80. {
  81. lock.readLock().unlock();
  82. }
  83. }
  84. }