package org.apache.ode.bpel.obj.migrate;

import java.io.StringWriter;

import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.ls.DOMImplementationLS;
import org.w3c.dom.ls.LSSerializer;

/**
 * DeepEqual of two DomElement.
 * @see DeepEqualityHelper
 */
public class DomElementComparator implements EqualityComparator{
    private static final Log __log = LogFactory.getLog(DomElementComparator.class);
	private DeepEqualityHelper deepEquality;
	@Override
	public Boolean objectsEqual(Object obj1, Object obj2) {
		if (obj1 == obj2) return true;
		if (!(obj2 instanceof Element)){
			if (!deepEquality.logFalseThrough){
				__log.debug("Unequal in Dom Element: Type mismatch. " + deepEquality.getSt()
						+ "Object2 has type " + obj2.getClass());
			}
			return false;
		}
		try{
			String str1 = Element2String((Element)obj1);
			String str2 = Element2String((Element)obj2);
			boolean e =  str1.equals(str2);
		if (!e){
			if (!deepEquality.logFalseThrough){
				__log.debug("Unequal in Dom Element: " + deepEquality.getSt() + 
					"\n" + str1 + "\nand\n " + str2);
			}
		}
		return e;
		}catch(Exception e){
			if (!deepEquality.logFalseThrough){
				__log.debug("Unequal in Dom Element: Exception when comparing. " + 
						deepEquality.getSt() + e);
			}
			return false;
		}
	}

	public String Element2String(Element node){
		Document document = node.getOwnerDocument();
		DOMImplementationLS domImplLS = (DOMImplementationLS) document
		    .getImplementation();
		LSSerializer serializer = domImplLS.createLSSerializer();
		String str = serializer.writeToString(node);
		serializer .getDomConfig().setParameter("xml-declaration", false);
		return str;
	}
	/**
	 * Another option
	 */
	public String Element2String2(Element obj1) throws TransformerException{
		TransformerFactory transFactory = TransformerFactory.newInstance();
		Transformer transformer = transFactory.newTransformer();
		StringWriter buffer = new StringWriter();
		transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
		transformer.transform(new DOMSource(obj1),
		      new StreamResult(buffer));
		String str = buffer.toString();	
		return str;
	}
	@Override
	public Boolean canHanle(Object obj) {
		return obj instanceof Element;
	}

	public DeepEqualityHelper getDeepEquality() {
		return deepEquality;
	}
	
	@Override
	public void setDeepEquality(DeepEqualityHelper deepEquality) {
		this.deepEquality = deepEquality;
	}

}
