package org.jenkins.tools.test.servlets.util;
import org.jenkins.tools.test.model.MavenCoordinates;
import org.jenkins.tools.test.model.PluginCompatReport;
import org.jenkins.tools.test.model.PluginCompatResult;
import org.jenkins.tools.test.model.PluginInfos;
import java.io.IOException;
import java.io.StringWriter;
import java.io.Writer;
import java.util.*;
/**
* @author fcamblor
*/
public class JsonUtil {
public static void toJson(Writer w, PluginCompatReport report) throws IOException {
w.write("{\"coreCoordinates\":");
toJson(w, report.getTestedCoreCoordinates());
w.write(",\"plugins\":");
toJson(w, report.getPluginCompatTests().keySet());
w.write(",\"results\":");
toJson(w, report.getPluginCompatTests());
w.write("}");
}
public static void toJson(Writer w, Map<PluginInfos, List<PluginCompatResult>> pluginCompatTests) throws IOException {
w.write("[");
for(Iterator<PluginInfos> piIter = pluginCompatTests.keySet().iterator(); piIter.hasNext();){
PluginInfos pi = piIter.next();
w.write(String.format("{\"plugin\":\"%s:%s\",\"results\":", pi.pluginName, pi.pluginVersion));
toJson(w, pluginCompatTests.get(pi));
w.write("}");
if(piIter.hasNext()){
w.write(",");
}
}
w.write("]");
}
public static void toJson(Writer w, List<PluginCompatResult> pluginCompatResults) throws IOException {
// Ensuring results are sorted
Collections.sort(pluginCompatResults);
w.write("[");
for(Iterator<PluginCompatResult> resIter = pluginCompatResults.iterator(); resIter.hasNext();){
PluginCompatResult res = resIter.next();
w.write("{\"core\":\"");
w.write(res.coreCoordinates.toGAV());
w.write("\",\"status\":\"");
w.write(res.status.name());
w.write("\",\"date\":\"");
w.write(String.valueOf(res.compatTestExecutedOn.getTime()));
w.write("\",\"buildLogPath\":\"");
w.write(res.getBuildLogPath() == null ? "" : res.getBuildLogPath());
w.write("\"");
if(res.errorMessage != null && !"".equals(res.errorMessage)){
w.write(",");
displayMessage(w, "err", res.errorMessage);
}
if(res.warningMessages != null && !"".equals(res.warningMessages)){
w.write(",");
displayMessages(w, "warn", res.warningMessages);
}
w.write("}");
if(resIter.hasNext()){
w.write(",");
}
}
w.write("]");
}
public static void displayMessages(Writer w, String label, Collection<String> messages) throws IOException {
if(messages==null){
return;
}
w.write(String.format("\"%s\":[", label));
for(Iterator<String> msgIter = messages.iterator(); msgIter.hasNext();){
String msg = msgIter.next();
displayMessage(w, null, msg);
if(msgIter.hasNext()){
w.write(",");
}
}
w.write("]");
}
public static void displayMessage(Writer w, String label, String message) throws IOException {
if(message == null){
return;
}
message = message.replaceAll("\"", "\\\\\"").replaceAll("\r", "\\\\r")
.replaceAll("\n", "\\\\n").replaceAll("\t", "\\\\t");
w.write(label==null?"":"\""+label+"\":");
w.write("\"");
w.write(message);
w.write("\"");
}
public static void toJson(Writer w, Set<PluginInfos> pluginInfos) throws IOException {
w.write("[");
for(Iterator<PluginInfos> piIter = pluginInfos.iterator(); piIter.hasNext();){
PluginInfos pi = piIter.next();
w.write(String.format("{\"name\":\"%s\",\"version\":\"%s\",\"url\":\"%s\"}", pi.pluginName, pi.pluginVersion, pi.pluginUrl));
if(piIter.hasNext()){
w.write(",");
}
}
w.write("]");
}
public static void toJson(Writer w, SortedSet<MavenCoordinates> testedCoreCoordinates) throws IOException {
w.write("[");
for(Iterator<MavenCoordinates> coordIter = testedCoreCoordinates.iterator(); coordIter.hasNext();){
MavenCoordinates coord = coordIter.next();
w.write(String.format("{\"g\":\"%s\",\"a\":\"%s\",\"v\":\"%s\"}", coord.groupId, coord.artifactId, coord.version));
if(coordIter.hasNext()){
w.write(",");
}
}
w.write("]");
}
}