Mercurial > dive4elements > framework
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 : |