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 SO19509130d {
private String id;
private Properties props = new Properties();
@XmlAttribute public String getId() { return id; }
public void setId(String id) { this.id = id; }
@XmlElement(name="property")
public Collection<XmlProperty> getProperties() {
return new XmlProperties(props);
}
@XmlType(name="property") static class XmlProperty {
@XmlAttribute public String key;
@XmlValue public String value;
}
static class XmlProperties extends AbstractCollection<XmlProperty> {
private final Properties props;
public XmlProperties(Properties props) { this.props = props; }
public int size() { return props.size(); }
public Iterator<XmlProperty> iterator() {
return new XmlPropertyIterator(props.entrySet().iterator());
}
public boolean add(XmlProperty xml) {
return !xml.value.equals(props.setProperty(xml.key, xml.value));
}
}
static class XmlPropertyIterator implements Iterator<XmlProperty> {
private final Iterator<Map.Entry<Object, Object>> base;
public XmlPropertyIterator(Iterator<Map.Entry<Object, Object>> base) {
this.base = base;
}
public boolean hasNext() { return base.hasNext(); }
public void remove() { base.remove(); }
public XmlProperty next() {
Map.Entry<?, ?> entry = base.next();
XmlProperty xml = new XmlProperty();
xml.key = entry.getKey().toString();
xml.value = entry.getValue().toString();
return xml;
}
}
public static void main(String[] args) throws Exception {
SO19509130d obj = new SO19509130d();
obj.id = "theID";
obj.props.setProperty("key1", "val1");
obj.props.setProperty("key2", "val2");
JAXBContext ctx = JAXBContext.newInstance(SO19509130d.class);
Marshaller m = ctx.createMarshaller();
Unmarshaller u = ctx.createUnmarshaller();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
m.marshal(obj, baos);
InputStream bais = new ByteArrayInputStream(baos.toByteArray());
obj = (SO19509130d)u.unmarshal(bais);
m.marshal(obj, System.out);
System.out.println();
}
}
aW1wb3J0IGphdmF4LnhtbC5iaW5kLio7CmltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLio7CmltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzLio7CmltcG9ydCBqYXZhLmlvLio7CmltcG9ydCBqYXZhLnV0aWwuKjsKCkBYbWxSb290RWxlbWVudChuYW1lPSJteXJvb3QiKQpAWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuTk9ORSkKY2xhc3MgU08xOTUwOTEzMGQgewoKICAgIHByaXZhdGUgU3RyaW5nIGlkOwogICAgcHJpdmF0ZSBQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKCiAgICBAWG1sQXR0cmlidXRlIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7IHJldHVybiBpZDsgfQogICAgcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIGlkKSB7IHRoaXMuaWQgPSBpZDsgfQoKICAgIEBYbWxFbGVtZW50KG5hbWU9InByb3BlcnR5IikKICAgIHB1YmxpYyBDb2xsZWN0aW9uPFhtbFByb3BlcnR5PiBnZXRQcm9wZXJ0aWVzKCkgewogICAgICAgIHJldHVybiBuZXcgWG1sUHJvcGVydGllcyhwcm9wcyk7CiAgICB9CgogICAgQFhtbFR5cGUobmFtZT0icHJvcGVydHkiKSBzdGF0aWMgY2xhc3MgWG1sUHJvcGVydHkgewogICAgICAgIEBYbWxBdHRyaWJ1dGUgcHVibGljIFN0cmluZyBrZXk7CiAgICAgICAgQFhtbFZhbHVlIHB1YmxpYyBTdHJpbmcgdmFsdWU7CiAgICB9CgogICAgc3RhdGljIGNsYXNzIFhtbFByb3BlcnRpZXMgZXh0ZW5kcyBBYnN0cmFjdENvbGxlY3Rpb248WG1sUHJvcGVydHk+IHsKICAgICAgICBwcml2YXRlIGZpbmFsIFByb3BlcnRpZXMgcHJvcHM7CiAgICAgICAgcHVibGljIFhtbFByb3BlcnRpZXMoUHJvcGVydGllcyBwcm9wcykgeyB0aGlzLnByb3BzID0gcHJvcHM7IH0KICAgICAgICBwdWJsaWMgaW50IHNpemUoKSB7IHJldHVybiBwcm9wcy5zaXplKCk7IH0KICAgICAgICBwdWJsaWMgSXRlcmF0b3I8WG1sUHJvcGVydHk+IGl0ZXJhdG9yKCkgewogICAgICAgICAgICByZXR1cm4gbmV3IFhtbFByb3BlcnR5SXRlcmF0b3IocHJvcHMuZW50cnlTZXQoKS5pdGVyYXRvcigpKTsKICAgICAgICB9CiAgICAgICAgcHVibGljIGJvb2xlYW4gYWRkKFhtbFByb3BlcnR5IHhtbCkgewogICAgICAgICAgICByZXR1cm4gIXhtbC52YWx1ZS5lcXVhbHMocHJvcHMuc2V0UHJvcGVydHkoeG1sLmtleSwgeG1sLnZhbHVlKSk7CiAgICAgICAgfQogICAgfQoKICAgIHN0YXRpYyBjbGFzcyBYbWxQcm9wZXJ0eUl0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3I8WG1sUHJvcGVydHk+IHsKICAgICAgICBwcml2YXRlIGZpbmFsIEl0ZXJhdG9yPE1hcC5FbnRyeTxPYmplY3QsIE9iamVjdD4+IGJhc2U7CiAgICAgICAgcHVibGljIFhtbFByb3BlcnR5SXRlcmF0b3IoSXRlcmF0b3I8TWFwLkVudHJ5PE9iamVjdCwgT2JqZWN0Pj4gYmFzZSkgewogICAgICAgICAgICB0aGlzLmJhc2UgPSBiYXNlOwogICAgICAgIH0KICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgeyByZXR1cm4gYmFzZS5oYXNOZXh0KCk7IH0KICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7IGJhc2UucmVtb3ZlKCk7IH0KICAgICAgICBwdWJsaWMgWG1sUHJvcGVydHkgbmV4dCgpIHsKICAgICAgICAgICAgTWFwLkVudHJ5PD8sID8+IGVudHJ5ID0gYmFzZS5uZXh0KCk7CiAgICAgICAgICAgIFhtbFByb3BlcnR5IHhtbCA9IG5ldyBYbWxQcm9wZXJ0eSgpOwogICAgICAgICAgICB4bWwua2V5ID0gZW50cnkuZ2V0S2V5KCkudG9TdHJpbmcoKTsKICAgICAgICAgICAgeG1sLnZhbHVlID0gZW50cnkuZ2V0VmFsdWUoKS50b1N0cmluZygpOwogICAgICAgICAgICByZXR1cm4geG1sOwogICAgICAgIH0KICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICBTTzE5NTA5MTMwZCBvYmogPSBuZXcgU08xOTUwOTEzMGQoKTsKICAgICAgICBvYmouaWQgPSAidGhlSUQiOwogICAgICAgIG9iai5wcm9wcy5zZXRQcm9wZXJ0eSgia2V5MSIsICJ2YWwxIik7CiAgICAgICAgb2JqLnByb3BzLnNldFByb3BlcnR5KCJrZXkyIiwgInZhbDIiKTsKICAgICAgICBKQVhCQ29udGV4dCBjdHggPSBKQVhCQ29udGV4dC5uZXdJbnN0YW5jZShTTzE5NTA5MTMwZC5jbGFzcyk7CiAgICAgICAgTWFyc2hhbGxlciBtID0gY3R4LmNyZWF0ZU1hcnNoYWxsZXIoKTsKICAgICAgICBVbm1hcnNoYWxsZXIgdSA9IGN0eC5jcmVhdGVVbm1hcnNoYWxsZXIoKTsKICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICAgICBtLm1hcnNoYWwob2JqLCBiYW9zKTsKICAgICAgICBJbnB1dFN0cmVhbSBiYWlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSk7CiAgICAgICAgb2JqID0gKFNPMTk1MDkxMzBkKXUudW5tYXJzaGFsKGJhaXMpOwogICAgICAgIG0ubWFyc2hhbChvYmosIFN5c3RlbS5vdXQpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwogICAgfQp9Cg==