fork download
  1. /* package whatever; // don't place package name! */
  2.  
  3. import java.util.*;
  4. import java.lang.*;
  5. import java.io.*;
  6. import javax.xml.bind.annotation.*;
  7. import javax.xml.bind.*;
  8. import javax.xml.bind.annotation.adapters.*;
  9. import javax.xml.transform.stream.*;
  10.  
  11.  
  12. @XmlRootElement(name = "datacenter")
  13. class DataCenter {
  14. /**
  15. * K: storageId V: storage
  16. */
  17. @XmlElement(name = "storages")
  18. @XmlJavaTypeAdapter(StorageMapAdapter.class)
  19. private final Map<String, Storage> storages = new LinkedHashMap<String, Storage>();
  20.  
  21. @Override
  22. public String toString() {
  23. StringBuilder sb = new StringBuilder();
  24. sb.append("datacenter\n");
  25. for (Map.Entry<String, Storage> s : storages.entrySet()) {
  26. sb.append(s.getValue().toString());
  27. }
  28. return sb.toString();
  29. }
  30. }
  31.  
  32. @XmlJavaTypeAdapter(StorageMapAdapter.class)
  33. @XmlAccessorType(XmlAccessType.FIELD)
  34. class Storage {
  35.  
  36. @XmlAttribute(name = "id")
  37. private String id;
  38.  
  39. /**
  40. * K: repository.id V: Repository
  41. */
  42. @XmlElement(name = "repositories")
  43. @XmlJavaTypeAdapter(RepositoryMapAdapter.class)
  44. private final Map<String, Repository> repositories = new LinkedHashMap<String, Repository>();
  45.  
  46. public String getId() {
  47. return id;
  48. }
  49.  
  50. @Override
  51. public String toString() {
  52. StringBuilder sb = new StringBuilder();
  53. sb.append("* storage id: " + id + "\n");
  54. for (Map.Entry<String, Repository> r : repositories.entrySet()) {
  55. sb.append(r.getValue().toString());
  56. }
  57. return sb.toString();
  58. }
  59. }
  60.  
  61. class StorageMap {
  62. @XmlElement(name = "storage")
  63. List<Storage> entries = new ArrayList<Storage>();
  64.  
  65. public List<Storage> getEntries() {
  66. return entries;
  67. }
  68. }
  69.  
  70.  
  71. class RepositoryMapAdapter extends XmlAdapter<RepositoryMap, Map<String, Repository>> {
  72.  
  73. @Override
  74. public RepositoryMap marshal(Map<String, Repository> map) throws Exception {
  75. RepositoryMap repositoryMap = new RepositoryMap();
  76. for (Map.Entry<String, Repository> entry : map.entrySet()) {
  77. repositoryMap.getEntries().add(entry.getValue());
  78. }
  79.  
  80. return repositoryMap;
  81. }
  82.  
  83. @Override
  84. public Map<String, Repository> unmarshal(RepositoryMap repositoryMap) throws Exception {
  85. List<Repository> adaptedEntries = repositoryMap.entries;
  86. Map<String, Repository> map = new LinkedHashMap<String, Repository>(adaptedEntries.size());
  87. for (Repository repository : adaptedEntries) {
  88. System.out.println("Reading repository " + repository.getId());
  89. map.put(repository.getId(), repository);
  90. }
  91.  
  92. return map;
  93. }
  94. }
  95.  
  96. class RepositoryMap {
  97. @XmlElement(name = "repository")
  98. List<Repository> entries = new ArrayList<Repository>();
  99.  
  100. public List<Repository> getEntries() {
  101. return entries;
  102. }
  103.  
  104. }
  105.  
  106. class StorageMapAdapter extends XmlAdapter<StorageMap, Map<String, Storage>> {
  107.  
  108. @Override
  109. public StorageMap marshal(Map<String, Storage> map) throws Exception {
  110. StorageMap storageMap = new StorageMap();
  111. for (Map.Entry<String, Storage> entry : map.entrySet()) {
  112. storageMap.getEntries().add(entry.getValue());
  113. }
  114. return storageMap;
  115. }
  116.  
  117. @Override
  118. public Map<String, Storage> unmarshal(StorageMap storageMap) throws Exception {
  119. List<Storage> adaptedEntries = storageMap.entries;
  120. Map<String, Storage> map = new LinkedHashMap<String, Storage>(adaptedEntries.size());
  121. for (Storage storage : adaptedEntries) {
  122. map.put(storage.getId(), storage);
  123. }
  124. return map;
  125. }
  126. }
  127.  
  128. @XmlRootElement(name = "repository")
  129. @XmlAccessorType(XmlAccessType.FIELD)
  130. class Repository {
  131. @XmlAttribute(name = "id")
  132. private String id;
  133.  
  134. @XmlAttribute(name = "policy")
  135. private String policy;
  136.  
  137. public String getId() {
  138. return id;
  139. }
  140.  
  141. @Override
  142. public String toString() {
  143. return "** repository id: " + id + "\n";
  144. }
  145. }
  146.  
  147. class Ideone {
  148. public static void main(String[] args) {
  149.  
  150. try {
  151. StringBuilder xml = new StringBuilder();
  152. xml.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?><datacenter><storages>")
  153. .append("<storage id=\"storage0\"><repositories>")
  154. .append("<repository id=\"repository1\" policy=\"policy1\"/>")
  155. .append("<repository id=\"repository2\" policy=\"policy2\"/>")
  156. .append("</repositories></storage><storage id=\"storage1\">")
  157. .append("<repositories><repository id=\"repository3\" />")
  158. .append("<repository id=\"repository4\" /></repositories>")
  159. .append("</storage></storages></datacenter>");
  160.  
  161. JAXBContext jaxbContext = JAXBContext.newInstance(DataCenter.class);
  162. Unmarshaller jaxbUnMarshaller = jaxbContext.createUnmarshaller();
  163.  
  164. DataCenter example = (DataCenter) jaxbUnMarshaller.unmarshal(
  165. new StreamSource(new StringReader( xml.toString())));
  166.  
  167. System.out.println(example.toString());
  168.  
  169. System.out.println("Marshalling back to xml");
  170. Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
  171. jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
  172. jaxbMarshaller.marshal(example, System.out);
  173.  
  174. } catch (JAXBException e) {
  175. e.printStackTrace();
  176. }
  177.  
  178. }
  179. }
  180.  
  181.  
  182.  
  183.  
Success #stdin #stdout 0.23s 381696KB
stdin
Standard input is empty
stdout
Reading repository repository1
Reading repository repository2
Reading repository repository3
Reading repository repository4
datacenter
* storage id: storage0
** repository id: repository1
** repository id: repository2
* storage id: storage1
** repository id: repository3
** repository id: repository4

Marshalling back to xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<datacenter>
    <storages>
        <storage id="storage0">
            <repositories>
                <repository id="repository1" policy="policy1"/>
                <repository id="repository2" policy="policy2"/>
            </repositories>
        </storage>
        <storage id="storage1">
            <repositories>
                <repository id="repository3"/>
                <repository id="repository4"/>
            </repositories>
        </storage>
    </storages>
</datacenter>