package aQute.bnd.test;
import static junit.framework.TestCase.assertEquals;
import static junit.framework.TestCase.assertNotNull;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Iterator;
import javax.xml.namespace.NamespaceContext;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
public class XmlTester {
final static DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
final static XPathFactory xpathf = XPathFactory.newInstance();
final static DocumentBuilder db;
static {
try {
dbf.setNamespaceAware(true);
db = dbf.newDocumentBuilder();
} catch (ParserConfigurationException e) {
throw new RuntimeException(e);
}
}
final Document document;
final XPath xpath = xpathf.newXPath();
public XmlTester(InputStream in, final String... namespace) throws Exception {
xpath.setNamespaceContext(new NamespaceContext() {
public Iterator<String> getPrefixes(String namespaceURI) {
ArrayList<String> result = new ArrayList<String>(namespace.length / 2);
for (int i = 0; i < namespace.length; i += 2) {
result.add(namespace[i]);
}
return result.iterator();
}
public String getPrefix(String namespaceURI) {
for (int i = 0; i < namespace.length; i += 2) {
if (namespaceURI.equals(namespace[i + 1]))
return namespace[i];
}
return null;
}
public String getNamespaceURI(String prefix) {
for (int i = 0; i < namespace.length; i += 2) {
if (prefix.equals(namespace[i]))
return namespace[i + 1];
}
return null;
}
});
document = db.parse(in);
}
public void assertExactAttribute(String value, String expr) throws XPathExpressionException {
System.err.println(expr);
String o = (String) xpath.evaluate(expr, document, XPathConstants.STRING);
assertNotNull(o);
assertEquals(value, o);
}
public void assertAttribute(String value, String expr) throws XPathExpressionException {
System.err.println(expr);
String o = (String) xpath.evaluate(expr, document, XPathConstants.STRING);
assertNotNull(o);
assertEquals(value, o.trim());
}
public void assertTrimmedAttribute(String value, String expr) throws XPathExpressionException {
System.err.println(expr);
String o = (String) xpath.evaluate(expr, document, XPathConstants.STRING);
assertNotNull(o);
assertEquals(value, o.trim().replaceAll("\n", "\\\\n"));
}
public void assertNoAttribute(String expr) throws XPathExpressionException {
System.err.println(expr);
String o = (String) xpath.evaluate(expr, document, XPathConstants.STRING);
assertEquals("", o);
}
public void assertNamespace(String namespace) {
Element element = document.getDocumentElement();
String xmlns = element.getNamespaceURI();
assertEquals(namespace, xmlns);
}
public void assertNumber(Double value, String expr) throws XPathExpressionException {
System.err.println(expr);
Double o = (Double) xpath.evaluate(expr, document, XPathConstants.NUMBER);
assertNotNull(o);
assertEquals(value, o);
}
public void assertCount(int value, String expr) throws XPathExpressionException {
assertNumber(Double.valueOf(value), "count(" + expr + ")");
}
}