package com.tw.go.plugin.provider.gerrit;
import com.tw.go.plugin.provider.DefaultProvider;
import com.tw.go.plugin.provider.gerrit.response.ResponseParser;
import com.tw.go.plugin.provider.gerrit.response.model.CommitDetails;
import com.tw.go.plugin.setting.PluginSettings;
import com.tw.go.plugin.util.AuthenticationType;
import com.tw.go.plugin.util.HTTPClient;
import com.tw.go.plugin.util.JSONUtils;
import com.tw.go.plugin.util.StringUtils;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static com.tw.go.plugin.provider.gerrit.GerritConfigurationView.PLUGIN_SETTINGS_REVIEW_LABEL;
import static com.tw.go.plugin.setting.DefaultPluginConfigurationView.*;
import static com.tw.go.plugin.util.ValidationUtils.getValidationError;
public class GerritProvider extends DefaultProvider {
public static final String PLUGIN_ID = "gerrit.cs.status";
public static final String GERRIT_CS_POLLER_PLUGIN_ID = "gerrit.cs";
public static final int IN_PROGRESS_VALUE = 0;
public static final int SUCCESS_VALUE = 1;
public static final int FAILURE_VALUE = -1;
private final HTTPClient httpClient;
public GerritProvider() {
super(new GerritConfigurationView());
httpClient = new HTTPClient();
}
public GerritProvider(HTTPClient httpClient) {
super(new GerritConfigurationView());
this.httpClient = httpClient;
}
@Override
public String pluginId() {
return PLUGIN_ID;
}
@Override
public String pollerPluginId() {
return GERRIT_CS_POLLER_PLUGIN_ID;
}
@Override
public void updateStatus(String url, PluginSettings pluginSettings, String branch, String revision, String pipelineInstance,
String result, String trackbackURL) throws Exception {
GerritPluginSettings settings = (GerritPluginSettings) pluginSettings;
String endPointToUse = settings.getEndPoint();
String usernameToUse = settings.getUsername();
String passwordToUse = settings.getPassword();
String codeReviewLabel = settings.getReviewLabel();
if (StringUtils.isEmpty(endPointToUse)) {
endPointToUse = System.getProperty("go.plugin.build.status.gerrit.endpoint");
}
if (StringUtils.isEmpty(usernameToUse)) {
usernameToUse = System.getProperty("go.plugin.build.status.gerrit.username");
}
if (StringUtils.isEmpty(passwordToUse)) {
passwordToUse = System.getProperty("go.plugin.build.status.gerrit.password");
}
if (StringUtils.isEmpty(codeReviewLabel)) {
codeReviewLabel = System.getProperty("go.plugin.build.status.gerrit.codeReviewLabel");
}
String commitDetailsURL = String.format("%s/a/changes/?q=commit:%s", endPointToUse, revision);
String commitDetailsResponse = httpClient.getRequest(commitDetailsURL, AuthenticationType.DIGEST, usernameToUse, passwordToUse);
CommitDetails commitDetails = new ResponseParser().parseCommitDetails(commitDetailsResponse);
Map<String, Object> request = new HashMap<String, Object>();
request.put("message", String.format("%s: %s", pipelineInstance, trackbackURL));
Map<String, Object> labels = new HashMap<String, Object>();
request.put("labels", labels);
labels.put(codeReviewLabel, getCodeReviewValue(result));
String updateStatusURL = String.format("%s/a/changes/%s/revisions/%s/review", endPointToUse, commitDetails.getId(), revision);
httpClient.postRequest(updateStatusURL, AuthenticationType.DIGEST, usernameToUse, passwordToUse, JSONUtils.toJSON(request));
}
@Override
public List<Map<String, Object>> validateConfig(Map<String, Object> fields) {
List<Map<String, Object>> response = new ArrayList<Map<String, Object>>();
if (!fields.containsKey(PLUGIN_SETTINGS_REVIEW_LABEL)) {
response.add(getValidationError(
PLUGIN_SETTINGS_REVIEW_LABEL,
"Review field must be set"
));
}
return response;
}
@Override
public PluginSettings pluginSettings(Map<String, String> responseBodyMap) {
return new GerritPluginSettings(
responseBodyMap.get(PLUGIN_SETTINGS_SERVER_BASE_URL),
responseBodyMap.get(PLUGIN_SETTINGS_END_POINT),
responseBodyMap.get(PLUGIN_SETTINGS_USERNAME),
responseBodyMap.get(PLUGIN_SETTINGS_PASSWORD),
responseBodyMap.get(PLUGIN_SETTINGS_OAUTH_TOKEN),
responseBodyMap.get(PLUGIN_SETTINGS_REVIEW_LABEL)
);
}
int getCodeReviewValue(String result) {
result = result == null ? "" : result;
int value = IN_PROGRESS_VALUE;
if (result.equalsIgnoreCase("Passed")) {
value = SUCCESS_VALUE;
} else if (result.equalsIgnoreCase("Failed")) {
value = FAILURE_VALUE;
} else if (result.equalsIgnoreCase("Cancelled")) {
value = FAILURE_VALUE;
}
return value;
}
}