1 package com.atlassian.plugin.refimpl;
2
3 import com.atlassian.plugin.manager.PluginEnabledState;
4 import com.atlassian.plugin.manager.PluginPersistentState;
5 import com.atlassian.plugin.manager.PluginPersistentStateStore;
6 import org.apache.commons.io.IOUtils;
7 import org.slf4j.Logger;
8 import org.slf4j.LoggerFactory;
9
10 import java.io.File;
11 import java.io.FileInputStream;
12 import java.io.FileOutputStream;
13 import java.io.IOException;
14 import java.util.Map.Entry;
15 import java.util.Properties;
16 import java.util.Set;
17 import java.util.stream.Collectors;
18
19 import static com.atlassian.plugin.manager.PluginEnabledState.getPluginEnabledStateWithCurrentTime;
20
21 public class DefaultPluginPersistentStateStore implements PluginPersistentStateStore {
22 private static final Logger log = LoggerFactory.getLogger(DefaultPluginPersistentStateStore.class);
23
24 private File file;
25
26 public DefaultPluginPersistentStateStore(final File directory) {
27 try {
28 file = new File(directory.getParentFile(), "plugins.state");
29 if (!file.exists()) {
30 file.createNewFile();
31 }
32 } catch (final IOException e) {
33 log.error("Error creating plugins.state file. " + e, e);
34 }
35 }
36
37 public PluginPersistentState load() {
38 PluginPersistentState.Builder builder = PluginPersistentState.Builder.create();
39 try (FileInputStream inputStream = new FileInputStream(file)) {
40 final Properties properties = new Properties();
41 properties.load(inputStream);
42 builder.addPluginEnabledState(properties.entrySet().stream()
43 .collect(Collectors.toMap(
44 String::valueOf,
45 value -> getPluginEnabledStateWithCurrentTime(Boolean.valueOf(String.valueOf(value))))));
46 } catch (final IOException e) {
47 log.error("Error creating/reading plugins.state file. ", e);
48 }
49 return builder.toState();
50 }
51
52 public void save(final PluginPersistentState state) {
53 final Properties properties = new Properties();
54 final Set<Entry<String, PluginEnabledState>> entrySet = state.getStatesMap().entrySet();
55 for (final Entry<String, PluginEnabledState> entry : entrySet) {
56 properties.put(entry.getKey(), String.valueOf(entry.getValue().isEnabled()));
57 }
58 FileOutputStream outputStream = null;
59 try {
60 outputStream = new FileOutputStream(file);
61 properties.store(outputStream, "Saving plugins state");
62 } catch (final IOException e) {
63 log.error("Error saving to plugins.state file. " + e, e);
64 } finally {
65 IOUtils.closeQuietly(outputStream);
66 }
67 }
68 }