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