comparison 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
comparison
equal deleted inserted replaced
380:9798e4d83681 381:bed51de8ae58
6 * or visit http://www.gnu.org/licenses/ if it does not exist. 6 * or visit http://www.gnu.org/licenses/ if it does not exist.
7 */ 7 */
8 8
9 package de.intevation.artifacts.common.utils; 9 package de.intevation.artifacts.common.utils;
10 10
11 import java.util.List;
12 import java.util.ArrayList;
11 import java.util.Map; 13 import java.util.Map;
14 import java.util.LinkedHashMap;
12 import java.util.zip.GZIPInputStream; 15 import java.util.zip.GZIPInputStream;
13 import java.util.zip.GZIPOutputStream; 16 import java.util.zip.GZIPOutputStream;
14 17
15 import java.io.ByteArrayInputStream; 18 import java.io.ByteArrayInputStream;
16 import java.io.FileInputStream; 19 import java.io.FileInputStream;
462 } 465 }
463 } 466 }
464 } 467 }
465 return null; 468 return null;
466 } 469 }
470
471 private static class BuildResult {
472 List<Node> children;
473 Map<String, String> attributes;
474 BuildResult() {
475 children = new ArrayList<Node>();
476 attributes = new LinkedHashMap<String, String>();
477 }
478
479 void setAttributes(Element element) {
480 for (Map.Entry<String, String> entry: attributes.entrySet()) {
481 element.setAttribute(entry.getKey(), entry.getValue());
482 }
483 }
484 void add(Node node) {
485 children.add(node);
486 }
487
488 void add(String key, Object value) {
489 attributes.put(key, value != null ? value.toString() : "null");
490 }
491 } // class BuildResult
492
493 private static BuildResult recursiveBuild(
494 List list,
495 Document document
496 ) {
497 BuildResult result = new BuildResult();
498 for (Object entry: list) {
499 if (entry instanceof Map) {
500 Element element = document.createElement("map");
501 BuildResult subResult = recursiveBuild(
502 (Map<String, Object>)entry, document);
503 subResult.setAttributes(element);
504 result.add(element);
505 }
506 else if (entry instanceof List) {
507 Element element = document.createElement("list");
508 BuildResult subResult = recursiveBuild((List)entry, document);
509 subResult.setAttributes(element);
510 result.add(element);
511 }
512 else {
513 Element element = document.createElement("entry");
514 element.setAttribute(
515 "value",
516 entry != null ? entry.toString() : "null");
517 }
518 }
519 return result;
520 }
521
522 private static BuildResult recursiveBuild(
523 Map<String, Object> map,
524 Document document
525 ) {
526 BuildResult result = new BuildResult();
527
528 List<Node> nodes = new ArrayList<Node>();
529 for (Map.Entry<String, Object> entry: map.entrySet()) {
530 Object value = entry.getValue();
531 if (value instanceof Map) {
532 Element element = document.createElement(entry.getKey());
533 BuildResult subResult = recursiveBuild(
534 (Map<String, Object>)value, document);
535 subResult.setAttributes(element);
536 result.add(element);
537 }
538 else if (value instanceof List) {
539 Element element = document.createElement(entry.getKey());
540 BuildResult subResult = recursiveBuild((List)value, document);
541 subResult.setAttributes(element);
542 result.add(element);
543 }
544 else {
545 result.add(entry.getKey(), value);
546 }
547 }
548 return result;
549 }
550
551 public static Document jsonToXML(String input) {
552 Document document = newDocument();
553
554 if (document == null) {
555 return null;
556 }
557
558 Map<String, Object> map;
559 try {
560 map = JSON.parse(input);
561 }
562 catch (IOException ioe) {
563 logger.error(ioe);
564 return null;
565 }
566
567 BuildResult roots = recursiveBuild(map, document);
568
569 int N = roots.children.size();
570
571 if (N == 1) {
572 document.appendChild(roots.children.get(0));
573 }
574 else if (N > 1) {
575 Node root = document.createElement("root");
576 for (int i = 0; i < N; ++i) {
577 root.appendChild(roots.children.get(i));
578 }
579 document.appendChild(root);
580 }
581
582 return document;
583 }
467 } 584 }
468 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : 585 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org