diff options
author | Trygve Laugstøl <trygvis@inamo.no> | 2013-01-03 15:09:43 +0100 |
---|---|---|
committer | Trygve Laugstøl <trygvis@inamo.no> | 2013-01-03 15:09:43 +0100 |
commit | 35ba1a6f765f72a1d91a5456c7556e6274f8c3a9 (patch) | |
tree | 18d069a4512cec4fca1c93964adcb039b9ee6167 /src/main/java/io/trygvis/esper/testing/jenkins/xml | |
parent | 84fb49088a14cff8b453e0e32f6ad7007eb2184a (diff) | |
download | esper-testing-35ba1a6f765f72a1d91a5456c7556e6274f8c3a9.tar.gz esper-testing-35ba1a6f765f72a1d91a5456c7556e6274f8c3a9.tar.bz2 esper-testing-35ba1a6f765f72a1d91a5456c7556e6274f8c3a9.tar.xz esper-testing-35ba1a6f765f72a1d91a5456c7556e6274f8c3a9.zip |
o Moving Jenkins XML objects and parsing to it's own package.
o Removing fields from JenkinsBuild that's read from the XML later on.
Diffstat (limited to 'src/main/java/io/trygvis/esper/testing/jenkins/xml')
4 files changed, 346 insertions, 0 deletions
diff --git a/src/main/java/io/trygvis/esper/testing/jenkins/xml/JenkinsBuildXml.java b/src/main/java/io/trygvis/esper/testing/jenkins/xml/JenkinsBuildXml.java new file mode 100755 index 0000000..506407e --- /dev/null +++ b/src/main/java/io/trygvis/esper/testing/jenkins/xml/JenkinsBuildXml.java @@ -0,0 +1,210 @@ +package io.trygvis.esper.testing.jenkins.xml; + +import java.net.URI; +import java.util.ArrayList; +import java.util.List; + +import org.jdom2.Document; +import org.jdom2.Element; +import org.joda.time.DateTime; +import org.joda.time.format.DateTimeFormat; +import org.joda.time.format.DateTimeFormatter; +import org.joda.time.format.ISODateTimeFormat; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import fj.F; +import fj.data.Option; +import io.trygvis.esper.testing.Util; + +import static fj.data.List.iterableList; +import static fj.data.Option.*; +import static io.trygvis.esper.testing.Util.childText; +import static io.trygvis.esper.testing.Util.parseInt; +import static io.trygvis.esper.testing.jenkins.xml.JenkinsBuildXml.ChangeSetItemXml.parseChangeSetItem; +import static io.trygvis.esper.testing.jenkins.xml.JenkinsBuildXml.RevisionXml.parseRevision; + +public class JenkinsBuildXml { + private static final Logger logger = LoggerFactory.getLogger(JenkinsBuildXml.class); + + public final URI url; + + public final int number; + + public final Option<String> result; + + public final int duration; + + public final long timestamp; + + public final Option<ChangeSetXml> changeSet; + + JenkinsBuildXml(URI url, int number, Option<String> result, int duration, long timestamp, Option<ChangeSetXml> changeSet) { + this.url = url; + this.number = number; + this.result = result; + this.duration = duration; + this.timestamp = timestamp; + this.changeSet = changeSet; + } + + public static F<Document, Option<JenkinsBuildXml>> parse = new F<Document, Option<JenkinsBuildXml>>() { + public Option<JenkinsBuildXml> f(Document document) { + return parse(document); + } + }; + + public static Option<JenkinsBuildXml> parse(Document doc) { + Element root = doc.getRootElement(); + + Option<URI> url = childText(root, "url").bind(Util.parseUri); + Option<Integer> number = childText(root, "number").bind(Util.parseInt); + Option<String> result = childText(root, "result"); + Option<Integer> duration = childText(root, "duration").bind(Util.parseInt); + Option<Long> timestamp = childText(root, "timestamp").bind(Util.parseLong); + + if (url.isNone()) { + logger.warn("Missing required field: <url>"); + return none(); + } + if (number.isNone()) { + logger.warn("Missing required field: <number>"); + return none(); + } + if (duration.isNone()) { + logger.warn("Missing required field: <duration>"); + return none(); + } + if (timestamp.isNone()) { + logger.warn("Missing required field: <timestamp>"); + return none(); + } + + Option<ChangeSetXml> changeSet = none(); + Element e = root.getChild("changeSet"); + if (e != null) { + changeSet = ChangeSetXml.parse(e); + } + + return some(new JenkinsBuildXml(url.some(), number.some(), result, duration.some(), timestamp.some(), changeSet)); + } + + public static class ChangeSetXml { + public final List<ChangeSetItemXml> items; + + public final Option<RevisionXml> revision; + + public ChangeSetXml(List<ChangeSetItemXml> items, Option<RevisionXml> revision) { + this.items = items; + this.revision = revision; + } + + public static Option<ChangeSetXml> parse(Element changeSet) { + + List<ChangeSetItemXml> items = new ArrayList<>(Option.somes(iterableList(changeSet.getChildren("item")).map(parseChangeSetItem)).toCollection()); + + Option<RevisionXml> revision = Option.fromNull(changeSet.getChild("revision")).bind(parseRevision); + + return some(new ChangeSetXml(items, revision)); + } + } + + public static class ChangeSetItemXml { + public final String commitId; + + public final DateTime date; + + public final String msg; + + public final Option<AuthorXml> author; + + public ChangeSetItemXml(String commitId, DateTime date, String msg, Option<AuthorXml> author) { + this.commitId = commitId; + this.date = date; + this.msg = msg; + this.author = author; + } + + private static final F<String, Option<DateTime>> parseDate = new F<String, Option<DateTime>>() { + // This variant is used by git + DateTimeFormatter parser = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss Z"); + // and this by subversion + DateTimeFormatter parser2 = ISODateTimeFormat.dateTime(); + + public Option<DateTime> f(String s) { + try { + return some(parser.parseDateTime(s)); + } catch (IllegalArgumentException e) { + try { + return some(parser2.parseDateTime(s)); + } catch (IllegalArgumentException e2) { + return none(); + } + } + } + }; + + public static final F<Element, Option<ChangeSetItemXml>> parseChangeSetItem = new F<Element, Option<ChangeSetItemXml>>() { + public Option<ChangeSetItemXml> f(Element item) { + Option<String> commitId = childText(item, "commitId"); + Option<DateTime> date = childText(item, "date").bind(parseDate); + Option<String> msg = childText(item, "msg"); + + if (commitId.isNone() || date.isNone() || msg.isNone()) { + return none(); + } + + Option<AuthorXml> author = fromNull(item.getChild("author")).bind(AuthorXml.parseAuthorXml); + + return some(new ChangeSetItemXml(commitId.some(), date.some(), msg.some(), author)); + } + }; + } + + public static class AuthorXml { + public final String absoluteUrl; + public final String fullName; + + public AuthorXml(String absoluteUrl, String fullName) { + this.absoluteUrl = absoluteUrl; + this.fullName = fullName; + } + + public static final F<Element, Option<AuthorXml>> parseAuthorXml = new F<Element, Option<AuthorXml>>() { + public Option<AuthorXml> f(Element element) { + Option<String> absoluteUrl = childText(element, "absoluteUrl"); + Option<String> fullName = childText(element, "fullName"); + + if(absoluteUrl.isNone() || fullName.isNone()) { + return none(); + } + + return some(new AuthorXml(absoluteUrl.some(), fullName.some())); + } + }; + } + + public static class RevisionXml { + public final String module; + + public final int revision; + + public RevisionXml(String module, int revision) { + this.module = module; + this.revision = revision; + } + + public static final F<Element, Option<RevisionXml>> parseRevision = new F<Element, Option<RevisionXml>>() { + public Option<RevisionXml> f(Element e) { + Option<String> module = childText(e, "module"); + Option<Integer> revision = childText(e, "revision").bind(parseInt); + + if (module.isNone() || revision.isNone()) { + return none(); + } + + return some(new RevisionXml(module.some(), revision.some())); + } + }; + } +} diff --git a/src/main/java/io/trygvis/esper/testing/jenkins/xml/JenkinsEntryXml.java b/src/main/java/io/trygvis/esper/testing/jenkins/xml/JenkinsEntryXml.java new file mode 100755 index 0000000..c801ccf --- /dev/null +++ b/src/main/java/io/trygvis/esper/testing/jenkins/xml/JenkinsEntryXml.java @@ -0,0 +1,17 @@ +package io.trygvis.esper.testing.jenkins.xml; + +import java.net.URI; + +import org.joda.time.DateTime; + +public class JenkinsEntryXml { + public final String id; + public final DateTime timestamp; + public final URI url; + + public JenkinsEntryXml(String id, DateTime timestamp, URI url) { + this.id = id; + this.timestamp = timestamp; + this.url = url; + } +} diff --git a/src/main/java/io/trygvis/esper/testing/jenkins/xml/JenkinsJobXml.java b/src/main/java/io/trygvis/esper/testing/jenkins/xml/JenkinsJobXml.java new file mode 100755 index 0000000..eb4c874 --- /dev/null +++ b/src/main/java/io/trygvis/esper/testing/jenkins/xml/JenkinsJobXml.java @@ -0,0 +1,88 @@ +package io.trygvis.esper.testing.jenkins.xml; + +import java.net.URI; + +import org.jdom2.Element; + +import fj.F; +import fj.data.Option; +import io.trygvis.esper.testing.Util; + +import static fj.data.Option.some; +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 final JenkinsJobType type; + public final Option<String> description; + public final Option<String> displayName; + public final Option<String> name; + public final URI url; + public final Option<String> color; + public final boolean buildable; + public final Option<BuildXml> lastBuild; + public final Option<BuildXml> lastCompletedBuild; + public final Option<BuildXml> lastFailedBuild; + public final Option<BuildXml> lastSuccessfulBuild; + public final Option<BuildXml> lastUnsuccessfulBuild; + + protected JenkinsJobXml(JenkinsJobType type, Option<String> description, Option<String> displayName, + Option<String> name, URI url, Option<String> color, boolean buildable, + Option<BuildXml> lastBuild, Option<BuildXml> lastCompletedBuild, + Option<BuildXml> lastFailedBuild, Option<BuildXml> lastSuccessfulBuild, + Option<BuildXml> 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<Element, Option<BuildXml>> buildXml = new F<Element, Option<BuildXml>>() { + public Option<BuildXml> f(Element element) { + Option<Integer> number = childText(element, "number").bind(Util.parseInt); + Option<URI> 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 JenkinsJobXml parse(URI url, JenkinsJobType type, Element root) { + return new JenkinsJobXml(type, + childText(root, "description"), + childText(root, "displayName"), + childText(root, "name"), + childText(root, "url").bind(Util.parseUri).orSome(url), + 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)); + } +} diff --git a/src/main/java/io/trygvis/esper/testing/jenkins/xml/JenkinsXml.java b/src/main/java/io/trygvis/esper/testing/jenkins/xml/JenkinsXml.java new file mode 100755 index 0000000..d599484 --- /dev/null +++ b/src/main/java/io/trygvis/esper/testing/jenkins/xml/JenkinsXml.java @@ -0,0 +1,31 @@ +package io.trygvis.esper.testing.jenkins.xml; + +import java.util.List; + +import fj.data.Option; + +public class JenkinsXml { + public final Option<String> nodeName; + public final Option<String> nodeDescription; + public final Option<String> description; + public final List<JobXml> jobs; + + public JenkinsXml(Option<String> nodeName, Option<String> nodeDescription, Option<String> description, List<JobXml> jobs) { + this.nodeName = nodeName; + this.nodeDescription = nodeDescription; + this.description = description; + this.jobs = jobs; + } + + public static class JobXml { + public final String name; + public final String url; + public final String color; + + public JobXml(String name, String url, String color) { + this.name = name; + this.url = url; + this.color = color; + } + } +} |