import java.io.StringReader; import java.net.URI; import java.util.Iterator; import javax.xml.namespace.NamespaceContext; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathFactory; import junit.framework.TestCase; import junit.textui.TestRunner; import org.w3c.dom.Element; import org.xml.sax.InputSource; public class xml_base extends TestCase { static String base = "http://example.com/blog/index.atom"; // namespace resolver for "atom:" static class AtomNamespaceContext implements NamespaceContext { public String getNamespaceURI(String prefix) { if (prefix.equals("atom")) return "http://www.w3.org/2005/Atom"; else return null; } public String getPrefix(String namespace) { return null; } public Iterator getPrefixes(String namespace) { return null; } } // Parse a document and a fully resolved "//atom:link/@href" public static String parse(String stream) throws Exception { InputSource source = new InputSource(new StringReader(stream)); source.setSystemId(base); XPath xpath = XPathFactory.newInstance().newXPath(); xpath.setNamespaceContext(new AtomNamespaceContext()); Element link = (Element) xpath.evaluate("//atom:link", source, XPathConstants.NODE); URI base = new URI(link.getBaseURI()); return base.resolve(link.getAttribute("href")).toString(); } public static void test_no_xml_base_abs() throws Exception { String feed = "" + " " + " " + " " + ""; assertEquals("http://example.org/archives/2005/08/123.html", parse(feed)); } public static void test_no_xml_base_rel() throws Exception { String feed = "" + " " + " " + " " + ""; assertEquals("http://example.com/archives/2005/08/123.html", parse(feed)); } public static void test_xml_base_on_feed_and_entry() throws Exception { String feed = "" + " " + " " + " " + ""; assertEquals("http://example.com/archives/123.html", parse(feed)); } public static void test_xml_base_overridden_on_link() throws Exception { String feed = "" + " " + " " + " " + ""; assertEquals("http://example.com/123.html", parse(feed)); } public static void main(String[] args) { TestRunner.run(xml_base.class); if (args.length>=1 && args[0].equals("--properties")) System.getProperties().list(System.out); } }