package org.eclipse.persistence.testing.jaxb; | |
import org.eclipse.persistence.platform.xml.XMLComparer; | |
import org.w3c.dom.Attr; | |
import org.w3c.dom.Document; | |
import org.w3c.dom.Element; | |
import org.w3c.dom.NamedNodeMap; | |
import org.w3c.dom.Node; | |
import org.w3c.dom.NodeList; | |
public class JAXBXMLComparer extends XMLComparer{ | |
public JAXBXMLComparer() { | |
super(); | |
} | |
/** | |
* Compares two XML documents which represent XML Schemas. Order of declarations should | |
* be ignored. | |
*/ | |
public boolean isSchemaEqual(Document control, Document test) { | |
Element controlRoot = control.getDocumentElement(); | |
Element testRoot = test.getDocumentElement(); | |
if(!(controlRoot.getChildNodes().getLength() == testRoot.getChildNodes().getLength())) { | |
return false; | |
} | |
//compare attributes: | |
NamedNodeMap controlAttributes = controlRoot.getAttributes(); | |
NamedNodeMap testAttributes = testRoot.getAttributes(); | |
int numberOfControlAttributes = controlAttributes.getLength(); | |
int numberOfTestAttributes = testAttributes.getLength(); | |
if (numberOfControlAttributes != numberOfTestAttributes) { | |
return false; | |
} | |
Attr controlAttribute; | |
Attr testAttribute; | |
for (int x = 0; x < numberOfControlAttributes; x++) { | |
controlAttribute = (Attr)controlAttributes.item(x); | |
if (null == controlAttribute.getNamespaceURI()) { | |
testAttribute = (Attr)testAttributes.getNamedItem(controlAttribute.getNodeName()); | |
} else { | |
testAttribute = (Attr)testAttributes.getNamedItemNS(controlAttribute.getNamespaceURI(), controlAttribute.getLocalName()); | |
} | |
if (null == testAttribute) { | |
return false; | |
} else if (!isAttributeEqual(controlAttribute, testAttribute)) { | |
return false; | |
} | |
} | |
//compare definitions ignoring order and text | |
NodeList controlChildren = controlRoot.getChildNodes(); | |
for(int i = 0; i < controlChildren.getLength(); i++) { | |
Node controlChild = controlChildren.item(i); | |
if(controlChild.getNodeType() == Node.TEXT_NODE) { | |
continue; | |
} | |
NamedNodeMap controlChildAttributes = controlChild.getAttributes(); | |
Node testChild = null; | |
//Find the equivalent node in the test children. | |
NodeList testChildren = testRoot.getElementsByTagNameNS(controlChild.getNamespaceURI(), controlChild.getLocalName()); | |
for(int j = 0; j < testChildren.getLength(); j++) { | |
Node next = testChildren.item(j); | |
NamedNodeMap testChildAttributes = next.getAttributes(); | |
numberOfControlAttributes = controlChildAttributes.getLength(); | |
numberOfTestAttributes = testChildAttributes.getLength(); | |
boolean equalAttributes = true; | |
if(numberOfControlAttributes != numberOfTestAttributes) { | |
equalAttributes = false; | |
} | |
for (int x = 0; x < numberOfControlAttributes; x++) { | |
controlAttribute = (Attr)controlChildAttributes.item(x); | |
if (null == controlAttribute.getNamespaceURI()) { | |
testAttribute = (Attr)testChildAttributes.getNamedItem(controlAttribute.getNodeName()); | |
} else { | |
testAttribute = (Attr)testChildAttributes.getNamedItemNS(controlAttribute.getNamespaceURI(), controlAttribute.getLocalName()); | |
} | |
if (testAttribute == null) { | |
equalAttributes = false; | |
} else if (!isAttributeEqual(controlAttribute, testAttribute)) { | |
equalAttributes = false; | |
} | |
} | |
if(equalAttributes) { | |
//if the attributes are all equal, then these are the same definition | |
testChild = next; | |
break; | |
} | |
} | |
if(testChild == null || !isNodeEqual(controlChild, testChild)) { | |
return false; | |
} | |
} | |
return true; | |
} | |
} |