blob: 7cbf1a198c74d6ce8816e361d70d1fdcf30febfc [file] [log] [blame]
/* Copyright 2004 The Apache Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package dom.common;
import org.w3c.dom.Attr;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class DomUtils{
/**
* @return true if sets are the same
*/
public static boolean compareNamedNodeMaps(NamedNodeMap atrSet1,NamedNodeMap atrSet2){
if (atrSet1==null)
if (atrSet2==null) return true;
else return false;
else if (atrSet2==null) return false;
int nLen1=atrSet1.getLength();
Attr at1,
at2;
if (nLen1!=atrSet2.getLength())
return false;
for (int i=0;i<nLen1;i++){
at1=(Attr)atrSet1.item(i);
at2=(Attr)atrSet2.getNamedItem(at1.getName());
if (at2==null) return false;
else if (!
(at1.getNodeName().equals(at2.getNodeName())) &&
(at1.getNamespaceURI().equals(at2.getNamespaceURI())) &&
(at1.getValue().equals(at2.getValue()))
)
return false;
else if (at1==at2) return false;
}
return true;
}
/**
* node is a copy
* children are the same obj
*/
public static boolean compareNodesShallow(Node n1,Node n2){
return (
n1.getNodeName().equals(n2.getNodeName()) &&
n1.getNamespaceURI().equals(n2.getNamespaceURI()) &&
n1.getPrefix().equals( n2.getPrefix()) &&
compareNamedNodeMaps(n1.getAttributes(),n2.getAttributes())
// cloned nodes never have children
// && compareNodeTreePtr(n1.getChildNodes(),n2.getChildNodes())
);
}
//equates "" to null
private static boolean compareNull(String pre1, String pre2){
if (pre1==null && pre2==null)return true;
if (pre1==null && pre2.equals(""))return true;
if (pre1.equals("") && pre2==null)return true;
else return pre1.equals(pre2) ;
}
/**
* node is a copy
* children copies
*/
public static boolean compareNodesDeep(Node n1,Node n2) throws IllegalStateException{
if( n1==n2 && n1==null) return true;
if (n1==null && n2!=null || n2==null && n1!=null)return false;
if (! (n1.getNodeName().equals(n2.getNodeName()) &&
compareNull(n1.getNamespaceURI(),n2.getNamespaceURI()) &&
compareNull(n1.getPrefix(), n2.getPrefix()) )
)
throw new IllegalStateException("Diff QNames "+n1.getNamespaceURI()+" * "+n1.getPrefix()+":"+n1.getNodeName()+
"AND "+n2.getNamespaceURI()+" * "+n2.getPrefix()+":"+n2.getNodeName());
else if ( !compareNamedNodeMaps(n1.getAttributes(),n2.getAttributes()) )
throw new IllegalStateException("Diff Attrs "+n1.getAttributes().getLength()+
"AND "+n2.getAttributes().getLength());
else if (n1.hasChildNodes() //Xerces attr quirk
&& n2.hasChildNodes() ){
if (! compareNodeTreeValue(n1.getChildNodes(),n2.getChildNodes()) )
throw new IllegalStateException("Diff Children "+n1.getNodeName()+
"AND "+n2.getNodeName());
}
else if (n1.hasChildNodes() //Xerces attr quirk
^ n2.hasChildNodes() )
throw new IllegalStateException("One node has Children, other one not ");
return true;
}
/** the two node lists really are the same list*/
public static boolean compareNodeTreePtr(NodeList lst1,NodeList lst2){
if (lst1.getLength()!=lst2.getLength())
return false;
for (int i=0;i<lst1.getLength();i++){
if (lst1.item(i)!=lst2.item(i))
return false;
}
return true;
}
public static boolean compareNodeTreeValue(NodeList lst1,NodeList lst2){
if (lst1.getLength()!=lst2.getLength())
return false;
boolean result=true;
for (int i=0;i<lst1.getLength();i++){
result=result&&compareNodesDeep(lst1.item(i),
lst2.item(i));
}
return result;
}
}