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; } }