/** * 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.apache.cxf.jaxrs.ext.xml; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.net.URI; import java.util.Arrays; import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.transform.Source; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.apache.ws.commons.schema.constants.Constants; import org.junit.Assert; import org.junit.Test; public class XMLSourceTest extends Assert { @Test public void testNodeStringValue() { InputStream is = getClass().getResourceAsStream("/book1.xsd"); XMLSource xp = new XMLSource(is); xp.setBuffering(); Map<String, String> nsMap = Collections.singletonMap("xs", Constants.URI_2001_SCHEMA_XSD); String value = xp.getNode("/xs:schema", nsMap, String.class); assertFalse(value.contains("<?xml")); assertTrue(value, value.startsWith("<xs:schema")); } @Test public void testAttributeValue() { InputStream is = new ByteArrayInputStream("<foo><bar attr=\"baz\">barValue</bar></foo>".getBytes()); XMLSource xp = new XMLSource(is); xp.setBuffering(); assertEquals("baz", xp.getValue("/foo/bar/@attr")); } @Test public void testAttributeValueAsNode() { InputStream is = new ByteArrayInputStream("<foo><bar attr=\"baz\">barValue</bar></foo>".getBytes()); XMLSource xp = new XMLSource(is); xp.setBuffering(); Node node = xp.getNode("/foo/bar/@attr", Node.class); assertNotNull(node); assertEquals("baz", node.getTextContent()); } @Test public void testNodeTextValue() { InputStream is = new ByteArrayInputStream("<foo><bar attr=\"baz\">barValue</bar></foo>".getBytes()); XMLSource xp = new XMLSource(is); xp.setBuffering(); assertEquals("barValue", xp.getValue("/foo/bar")); } @Test public void testAttributeValues() { InputStream is = new ByteArrayInputStream( "<foo><bar attr=\"baz\">bar1</bar><bar attr=\"baz2\">bar2</bar></foo>".getBytes()); XMLSource xp = new XMLSource(is); xp.setBuffering(); List<String> values = Arrays.asList(xp.getValues("/foo/bar/@attr")); assertEquals(2, values.size()); assertTrue(values.contains("baz")); assertTrue(values.contains("baz2")); } @Test public void testNodeTextValues() { InputStream is = new ByteArrayInputStream( "<foo><bar attr=\"baz\">bar1</bar><bar attr=\"baz2\">bar2</bar></foo>".getBytes()); XMLSource xp = new XMLSource(is); xp.setBuffering(); List<String> values = Arrays.asList(xp.getValues("/foo/bar/text()")); assertEquals(2, values.size()); assertTrue(values.contains("bar1")); assertTrue(values.contains("bar2")); } @Test public void testIntegerValues() { InputStream is = new ByteArrayInputStream( "<foo><bar attr=\"1\"/><bar attr=\"2\"/></foo>".getBytes()); XMLSource xp = new XMLSource(is); xp.setBuffering(); Integer[] values = xp.getNodes("/foo/bar/@attr", Integer.class); assertEquals(2, values.length); assertTrue(values[0] == 1 && values[1] == 2 || values[0] == 2 && values[1] == 1); } @Test public void testGetNodeNoNamespace() { InputStream is = new ByteArrayInputStream("<foo><bar/></foo>".getBytes()); XMLSource xp = new XMLSource(is); xp.setBuffering(); Bar bar = xp.getNode("/foo/bar", Bar.class); assertNotNull(bar); } @Test public void testGetNodeAsElement() { InputStream is = new ByteArrayInputStream("<foo><bar/></foo>".getBytes()); XMLSource xp = new XMLSource(is); xp.setBuffering(); Element element = xp.getNode("/foo/bar", Element.class); assertNotNull(element); } @Test public void testGetNodeAsSource() { InputStream is = new ByteArrayInputStream("<foo><bar/></foo>".getBytes()); XMLSource xp = new XMLSource(is); xp.setBuffering(); Source element = xp.getNode("/foo/bar", Source.class); assertNotNull(element); } @Test public void testGetNodeNull() { InputStream is = new ByteArrayInputStream("<foo><bar/></foo>".getBytes()); XMLSource xp = new XMLSource(is); xp.setBuffering(); assertNull(xp.getNode("/foo/bar1", Element.class)); } @Test public void testGetNodeAsJaxbElement() { InputStream is = new ByteArrayInputStream("<foo><bar name=\"foo\"/></foo>".getBytes()); XMLSource xp = new XMLSource(is); xp.setBuffering(); Bar3 bar = xp.getNode("/foo/bar", Bar3.class); assertNotNull(bar); assertEquals("foo", bar.getName()); } @Test public void testGetNodeNamespace() { String data = "<x:foo xmlns:x=\"http://baz\"><x:bar/></x:foo>"; InputStream is = new ByteArrayInputStream(data.getBytes()); XMLSource xp = new XMLSource(is); xp.setBuffering(); Map<String, String> map = new LinkedHashMap<String, String>(); map.put("x", "http://baz"); Bar2 bar = xp.getNode("/x:foo/x:bar", map, Bar2.class); assertNotNull(bar); } @Test public void testGetNodeBuffering() { String data = "<x:foo xmlns:x=\"http://baz\"><x:bar/></x:foo>"; InputStream is = new ByteArrayInputStream(data.getBytes()); XMLSource xp = new XMLSource(is); xp.setBuffering(); Map<String, String> map = new LinkedHashMap<String, String>(); map.put("x", "http://baz"); Bar2 bar = xp.getNode("/x:foo/x:bar", map, Bar2.class); assertNotNull(bar); bar = xp.getNode("/x:foo/x:bar", map, Bar2.class); assertNotNull(bar); } @Test public void testGetNodeNamespace2() { String data = "<z:foo xmlns:z=\"http://baz\"><z:bar/></z:foo>"; InputStream is = new ByteArrayInputStream(data.getBytes()); XMLSource xp = new XMLSource(is); xp.setBuffering(); Map<String, String> map = new LinkedHashMap<String, String>(); map.put("x", "http://baz"); Bar2 bar = xp.getNode("/x:foo/x:bar", map, Bar2.class); assertNotNull(bar); } @Test public void testGetNodeNamespace3() { String data = "<x:foo xmlns:x=\"http://foo\" xmlns:z=\"http://baz\"><z:bar/></x:foo>"; InputStream is = new ByteArrayInputStream(data.getBytes()); XMLSource xp = new XMLSource(is); xp.setBuffering(); Map<String, String> map = new LinkedHashMap<String, String>(); map.put("x", "http://foo"); map.put("y", "http://baz"); Bar2 bar = xp.getNode("/x:foo/y:bar", map, Bar2.class); assertNotNull(bar); } @Test public void testGetNodeDefaultNamespace() { String data = "<foo xmlns=\"http://baz\"><bar/></foo>"; InputStream is = new ByteArrayInputStream(data.getBytes()); XMLSource xp = new XMLSource(is); xp.setBuffering(); Map<String, String> map = new LinkedHashMap<String, String>(); map.put("x", "http://baz"); Bar2 bar = xp.getNode("/x:foo/x:bar", map, Bar2.class); assertNotNull(bar); } @Test public void testGetNodesNoNamespace() { InputStream is = new ByteArrayInputStream("<foo><bar/><bar/></foo>".getBytes()); XMLSource xp = new XMLSource(is); xp.setBuffering(); Bar[] bars = xp.getNodes("/foo/bar", Bar.class); assertNotNull(bars); assertEquals(2, bars.length); assertNotSame(bars[0], bars[1]); } @Test public void testGetNodesNamespace() { String data = "<x:foo xmlns:x=\"http://baz\"><x:bar/><x:bar/></x:foo>"; InputStream is = new ByteArrayInputStream(data.getBytes()); XMLSource xp = new XMLSource(is); xp.setBuffering(); Map<String, String> map = new LinkedHashMap<String, String>(); map.put("x", "http://baz"); Bar2[] bars = xp.getNodes("/x:foo/x:bar", map, Bar2.class); assertNotNull(bars); assertNotNull(bars); assertEquals(2, bars.length); assertNotSame(bars[0], bars[1]); } @Test public void testGetStringValue() { InputStream is = new ByteArrayInputStream("<foo><bar/><bar id=\"2\"/></foo>".getBytes()); XMLSource xp = new XMLSource(is); String value = xp.getValue("/foo/bar/@id"); assertEquals("2", value); } @Test public void testGetRelativeLink() { InputStream is = new ByteArrayInputStream("<foo><bar/><bar href=\"/2\"/></foo>".getBytes()); XMLSource xp = new XMLSource(is); URI value = xp.getLink("/foo/bar/@href"); assertEquals("/2", value.toString()); } @Test public void testBaseURI() { InputStream is = new ByteArrayInputStream( "<foo xml:base=\"http://bar\"><bar/><bar href=\"/2\"/></foo>".getBytes()); XMLSource xp = new XMLSource(is); URI value = xp.getBaseURI(); assertEquals("http://bar", value.toString()); } @XmlRootElement private static class Bar { } @XmlRootElement(name = "bar", namespace = "http://baz") private static class Bar2 { } private static class Bar3 { @XmlAttribute private String name; public String getName() { return name; } } }