package com.temenos.interaction.media.odata.xml.atom;
/*
* #%L
* interaction-media-odata-xml
* %%
* Copyright (C) 2012 - 2014 Temenos Holdings N.V.
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
* #L%
*/
import org.custommonkey.xmlunit.Difference;
import org.custommonkey.xmlunit.DifferenceListener;
import org.w3c.dom.Node;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* NB - credit to http://ayazanwar.wordpress.com/2012/09/23/xmlunit-ignoring-certain-pieces-of-xml-during-xml-comparison-using-regular-expression/
* This is a custom listener class used to ignore differences between expected
* and generated xmls based on regular expression.
*/
public class RegexBasedDifferenceListener implements DifferenceListener {
/**
* list of regex expressions used to ignore differences found between
* expected and generated xmls.
*/
private final List<Pattern> ignorableRegexPatters;
public RegexBasedDifferenceListener(final List<String> ignorableXPathsRegex) {
this.ignorableRegexPatters = compileXpathExpressions(ignorableXPathsRegex);
}
/**
* compile all regular expressions once.
*
* @param ignorableXPathsRegex
* list of regular expressions for ignorable xpath locations.
* @return list of compiled regular expressions.
*/
private List<Pattern> compileXpathExpressions(
final List<String> ignorableXPathsRegex) {
final List<Pattern> compiledRegexList = new ArrayList<Pattern>();
Iterator<String> it = ignorableXPathsRegex.iterator();
while (it.hasNext()) {
final Pattern pattern = Pattern.compile(it.next().toString());
compiledRegexList.add(pattern);
}
return compiledRegexList;
}
/**
* On each difference this method is called by XMLUnit framework to
* determine whether we accept the difference or ignore it. If any of the
* provided regular expression match with xml xpath location at which
* difference found then ignore the difference.
*
* @param difference
* contains information about differences.
*/
public int differenceFound(Difference difference) {
Iterator<Pattern> it = this.ignorableRegexPatters.iterator();
final String xpathLocation = difference.getTestNodeDetail()
.getXpathLocation();
while (it.hasNext()) {
final Pattern pattern = it.next();
final Matcher m = pattern.matcher(xpathLocation);
if (m.find()) {
return DifferenceListener.RETURN_IGNORE_DIFFERENCE_NODES_IDENTICAL;
/** ignore it, not a valid difference */
}
}
return DifferenceListener.RETURN_ACCEPT_DIFFERENCE;
/** no objection, mark it as a valid difference */
}
/**
* This method is here just b/c it exist in DifferenceListener interface.
* So, needs dummy implementation. We actually do not need to implement it
* for current scenario.
*/
public void skippedComparison(Node node, Node node1) {
}
}