package jetbrains.buildserver.sonarplugin.sqrunner.manager; import jetbrains.buildServer.serverSide.ConfigActionFactory; import jetbrains.buildServer.serverSide.SProject; import jetbrains.buildserver.sonarplugin.sqrunner.manager.projectfeatures.SQSManagerProjectFeatures; import jetbrains.buildserver.sonarplugin.sqrunner.manager.projectsettings.SQSManagerImpl; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; /** * Created by linfar on 03.10.16. * * A SonarQube Server manager migrating SQSInfos from plugin-settings.xml to project features */ public class MigratingSQSManager implements SQSManager { @NotNull private final SQSManagerImpl mySQSManagerImpl; @NotNull private final SQSManagerProjectFeatures mySQSManagerProjectFeatures; @NotNull private final ConfigActionFactory myConfigActionFactory; public MigratingSQSManager(@NotNull final SQSManagerImpl sqsManagerImpl, @NotNull final SQSManagerProjectFeatures sqsManagerProjectFeatures, @NotNull final ConfigActionFactory configActionFactory) { mySQSManagerImpl = sqsManagerImpl; mySQSManagerProjectFeatures = sqsManagerProjectFeatures; myConfigActionFactory = configActionFactory; } @NotNull @Override public List<SQSInfo> getAvailableServers(@NotNull SProject project) { final Set<SQSInfo> res = new HashSet<>(mySQSManagerProjectFeatures.getAvailableServers(project)); res.addAll(mySQSManagerImpl.getAvailableServers(project)); return new ArrayList<>(res); } @NotNull @Override public List<SQSInfo> getOwnAvailableServers(@NotNull SProject project) { final Set<SQSInfo> res = new HashSet<>(mySQSManagerProjectFeatures.getOwnAvailableServers(project)); res.addAll(mySQSManagerImpl.getOwnAvailableServers(project)); return new ArrayList<>(res); } @Nullable @Override public SQSInfo getServer(@NotNull SProject project, @NotNull String serverId) { SQSInfo server = mySQSManagerProjectFeatures.getServer(project, serverId); if (server != null) return server; return mySQSManagerImpl.getServer(project, serverId); } @Nullable @Override public SQSInfo getOwnServer(@NotNull SProject project, @NotNull String serverId) { SQSInfo server = mySQSManagerProjectFeatures.getOwnServer(project, serverId); if (server != null) return server; return mySQSManagerImpl.getOwnServer(project, serverId); } @NotNull @Override public SQSActionResult editServer(@NotNull SProject project, @NotNull SQSInfo sqsInfo) { SQSInfo init = mySQSManagerProjectFeatures.getServer(project, sqsInfo.getId()); if (init == null) { init = mySQSManagerImpl.getServer(project, sqsInfo.getId()); if (init != null) { migrate(project, sqsInfo); return new SQSActionResult(init, sqsInfo, "SonarQube Server '" + sqsInfo.getName() + "' updated and moved to project features"); } else { return new SQSActionResult(null, null, "Cannot edit: SonarQube Server with id '" + sqsInfo.getId() + "' was not found", true); } } else { return mySQSManagerProjectFeatures.editServer(project, sqsInfo); } } @NotNull @Override public SQSActionResult addServer(@NotNull SProject project, @NotNull SQSInfo sqsInfo) { return mySQSManagerProjectFeatures.addServer(project, sqsInfo); } @NotNull @Override public SQSActionResult removeServer(@NotNull SProject project, @NotNull String serverId) { final SQSActionResult sqsInfo = mySQSManagerImpl.removeServer(project, serverId); final SQSActionResult oldSqsInfo = mySQSManagerProjectFeatures.removeServer(project, serverId); return !sqsInfo.isError() ? sqsInfo : oldSqsInfo; } private void migrate(@NotNull final SProject project, @NotNull final SQSInfo... sqsInfos) { for (SQSInfo sqsInfo : sqsInfos) { mySQSManagerProjectFeatures.addServer(project, sqsInfo); mySQSManagerImpl.removeServer(project, sqsInfo.getId()); } if (sqsInfos.length > 0) { if (sqsInfos.length > 1) { project.persist(myConfigActionFactory.createAction(project, sqsInfos.length + " SonarQube Servers moved from plugin-settings to project features")); } else { project.persist(myConfigActionFactory.createAction(project, "SonarQube Server '" + sqsInfos[0].getName() + "' moved from plugin-settings to project features")); } } } }