| 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.slf4j.Logger; |
| import org.slf4j.LoggerFactory; |
| 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 Logger __log = LoggerFactory.getLogger(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; |
| } |
| |
| } |