Mercurial > dive4elements > framework
diff artifacts-common/src/main/java/de/intevation/artifacts/common/utils/XMLUtils.java @ 381:bed51de8ae58
Added JSON parser from Artefact Server NG to bridge from JSON to XML speaking services.
artifacts/trunk@4270 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Wed, 18 Apr 2012 17:10:10 +0000 |
parents | 6431b7efe240 |
children | 823752e3d392 |
line wrap: on
line diff
--- a/artifacts-common/src/main/java/de/intevation/artifacts/common/utils/XMLUtils.java Tue Apr 03 11:15:10 2012 +0000 +++ b/artifacts-common/src/main/java/de/intevation/artifacts/common/utils/XMLUtils.java Wed Apr 18 17:10:10 2012 +0000 @@ -8,7 +8,10 @@ package de.intevation.artifacts.common.utils; +import java.util.List; +import java.util.ArrayList; import java.util.Map; +import java.util.LinkedHashMap; import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream; @@ -464,5 +467,119 @@ } return null; } + + private static class BuildResult { + List<Node> children; + Map<String, String> attributes; + BuildResult() { + children = new ArrayList<Node>(); + attributes = new LinkedHashMap<String, String>(); + } + + void setAttributes(Element element) { + for (Map.Entry<String, String> entry: attributes.entrySet()) { + element.setAttribute(entry.getKey(), entry.getValue()); + } + } + void add(Node node) { + children.add(node); + } + + void add(String key, Object value) { + attributes.put(key, value != null ? value.toString() : "null"); + } + } // class BuildResult + + private static BuildResult recursiveBuild( + List list, + Document document + ) { + BuildResult result = new BuildResult(); + for (Object entry: list) { + if (entry instanceof Map) { + Element element = document.createElement("map"); + BuildResult subResult = recursiveBuild( + (Map<String, Object>)entry, document); + subResult.setAttributes(element); + result.add(element); + } + else if (entry instanceof List) { + Element element = document.createElement("list"); + BuildResult subResult = recursiveBuild((List)entry, document); + subResult.setAttributes(element); + result.add(element); + } + else { + Element element = document.createElement("entry"); + element.setAttribute( + "value", + entry != null ? entry.toString() : "null"); + } + } + return result; + } + + private static BuildResult recursiveBuild( + Map<String, Object> map, + Document document + ) { + BuildResult result = new BuildResult(); + + List<Node> nodes = new ArrayList<Node>(); + for (Map.Entry<String, Object> entry: map.entrySet()) { + Object value = entry.getValue(); + if (value instanceof Map) { + Element element = document.createElement(entry.getKey()); + BuildResult subResult = recursiveBuild( + (Map<String, Object>)value, document); + subResult.setAttributes(element); + result.add(element); + } + else if (value instanceof List) { + Element element = document.createElement(entry.getKey()); + BuildResult subResult = recursiveBuild((List)value, document); + subResult.setAttributes(element); + result.add(element); + } + else { + result.add(entry.getKey(), value); + } + } + return result; + } + + public static Document jsonToXML(String input) { + Document document = newDocument(); + + if (document == null) { + return null; + } + + Map<String, Object> map; + try { + map = JSON.parse(input); + } + catch (IOException ioe) { + logger.error(ioe); + return null; + } + + BuildResult roots = recursiveBuild(map, document); + + int N = roots.children.size(); + + if (N == 1) { + document.appendChild(roots.children.get(0)); + } + else if (N > 1) { + Node root = document.createElement("root"); + for (int i = 0; i < N; ++i) { + root.appendChild(roots.children.get(i)); + } + document.appendChild(root); + } + + return document; + } } // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :