You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by se...@apache.org on 2009/03/20 23:41:42 UTC
svn commit: r756792 - in /cxf/trunk:
rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/
rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/
systests/src/test/java/org/apache/cxf/systest/jaxrs/
systests/src/test/java/org/apache/cxf/syst...
Author: sergeyb
Date: Fri Mar 20 22:41:41 2009
New Revision: 756792
URL: http://svn.apache.org/viewvc?rev=756792&view=rev
Log:
JAXRS: XMLSource buffering mode
Modified:
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/Messages.properties
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/XMLSource.java
cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/XMLSourceTest.java
cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSSoapBookTest.java
cxf/trunk/systests/src/test/java/org/apache/cxf/systest/rest/RestClientServerBookTest.java
cxf/trunk/systests/src/test/java/org/apache/cxf/systest/rest/RestClientServerHttpBindingTest.java
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/Messages.properties
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/Messages.properties?rev=756792&r1=756791&r2=756792&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/Messages.properties (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/Messages.properties Fri Mar 20 22:41:41 2009
@@ -31,4 +31,5 @@
NO_MSG_READER =.No message body reader found for request class : {0}, ContentType : {1}.
NO_SUBRESOURCE_METHOD_FOUND=No operation matching request path {0} is found on subresource, ContentType : {1}, Accept : {2}.
NO_OP_EXC =.No operation matching request path {0} is found, ContentType : {1}, Accept : {2}.
-MULTTIPART_ID_NOT_FOUND=No multipart with content id {0} found, request content type : {1}
\ No newline at end of file
+MULTTIPART_ID_NOT_FOUND=No multipart with content id {0} found, request content type : {1}
+NO_SOURCE_MARK=InputStream used by XMLSource does not support buffering mode
\ No newline at end of file
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/XMLSource.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/XMLSource.java?rev=756792&r1=756791&r2=756792&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/XMLSource.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/XMLSource.java Fri Mar 20 22:41:41 2009
@@ -18,6 +18,7 @@
*/
package org.apache.cxf.jaxrs.utils;
+import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Array;
import java.net.URI;
@@ -25,6 +26,8 @@
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
+import java.util.ResourceBundle;
+import java.util.logging.Logger;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
@@ -41,7 +44,10 @@
import org.xml.sax.InputSource;
+import org.apache.cxf.common.i18n.BundleUtils;
+import org.apache.cxf.common.logging.LogUtils;
import org.apache.cxf.helpers.CastUtils;
+import org.apache.cxf.helpers.IOUtils;
import org.apache.cxf.jaxrs.provider.JAXBElementProvider;
/**
@@ -49,18 +55,27 @@
*
*/
public class XMLSource {
+ private static final Logger LOG = LogUtils.getL7dLogger(XMLSource.class);
+ private static final ResourceBundle BUNDLE = BundleUtils.getBundle(XMLSource.class);
private static final String XML_NAMESPACE = "http://www.w3.org/XML/1998/namespace";
- private InputSource source;
- private RuntimeException exceptionToThrow;
+ private InputStream stream;
+ private boolean buffering;
public XMLSource(InputStream is) {
- source = new InputSource(is);
+ stream = is;
}
- public void setException(RuntimeException ex) {
- exceptionToThrow = ex;
+ public void setBuffering(boolean enable) {
+ buffering = enable;
+ if (!stream.markSupported()) {
+ try {
+ stream = IOUtils.loadIntoBAIS(stream);
+ } catch (IOException ex) {
+ LOG.warning(new org.apache.cxf.common.i18n.Message("NO_SOURCE_MARK", BUNDLE).toString());
+ }
+ }
}
public <T> T getNode(String expression, Class<T> cls) {
@@ -71,11 +86,8 @@
XPath xpath = XPathFactory.newInstance().newXPath();
xpath.setNamespaceContext(new NamespaceContextImpl(namespaces));
try {
- Node node = (Node)xpath.evaluate(expression, source, XPathConstants.NODE);
+ Node node = (Node)xpath.evaluate(expression, getSource(), XPathConstants.NODE);
if (node == null) {
- if (exceptionToThrow != null) {
- throw exceptionToThrow;
- }
return null;
}
DOMSource ds = new DOMSource(node);
@@ -94,11 +106,8 @@
XPath xpath = XPathFactory.newInstance().newXPath();
xpath.setNamespaceContext(new NamespaceContextImpl(namespaces));
try {
- NodeList nodes = (NodeList)xpath.evaluate(expression, source, XPathConstants.NODESET);
+ NodeList nodes = (NodeList)xpath.evaluate(expression, getSource(), XPathConstants.NODESET);
if (nodes == null || nodes.getLength() == 0) {
- if (exceptionToThrow != null) {
- throw exceptionToThrow;
- }
return null;
}
T[] values = (T[])Array.newInstance(cls, nodes.getLength());
@@ -138,7 +147,7 @@
XPath xpath = XPathFactory.newInstance().newXPath();
xpath.setNamespaceContext(new NamespaceContextImpl(namespaces));
try {
- return (String)xpath.evaluate(expression, source, XPathConstants.STRING);
+ return (String)xpath.evaluate(expression, getSource(), XPathConstants.STRING);
} catch (XPathExpressionException ex) {
throw new IllegalArgumentException("Illegal XPath expression '" + expression + "'", ex);
}
@@ -187,4 +196,16 @@
throw new RuntimeException(ex);
}
}
+
+ private InputSource getSource() {
+ try {
+ if (buffering) {
+ stream.reset();
+ stream.mark(stream.available());
+ }
+ } catch (IOException ex) {
+ LOG.warning(new org.apache.cxf.common.i18n.Message("NO_SOURCE_MARK", BUNDLE).toString());
+ }
+ return new InputSource(stream);
+ }
}
Modified: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/XMLSourceTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/XMLSourceTest.java?rev=756792&r1=756791&r2=756792&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/XMLSourceTest.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/XMLSourceTest.java Fri Mar 20 22:41:41 2009
@@ -51,6 +51,20 @@
}
@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(true);
+ 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());
Modified: cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSSoapBookTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSSoapBookTest.java?rev=756792&r1=756791&r2=756792&view=diff
==============================================================================
--- cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSSoapBookTest.java (original)
+++ cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSSoapBookTest.java Fri Mar 20 22:41:41 2009
@@ -105,7 +105,12 @@
String baseAddress = "http://localhost:9092/test/services/rest";
WebClient client = WebClient.create(baseAddress);
client.path("/bookstore/123").accept(MediaType.APPLICATION_XML_TYPE);
- Book b = client.get(XMLSource.class).getNode("/Book", Book.class);
+ XMLSource source = client.get(XMLSource.class);
+ source.setBuffering(true);
+ Book b = source.getNode("/Book", Book.class);
+ assertEquals(123, b.getId());
+ assertEquals("CXF in Action", b.getName());
+ b = source.getNode("/Book", Book.class);
assertEquals(123, b.getId());
assertEquals("CXF in Action", b.getName());
}
Modified: cxf/trunk/systests/src/test/java/org/apache/cxf/systest/rest/RestClientServerBookTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/rest/RestClientServerBookTest.java?rev=756792&r1=756791&r2=756792&view=diff
==============================================================================
--- cxf/trunk/systests/src/test/java/org/apache/cxf/systest/rest/RestClientServerBookTest.java (original)
+++ cxf/trunk/systests/src/test/java/org/apache/cxf/systest/rest/RestClientServerBookTest.java Fri Mar 20 22:41:41 2009
@@ -55,7 +55,7 @@
@BeforeClass
public static void startServers() throws Exception {
- assertTrue("server did not launch correctly", launchServer(BookServer.class));
+ assertTrue("server did not launch correctly", launchServer(BookServer.class, true));
}
@Test
Modified: cxf/trunk/systests/src/test/java/org/apache/cxf/systest/rest/RestClientServerHttpBindingTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/rest/RestClientServerHttpBindingTest.java?rev=756792&r1=756791&r2=756792&view=diff
==============================================================================
--- cxf/trunk/systests/src/test/java/org/apache/cxf/systest/rest/RestClientServerHttpBindingTest.java (original)
+++ cxf/trunk/systests/src/test/java/org/apache/cxf/systest/rest/RestClientServerHttpBindingTest.java Fri Mar 20 22:41:41 2009
@@ -55,7 +55,7 @@
@BeforeClass
public static void startServers() throws Exception {
- assertTrue("server did not launch correctly", launchServer(HttpBindingServer.class));
+ assertTrue("server did not launch correctly", launchServer(HttpBindingServer.class, true));
}
@Test