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 2010/01/22 15:37:27 UTC
svn commit: r902101 - in /cxf/trunk:
rt/core/src/main/java/org/apache/cxf/interceptor/
rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ext/
rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/
systests/jaxrs/src/test/java/org/apache/cxf/...
Author: sergeyb
Date: Fri Jan 22 14:37:26 2010
New Revision: 902101
URL: http://svn.apache.org/viewvc?rev=902101&view=rev
Log:
JAXRS : Updating JAXBElementProvider to check for stax factories
Modified:
cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/FIStaxInInterceptor.java
cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/FIStaxOutInterceptor.java
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ext/MessageContextImpl.java
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JAXBElementProvider.java
cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookStoreJaxrsJaxws.java
cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookStoreSoapRestImpl.java
cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSSoapBookTest.java
cxf/trunk/systests/jaxrs/src/test/resources/jaxrs_soap_rest/WEB-INF/beans.xml
Modified: cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/FIStaxInInterceptor.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/FIStaxInInterceptor.java?rev=902101&r1=902100&r2=902101&view=diff
==============================================================================
--- cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/FIStaxInInterceptor.java (original)
+++ cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/FIStaxInInterceptor.java Fri Jan 22 14:37:26 2010
@@ -28,6 +28,7 @@
import org.apache.cxf.endpoint.Endpoint;
import org.apache.cxf.message.Message;
+import org.apache.cxf.message.MessageUtils;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
@@ -35,21 +36,26 @@
* Creates an XMLStreamReader from the InputStream on the Message.
*/
public class FIStaxInInterceptor extends AbstractPhaseInterceptor<Message> {
+ public static final String FI_GET_SUPPORTED = "org.apache.cxf.fastinfoset.get.supported";
+
XMLInputFactory factory = new StAXInputFactory();
public FIStaxInInterceptor() {
this(Phase.POST_STREAM);
}
+
public FIStaxInInterceptor(String phase) {
super(phase);
addBefore(StaxInInterceptor.class.getName());
}
+
protected boolean isRequestor(Message message) {
return Boolean.TRUE.equals(message.containsKey(Message.REQUESTOR_ROLE));
}
public void handleMessage(Message message) {
- if (isGET(message) || message.getContentFormats().contains(XMLStreamReader.class)) {
+ if (message.getContentFormats().contains(XMLStreamReader.class)
+ || !isHttpVerbSupported(message)) {
return;
}
@@ -71,4 +77,16 @@
}
}
}
+
+ protected boolean isHttpVerbSupported(Message message) {
+ if (isGET(message)) {
+ if (isRequestor(message)
+ && MessageUtils.isTrue(message.getContextualProperty(FI_GET_SUPPORTED))) {
+ return true;
+ }
+ return false;
+ } else {
+ return true;
+ }
+ }
}
Modified: cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/FIStaxOutInterceptor.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/FIStaxOutInterceptor.java?rev=902101&r1=902100&r2=902101&view=diff
==============================================================================
--- cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/FIStaxOutInterceptor.java (original)
+++ cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/FIStaxOutInterceptor.java Fri Jan 22 14:37:26 2010
@@ -31,6 +31,7 @@
import org.apache.cxf.helpers.CastUtils;
import org.apache.cxf.message.Message;
+import org.apache.cxf.message.MessageUtils;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
@@ -54,6 +55,8 @@
force = f;
}
+
+
public void handleMessage(Message message) {
XMLStreamWriter writer = message.getContent(XMLStreamWriter.class);
if (writer != null) {
@@ -87,7 +90,7 @@
}
if (force
- || Boolean.TRUE.equals(o)) {
+ || MessageUtils.isTrue(o)) {
message.put(XMLOutputFactory.class.getName(),
factory);
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ext/MessageContextImpl.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ext/MessageContextImpl.java?rev=902101&r1=902100&r2=902101&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ext/MessageContextImpl.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ext/MessageContextImpl.java Fri Jan 22 14:37:26 2010
@@ -68,7 +68,18 @@
|| (MultipartBody.INBOUND_MESSAGE_ATTACHMENTS + ".embedded").equals(keyValue)) {
return createAttachments(key.toString());
}
- return m.get(key);
+ Object value = m.get(key);
+ if (value == null && isRequestor()) {
+ Message inMessage = m.getExchange().getInMessage();
+ if (inMessage != null) {
+ value = inMessage.get(key);
+ }
+ }
+ return value;
+ }
+
+ private boolean isRequestor() {
+ return Boolean.TRUE.equals(m.containsKey(Message.REQUESTOR_ROLE));
}
public <T> T getContent(Class<T> format) {
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JAXBElementProvider.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JAXBElementProvider.java?rev=902101&r1=902100&r2=902101&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JAXBElementProvider.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JAXBElementProvider.java Fri Jan 22 14:37:26 2010
@@ -45,6 +45,9 @@
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.ValidationEventHandler;
import javax.xml.namespace.QName;
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLOutputFactory;
+import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import javax.xml.stream.XMLStreamWriter;
import javax.xml.transform.stream.StreamSource;
@@ -186,6 +189,19 @@
protected XMLStreamReader getStreamReader(InputStream is, Class<?> type, MediaType mt) {
MessageContext mc = getContext();
XMLStreamReader reader = mc != null ? mc.getContent(XMLStreamReader.class) : null;
+
+ if (reader == null && mc != null) {
+ XMLInputFactory factory = (XMLInputFactory)mc.get(XMLInputFactory.class.getName());
+ if (factory != null) {
+ try {
+ reader = factory.createXMLStreamReader(is);
+ } catch (XMLStreamException e) {
+ throw new WebApplicationException(
+ new RuntimeException("Cant' create XMLStreamReader", e));
+ }
+ }
+ }
+
reader = createTransformReaderIfNeeded(reader, is);
if (InjectionUtils.isSupportedCollectionOrArray(type)) {
return new JAXBCollectionWrapperReader(createNewReaderIfNeeded(reader, is));
@@ -332,6 +348,17 @@
MessageContext mc = getContext();
if (mc != null) {
writer = mc.getContent(XMLStreamWriter.class);
+ if (writer == null) {
+ XMLOutputFactory factory = (XMLOutputFactory)mc.get(XMLOutputFactory.class.getName());
+ if (factory != null) {
+ try {
+ writer = factory.createXMLStreamWriter(os);
+ } catch (XMLStreamException e) {
+ throw new WebApplicationException(
+ new RuntimeException("Cant' create XMLStreamWriter", e));
+ }
+ }
+ }
if (writer == null && enableStreaming) {
writer = StaxUtils.createXMLStreamWriter(os);
}
Modified: cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookStoreJaxrsJaxws.java
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookStoreJaxrsJaxws.java?rev=902101&r1=902100&r2=902101&view=diff
==============================================================================
--- cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookStoreJaxrsJaxws.java (original)
+++ cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookStoreJaxrsJaxws.java Fri Jan 22 14:37:26 2010
@@ -53,4 +53,17 @@
@Path("/thestore/{id}")
@WebMethod(exclude = true)
BookStoreJaxrsJaxws getBookStore(@PathParam("id") String id);
+
+ @POST
+ @Path("/fastinfoset")
+ @Consumes({"text/xml" })
+ @Produces({"application/fastinfoset", "text/xml", "application/xml" })
+ @WebMethod(exclude = true)
+ Book addFastinfoBook(Book book);
+
+ @GET
+ @Path("/fastinfoset2")
+ @Produces({"application/fastinfoset", "text/xml", "application/xml" })
+ @WebMethod(exclude = true)
+ Book getFastinfoBook();
}
Modified: cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookStoreSoapRestImpl.java
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookStoreSoapRestImpl.java?rev=902101&r1=902100&r2=902101&view=diff
==============================================================================
--- cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookStoreSoapRestImpl.java (original)
+++ cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookStoreSoapRestImpl.java Fri Jan 22 14:37:26 2010
@@ -142,5 +142,13 @@
}
return this;
}
+
+ public Book addFastinfoBook(Book book) {
+ return book;
+ }
+
+ public Book getFastinfoBook() {
+ return new Book("CXF2", 2L);
+ }
}
Modified: cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSSoapBookTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSSoapBookTest.java?rev=902101&r1=902100&r2=902101&view=diff
==============================================================================
--- cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSSoapBookTest.java (original)
+++ cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSSoapBookTest.java Fri Jan 22 14:37:26 2010
@@ -45,6 +45,8 @@
import org.apache.cxf.Bus;
import org.apache.cxf.feature.AbstractFeature;
import org.apache.cxf.helpers.IOUtils;
+import org.apache.cxf.interceptor.FIStaxInInterceptor;
+import org.apache.cxf.interceptor.FIStaxOutInterceptor;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.interceptor.InterceptorProvider;
import org.apache.cxf.io.CachedOutputStream;
@@ -55,6 +57,7 @@
import org.apache.cxf.jaxrs.ext.form.Form;
import org.apache.cxf.jaxrs.ext.xml.XMLSource;
import org.apache.cxf.jaxrs.impl.MetadataMap;
+import org.apache.cxf.jaxrs.provider.JAXBElementProvider;
import org.apache.cxf.message.Message;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
@@ -82,6 +85,50 @@
}
@Test
+ public void testGetBookFastinfoset() throws Exception {
+
+ JAXRSClientFactoryBean bean = new JAXRSClientFactoryBean();
+ bean.setAddress("http://localhost:9092/test/services/rest3/bookstore/fastinfoset2");
+ bean.getInInterceptors().add(new FIStaxInInterceptor());
+ JAXBElementProvider p = new JAXBElementProvider();
+ p.setConsumeMediaTypes(Collections.singletonList("application/fastinfoset"));
+ bean.setProvider(p);
+
+ Map<String, Object> props = new HashMap<String, Object>();
+ props.put(FIStaxInInterceptor.FI_GET_SUPPORTED, Boolean.TRUE);
+ bean.setProperties(props);
+
+ WebClient client = bean.createWebClient();
+ Book b = client.accept("application/fastinfoset").get(Book.class);
+ assertEquals("CXF2", b.getName());
+ assertEquals(2L, b.getId());
+ }
+
+ @Test
+ public void testPostGetBookFastinfoset() throws Exception {
+
+ JAXRSClientFactoryBean bean = new JAXRSClientFactoryBean();
+ bean.setAddress("http://localhost:9092/test/services/rest3/bookstore/fastinfoset");
+ bean.getOutInterceptors().add(new FIStaxOutInterceptor());
+ bean.getInInterceptors().add(new FIStaxInInterceptor());
+ JAXBElementProvider p = new JAXBElementProvider();
+ p.setConsumeMediaTypes(Collections.singletonList("application/fastinfoset"));
+ p.setProduceMediaTypes(Collections.singletonList("application/fastinfoset"));
+ bean.setProvider(p);
+
+ Map<String, Object> props = new HashMap<String, Object>();
+ props.put(FIStaxOutInterceptor.FI_ENABLED, Boolean.TRUE);
+ bean.setProperties(props);
+
+ WebClient client = bean.createWebClient();
+ Book b = new Book("CXF", 1L);
+ Book b2 = client.type("application/fastinfoset").accept("application/fastinfoset")
+ .post(b, Book.class);
+ assertEquals(b2.getName(), b.getName());
+ assertEquals(b2.getId(), b.getId());
+ }
+
+ @Test
public void testGetBook123ServletResponse() throws Exception {
InputStream in = getHttpInputStream("http://localhost:9092/test/services/rest/bookstore/0");
Modified: cxf/trunk/systests/jaxrs/src/test/resources/jaxrs_soap_rest/WEB-INF/beans.xml
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/jaxrs/src/test/resources/jaxrs_soap_rest/WEB-INF/beans.xml?rev=902101&r1=902100&r2=902101&view=diff
==============================================================================
--- cxf/trunk/systests/jaxrs/src/test/resources/jaxrs_soap_rest/WEB-INF/beans.xml (original)
+++ cxf/trunk/systests/jaxrs/src/test/resources/jaxrs_soap_rest/WEB-INF/beans.xml Fri Jan 22 14:37:26 2010
@@ -22,8 +22,11 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jaxrs="http://cxf.apache.org/jaxrs"
xmlns:jaxws="http://cxf.apache.org/jaxws"
+ xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
+http://www.springframework.org/schema/util
+http://www.springframework.org/schema/util/spring-util-2.0.xsd
http://cxf.apache.org/jaxws
http://cxf.apache.org/schemas/jaxws.xsd
http://cxf.apache.org/jaxrs
@@ -75,5 +78,39 @@
</jaxrs:server>
<bean id="bookstore2" class="org.apache.cxf.systest.jaxrs.BookStoreSoapRestImpl2"/>
+ <util:list id="fastinfosetType">
+ <value>application/fastinfoset</value>
+ </util:list>
+
+
+ <jaxrs:server id="restservice3"
+ address="/rest3">
+ <jaxrs:serviceBeans>
+ <ref bean="bookstore"/>
+ </jaxrs:serviceBeans>
+
+ <jaxrs:providers>
+ <ref bean="jaxbProvider" />
+ </jaxrs:providers>
+
+ <jaxrs:outInterceptors>
+ <ref bean="fastInfosetOutInterceptor" />
+ </jaxrs:outInterceptors>
+ <jaxrs:inInterceptors>
+ <ref bean="fastInfosetInInterceptor" />
+ </jaxrs:inInterceptors>
+
+ </jaxrs:server>
+
+ <bean id="jaxbProvider" class="org.apache.cxf.jaxrs.provider.JAXBElementProvider">
+ <property name="produceMediaTypes" ref="fastinfosetType"/>
+ <property name="consumeMediaTypes" ref="fastinfosetType"/>
+ </bean>
+
+ <bean id="fastInfosetOutInterceptor"
+ class="org.apache.cxf.interceptor.FIStaxOutInterceptor" />
+ <bean id="fastInfosetInInterceptor"
+ class="org.apache.cxf.interceptor.FIStaxInInterceptor" />
+
</beans>
<!-- END SNIPPET: beans -->