blob: 6f2bd5faf9b315cef7ef50b7c27132071fc9d546 [file] [log] [blame]
package org.apache.ode.bpel.obj.migrate;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.ode.bpel.obj.DebugInfo;
import org.apache.ode.bpel.obj.ExtensibleImpl;
import org.apache.ode.bpel.obj.OProcess;
/**
* DeepEquality comparator for OModel classes. It will compare backed map recursively.
* @see DeepEqualityHelper
*/
public class ExtensibeImplEqualityComp implements EqualityComparator{
private static final Logger __log = LoggerFactory.getLogger(ExtensibeImplEqualityComp.class);
private DeepEqualityHelper deepEquality;
public ExtensibeImplEqualityComp() {
}
@Override
public Boolean objectsEqual(Object obj1, Object obj2) {
if (obj2 == null) {
if (!deepEquality.logFalseThrough){
__log.debug("Unequal in ExtensibleImpl: Object2 is null. " +
deepEquality.getSt());
}
return false;
}
ExtensibleImpl esi = (ExtensibleImpl)obj1;
ExtensibleImpl esio = null;
if (obj1.getClass() != obj2.getClass()){
if (!deepEquality.logFalseThrough){
__log.debug("Unequal in ExtensibleImpl: Type mismatch. " + deepEquality.getSt() +
"\nmismatched type: " + obj1.getClass().getSimpleName() +
" and " + obj2.getClass().getSimpleName());
}
return false;
}
try{
esio = (ExtensibleImpl)obj2;
}catch(ClassCastException e){
//won't get here
return false;
}
if (obj1 instanceof DebugInfo){
boolean r = obj1.equals(obj2);
if (!r){
if(!deepEquality.logFalseThrough){
__log.debug("Unequal in ExtensibleImpl: DebugInfo unequal." + deepEquality.getSt());
}
}
return r;
}
Map m1 = new LinkedHashMap(esi.getFieldContainer());
Map m2 = new LinkedHashMap(esio.getFieldContainer());
dehydrate(m1);
dehydrate(m2);
if (obj1 instanceof OProcess){
dehydrateOProcess(m1);
dehydrateOProcess(m2);
}
return (Boolean) deepEquality.deepEquals(m1, m2);
}
private void dehydrateOProcess(Map m) {
m.remove("compileDate");
m.remove("namespaceContext");
}
@SuppressWarnings("rawtypes")
private void dehydrate(Map map) {
if (map == null) return;
map.remove("originalVersion");
Set<Entry> entries = map.entrySet();
Iterator<Entry> itor = entries.iterator();
while (itor.hasNext()){
Entry entry = itor.next();
if (entry.getValue() == null){
itor.remove();
}
}
}
@Override
public Boolean canHanle(Object obj) {
return obj instanceof ExtensibleImpl;
}
@Override
public void setDeepEquality(DeepEqualityHelper deepEquality) {
this.deepEquality = deepEquality;
}
}