blob: 03607d4337b20bd0b8604c5ea1f3dc296808f36d [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.tempuri.differenceEngine;
import org.custommonkey.xmlunit.ComparisonController;
import org.custommonkey.xmlunit.DifferenceEngine;
import org.custommonkey.xmlunit.DifferenceListener;
import org.w3c.dom.Attr;
import java.lang.reflect.Method;
/**
* This class extends the DifferenceEngine class to overwrite the methods that
* incorrectly fail Diff.similar() for certain equivalent but not identical
* XML file comparisons.
*/
public class WSDLDifferenceEngine extends DifferenceEngine {
/**
* Simple constructor
* @param controller the instance used to determine whether a Difference
* detected by this class should halt further comparison or not
* @see ComparisonController#haltComparison(Difference)
*/
public WSDLDifferenceEngine(ComparisonController controller) {
super(controller);
}
/**
* Compare two attributes to determine if they are equivalent
* @param control a known attribute against which a test attribute is being compared
* @param test the generated attribute that is being tested against a known attribute
* @param listener
* @throws DifferenceFoundException if there is a difference detected between
* the two attributes
*/
protected void compareAttribute(Attr control, Attr test,
DifferenceListener listener) throws DifferenceFoundException {
// There are no getter methods for these private fields in DifferenceEngine
// controlTracker.visited(control);
// testTracker.visited(test);
compare(control.getPrefix(), test.getPrefix(), control, test,
listener, NAMESPACE_PREFIX);
compare(getValueWithoutNamespace(control), getValueWithoutNamespace(test), control, test,
listener, ATTR_VALUE);
compare(getValueNamespaceURI(control), getValueNamespaceURI(test), control, test,
listener, ATTR_VALUE);
compare(control.getSpecified() ? Boolean.TRUE : Boolean.FALSE,
test.getSpecified() ? Boolean.TRUE : Boolean.FALSE,
control, test, listener, ATTR_VALUE_EXPLICITLY_SPECIFIED);
}
/**
* Obtain the value of this attribute with the namespace prefix removed (if present)
* @param attr the attribute for which the non namespaced value is sought
* @return the value of this attribute without a namespace prefix
*/
protected String getValueWithoutNamespace(Attr attr) {
String value = attr.getValue();
int index = value.indexOf(':');
int protocol = value.indexOf("://");
if (value == null)
return null;
if (index == -1 || index == protocol)
return value;
return value.substring(index + 1);
}
/**
* Obtain the namespace URI for the value of this attr (if a namespace prefix is present)
* @param attr the attribute for which the namespace URI of the value is sought
* @return the namespace URI of the attribute's value if a namespace prefix is
* present, otherwise return null
*/
protected String getValueNamespaceURI(Attr attr) {
String value = attr.getValue();
int index = value.indexOf(':');
int protocol = value.indexOf("://");
if (value == null || index == -1 || index == protocol)
return null;
try {
Method m = Attr.class.getMethod("lookupNamespaceURI", new Class[]{String.class});
return (String) m.invoke(attr, new Object[]{value.substring(0, index)});
} catch (Exception e) {
return null;
}
}
}