View Javadoc
1   package com.atlassian.activeobjects.internal;
2   
3   import com.atlassian.activeobjects.external.ModelVersion;
4   import com.atlassian.sal.api.pluginsettings.PluginSettings;
5   import com.atlassian.sal.api.pluginsettings.PluginSettingsFactory;
6   
7   import java.util.concurrent.locks.Lock;
8   import java.util.concurrent.locks.ReadWriteLock;
9   import java.util.concurrent.locks.ReentrantReadWriteLock;
10  
11  import static com.google.common.base.Preconditions.checkNotNull;
12  
13  /**
14   * A model version manager that uses SAL's {@link PluginSettings} to store the actual current version.
15   *
16   * @see PluginSettingsFactory
17   * @see PluginSettings
18   */
19  public final class SalModelVersionManager implements ModelVersionManager {
20      private final ReadWriteLock lock = new ReentrantReadWriteLock();
21  
22      private final PluginSettingsFactory pluginSettingsFactory;
23      private final ActiveObjectsSettingKeys settingKeys;
24  
25      public SalModelVersionManager(PluginSettingsFactory pluginSettingsFactory, ActiveObjectsSettingKeys settingKeys) {
26          this.pluginSettingsFactory = checkNotNull(pluginSettingsFactory);
27          this.settingKeys = checkNotNull(settingKeys);
28      }
29  
30      @Override
31      public ModelVersion getCurrent(Prefix tableNamePrefix) {
32          final Lock read = lock.readLock();
33          read.lock();
34          try {
35              return ModelVersion.valueOf((String) getPluginSettings().get(settingKeys.getModelVersionKey(tableNamePrefix)));
36          } finally {
37              read.unlock();
38          }
39      }
40  
41      @Override
42      public void update(Prefix tableNamePrefix, ModelVersion version) {
43          final Lock write = lock.writeLock();
44          write.lock();
45          try {
46              getPluginSettings().put(settingKeys.getModelVersionKey(tableNamePrefix), version.toString());
47          } finally {
48              write.unlock();
49          }
50      }
51  
52      private PluginSettings getPluginSettings() {
53          return pluginSettingsFactory.createGlobalSettings();
54      }
55  }