/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
import javax.xml.bind.annotation.*;
import javax.xml.bind.*;
import javax.xml.bind.annotation.adapters.*;
import javax.xml.transform.stream.*;
@XmlRootElement(name = "datacenter")
class DataCenter {
/**
* K: storageId V: storage
*/
@XmlElement(name = "storages")
@XmlJavaTypeAdapter(StorageMapAdapter.class)
private final Map
<String, Storage
> storages
= new LinkedHashMap
<String, Storage
>();
@Override
StringBuilder sb = new StringBuilder();
sb.append("datacenter\n");
for (Map.
Entry<String, Storage
> s
: storages.
entrySet()) { sb.append(s.getValue().toString());
}
return sb.toString();
}
}
@XmlJavaTypeAdapter(StorageMapAdapter.class)
@XmlAccessorType(XmlAccessType.FIELD)
class Storage {
@XmlAttribute(name = "id")
/**
* K: repository.id V: Repository
*/
@XmlElement(name = "repositories")
@XmlJavaTypeAdapter(RepositoryMapAdapter.class)
private final Map
<String, Repository
> repositories
= new LinkedHashMap
<String, Repository
>();
return id;
}
@Override
StringBuilder sb = new StringBuilder();
sb.append("* storage id: " + id + "\n");
for (Map.
Entry<String, Repository
> r
: repositories.
entrySet()) { sb.append(r.getValue().toString());
}
return sb.toString();
}
}
class StorageMap {
@XmlElement(name = "storage")
List<Storage> entries = new ArrayList<Storage>();
public List<Storage> getEntries() {
return entries;
}
}
class RepositoryMapAdapter
extends XmlAdapter
<RepositoryMap, Map
<String, Repository
>> {
@Override
public RepositoryMap marshal
(Map
<String, Repository
> map
) throws Exception { RepositoryMap repositoryMap = new RepositoryMap();
for (Map.
Entry<String, Repository
> entry
: map.
entrySet()) { // ...
}
return repositoryMap;
}
@Override
public Map
<String, Repository
> unmarshal
(RepositoryMap repositoryMap
) throws Exception { List<Repository> adaptedEntries = repositoryMap.entries;
Map
<String, Repository
> map
= new LinkedHashMap
<String, Repository
>(adaptedEntries.
size()); System.
out.
println("Reading repository " + repository.
getId()); map.put(repository.getId(), repository);
}
return map;
}
}
class RepositoryMap {
@XmlElement(name = "repository")
List<Repository> entries = new ArrayList<Repository>();
public List<Repository> getEntries() {
return entries;
}
}
class StorageMapAdapter
extends XmlAdapter
<StorageMap, Map
<String, Storage
>> {
@Override
StorageMap storageMap = new StorageMap();
for (Map.
Entry<String, Storage
> entry
: map.
entrySet()) { // ...
}
return storageMap;
}
@Override
public Map
<String, Storage
> unmarshal
(StorageMap storageMap
) throws Exception { List<Storage> adaptedEntries = storageMap.entries;
Map
<String, Storage
> map
= new LinkedHashMap
<String, Storage
>(adaptedEntries.
size()); for (Storage storage : adaptedEntries) {
map.put(storage.getId(), storage);
}
return map;
}
}
@XmlRootElement(name = "repository")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlAttribute(name = "id")
@XmlAttribute(name = "policy")
return id;
}
@Override
return "** repository id: " + id + "\n";
}
}
class Ideone {
public static void main
(String[] args
) {
try {
StringBuilder xml = new StringBuilder();
xml.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?><datacenter><storages>")
.append("<storage id=\"storage0\"><repositories>")
.append("<repository id=\"repository1\" policy=\"policy1\"/>")
.append("<repository id=\"repository2\" policy=\"policy2\"/>")
.append("</repositories></storage><storage id=\"storage1\">")
.append("<repositories><repository id=\"repository3\" />")
.append("<repository id=\"repository4\" /></repositories>")
.append("</storage></storages></datacenter>");
JAXBContext jaxbContext = JAXBContext.newInstance(DataCenter.class);
Unmarshaller jaxbMarshaller = jaxbContext.createUnmarshaller();
DataCenter example = (DataCenter) jaxbMarshaller.unmarshal(
System.
out.
println(example.
toString()); } catch (JAXBException e) {
e.printStackTrace();
}
}
}