package com.thundermoose.plugins.user; import com.atlassian.sal.api.pluginsettings.PluginSettings; import com.atlassian.sal.api.pluginsettings.PluginSettingsFactory; import com.atlassian.sal.api.transaction.TransactionCallback; import com.atlassian.sal.api.transaction.TransactionTemplate; import com.google.common.collect.Lists; import java.util.List; import static com.google.common.collect.Lists.newArrayList; import static com.google.common.collect.Sets.newHashSet; public class UserConfigDao { public static final String BASE = UserConfig.class.getName(); /** * PluginSettings does not have the ability to list properties, so we have to * track users by a List property */ public static final String USER_LIST = BASE + ".users"; private final PluginSettingsFactory pluginSettingsFactory; private final TransactionTemplate transactionTemplate; public UserConfigDao(PluginSettingsFactory pluginSettingsFactory, TransactionTemplate transactionTemplate) { this.pluginSettingsFactory = pluginSettingsFactory; this.transactionTemplate = transactionTemplate; } public UserConfig getUserConfig(final String username) { return readUserConfig(username, pluginSettingsFactory.createGlobalSettings()); } public void setUserConfig(final String username, final UserConfig config) { transactionTemplate.execute(new TransactionCallback<UserConfig>() { public UserConfig doInTransaction() { PluginSettings settings = pluginSettingsFactory.createGlobalSettings(); settings.put(BASE + "." + username + ".token", config.getToken()); updateUserList(username); return config; } }); } public List<UserConfig> getAllUserConfigs() { PluginSettings settings = pluginSettingsFactory.createGlobalSettings(); List<UserConfig> configs = newArrayList(); for (String username : getUserList()) { configs.add(readUserConfig(username, settings)); } return configs; } private UserConfig readUserConfig(String username, PluginSettings settings) { UserConfig config = new UserConfig(); config.setUsername(username); config.setToken((String) settings.get(BASE + "." + username + ".token")); return config; } /** * Updates the list of users to add a new one, if it does not already exist. * * @param username */ @SuppressWarnings("unchecked") private void updateUserList(final String username) { transactionTemplate.execute(new TransactionCallback<Object>() { public Object doInTransaction() { PluginSettings settings = pluginSettingsFactory.createGlobalSettings(); List<String> list = getUserList(); list.add(username); list = newArrayList(newHashSet(list)); settings.put(USER_LIST, list); return null; } }); } /** * Returns the list of users with config data in the system * * @return */ @SuppressWarnings("unchecked") private List<String> getUserList() { PluginSettings settings = pluginSettingsFactory.createGlobalSettings(); List<String> list = (List<String>) settings.get(USER_LIST); return list == null ? Lists.<String>newArrayList() : list; } }