blob: 464771a061d387253f2ac504fe673d18cd2da456 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.apache.vysper.xml.fragment;
import java.util.Comparator;
import java.util.List;
import java.util.TreeSet;
/**
*
* @author The Apache MINA Project (dev@mina.apache.org)
*/
public class EqualityVerifier {
private static AttributeComparator ATTRIBUTE_COMPARATOR = new AttributeComparator();
/**
* checks only name, namespace and attributes of both XMLElements for equality,
* but not inner elements
*/
public boolean equalsElements_Shallow(XMLElement first, XMLElement second) {
if (first == null)
return second == null;
if (second == null)
return false;
if (!first.getName().equals(second.getName()))
return false;
if (!first.getNamespacePrefix().equals(second.getNamespacePrefix()))
return false;
return equalsAttributes(first.getAttributes(), second.getAttributes());
}
/**
* additional to the shallow check, does check the inner elements. more precisely, it checks whether
* all inner elements at corresponding positions are equal. it does _not_ check whether inner elements
* are the same for some proper mutation.
*/
public boolean equalsElements_DeepSameOrder(XMLElement first, XMLElement second) {
if (first == null)
return second == null;
if (second == null)
return false;
if (!first.getName().equals(second.getName()))
return false;
if (!first.getNamespacePrefix().equals(second.getNamespacePrefix()))
return false;
boolean attrEquals = equalsAttributes(first.getAttributes(), second.getAttributes());
if (!attrEquals)
return false;
List<XMLElement> firstInnerElements = first.getInnerElements();
List<XMLElement> secondInnerElements = second.getInnerElements();
if (firstInnerElements.size() != secondInnerElements.size())
return false;
for (int i = 0; i < firstInnerElements.size(); i++) {
if (!equalsElements_DeepSameOrder(firstInnerElements.get(0), secondInnerElements.get(0)))
return false;
}
return true;
}
private boolean equalsAttributes(List<Attribute> firstAttrs, List<Attribute> secondAttrs) {
TreeSet<Attribute> attrSorted1 = new TreeSet<Attribute>(ATTRIBUTE_COMPARATOR);
attrSorted1.addAll(firstAttrs);
TreeSet<Attribute> attrSorted2 = new TreeSet<Attribute>(ATTRIBUTE_COMPARATOR);
attrSorted2.addAll(secondAttrs);
return attrSorted1.equals(attrSorted2);
}
static class AttributeComparator implements Comparator<Attribute> {
public int compare(Attribute attribute1, Attribute attribute2) {
if (attribute1.getName().equals(attribute2.getName())) {
return attribute1.getValue().compareTo(attribute2.getValue());
}
return attribute1.getName().compareTo(attribute2.getName());
}
}
}