package jetbrains.buildserver.sonarplugin.sqrunner.manager.projectsettings; import jetbrains.buildServer.serverSide.SProject; import jetbrains.buildServer.serverSide.settings.ProjectSettings; import jetbrains.buildServer.serverSide.settings.ProjectSettingsFactory; import jetbrains.buildServer.serverSide.settings.ProjectSettingsManager; import jetbrains.buildserver.sonarplugin.sqrunner.manager.SQSInfo; import jetbrains.buildserver.sonarplugin.sqrunner.manager.SQSManager; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.LinkedList; import java.util.List; /** * Created by Andrey Titov on 7/9/14. * * SonarQube Server Manager based on ProjectSettingsManager */ public class SQSManagerImpl implements SQSManager, ProjectSettingsFactory { public static final String SQS_MANAGER_KEY = "sonar-qube"; @NotNull private final ProjectSettingsManager mySettingsManager; public SQSManagerImpl(@NotNull final ProjectSettingsManager settingsManager) { mySettingsManager = settingsManager; mySettingsManager.registerSettingsFactory(SQS_MANAGER_KEY, this); } @NotNull @Override public List<SQSInfo> getAvailableServers(@NotNull final SProject project) { return getAvailableServers(ProjectAccessor.recurse(project)); } @NotNull @Override public List<SQSInfo> getOwnAvailableServers(@NotNull final SProject project) { return getAvailableServers(ProjectAccessor.single(project)); } @Nullable @Override public SQSInfo getServer(@NotNull final SProject project, @NotNull String serverId) { return findServer(ProjectAccessor.recurse(project), serverId); } @Nullable @Override public SQSInfo getOwnServer(@NotNull final SProject project, @NotNull String serverId) { return findServer(ProjectAccessor.single(project), serverId); } @Nullable private synchronized SQSInfo findServer(@NotNull final ProjectAccessor accessor, @NotNull final String serverId) { SProject project; while ((project = accessor.next()) != null) { final SQSInfo info = getSettings(project).getInfo(serverId); if (info != null) { return info; } } return null; } @NotNull private List<SQSInfo> getAvailableServers(@NotNull final ProjectAccessor accessor) { SProject project; List<SQSInfo> res = new LinkedList<>(); while ((project = accessor.next()) != null) { res.addAll(getSettings(project).getAll()); } return res; } @NotNull public synchronized SQSActionResult editServer(@NotNull final SProject project, @NotNull final SQSInfo sqsInfo){ final SQSProjectSettings settings = getSettings(project); final SQSInfo old = settings.getInfo(sqsInfo.getId()); settings.setInfo(sqsInfo.getId(), sqsInfo); return new SQSActionResult(old, sqsInfo, "SonarQube Server '" + sqsInfo.getName() + "' updated"); } @NotNull public synchronized SQSActionResult addServer(@NotNull final SProject project, @NotNull final SQSInfo sqsInfo) { final SQSProjectSettings settings = getSettings(project); final SQSInfo old = settings.getInfo(sqsInfo.getId()); if (old != null) { return new SQSActionResult(old, null, "Cannot add: SonarQube Server with id " + sqsInfo.getId() + " already exists"); } settings.setInfo(sqsInfo.getId(), sqsInfo); return new SQSActionResult(null, sqsInfo, "SonarQube Server '" + sqsInfo.getName() + " added"); } @NotNull public SQSActionResult removeServer(@NotNull final SProject project, @NotNull final String serverId) { final SQSProjectSettings settings = getSettings(project); final SQSInfo old = settings.getInfo(serverId); if (old != null) { settings.remove(serverId); return new SQSActionResult(old, null, "SonarQube Server '" + old.getName() + "' removed"); } return new SQSActionResult(null, null, "Cannot remove: SonarQube Server with id '" + serverId + "' doesn't exist"); } @NotNull private SQSProjectSettings getSettings(@NotNull final SProject project) { final ProjectSettings settings = mySettingsManager.getSettings(project.getProjectId(), SQS_MANAGER_KEY); if (!(settings instanceof SQSProjectSettings)) { // TODO log error return new SQSProjectSettings(); } else { return (SQSProjectSettings)settings; } } @NotNull public ProjectSettings createProjectSettings(String s) { return new SQSProjectSettings(); } private static abstract class ProjectAccessor { @Nullable SProject myProject; ProjectAccessor(@Nullable final SProject firstProject) { myProject = firstProject; } static ProjectAccessor recurse(@NotNull final SProject project) { return new ProjectAccessor(project) { public SProject next() { if (myProject == null) { return null; } SProject t = myProject; myProject = myProject.getParentProject(); return t; } }; } static ProjectAccessor single(@NotNull final SProject project) { return new ProjectAccessor(project) { @Override public SProject next() { SProject t = myProject; myProject = null; return t; } }; } public abstract SProject next(); } }