package org.jvnet.jaxb2_commons.lang;
import static org.jvnet.jaxb2_commons.locator.util.LocatorUtils.item;
import static org.jvnet.jaxb2_commons.locator.util.LocatorUtils.property;
import java.util.Iterator;
import java.util.List;
import javax.xml.bind.JAXBElement;
import org.jvnet.jaxb2_commons.locator.ObjectLocator;
public class JAXBEqualsStrategy extends DefaultEqualsStrategy {
@Override
protected boolean equalsInternal(ObjectLocator leftLocator,
ObjectLocator rightLocator, Object lhs, Object rhs) {
if (lhs instanceof JAXBElement<?> && rhs instanceof JAXBElement<?>) {
final JAXBElement<?> left = (JAXBElement<?>) lhs;
final JAXBElement<?> right = (JAXBElement<?>) rhs;
return equalsInternal(leftLocator, rightLocator, left, right);
} else if (lhs instanceof List<?> && rhs instanceof List<?>) {
final List<?> left = (List<?>) lhs;
final List<?> right = (List<?>) rhs;
return equalsInternal(leftLocator, rightLocator, left, right);
} else {
return super.equalsInternal(leftLocator, rightLocator, lhs, rhs);
}
}
protected boolean equalsInternal(ObjectLocator leftLocator,
ObjectLocator rightLocator, final List<?> left, final List<?> right) {
final Iterator<?> e1 = left.iterator();
final Iterator<?> e2 = right.iterator();
int index = 0;
while (e1.hasNext() && e2.hasNext()) {
Object o1 = e1.next();
Object o2 = e2.next();
if (!(o1 == null ? o2 == null : equals(
item(leftLocator, index, o1), item(rightLocator, index,
o2), o1, o2))) {
return false;
}
index = index + 1;
}
return !(e1.hasNext() || e2.hasNext());
}
protected boolean equalsInternal(ObjectLocator leftLocator,
ObjectLocator rightLocator, final JAXBElement<?> left,
final JAXBElement<?> right) {
return
//
equals(property(leftLocator, "name", left.getName()), property(rightLocator,
"name", right.getName()), left.getName(), right.getName())
&&
//
equals(property(leftLocator, "value", left.getValue()), property(
rightLocator, "name", right.getValue()), left
.getValue(), right.getValue());
}
public static EqualsStrategy INSTANCE = new JAXBEqualsStrategy();
}