package me.batanov.jenkins.plugins.atlassian.bitbucket.notifier; import hudson.model.AbstractBuild; import jenkins.model.Jenkins; import jenkins.model.JenkinsLocationConfiguration; import me.batanov.jenkins.plugins.atlassian.bitbucket.ApiServer; import org.apache.commons.lang.StringEscapeUtils; import org.apache.http.auth.AuthenticationException; import javax.annotation.Nonnull; import java.util.HashMap; import java.util.List; /** * @author Pavel Batanov <pavel@batanov.me> * 2016-01-10 16:06 */ final public class NotifiableStashServerWrapper implements Notifiable { public static final String REST_V10_BUILD_STATUS_METHOD = "/rest/build-status/1.0/commits/"; private static final int FIELD_MAX_WIDTH = 255; private ApiServer server; private ProjectKeyBuilder keyBuilder; private BuildStateMapper stateMapper; private DescriptionBuilder descriptionBuilder; public NotifiableStashServerWrapper( ApiServer server, BuildStateMapper stateMapper, ProjectKeyBuilder keyBuilder, DescriptionBuilder descriptionBuilder ) { this.server = server; this.stateMapper = stateMapper; this.keyBuilder = keyBuilder; this.descriptionBuilder = descriptionBuilder; } @Nonnull private static String cutString(@Nonnull String text) { if (text.length() <= FIELD_MAX_WIDTH) { return text; } return text.substring(0, FIELD_MAX_WIDTH - 3) + "..."; } public void Notify(@Nonnull AbstractBuild<?, ?> build, List<String> commits) { String fullDisplayName = build.getFullDisplayName(); String fullName = sanitizeDisplayName(fullDisplayName); HashMap<String, Object> request = new HashMap<String, Object>(); request.put("state", stateMapper.getBuildStatus(build).name()); request.put("key", cutString(keyBuilder.getNotificationKey(build))); request.put("name", cutString(fullName)); request.put("description", cutString(descriptionBuilder.getNotificationDescription(build))); request.put("description", cutString(getRootUrl().concat(build.getUrl()))); for (String commit : commits) { String method = REST_V10_BUILD_STATUS_METHOD + commit; try { server.performApiCall(method, request); } catch (AuthenticationException exception) { //Todo: Logging } } } /** * Provide a fallback for getting the instance's root URL * * @return Root URL contained in the global config */ @Nonnull private String getRootUrl() { JenkinsLocationConfiguration globalConfig = new JenkinsLocationConfiguration(); return (Jenkins.getInstance().getRootUrl() != null) ? Jenkins.getInstance().getRootUrl() : globalConfig.getUrl(); } @Nonnull private String sanitizeDisplayName(@Nonnull String fullDisplayName) { // This is to replace the odd character Jenkins injects to separate // nested jobs, especially when using the Cloudbees Folders plugin. // These characters cause Stash to throw up. return StringEscapeUtils. escapeJavaScript(fullDisplayName). replaceAll("\\\\u00BB", "\\/"); } }