1 package com.atlassian.plugin.manager;
2
3 import com.atlassian.plugin.ModuleDescriptor;
4 import com.atlassian.plugin.Plugin;
5 import com.atlassian.plugin.PluginRestartState;
6
7 import java.util.HashMap;
8 import java.util.HashSet;
9 import java.util.Map;
10 import java.util.Set;
11
12 import static com.atlassian.plugin.manager.PluginPersistentState.Util.RESTART_STATE_SEPARATOR;
13 import static com.atlassian.plugin.manager.PluginPersistentState.Util.buildStateKey;
14
15
16
17
18
19
20
21
22
23 public interface PluginPersistentState {
24
25
26
27
28
29
30 Map<String, Boolean> getMap();
31
32
33
34
35 boolean isEnabled(final Plugin plugin);
36
37
38
39
40 boolean isEnabled(final ModuleDescriptor<?> pluginModule);
41
42
43
44
45
46
47
48
49 Map<String, Boolean> getPluginStateMap(final Plugin plugin);
50
51
52
53
54
55
56
57 PluginRestartState getPluginRestartState(String pluginKey);
58
59
60
61
62
63
64
65
66
67 final class Builder {
68 public static Builder create() {
69 return new Builder();
70 }
71
72 public static Builder create(final PluginPersistentState state) {
73 return new Builder(state);
74 }
75
76 private final Map<String, Boolean> map = new HashMap<>();
77
78 Builder() {
79 }
80
81 Builder(final PluginPersistentState state) {
82 map.putAll(state.getMap());
83 }
84
85 public PluginPersistentState toState() {
86 return new DefaultPluginPersistentState(map, true);
87 }
88
89 public Builder setEnabled(final ModuleDescriptor<?> pluginModule, final boolean isEnabled) {
90 setEnabled(pluginModule.getCompleteKey(), pluginModule.isEnabledByDefault(), isEnabled);
91 return this;
92 }
93
94 public Builder setEnabled(final Plugin plugin, final boolean isEnabled) {
95 setEnabled(plugin.getKey(), plugin.isEnabledByDefault(), isEnabled);
96 return this;
97 }
98
99 private Builder setEnabled(final String completeKey, final boolean enabledByDefault, final boolean isEnabled) {
100 if (isEnabled == enabledByDefault) {
101 map.remove(completeKey);
102 } else {
103 map.put(completeKey, isEnabled);
104 }
105 return this;
106 }
107
108
109
110
111 public Builder setState(final PluginPersistentState state) {
112 map.clear();
113 map.putAll(state.getMap());
114 return this;
115 }
116
117
118
119
120 public Builder addState(final Map<String, Boolean> state) {
121 map.putAll(state);
122 return this;
123 }
124
125
126
127
128 public Builder removeState(final String key) {
129 map.remove(key);
130 return this;
131 }
132
133 public Builder setPluginRestartState(final String pluginKey, final PluginRestartState state) {
134
135 for (final PluginRestartState st : PluginRestartState.values()) {
136 map.remove(buildStateKey(pluginKey, st));
137 }
138
139 if (state != PluginRestartState.NONE) {
140 map.put(buildStateKey(pluginKey, state), true);
141 }
142 return this;
143 }
144
145 public Builder clearPluginRestartState() {
146 final Set<String> keys = new HashSet<>(map.keySet());
147 for (final String key : keys) {
148 if (key.contains(RESTART_STATE_SEPARATOR)) {
149 map.remove(key);
150 }
151 }
152 return this;
153 }
154 }
155
156 class Util {
157 public static final String RESTART_STATE_SEPARATOR = "--";
158
159 static String buildStateKey(final String pluginKey, final PluginRestartState state) {
160 final StringBuilder sb = new StringBuilder();
161 sb.append(state.name());
162 sb.append(RESTART_STATE_SEPARATOR);
163 sb.append(pluginKey);
164 return sb.toString();
165 }
166 }
167 }