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.PluginEnabledState.UNKNOWN_ENABLED_TIME;
13 import static com.atlassian.plugin.manager.PluginEnabledState.getPluginEnabledStateWithCurrentTime;
14 import static com.atlassian.plugin.manager.PluginPersistentState.Util.RESTART_STATE_SEPARATOR;
15 import static com.atlassian.plugin.manager.PluginPersistentState.Util.buildStateKey;
16 import static java.util.stream.Collectors.toMap;
17
18
19
20
21
22
23
24
25
26 public interface PluginPersistentState {
27
28
29
30
31
32 @Deprecated
33 default Map<String, Boolean> getMap() {
34 return getStatesMap().entrySet().stream().collect(toMap(Map.Entry::getKey, e -> e.getValue().isEnabled()));
35 }
36
37
38
39
40
41
42 Map<String, PluginEnabledState> getStatesMap();
43
44
45
46
47 boolean isEnabled(final Plugin plugin);
48
49
50
51
52 boolean isEnabled(final ModuleDescriptor<?> pluginModule);
53
54
55
56
57
58
59
60
61 @Deprecated
62 default Map<String, Boolean> getPluginStateMap(final Plugin plugin) {
63 return getPluginEnabledStateMap(plugin).entrySet().stream()
64 .collect(toMap(Map.Entry::getKey, e -> e.getValue().isEnabled()));
65 }
66
67
68
69
70
71
72
73 Map<String, PluginEnabledState> getPluginEnabledStateMap(final Plugin plugin);
74
75
76
77
78
79
80
81 PluginRestartState getPluginRestartState(String pluginKey);
82
83
84
85
86
87
88
89
90
91 final class Builder {
92
93 public static Builder create() {
94 return new Builder();
95 }
96
97 public static Builder create(final PluginPersistentState state) {
98 return new Builder(state);
99 }
100
101 private final Map<String, PluginEnabledState> map = new HashMap<>();
102
103 Builder() {
104 }
105
106 Builder(final PluginPersistentState state) {
107 map.putAll(state.getStatesMap());
108 }
109
110 public PluginPersistentState toState() {
111 return new DefaultPluginPersistentState(map, true);
112 }
113
114 public Builder setEnabled(final ModuleDescriptor<?> pluginModule, final boolean isEnabled) {
115 setEnabled(pluginModule.getCompleteKey(), isEnabled);
116 return this;
117 }
118
119 public Builder setEnabled(final Plugin plugin, final boolean isEnabled) {
120 setEnabled(plugin.getKey(), isEnabled);
121 return this;
122 }
123
124 private Builder setEnabled(final String completeKey, final boolean isEnabled) {
125 map.put(completeKey, getPluginEnabledStateWithCurrentTime(isEnabled));
126 return this;
127 }
128
129
130
131
132 public Builder setState(final PluginPersistentState state) {
133 map.clear();
134 map.putAll(state.getStatesMap());
135 return this;
136 }
137
138
139
140
141 public Builder addPluginEnabledState(final Map<String, PluginEnabledState> state) {
142 map.putAll(state);
143 return this;
144 }
145
146
147
148
149 @Deprecated
150 public Builder addState(final Map<String, Boolean> state) {
151 map.putAll(state.entrySet().stream().collect(toMap(Map.Entry::getKey, e -> new PluginEnabledState(e.getValue(), UNKNOWN_ENABLED_TIME))));
152 return this;
153 }
154
155
156
157
158 public Builder removeState(final String key) {
159 map.remove(key);
160 return this;
161 }
162
163 public Builder setPluginRestartState(final String pluginKey, final PluginRestartState state) {
164
165 for (final PluginRestartState st : PluginRestartState.values()) {
166 map.remove(buildStateKey(pluginKey, st));
167 }
168
169 if (state != PluginRestartState.NONE) {
170 map.put(buildStateKey(pluginKey, state), getPluginEnabledStateWithCurrentTime(true));
171 }
172 return this;
173 }
174
175 public Builder clearPluginRestartState() {
176 final Set<String> keys = new HashSet<>(map.keySet());
177 for (final String key : keys) {
178 if (key.contains(RESTART_STATE_SEPARATOR)) {
179 map.remove(key);
180 }
181 }
182 return this;
183 }
184 }
185
186 class Util {
187 public static final String RESTART_STATE_SEPARATOR = "--";
188
189 static String buildStateKey(final String pluginKey, final PluginRestartState state) {
190 final StringBuilder sb = new StringBuilder();
191 sb.append(state.name());
192 sb.append(RESTART_STATE_SEPARATOR);
193 sb.append(pluginKey);
194 return sb.toString();
195 }
196 }
197 }