package com.thundermoose.plugins.admin; 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.thundermoose.plugins.paths.AdminPaths; import com.thundermoose.plugins.paths.ProjectPaths; import com.thundermoose.plugins.paths.RepoPaths; import com.thundermoose.plugins.paths.SSHPaths; import com.thundermoose.plugins.utils.KeyGenerator; import org.apache.commons.lang3.BooleanUtils; public class AdminConfigDao { private final PluginSettingsFactory pluginSettingsFactory; private final TransactionTemplate transactionTemplate; private AdminConfig cachedConfig; public AdminConfigDao(PluginSettingsFactory pluginSettingsFactory, TransactionTemplate transactionTemplate) { this.pluginSettingsFactory = pluginSettingsFactory; this.transactionTemplate = transactionTemplate; setDefaults(); } private void setDefaults() { AdminConfig config = getAdminConfig(); if(config.getEnabled() == null) { config.setEnabled(true); } if(config.getKey() == null) { config.setKey(new KeyGenerator().generateKey()); } if(config.getTtl() == null) { config.setTtl(30); } if(config.getAdminPaths() == null) { config.setAdminPaths(new AdminPaths(true, true, true, true)); } if(config.getProjectPaths() == null) { config.setProjectPaths(new ProjectPaths(true, true, true)); } if(config.getRepoPaths() == null) { config.setRepoPaths(new RepoPaths(true, true, true, true, true, true, true)); } if(config.getSSHPaths() == null) { config.setSSHPaths(new SSHPaths(true, true)); } setAdminConfig(config); } public AdminConfig getAdminConfig() { AdminConfig config = getCache(); if(config != null) { return config; } else { return transactionTemplate.execute(new TransactionCallback<AdminConfig>() { public AdminConfig doInTransaction() { PluginSettings settings = pluginSettingsFactory.createGlobalSettings(); AdminConfig config = new AdminConfig(); config.setEnabled(BooleanUtils.toBoolean((String) settings.get(BASE + ".enabled"))); config.setKey((String) settings.get(BASE + ".key")); String ttl = (String) settings.get(BASE + ".ttl"); if(ttl != null) { config.setTtl(Integer.valueOf(ttl)); } if(settings.get(adminPathPrefix) != null) { config.setAdminPaths(new AdminPaths( BooleanUtils.toBoolean((String) settings.get(adminPermissions)), BooleanUtils.toBoolean((String) settings.get(adminUsers)), BooleanUtils.toBoolean((String) settings.get(adminGroups)), BooleanUtils.toBoolean((String) settings.get(adminLogs)) )); } if(settings.get(projectPathPrefix) != null) { config.setProjectPaths(new ProjectPaths( BooleanUtils.toBoolean((String) settings.get(projectList)), BooleanUtils.toBoolean((String) settings.get(projectPermissions)), BooleanUtils.toBoolean((String) settings.get(projectRepoList)) )); } if(settings.get(repoPathPrefix) != null) { config.setRepoPaths(new RepoPaths( BooleanUtils.toBoolean((String) settings.get(repoPermissions)), BooleanUtils.toBoolean((String) settings.get(repoCommitHistory)), BooleanUtils.toBoolean((String) settings.get(repoFiles)), BooleanUtils.toBoolean((String) settings.get(repoPullRequests)), BooleanUtils.toBoolean((String) settings.get(repoBranchPermissions)), BooleanUtils.toBoolean((String) settings.get(repoBuildStatus)), BooleanUtils.toBoolean((String) settings.get(repoBaseDetails)) )); } if(settings.get(sshPathPrefix) != null) { config.setSSHPaths(new SSHPaths( BooleanUtils.toBoolean((String) settings.get(sshUserKeys)), BooleanUtils.toBoolean((String) settings.get(sshRepoKeys)) )); } return config; } }); } } public void setAdminConfig(final AdminConfig config) { transactionTemplate.execute(new TransactionCallback<AdminConfig>() { public AdminConfig doInTransaction() { PluginSettings settings = pluginSettingsFactory.createGlobalSettings(); settings.put(BASE + ".enabled", BooleanUtils.toStringTrueFalse(config.getEnabled())); settings.put(BASE + ".ttl", Integer.toString(config.getTtl())); settings.put(BASE + ".key", config.getKey()); if(config.getAdminPaths() != null) { settings.put(adminPathPrefix, "true"); settings.put(adminPermissions, BooleanUtils.toStringTrueFalse(config.getAdminPaths().getPermissions())); settings.put(adminUsers, BooleanUtils.toStringTrueFalse(config.getAdminPaths().getUsers())); settings.put(adminGroups, BooleanUtils.toStringTrueFalse(config.getAdminPaths().getGroups())); settings.put(adminLogs, BooleanUtils.toStringTrueFalse(config.getAdminPaths().getLogs())); } if(config.getProjectPaths() != null) { settings.put(projectPathPrefix, "true"); settings.put(projectList, BooleanUtils.toStringTrueFalse(config.getProjectPaths().getProjectList())); settings.put(projectPermissions, BooleanUtils.toStringTrueFalse(config.getProjectPaths().getPermissions())); settings.put(projectRepoList, BooleanUtils.toStringTrueFalse(config.getProjectPaths().getRepoList())); } if(config.getRepoPaths() != null) { settings.put(repoPathPrefix, "true"); settings.put(repoPermissions, BooleanUtils.toStringTrueFalse(config.getRepoPaths().getPermissions())); settings.put(repoCommitHistory, BooleanUtils.toStringTrueFalse(config.getRepoPaths().getCommitHistory())); settings.put(repoFiles, BooleanUtils.toStringTrueFalse(config.getRepoPaths().getFiles())); settings.put(repoPullRequests, BooleanUtils.toStringTrueFalse(config.getRepoPaths().getPullRequests())); settings.put(repoBranchPermissions, BooleanUtils.toStringTrueFalse(config.getRepoPaths().getBranchPermissions())); settings.put(repoBuildStatus, BooleanUtils.toStringTrueFalse(config.getRepoPaths().getBuildStatus())); settings.put(repoBaseDetails, BooleanUtils.toStringTrueFalse(config.getRepoPaths().getBaseDetails())); } if(config.getSSHPaths() != null) { settings.put(sshPathPrefix, "true"); settings.put(sshUserKeys, BooleanUtils.toStringTrueFalse(config.getSSHPaths().getUserKeys())); settings.put(sshRepoKeys, BooleanUtils.toStringTrueFalse(config.getSSHPaths().getRepoKeys())); } setCache(config); return config; } }); } private synchronized void setCache(AdminConfig config) { this.cachedConfig = config; } private synchronized AdminConfig getCache() { return this.cachedConfig; } public static final String BASE = AdminConfig.class.getName(); public static final String adminPathPrefix = BASE + ".adminPaths"; public static final String adminPermissions = adminPathPrefix + ".permissions"; public static final String adminUsers = adminPathPrefix + ".users"; public static final String adminGroups = adminPathPrefix + ".groups"; public static final String adminLogs = adminPathPrefix + ".logs"; public static final String projectPathPrefix = ".projectPaths"; public static final String projectList = projectPathPrefix + ".projectList"; public static final String projectPermissions = projectPathPrefix + ".permissions"; public static final String projectRepoList = projectPathPrefix + ".repoList"; public static final String repoPathPrefix = BASE + ".repoPaths"; public static final String repoPermissions = repoPathPrefix + ".permissions"; public static final String repoCommitHistory = repoPathPrefix + ".commitHistory"; public static final String repoFiles = repoPathPrefix + ".files"; public static final String repoPullRequests = repoPathPrefix + ".pullRequests"; public static final String repoBranchPermissions = repoPathPrefix + ".branchPermissions"; public static final String repoBuildStatus = repoPathPrefix + ".buildStatus"; public static final String repoBaseDetails = repoPathPrefix + ".baseDetails"; public static final String sshPathPrefix = BASE + ".sshPaths"; public static final String sshUserKeys = sshPathPrefix + ".userKeys"; public static final String sshRepoKeys = sshPathPrefix + ".repoKeys"; }