package io.trygvis.esper.testing.jenkins.xml; import java.net.URI; import org.jdom2.*; import fj.F; import fj.data.Option; import io.trygvis.esper.testing.Util; import static fj.data.Option.*; import static io.trygvis.esper.testing.Util.child; import static io.trygvis.esper.testing.Util.childText; public class JenkinsJobXml { public enum JenkinsJobType { FREE_STYLE, MAVEN_MODULE_SET, MAVEN_MODULE, MATRIX, MATRIX_CONFIGURATION; public static Option fromElement(String name) { switch (name) { case "freeStyleProject": return some(FREE_STYLE); case "mavenModuleSet": return some(MAVEN_MODULE_SET); case "mavenModule": return some(MAVEN_MODULE); case "matrixProject": return some(MATRIX); case "matrixConfiguration": return some(MATRIX_CONFIGURATION); default: return none(); } } } public final JenkinsJobType type; public final Option description; public final Option displayName; public final Option name; public final URI url; public final Option color; public final boolean buildable; public final Option lastBuild; public final Option lastCompletedBuild; public final Option lastFailedBuild; public final Option lastSuccessfulBuild; public final Option lastUnsuccessfulBuild; protected JenkinsJobXml(JenkinsJobType type, Option description, Option displayName, Option name, URI url, Option color, boolean buildable, Option lastBuild, Option lastCompletedBuild, Option lastFailedBuild, Option lastSuccessfulBuild, Option lastUnsuccessfulBuild) { this.type = type; this.description = description; this.displayName = displayName; this.name = name; this.url = url; this.color = color; this.buildable = buildable; this.lastBuild = lastBuild; this.lastCompletedBuild = lastCompletedBuild; this.lastFailedBuild = lastFailedBuild; this.lastSuccessfulBuild = lastSuccessfulBuild; this.lastUnsuccessfulBuild = lastUnsuccessfulBuild; } static class BuildXml { public final int number; public final URI url; public static F> buildXml = new F>() { public Option f(Element element) { Option number = childText(element, "number").bind(Util.parseInt); Option url = childText(element, "url").bind(Util.parseUri); if (number.isNone() || url.isNone()) { return Option.none(); } return some(new BuildXml(number.some(), url.some())); } }; BuildXml(int number, URI url) { this.number = number; this.url = url; } } public static final F> parse = new F>() { public Option f(Document document) { return parse(document.getRootElement()); } }; public static Option parse(Element root) { Option uri = childText(root, "url").bind(Util.parseUri); Option typeO = JenkinsJobType.fromElement(root.getName()); if (uri.isNone() || typeO.isNone()) { return none(); } return some(new JenkinsJobXml(typeO.some(), childText(root, "description"), childText(root, "displayName"), childText(root, "name"), uri.some(), childText(root, "color"), childText(root, "buildable").bind(Util.parseBoolean).orSome(false), child(root, "lastBuild").bind(BuildXml.buildXml), child(root, "lastCompletedBuild").bind(BuildXml.buildXml), child(root, "lastFailedBuild").bind(BuildXml.buildXml), child(root, "lastSuccessfulBuild").bind(BuildXml.buildXml), child(root, "lastUnsuccessfulBuild").bind(BuildXml.buildXml))); } }