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