View Javadoc

1   package com.atlassian.plugin;
2   
3   import com.atlassian.plugin.util.concurrent.CopyOnWriteMap;
4   
5   import org.apache.commons.collections.CollectionUtils;
6   import org.apache.commons.collections.Predicate;
7   
8   import java.io.Serializable;
9   import java.util.Collections;
10  import java.util.HashMap;
11  import java.util.Map;
12  
13  /**
14   * <p/>
15   * <p>The state stored in this object represents only the <i>differences</i> between the desired state
16   * and the default state configured in the plugin. So if "getPluginState()" or "getPluginModuleState()" return
17   * null, then the manager should assume that the default state applies instead.
18   * <p>
19   * Please note that this method is not threadsafe.  Access to instances should be synchronised.
20   */
21  public class DefaultPluginManagerState implements Serializable, PluginManagerState
22  {
23      private final Map<String, Boolean> map;
24  
25      public DefaultPluginManagerState()
26      {
27          map = CopyOnWriteMap.newHashMap();
28      }
29  
30      public DefaultPluginManagerState(final Map<String, Boolean> map)
31      {
32          this.map = CopyOnWriteMap.newHashMap(map);
33      }
34  
35      public DefaultPluginManagerState(final PluginManagerState state)
36      {
37          map = CopyOnWriteMap.newHashMap(state.getMap());
38      }
39  
40      /* (non-Javadoc)
41       * @see com.atlassian.plugin.PluginManagerState#getState(java.lang.String)
42       */
43      public Boolean getState(final String key)
44      {
45          return map.get(key);
46      }
47  
48      /* (non-Javadoc)
49       * @see com.atlassian.plugin.PluginManagerState#getMap()
50       */
51      public Map<String, Boolean> getMap()
52      {
53          return Collections.unmodifiableMap(map);
54      }
55  
56      /* (non-Javadoc)
57       * @see com.atlassian.plugin.PluginManagerState#isEnabled(com.atlassian.plugin.Plugin)
58       */
59      public boolean isEnabled(final Plugin plugin)
60      {
61          final Boolean bool = getState(plugin.getKey());
62          return (bool == null) ? plugin.isEnabledByDefault() : bool.booleanValue();
63      }
64  
65      /* (non-Javadoc)
66       * @see com.atlassian.plugin.PluginManagerState#isEnabled(com.atlassian.plugin.ModuleDescriptor)
67       */
68      public boolean isEnabled(final ModuleDescriptor<?> pluginModule)
69      {
70          if (pluginModule == null)
71          {
72              return false;
73          }
74  
75          final Boolean bool = getState(pluginModule.getCompleteKey());
76          return (bool == null) ? pluginModule.isEnabledByDefault() : bool.booleanValue();
77      }
78  
79      public void setEnabled(final ModuleDescriptor<?> pluginModule, boolean isEnabled)
80      {
81          setEnabled(pluginModule.getCompleteKey(), pluginModule.isEnabledByDefault(), isEnabled);
82      }
83  
84      public void setEnabled(final Plugin plugin, boolean isEnabled)
85      {
86          setEnabled(plugin.getKey(), plugin.isEnabledByDefault(), isEnabled);
87      }
88      
89      private void setEnabled(final String completeKey, boolean enabledByDefault, boolean isEnabled)
90      {
91          if (isEnabled == enabledByDefault)
92          {
93              map.remove(completeKey);
94          }
95          else
96          {
97              map.put(completeKey, Boolean.valueOf(isEnabled));
98          }
99      }
100 
101     /**
102      * reset all plugin's state.
103      */
104     public void setState(final PluginManagerState state)
105     {
106         map.clear();
107         map.putAll(state.getMap());
108     }
109 
110     /**
111      * Add the plugin state.
112      */
113     public void addState(final Map<String, Boolean> state)
114     {
115         map.putAll(state);
116     }
117 
118     /**
119      * Remove a plugin's state.
120      */
121     public void removeState(final String key)
122     {
123         map.remove(key);
124     }
125 
126     /* (non-Javadoc)
127      * @see com.atlassian.plugin.PluginManagerState#getPluginStateMap(com.atlassian.plugin.Plugin)
128      */
129     public Map<String, Boolean> getPluginStateMap(final Plugin plugin)
130     {
131         final Map<String, Boolean> state = new HashMap<String, Boolean>(getMap());
132         CollectionUtils.filter(state.keySet(), new StringStartsWith(plugin.getKey()));
133         return state;
134     }
135 
136     private static class StringStartsWith implements Predicate
137     {
138         private final String prefix;
139 
140         public StringStartsWith(final String keyPrefix)
141         {
142             prefix = keyPrefix;
143         }
144 
145         public boolean evaluate(final Object object)
146         {
147             final String str = (String) object;
148             return str.startsWith(prefix);
149         }
150     }
151 }