package jetbrains.buildserver.sonarplugin.sqrunner; import jetbrains.buildServer.serverSide.Parameter; import jetbrains.buildServer.serverSide.SBuild; import jetbrains.buildServer.serverSide.SBuildRunnerDescriptor; import jetbrains.buildServer.serverSide.SBuildType; import jetbrains.buildServer.serverSide.parameters.ParameterFactory; import jetbrains.buildServer.serverSide.parameters.types.PasswordsProvider; import jetbrains.buildserver.sonarplugin.Constants; import jetbrains.buildserver.sonarplugin.Util; 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.*; /** * Created by Andrey Titov on 10/30/14. * * <p> * Provides Password Parameters ("sonar.password" and "sonar.jdbc.password") for the build. * * The class uses closed API: ParameterFactory and PasswordsProvider * * Currently only one SonarQube Runner is allowed for the build. * </p> */ public class SQRPasswordProvider implements PasswordsProvider { private static final String PASSWORD_PARAMETER_TYPE = "password"; @NotNull private final SQSManager mySqsManager; @NotNull private final ParameterFactory myFactory; public SQRPasswordProvider(@NotNull final SQSManager sqsManager, @NotNull final ParameterFactory factory) { mySqsManager = sqsManager; myFactory = factory; } @NotNull public Collection<Parameter> getPasswordParameters(@NotNull final SBuild build) { final List<SQSInfo> servers = findSQSInfos(build.getBuildType()); final List<Parameter> list = new ArrayList<Parameter>(); for (final SQSInfo server : servers) { addParameterIfNeeded(list, server.getId(), server.getPassword(), Constants.SONAR_PASSWORD); addParameterIfNeeded(list, server.getId(), server.getJDBCPassword(), Constants.SONAR_SERVER_JDBC_PASSWORD); } return list; } /** * <p> * Adds a parameter to the parameter list if it's value is not empty * </p> * @param list List to add parameter to. * @param id Server ID * @param parameterValue Parameter value. The parameter will not be added if the value is null or empty. * @param parameterName Parameter name. NB: resulting Parameter will have name in form "secure:teamcity.password.<parameterName>". */ private void addParameterIfNeeded(@NotNull final List<Parameter> list, @NotNull final String id, @Nullable final String parameterValue, @NotNull final String parameterName) { if (!Util.isEmpty(parameterValue)) { list.add(myFactory.createTypedParameter(id + "." + parameterName, parameterValue, PASSWORD_PARAMETER_TYPE)); } } /** * @param buildType Build Configuration * @return SQSInfo in the Build Configuration or null */ @NotNull private List<SQSInfo> findSQSInfos(@Nullable final SBuildType buildType) { if (buildType == null) { return Collections.emptyList(); } final List<SQSInfo> res = new LinkedList<SQSInfo>(); for (final SBuildRunnerDescriptor r : buildType.getBuildRunners()) { final String serverId = r.getParameters().get(Constants.SONAR_SERVER_ID); if (!Util.isEmpty(serverId)) { final SQSInfo server = mySqsManager.getServer(buildType.getProject(), serverId); if (server != null) { res.add(server); } } } return res; } }