1 package org.rundeck.api.parser;
2
3 import org.apache.commons.lang.StringUtils;
4 import org.dom4j.Node;
5 import org.rundeck.api.domain.RundeckExecution;
6 import org.rundeck.api.domain.RundeckOutput;
7 import org.rundeck.api.domain.RundeckOutputEntry;
8
9 import java.util.List;
10
11
12 public class OutputParser implements XmlNodeParser<RundeckOutput> {
13
14
15 private String xpath;
16 XmlNodeParser<RundeckOutputEntry> parser;
17
18 public OutputParser(String xpath, XmlNodeParser<RundeckOutputEntry> parser) {
19 this.xpath = xpath;
20 if (null != parser) {
21 this.parser = parser;
22 }
23 }
24
25 @Override
26 public RundeckOutput parseXmlNode(Node node) {
27 Node entryNode = xpath != null ? node.selectSingleNode(xpath) : node;
28
29 RundeckOutput output = new RundeckOutput();
30
31
32
33
34
35 try {
36 output.setExecutionId(Long.valueOf(entryNode.valueOf("id")));
37 } catch (NumberFormatException e) {
38 output.setExecutionId(null);
39 }
40
41 try {
42 output.setOffset(Integer.valueOf(entryNode.valueOf("offset")));
43 } catch (NumberFormatException e) {
44 output.setOffset(-1);
45 }
46
47 output.setCompleted(Boolean.valueOf(entryNode.valueOf("completed")));
48 output.setExecCompleted(Boolean.valueOf(entryNode.valueOf("execCompleted")));
49 output.setHasFailedNodes(Boolean.valueOf(entryNode.valueOf("hasFailedNodes")));
50
51 try {
52 output.setStatus(RundeckExecution.ExecutionStatus
53 .valueOf(StringUtils.upperCase(entryNode.valueOf("execState"))));
54 } catch (IllegalArgumentException e) {
55 output.setStatus(null);
56 }
57
58 try {
59 output.setLastModified(Long.valueOf(entryNode.valueOf("lastModified")));
60 } catch (NumberFormatException e) {
61 output.setLastModified(null);
62 }
63
64 try {
65 output.setExecDuration(Long.valueOf(entryNode.valueOf("execDuration")));
66 } catch (NumberFormatException e) {
67 output.setExecDuration(null);
68 }
69
70 try {
71 output.setPercentLoaded(Float.valueOf(entryNode.valueOf("percentLoaded")));
72 } catch (NumberFormatException e) {
73 output.setPercentLoaded(null);
74 }
75
76 try {
77 output.setTotalSize(Integer.valueOf(entryNode.valueOf("totalSize")));
78 } catch (NumberFormatException e) {
79 output.setTotalSize(-1);
80 }
81
82 Node entriesListNode = entryNode.selectSingleNode("entries");
83
84 if (entriesListNode != null) {
85 @SuppressWarnings("unchecked")
86 List<Node> entries = entriesListNode.selectNodes("entry");
87
88 for (Node logEntryNode : entries) {
89 RundeckOutputEntry outputEntry = parser.parseXmlNode(logEntryNode);
90 output.addLogEntry(outputEntry);
91 }
92 }
93 return output;
94 }
95
96 }