1 package com.atlassian.sal.core.usersettings;
2
3 import io.atlassian.fugue.Option;
4 import com.atlassian.sal.api.usersettings.UserSettings;
5 import com.atlassian.sal.api.usersettings.UserSettingsBuilder;
6 import com.google.common.base.Preconditions;
7
8 import java.util.HashMap;
9 import java.util.Map;
10 import java.util.Set;
11
12 import static com.atlassian.sal.api.usersettings.UserSettingsService.MAX_KEY_LENGTH;
13 import static com.atlassian.sal.api.usersettings.UserSettingsService.MAX_STRING_VALUE_LENGTH;
14
15 public class DefaultUserSettings implements UserSettings {
16 private final Map<String, Object> settings;
17
18 private DefaultUserSettings(Map<String, Object> settings) {
19 this.settings = settings;
20 }
21
22 @Override
23 public Option<String> getString(String key) {
24 checkKeyArgument(key);
25
26 if (!settings.containsKey(key)) {
27 return Option.none();
28 }
29
30 final Object value = settings.get(key);
31 return (value instanceof String) ? Option.some((String) value) : Option.none();
32
33 }
34
35 @Override
36 public Option<Boolean> getBoolean(String key) {
37 checkKeyArgument(key);
38
39 if (!settings.containsKey(key)) {
40 return Option.none();
41 }
42
43 final Object value = settings.get(key);
44 return (value instanceof Boolean) ? Option.some((Boolean) value) : Option.none();
45 }
46
47 @Override
48 public Option<Long> getLong(String key) {
49 checkKeyArgument(key);
50
51 if (!settings.containsKey(key)) {
52 return Option.none();
53 }
54
55 final Object value = settings.get(key);
56 return (value instanceof Long) ? Option.some((Long) value) : Option.none();
57
58 }
59
60 @Override
61 public Set<String> getKeys() {
62 return settings.keySet();
63 }
64
65 public static class Builder implements UserSettingsBuilder {
66 private final Map<String, Object> settings = new HashMap<>();
67
68 private Builder(UserSettings userSettings) {
69 for (String key : userSettings.getKeys()) {
70 for (Boolean value : userSettings.getBoolean(key)) {
71 settings.put(key, value);
72 }
73 for (String value : userSettings.getString(key)) {
74 settings.put(key, value);
75 }
76 for (Long value : userSettings.getLong(key)) {
77 settings.put(key, value);
78 }
79 }
80 }
81
82 private Builder() {
83
84 }
85
86 @Override
87 public UserSettingsBuilder put(String key, String value) {
88 checkKeyArgument(key);
89 checkValueArgument(value);
90
91 settings.put(key, value);
92 return this;
93 }
94
95 @Override
96 public UserSettingsBuilder put(String key, boolean value) {
97 checkKeyArgument(key);
98
99 settings.put(key, value);
100 return this;
101 }
102
103 @Override
104 public UserSettingsBuilder put(String key, long value) {
105 checkKeyArgument(key);
106
107 settings.put(key, value);
108 return this;
109 }
110
111 @Override
112 public UserSettingsBuilder remove(String key) {
113 checkKeyArgument(key);
114
115 settings.remove(key);
116 return this;
117 }
118
119 @Override
120 public Option<Object> get(String key) {
121 checkKeyArgument(key);
122
123 return settings.containsKey(key) ? Option.some(settings.get(key)) : Option.none();
124 }
125
126 @Override
127 public Set<String> getKeys() {
128 return settings.keySet();
129 }
130
131 @Override
132 public UserSettings build() {
133 return new DefaultUserSettings(settings);
134 }
135
136 }
137
138 public static UserSettingsBuilder builder() {
139 return new Builder();
140 }
141
142 public static UserSettingsBuilder builder(UserSettings userSettings) {
143 return new Builder(userSettings);
144 }
145
146 private static void checkKeyArgument(String key) {
147 Preconditions.checkArgument(key != null, "key cannot be null");
148 Preconditions.checkArgument(key.length() <= MAX_KEY_LENGTH, "key cannot be longer than %s characters", MAX_KEY_LENGTH);
149 }
150
151 private static void checkValueArgument(String value) {
152 Preconditions.checkArgument(value != null, "value cannot be null");
153 Preconditions.checkArgument(value.length() <= MAX_STRING_VALUE_LENGTH, "value cannot be longer than %s characters", MAX_STRING_VALUE_LENGTH);
154 }
155 }