Index: core/kernel/src/main/java/com/sun/enterprise/v3/common/XMLActionReporter.java =================================================================== --- core/kernel/src/main/java/com/sun/enterprise/v3/common/XMLActionReporter.java (revision 38455) +++ core/kernel/src/main/java/com/sun/enterprise/v3/common/XMLActionReporter.java (working copy) @@ -37,7 +37,9 @@ package com.sun.enterprise.v3.common; import java.io.OutputStream; +import java.util.List; import java.util.Map; +import java.util.Set; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.Result; @@ -50,7 +52,6 @@ import javax.xml.transform.stream.StreamResult; import org.w3c.dom.Document; import org.w3c.dom.Element; -import org.w3c.dom.Node; import org.jvnet.hk2.annotations.Service; import org.jvnet.hk2.annotations.Scoped; import org.jvnet.hk2.component.PerLookup; @@ -84,11 +85,11 @@ @Scoped(PerLookup.class) public class XMLActionReporter extends ActionReporter { + @Override public void writeReport(OutputStream os) { try { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); - Document d = db.newDocument(); d.appendChild(writeActionReport(d, this)); @@ -127,8 +128,6 @@ return "text/xml"; } - - private void writePart(Element actionReport, MessagePart part, String childType) { Document d = actionReport.getOwnerDocument(); Element messagePart = d.createElement("message-part"); @@ -141,14 +140,61 @@ Element p = d.createElement("property"); messagePart.appendChild(p); p.setAttribute("name", prop.getKey().toString()); - p.setAttribute("value", prop.getValue().toString()); + Object value = prop.getValue(); + if (value instanceof List) { + addListElement(p, (List)value); + } else if (value instanceof Map) { + addMapElement(p, (Map)value); + } else { + p.setAttribute("value", prop.getValue().toString()); + } } messagePart.setAttribute("message", part.getMessage()); for (MessagePart subPart : part.getChildren()) { writePart(messagePart, subPart, subPart.getChildrenType()); } } + + private void addListElement(Element parent, List list) { + Document d = parent.getOwnerDocument(); + Element listElement = d.createElement("list"); + parent.appendChild(listElement); + + for (Object entry : list) { + Element entryElement = d.createElement("entry"); + listElement.appendChild(entryElement); + if (entry instanceof List) { + addListElement(entryElement, (List) entry); + } else if (entry instanceof Map) { + addMapElement(entryElement, (Map) entry); + } else { + entryElement.setAttribute("value", entry.toString()); + } + } + } + private void addMapElement(Element parent, Map map) { + Document d = parent.getOwnerDocument(); + Element mapElement = d.createElement("map"); + parent.appendChild(mapElement); + + for (Map.Entry entry : (Set)map.entrySet()) { + Element entryElement = d.createElement("entry"); + String key = entry.getKey().toString(); + Object value = entry.getValue(); + mapElement.appendChild(entryElement); + entryElement.setAttribute("key", key); + + if (value instanceof List) { + addListElement(entryElement, (List) value); + } else if (value instanceof Map) { + addMapElement(entryElement, (Map) value); + } else { + entryElement.setAttribute("value", value.toString()); + } + } + } + private void writeXML(Document doc, OutputStream os) throws TransformerConfigurationException, TransformerException { Source source = new DOMSource(doc); @@ -157,4 +203,4 @@ Transformer xformer = TransformerFactory.newInstance().newTransformer(); xformer.transform(source, result); } -} +} \ No newline at end of file Index: core/kernel/src/main/java/com/sun/enterprise/v3/common/JsonActionReporter.java =================================================================== --- core/kernel/src/main/java/com/sun/enterprise/v3/common/JsonActionReporter.java (revision 38455) +++ core/kernel/src/main/java/com/sun/enterprise/v3/common/JsonActionReporter.java (working copy) @@ -43,8 +43,10 @@ import java.io.IOException; import java.io.PrintWriter; import java.io.OutputStream; +import java.util.List; import java.util.Map; import java.util.Properties; +import java.util.Set; /** * Writes command output to a json stream @@ -66,6 +68,7 @@ public JsonActionReporter() { } + @Override public void writeReport(OutputStream os) throws IOException { PrintWriter writer = new PrintWriter(os); @@ -81,8 +84,6 @@ } private void write(MessagePart part, PrintWriter writer) { - - writer.println("{ " + quote("name") + ":" + quote(part.getMessage())); if (top) { writer.println(", " + quote("command") + ":" + quote(actionDescription)); @@ -115,19 +116,62 @@ if (props == null || props.size() == 0) { return; } - writer.println("," + quote("properties") + " : "); - boolean needComma = false; - writer.println("{"); + String result = "," + quote("properties") + " : {"; + String sep = ""; for (Map.Entry entry : props.entrySet()) { - if (needComma == true) { - writer.println(","); + String line = quote("" + entry.getKey()) + " : "; + Object value = entry.getValue(); + if (value instanceof List) { + line += encodeList((List)value); + } else if (value instanceof Map) { + line += encodeMap((Map)value); + } else { + line += quote("" + value.toString()); + } + result += sep + line; + sep = ","; + } + writer.println(result + "}"); + + } + + private String encodeList (List list) { + String result = "["; + String sep = ""; + for (Object entry : list) { + if (entry instanceof List) { + result += sep + encodeList((List)entry); + } else if (entry instanceof Map) { + result += sep + encodeMap((Map)entry); + } else { + result += sep + quote (entry.toString()); } - needComma = true; - writer.println(quote("" + entry.getKey()) + " : " + quote("" + entry.getValue())); + + sep = ","; } - writer.println("}"); + return result + "]"; + } + private String encodeMap (Map map) { + String result = "{"; + String sep = ""; + for (Map.Entry entry : (Set)map.entrySet()) { + String key = entry.getKey().toString(); + Object value = entry.getValue(); + result += sep + quote(key) + ":"; + + if (value instanceof List) { + result += encodeList((List) value); + } else if (value instanceof Map) { + result += encodeMap((Map) value); + } else { + result += quote(value.toString()); + } + sep = ","; + } + + return result += "}"; } /** @@ -143,7 +187,7 @@ char c = 0; int i; int len = string.length(); - StringBuffer sb = new StringBuffer(len + 4); + StringBuilder sb = new StringBuilder(len + 4); String t; sb.append('"'); @@ -189,4 +233,4 @@ sb.append('"'); return sb.toString(); } -} +} \ No newline at end of file