import javax.xml.bind.*;
import javax.xml.bind.annotation.*;
import javax.xml.bind.annotation.adapters.*;
import java.io.*;
import java.util.*;
@XmlRootElement(name="myroot")
@XmlAccessorType(XmlAccessType.NONE)
class SO19509130a {
@XmlAttribute
public String getId
() { return id
; } public void setId
(String id
) { this.
id = id
; }
@XmlElement
@XmlJavaTypeAdapter(SO19509130a.PropertiesAdapter.class)
public Properties getProperties
() { return props
; } public void setProperties
(Properties props
) { this.
props.
putAll(props
); }
@XmlType(name="property") static class XmlProperty {
@XmlAttribute
public String key
; @XmlValue
public String value
; }
@XmlType(name="properties") static class XmlProperties {
@XmlElement(name="entry") public Collection<XmlProperty> entries
= new ArrayList<XmlProperty>();
}
static class PropertiesAdapter
extends XmlAdapter<XmlProperties, Properties>
{
XmlProperties xml = new XmlProperties();
for (Map.
Entry<Object, Object
> entry
: props.
entrySet()) { XmlProperty xmlEntry = new XmlProperty();
xmlEntry.key = entry.getKey().toString();
xmlEntry.value = entry.getValue().toString();
xml.entries.add(xmlEntry);
}
return xml;
}
for (XmlProperty entry: xml.entries)
props.setProperty(entry.key, entry.value);
return props;
}
}
SO19509130a obj = new SO19509130a();
obj.id = "theID";
obj.props.setProperty("key1", "val1");
obj.props.setProperty("key2", "val2");
JAXBContext ctx = JAXBContext.newInstance(SO19509130a.class);
Marshaller m = ctx.createMarshaller();
Unmarshaller u = ctx.createUnmarshaller();
m.marshal(obj, baos);
obj = (SO19509130a)u.unmarshal(bais);
}
}
aW1wb3J0IGphdmF4LnhtbC5iaW5kLio7CmltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLio7CmltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzLio7CmltcG9ydCBqYXZhLmlvLio7CmltcG9ydCBqYXZhLnV0aWwuKjsKCkBYbWxSb290RWxlbWVudChuYW1lPSJteXJvb3QiKQpAWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuTk9ORSkKY2xhc3MgU08xOTUwOTEzMGEgewoKICAgIHByaXZhdGUgU3RyaW5nIGlkOwogICAgcHJpdmF0ZSBQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKCiAgICBAWG1sQXR0cmlidXRlIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7IHJldHVybiBpZDsgfQogICAgcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIGlkKSB7IHRoaXMuaWQgPSBpZDsgfQoKICAgIEBYbWxFbGVtZW50CiAgICBAWG1sSmF2YVR5cGVBZGFwdGVyKFNPMTk1MDkxMzBhLlByb3BlcnRpZXNBZGFwdGVyLmNsYXNzKQogICAgcHVibGljIFByb3BlcnRpZXMgZ2V0UHJvcGVydGllcygpIHsgcmV0dXJuIHByb3BzOyB9CiAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0aWVzKFByb3BlcnRpZXMgcHJvcHMpIHsgdGhpcy5wcm9wcy5wdXRBbGwocHJvcHMpOyB9CgogICAgQFhtbFR5cGUobmFtZT0icHJvcGVydHkiKSBzdGF0aWMgY2xhc3MgWG1sUHJvcGVydHkgewogICAgICAgIEBYbWxBdHRyaWJ1dGUgcHVibGljIFN0cmluZyBrZXk7CiAgICAgICAgQFhtbFZhbHVlIHB1YmxpYyBTdHJpbmcgdmFsdWU7CiAgICB9CgogICAgQFhtbFR5cGUobmFtZT0icHJvcGVydGllcyIpIHN0YXRpYyBjbGFzcyBYbWxQcm9wZXJ0aWVzIHsKICAgICAgICBAWG1sRWxlbWVudChuYW1lPSJlbnRyeSIpIHB1YmxpYyBDb2xsZWN0aW9uPFhtbFByb3BlcnR5PiBlbnRyaWVzCiAgICAgICAgICAgID0gbmV3IEFycmF5TGlzdDxYbWxQcm9wZXJ0eT4oKTsKICAgIH0KCiAgICBzdGF0aWMgY2xhc3MgUHJvcGVydGllc0FkYXB0ZXIKICAgICAgICBleHRlbmRzIFhtbEFkYXB0ZXI8WG1sUHJvcGVydGllcywgUHJvcGVydGllcz4KICAgIHsKICAgICAgICBwdWJsaWMgWG1sUHJvcGVydGllcyBtYXJzaGFsKFByb3BlcnRpZXMgcHJvcHMpIHsKICAgICAgICAgICAgWG1sUHJvcGVydGllcyB4bWwgPSBuZXcgWG1sUHJvcGVydGllcygpOwogICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxPYmplY3QsIE9iamVjdD4gZW50cnk6IHByb3BzLmVudHJ5U2V0KCkpIHsKICAgICAgICAgICAgICAgIFhtbFByb3BlcnR5IHhtbEVudHJ5ID0gbmV3IFhtbFByb3BlcnR5KCk7CiAgICAgICAgICAgICAgICB4bWxFbnRyeS5rZXkgPSBlbnRyeS5nZXRLZXkoKS50b1N0cmluZygpOwogICAgICAgICAgICAgICAgeG1sRW50cnkudmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpLnRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgICB4bWwuZW50cmllcy5hZGQoeG1sRW50cnkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB4bWw7CiAgICAgICAgfQogICAgICAgIHB1YmxpYyBQcm9wZXJ0aWVzIHVubWFyc2hhbChYbWxQcm9wZXJ0aWVzIHhtbCkgewogICAgICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKICAgICAgICAgICAgZm9yIChYbWxQcm9wZXJ0eSBlbnRyeTogeG1sLmVudHJpZXMpCiAgICAgICAgICAgICAgICBwcm9wcy5zZXRQcm9wZXJ0eShlbnRyeS5rZXksIGVudHJ5LnZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIHByb3BzOwogICAgICAgIH0KICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICBTTzE5NTA5MTMwYSBvYmogPSBuZXcgU08xOTUwOTEzMGEoKTsKICAgICAgICBvYmouaWQgPSAidGhlSUQiOwogICAgICAgIG9iai5wcm9wcy5zZXRQcm9wZXJ0eSgia2V5MSIsICJ2YWwxIik7CiAgICAgICAgb2JqLnByb3BzLnNldFByb3BlcnR5KCJrZXkyIiwgInZhbDIiKTsKICAgICAgICBKQVhCQ29udGV4dCBjdHggPSBKQVhCQ29udGV4dC5uZXdJbnN0YW5jZShTTzE5NTA5MTMwYS5jbGFzcyk7CiAgICAgICAgTWFyc2hhbGxlciBtID0gY3R4LmNyZWF0ZU1hcnNoYWxsZXIoKTsKICAgICAgICBVbm1hcnNoYWxsZXIgdSA9IGN0eC5jcmVhdGVVbm1hcnNoYWxsZXIoKTsKICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICAgICBtLm1hcnNoYWwob2JqLCBiYW9zKTsKICAgICAgICBJbnB1dFN0cmVhbSBiYWlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSk7CiAgICAgICAgb2JqID0gKFNPMTk1MDkxMzBhKXUudW5tYXJzaGFsKGJhaXMpOwogICAgICAgIG0ubWFyc2hhbChvYmosIFN5c3RlbS5vdXQpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwogICAgfQp9Cg==