package com.atlassian.labs.speakeasy.data;
import com.atlassian.labs.speakeasy.external.SpeakeasyBackendService;
import com.atlassian.labs.speakeasy.util.PomProperties;
import com.atlassian.sal.api.pluginsettings.PluginSettings;
import com.atlassian.sal.api.pluginsettings.PluginSettingsFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import static com.google.common.collect.Lists.newArrayList;
/**
*
*/
public class SpeakeasyData implements SpeakeasyBackendService
{
private final PluginSettingsFactory pluginSettingsFactory;
private final PomProperties pomProperties;
@Autowired
public SpeakeasyData(PluginSettingsFactory pluginSettingsFactory, PomProperties pomProperties)
{
this.pluginSettingsFactory = pluginSettingsFactory;
this.pomProperties = pomProperties;
}
private PluginSettings getPluginSettings()
{
return pluginSettingsFactory.createGlobalSettings();
}
public String getSpeakeasyVersion()
{
return pomProperties.get("project.version");
}
public void setPluginAuthor(String pluginKey, String username)
{
getPluginSettings().put(createAccessKey(pluginKey, "author"), username);
}
public void clearPluginAuthor(String pluginKey)
{
getPluginSettings().remove(createAccessKey(pluginKey, "author"));
}
public String getPluginAuthor(String pluginKey)
{
return (String) getPluginSettings().get(createAccessKey(pluginKey, "author"));
}
public List<String> getUsersList(String pluginKey)
{
String key = createAccessKey(pluginKey, "users");
List<String> accessList = getListCopy(key);
return accessList;
}
private List<String> getListCopy(String key)
{
List<String> original = (List<String>) getPluginSettings().get(key);
if (original == null)
{
return new ArrayList<String>();
}
else
{
return newArrayList(original);
}
}
public List<String> getFavorites(String pluginKey)
{
String key = createAccessKey(pluginKey, "votes");
List<String> list = getListCopy(key);
return list;
}
public void saveUsersList(String pluginKey, Collection<String> users)
{
String key = createAccessKey(pluginKey, "users");
getPluginSettings().put(key, users);
}
private String createAccessKey(String pluginKey, String propertyName)
{
return "speakeasy-" + pluginKey + "-" + propertyName;
}
private String createAccessKey(String propertyName)
{
return "speakeasy-" + propertyName;
}
private String createUserAccessKey(String propertyName, String user)
{
return "speakeasy-" + propertyName + "-" + user;
}
public String getSettings()
{
String result = (String) getPluginSettings().get(createAccessKey("settings"));
if (result == null)
{
result = saveSettings("{}");
}
return result;
}
public String saveSettings(String value)
{
getPluginSettings().put(createAccessKey("settings"), value);
return value;
}
public boolean isGlobalExtension(String pluginKey)
{
if (pluginKey == null)
{
return false;
}
List<String> extensions = (List<String>)getPluginSettings().get(createAccessKey("globalExtensions"));
return extensions != null && extensions.contains(pluginKey);
}
public void addGlobalExtension(String pluginKey)
{
final PluginSettings pluginSettings = getPluginSettings();
final String accessKey = createAccessKey("globalExtensions");
List<String> extensions = (List<String>) pluginSettings.get(accessKey);
if (extensions == null)
{
extensions = new ArrayList<String>();
}
extensions.add(pluginKey);
pluginSettings.put(accessKey, extensions);
}
public void removeGlobalExtension(String pluginKey)
{
final PluginSettings pluginSettings = getPluginSettings();
final String accessKey = createAccessKey("globalExtensions");
List<String> extensions = (List<String>) pluginSettings.get(accessKey);
if (extensions != null)
{
extensions.remove(pluginKey);
pluginSettings.put(accessKey, extensions);
}
}
public void favorite(String pluginKey, String user)
{
// concurrent marks handled through lock higher up
String key = createAccessKey(pluginKey, "votes");
final List<String> marks = getFavorites(pluginKey);
if (marks.indexOf(user) == -1)
{
marks.add(user);
getPluginSettings().put(key, marks);
}
}
public void unfavorite(String pluginKey, String user)
{
// concurrent marks handled through lock higher up
String key = createAccessKey(pluginKey, "votes");
final List<String> marks = getFavorites(pluginKey);
if (marks.contains(user))
{
marks.remove(user);
getPluginSettings().put(key, marks);
}
}
public void clearFavorites(String pluginKey)
{
getPluginSettings().remove(createAccessKey(pluginKey, "votes"));
}
public void saveEnabledPlugins(List<String> enabledKeys, String user)
{
getPluginSettings().put(createUserAccessKey("enabled-plugins", user), enabledKeys);
}
public List<String> getEnabledPlugins(String user)
{
List<String> result = (List<String>) getPluginSettings().get(createUserAccessKey("enabled-plugins", user));
return result != null ? newArrayList(result) : Collections.<String>emptyList();
}
}