package org.geotools.csw;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.util.FeatureMap;
public class EMFUtils {
public static boolean emfEquals(EObject e1, EObject e2) {
if(e1 == e2) {
return true;
} else if(!e1.eClass().equals(e2.eClass())) {
return false;
}
for (EStructuralFeature sf : e1.eClass().getEAllStructuralFeatures()) {
Object o1 = e1.eGet(sf);
Object o2 = e2.eGet(sf);
if(o1 instanceof FeatureMap) {
// this is just extra stuff that EMF adds when there is a substitution group
continue;
}
boolean equals = objectEquals(o1, o2);
if(!equals) {
System.out.println("Comparison failed on " + sf + " o1 has " + o1 + " while o2 has " + o2);
return false;
}
}
return true;
}
private static boolean objectEquals(Object o1, Object o2) {
boolean equals = true;
if(o1 == null && o2 != null || o1 != null && o2 == null) {
equals = false;
} else if(o1 instanceof EObject) {
if(!emfEquals((EObject) o1, (EObject) o2)) {
equals = false;
}
} else if(o1 instanceof EList) {
EList l1 = (EList) o1;
EList l2 = (EList) o2;
if(l1.size() != l2.size()) {
System.out.println("The two lists do not have the same size, e1 has " + l1.size() + " while o2 has " + l2.size());
equals = false;
} else {
for (int i = 0; i < l1.size() && equals; i++) {
Object li1 = l1.get(i);
Object li2 = l2.get(i);
equals = objectEquals(li1, li2);
}
}
} else if(o1 == null) {
if(o2 != null) {
equals = false;
}
} else {
equals = o1.equals(o2);
}
return equals;
}
}