aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/io/trygvis/esper/testing/jenkins/xml
diff options
context:
space:
mode:
authorTrygve Laugstøl <trygvis@inamo.no>2013-01-03 15:09:43 +0100
committerTrygve Laugstøl <trygvis@inamo.no>2013-01-03 15:09:43 +0100
commit35ba1a6f765f72a1d91a5456c7556e6274f8c3a9 (patch)
tree18d069a4512cec4fca1c93964adcb039b9ee6167 /src/main/java/io/trygvis/esper/testing/jenkins/xml
parent84fb49088a14cff8b453e0e32f6ad7007eb2184a (diff)
downloadesper-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')
-rwxr-xr-xsrc/main/java/io/trygvis/esper/testing/jenkins/xml/JenkinsBuildXml.java210
-rwxr-xr-xsrc/main/java/io/trygvis/esper/testing/jenkins/xml/JenkinsEntryXml.java17
-rwxr-xr-xsrc/main/java/io/trygvis/esper/testing/jenkins/xml/JenkinsJobXml.java88
-rwxr-xr-xsrc/main/java/io/trygvis/esper/testing/jenkins/xml/JenkinsXml.java31
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;
+ }
+ }
+}