package fr.techad.sonar.gerrit;
import java.io.IOException;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.jetbrains.annotations.NotNull;
import org.sonar.api.utils.log.Logger;
import org.sonar.api.utils.log.Loggers;
import com.google.gson.stream.JsonWriter;
import fr.techad.sonar.GerritPluginException;
import fr.techad.sonar.gerrit.factory.GerritConnectorFactory;
import fr.techad.sonar.gerrit.review.ReviewFileComment;
import fr.techad.sonar.gerrit.review.ReviewInput;
import fr.techad.sonar.gerrit.review.ReviewLineComment;
public abstract class GerritFacade {
private static final Logger LOG = Loggers.get(GerritFacade.class);
private static final String MAVEN_ENTRY_REGEX = ".*?/?src/";
private static final String ERROR_FORMAT = "Error formatting review";
private static final String ERROR_SETTING = "Error setting review";
private final GerritConnector gerritConnector;
private List<String> gerritFileList = new ArrayList<String>();
public GerritFacade(GerritConnector gerritConnector) {
LOG.debug("[GERRIT PLUGIN] Instanciating GerritFacade");
this.gerritConnector = gerritConnector;
}
@NotNull
public List<String> listFiles() throws GerritPluginException {
if (!gerritFileList.isEmpty()) {
LOG.debug("[GERRIT PLUGIN] File list already filled. Not calling Gerrit.");
} else {
fillListFilesFomGerrit();
}
return Collections.unmodifiableList(gerritFileList);
}
public void setReview(@NotNull ReviewInput reviewInput) throws GerritPluginException {
try {
gerritConnector.setReview(formatReview(reviewInput));
} catch (IOException e) {
throw new GerritPluginException(ERROR_SETTING, e);
}
}
public String parseFileName(@NotNull String fileName) {
LOG.debug("[GERRIT PLUGIN] parse filename: {}.", fileName);
return fileName.replaceFirst(MAVEN_ENTRY_REGEX, "src/");
}
protected GerritConnector getGerritConnector() {
return this.gerritConnector;
}
protected void addFile(String fileName) {
gerritFileList.add(fileName);
}
protected abstract void fillListFilesFomGerrit() throws GerritPluginException;
@NotNull
private String formatReview(ReviewInput reviewInput) throws GerritPluginException {
StringWriter stringWriter = new StringWriter();
JsonWriter jsonWriter = new JsonWriter(stringWriter);
try {
jsonWriter.beginObject();
jsonWriter.name("message").value(reviewInput.getMessage());
if (!reviewInput.getLabels().isEmpty()) {
jsonWriter.name("labels").beginObject();
for (String label : reviewInput.getLabels().keySet()) {
jsonWriter.name(label).value(reviewInput.getLabels().get(label));
}
jsonWriter.endObject();
}
if (!reviewInput.getComments().isEmpty()) {
jsonWriter.name("comments").beginObject();
for (String fileName : reviewInput.getComments().keySet()) {
if (!reviewInput.getComments().isEmpty()) {
jsonWriter.name(fileName).beginArray();
for (ReviewFileComment rfc : reviewInput.getComments().get(fileName)) {
jsonWriter.beginObject();
jsonWriter.name("line").value(((ReviewLineComment) rfc).getLine());
jsonWriter.name("message").value(rfc.getMessage());
jsonWriter.endObject();
}
jsonWriter.endArray();
}
}
jsonWriter.endObject();
}
jsonWriter.endObject();
jsonWriter.close();
} catch (IOException e) {
throw new GerritPluginException(ERROR_FORMAT, e);
}
return stringWriter.toString();
}
}