From c8e1315612ab873f075a6b63ec46838636b08bb5 Mon Sep 17 00:00:00 2001 From: Greg Schueler Date: Fri, 7 Nov 2014 15:23:12 -0800 Subject: [PATCH] Patch rundeck API v11 bug for execution query results --- .../java/org/rundeck/api/RundeckClient.java | 19 ++++++++-- .../parser/PagedResultParser_BugPatchV11.java | 35 +++++++++++++++++++ 2 files changed, 51 insertions(+), 3 deletions(-) create mode 100644 src/main/java/org/rundeck/api/parser/PagedResultParser_BugPatchV11.java diff --git a/src/main/java/org/rundeck/api/RundeckClient.java b/src/main/java/org/rundeck/api/RundeckClient.java index 8ada6d9..101bf6d 100644 --- a/src/main/java/org/rundeck/api/RundeckClient.java +++ b/src/main/java/org/rundeck/api/RundeckClient.java @@ -1587,13 +1587,26 @@ public class RundeckClient implements Serializable { .param(new ExecutionQueryParameters(query)) .param("max", max) .param("offset", offset), - new PagedResultParser( - new ListParser(new ExecutionParser(), "execution"), - rootXpath()+"/executions" + patchApiV11Response( + new PagedResultParser( + new ListParser(new ExecutionParser(), "execution"), + rootXpath() + "/executions" + ) ) ); } + /** + * Fix potential buggy response from Rundeck, where <result> wrapper exists + * even if it should not. + * @param parser + * @return + */ + private XmlNodeParser> patchApiV11Response + (final PagedResultParser parser) { + return new PagedResultParser_BugPatchV11(parser); + } + /** * Get a single execution, identified by the given ID * diff --git a/src/main/java/org/rundeck/api/parser/PagedResultParser_BugPatchV11.java b/src/main/java/org/rundeck/api/parser/PagedResultParser_BugPatchV11.java new file mode 100644 index 0000000..083b3d1 --- /dev/null +++ b/src/main/java/org/rundeck/api/parser/PagedResultParser_BugPatchV11.java @@ -0,0 +1,35 @@ +package org.rundeck.api.parser; + +import org.dom4j.DocumentHelper; +import org.dom4j.Element; +import org.dom4j.Node; +import org.rundeck.api.util.PagedResults; + +/** + * WRaps a {@link PagedResultParser} to detect whether the result XML incorrectly is wrapped with a + * <result> element. + * + * @author Greg Schueler + * @since 2014-11-07 + */ +public class PagedResultParser_BugPatchV11 implements XmlNodeParser> { + PagedResultParser parser; + + public PagedResultParser_BugPatchV11(final PagedResultParser parser) { + this.parser = parser; + } + + @Override public PagedResults parseXmlNode(final Node node) { + Node sourceNode = node; + final Node tested = sourceNode.selectSingleNode(parser.getXpath()); + if (null == tested && !parser.getXpath().startsWith("result")) { + //prepend /result + if (null != sourceNode.selectSingleNode("result" + parser.getXpath())) { + sourceNode = sourceNode.selectSingleNode("result" + parser.getXpath()); + sourceNode.getParent().remove(sourceNode); + DocumentHelper.createDocument((Element) sourceNode); + } + } + return parser.parseXmlNode(sourceNode); + } +}