package org.eclipse.persistence.testing.jaxb.xmlelementref.nills; import java.util.Arrays; import java.util.Collections; import java.util.Iterator; import java.util.List; import javax.xml.bind.JAXBElement; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElementRef; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement public class Employee { @XmlElementRef(name = "address") public JAXBElement<Address> address; @XmlElementRef(name = "task") public List<JAXBElement<Task>> tasks; static class Task { @XmlAttribute Integer id; @Override public boolean equals(Object obj) { if (!(obj instanceof Task)) { return false; } Task t = (Task) obj; return t.id.equals(this.id); } } @Override public boolean equals(Object obj) { if (!(obj instanceof Employee)) { return false; } Employee e = (Employee) obj; if (!isEqual(e.address, this.address)) { return false; } if (e.tasks.size() == this.tasks.size()) { Iterator<JAXBElement<Task>> i = this.tasks.iterator(); Iterator<JAXBElement<Task>> j = e.tasks.iterator(); while (i.hasNext()) { if (!isEqual(i.next(), j.next())) { return false; } } } else { return false; } return true; } private boolean isEqual(JAXBElement<?> e1, JAXBElement<?> e2) { return e1.getName().equals(e2.getName()) && e1.getDeclaredType().equals(e2.getDeclaredType()) && (e1.isNil() == e2.isNil()) && e1.getValue().equals(e2.getValue()); } }