/** * The contents of this file are subject to the license and copyright * detailed in the LICENSE and NOTICE files at the root of the source * tree and available online at * * http://www.dspace.org/license/ */ package org.dspace.xoai.tests.support; import org.hamcrest.Description; import org.hamcrest.Matcher; import org.hamcrest.TypeSafeMatcher; import org.xmlmatchers.XmlMatchers; import org.xmlmatchers.transform.StringSource; import javax.xml.namespace.NamespaceContext; import java.util.*; public class XmlMatcherBuilder extends MatcherBuilder<XmlMatcherBuilder, String> { public static XmlMatcherBuilder xml () { return new XmlMatcherBuilder(); } private Namespaces namespaces = new Namespaces(); public XmlMatcherBuilder() { with(new TypeSafeMatcher<String>() { @Override protected boolean matchesSafely(String item) { try { StringSource.toSource(item); return true; } catch (Exception e) { e.printStackTrace(); return false; } } @Override public void describeTo(Description description) { description.appendText("is valid XML"); } }); } public XmlMatcherBuilder withXPath(final String xPath) { return with(new TypeSafeMatcher<String>() { @Override protected boolean matchesSafely(String item) { return XmlMatchers.hasXPath(xPath, namespaces).matches(StringSource.toSource(item)); } @Override public void describeTo(Description description) { description.appendText("has XPath ").appendValue(xPath); } }); } public XmlMatcherBuilder withXPath(final String xPath, final Matcher<? super String> subMatcher) { return with(new TypeSafeMatcher<String>() { @Override protected boolean matchesSafely(String item) { return XmlMatchers .hasXPath(xPath, namespaces, subMatcher) .matches(StringSource.toSource(item)); } @Override public void describeTo(Description description) { description.appendText("has XPath ").appendValue(xPath); } }); } public XmlMatcherBuilder withNamespace (String prefix, String uri) { namespaces.with(prefix, uri); return this; } private static class Namespaces implements NamespaceContext { private Map<String, String> namespace = new HashMap<>(); @Override public String getNamespaceURI(String prefix) { return namespace.get(prefix); } @Override public String getPrefix(String namespaceURI) { Iterator<String> prefixes = getPrefixes(namespaceURI); if (!prefixes.hasNext()) return null; else return prefixes.next(); } @Override public Iterator getPrefixes(String namespaceURI) { List<String> list = new ArrayList<>(); for (Map.Entry<String, String> stringStringEntry : namespace.entrySet()) { if (stringStringEntry.getValue().equals(namespaceURI)) list.add(stringStringEntry.getKey()); } return list.iterator(); } public void with(String prefix, String uri) { namespace.put(prefix, uri); } } }