From 234cf6db2a038317c029f19b744980b060f28d98 Mon Sep 17 00:00:00 2001 From: Greg Schueler Date: Thu, 3 Jan 2013 11:49:38 -0800 Subject: [PATCH] Support update for output entry format, API v6 #1 --- .../java/org/rundeck/api/RundeckClient.java | 12 ++- .../rundeck/api/parser/OutputEntryParser.java | 12 ++- .../api/parser/OutputEntryParserV5.java | 49 +++++++++++ .../org/rundeck/api/parser/OutputParser.java | 87 +++++++++---------- 4 files changed, 111 insertions(+), 49 deletions(-) create mode 100644 src/main/java/org/rundeck/api/parser/OutputEntryParserV5.java diff --git a/src/main/java/org/rundeck/api/RundeckClient.java b/src/main/java/org/rundeck/api/RundeckClient.java index eb5adbf..c04f933 100644 --- a/src/main/java/org/rundeck/api/RundeckClient.java +++ b/src/main/java/org/rundeck/api/RundeckClient.java @@ -2526,7 +2526,7 @@ public class RundeckClient implements Serializable { .param("lastlines", lastlines) .param("lastmod", lastmod) .param("maxlines", maxlines), - new OutputParser("result/output")); + new OutputParser("result/output", createOutputEntryParser())); } @@ -2549,7 +2549,15 @@ public class RundeckClient implements Serializable { return new ApiCall(this).get(new ApiPathBuilder("/execution/", executionId.toString(), "/output.xml").param("offset", offset) .param("lastmod", lastmod) .param("maxlines", maxlines), - new OutputParser("result/output")); + new OutputParser("result/output", createOutputEntryParser())); + } + + private OutputEntryParser createOutputEntryParser() { + if (getApiVersion() <= Version.V5.versionNumber) { + return new OutputEntryParserV5(); + }else{ + return new OutputEntryParser(); + } } diff --git a/src/main/java/org/rundeck/api/parser/OutputEntryParser.java b/src/main/java/org/rundeck/api/parser/OutputEntryParser.java index 014286b..9754377 100644 --- a/src/main/java/org/rundeck/api/parser/OutputEntryParser.java +++ b/src/main/java/org/rundeck/api/parser/OutputEntryParser.java @@ -6,6 +6,9 @@ import org.dom4j.Node; import org.rundeck.api.domain.RundeckOutputEntry; import org.rundeck.api.domain.RundeckOutputEntry.RundeckLogLevel; +/** + * Parses output message content for API v6 + */ public class OutputEntryParser implements XmlNodeParser { @@ -39,9 +42,16 @@ public class OutputEntryParser implements XmlNodeParser { outputEntry.setUser(StringUtils.trimToNull(entryNode.valueOf("@user"))); outputEntry.setCommand(StringUtils.trimToNull(entryNode.valueOf("@command"))); outputEntry.setNode(StringUtils.trimToNull(entryNode.valueOf("@node"))); - outputEntry.setMessage(StringUtils.trimToNull(entryNode.getStringValue())); + outputEntry.setMessage(parseMessage(entryNode)); return outputEntry; } + /** + * Parse the message content + */ + protected String parseMessage(Node entryNode) { + return StringUtils.trimToNull(entryNode.valueOf("@log")); + } + } \ No newline at end of file diff --git a/src/main/java/org/rundeck/api/parser/OutputEntryParserV5.java b/src/main/java/org/rundeck/api/parser/OutputEntryParserV5.java new file mode 100644 index 0000000..a3f7400 --- /dev/null +++ b/src/main/java/org/rundeck/api/parser/OutputEntryParserV5.java @@ -0,0 +1,49 @@ +/* + * Copyright 2013 DTO Labs, Inc. (http://dtolabs.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +/* + * OutputEntryParserV5.java + * + * User: Greg Schueler greg@dtosolutions.com + * Created: 1/2/13 5:33 PM + * + */ +package org.rundeck.api.parser; + +import org.apache.commons.lang.StringUtils; +import org.dom4j.Node; +import org.rundeck.api.domain.RundeckOutputEntry; + + +/** + * OutputEntryParserV5 parses message entry for API v5 + * + * @author Greg Schueler greg@dtosolutions.com + */ +public class OutputEntryParserV5 extends OutputEntryParser implements XmlNodeParser{ + public OutputEntryParserV5() { + } + + public OutputEntryParserV5(String xpath) { + super(xpath); + } + + @Override + protected String parseMessage(Node entryNode) { + return StringUtils.trimToNull(entryNode.getStringValue()); + } +} diff --git a/src/main/java/org/rundeck/api/parser/OutputParser.java b/src/main/java/org/rundeck/api/parser/OutputParser.java index ce7d29e..f5fe2a2 100644 --- a/src/main/java/org/rundeck/api/parser/OutputParser.java +++ b/src/main/java/org/rundeck/api/parser/OutputParser.java @@ -1,30 +1,25 @@ package org.rundeck.api.parser; -import java.util.List; import org.apache.commons.lang.StringUtils; import org.dom4j.Node; - +import org.rundeck.api.domain.RundeckExecution; import org.rundeck.api.domain.RundeckOutput; import org.rundeck.api.domain.RundeckOutputEntry; -import org.rundeck.api.domain.RundeckExecution; -import org.rundeck.api.domain.RundeckExecution.ExecutionStatus; + +import java.util.List; public class OutputParser implements XmlNodeParser { private String xpath; + XmlNodeParser parser; - public OutputParser() { - super(); - } - - /** - * @param xpath of the event element if it is not the root node - */ - public OutputParser(String xpath) { - super(); + public OutputParser(String xpath, XmlNodeParser parser) { this.xpath = xpath; + if (null != parser) { + this.parser = parser; + } } @Override @@ -32,68 +27,68 @@ public class OutputParser implements XmlNodeParser { Node entryNode = xpath != null ? node.selectSingleNode(xpath) : node; RundeckOutput output = new RundeckOutput(); - - //output.setMessage(StringUtils.trimToNull(entryNode.valueOf("message"))); - //output.setError(StringUtils.trimToNull(entryNode.valueOf("error"))); + + //output.setMessage(StringUtils.trimToNull(entryNode.valueOf("message"))); + //output.setError(StringUtils.trimToNull(entryNode.valueOf("error"))); - try{ - output.setExecutionId(Long.valueOf(entryNode.valueOf("id"))); + try { + output.setExecutionId(Long.valueOf(entryNode.valueOf("id"))); } catch (NumberFormatException e) { output.setExecutionId(null); } - - try{ - output.setOffset(Integer.valueOf(entryNode.valueOf("offset"))); + + try { + output.setOffset(Integer.valueOf(entryNode.valueOf("offset"))); } catch (NumberFormatException e) { output.setOffset(-1); } - - output.setCompleted(Boolean.valueOf(entryNode.valueOf("completed"))); - output.setExecCompleted(Boolean.valueOf(entryNode.valueOf("execCompleted"))); - output.setHasFailedNodes(Boolean.valueOf(entryNode.valueOf("hasFailedNodes"))); - + + output.setCompleted(Boolean.valueOf(entryNode.valueOf("completed"))); + output.setExecCompleted(Boolean.valueOf(entryNode.valueOf("execCompleted"))); + output.setHasFailedNodes(Boolean.valueOf(entryNode.valueOf("hasFailedNodes"))); + try { - output.setStatus(RundeckExecution.ExecutionStatus.valueOf(StringUtils.upperCase(entryNode.valueOf("execState")))); + output.setStatus(RundeckExecution.ExecutionStatus + .valueOf(StringUtils.upperCase(entryNode.valueOf("execState")))); } catch (IllegalArgumentException e) { output.setStatus(null); } - try{ - output.setLastModified(Long.valueOf(entryNode.valueOf("lastModified"))); + try { + output.setLastModified(Long.valueOf(entryNode.valueOf("lastModified"))); } catch (NumberFormatException e) { output.setLastModified(null); } - try{ - output.setExecDuration(Long.valueOf(entryNode.valueOf("execDuration"))); + try { + output.setExecDuration(Long.valueOf(entryNode.valueOf("execDuration"))); } catch (NumberFormatException e) { output.setExecDuration(null); } - try{ - output.setPercentLoaded(Float.valueOf(entryNode.valueOf("percentLoaded"))); + try { + output.setPercentLoaded(Float.valueOf(entryNode.valueOf("percentLoaded"))); } catch (NumberFormatException e) { output.setPercentLoaded(null); } - try{ - output.setTotalSize(Integer.valueOf(entryNode.valueOf("totalSize"))); + try { + output.setTotalSize(Integer.valueOf(entryNode.valueOf("totalSize"))); } catch (NumberFormatException e) { output.setTotalSize(-1); } - - Node entriesListNode = entryNode.selectSingleNode("entries"); - - if(entriesListNode != null){ - @SuppressWarnings("unchecked") - List entries = entriesListNode.selectNodes("entry"); - OutputEntryParser entryParser = new OutputEntryParser(); - for (Node logEntryNode : entries) { - RundeckOutputEntry outputEntry = entryParser.parseXmlNode(logEntryNode); - output.addLogEntry(outputEntry); - } + Node entriesListNode = entryNode.selectSingleNode("entries"); + + if (entriesListNode != null) { + @SuppressWarnings("unchecked") + List entries = entriesListNode.selectNodes("entry"); + + for (Node logEntryNode : entries) { + RundeckOutputEntry outputEntry = parser.parseXmlNode(logEntryNode); + output.addLogEntry(outputEntry); + } } return output; }