You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by dk...@apache.org on 2010/02/09 03:32:20 UTC
svn commit: r907887 - in /cxf/trunk/rt:
core/src/main/java/org/apache/cxf/interceptor/
frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/
frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ext/
frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/in...
Author: dkulp
Date: Tue Feb 9 02:32:19 2010
New Revision: 907887
URL: http://svn.apache.org/viewvc?rev=907887&view=rev
Log:
Use the FI internal stuff directly. The Stax factories are a LOT
slower and almost defeats the purpose of FI.
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/core/src/main/java/org/apache/cxf/interceptor/StaxOutInterceptor.java
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/WebClient.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/interceptor/JAXRSOutInterceptor.java
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JAXBElementProvider.java
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=907887&r1=907886&r2=907887&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 Tue Feb 9 02:32:19 2010
@@ -20,11 +20,11 @@
package org.apache.cxf.interceptor;
+import java.io.InputStream;
-import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamReader;
-import com.sun.xml.fastinfoset.stax.factory.StAXInputFactory;
+import com.sun.xml.fastinfoset.stax.StAXDocumentParser;
import org.apache.cxf.endpoint.Endpoint;
import org.apache.cxf.message.Message;
@@ -37,8 +37,6 @@
*/
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);
@@ -53,6 +51,14 @@
return Boolean.TRUE.equals(message.containsKey(Message.REQUESTOR_ROLE));
}
+ private synchronized StAXDocumentParser getParser(InputStream in) {
+ StAXDocumentParser parser = new StAXDocumentParser(in);
+ parser.setStringInterning(true);
+ parser.setForceStreamClose(true);
+ parser.setInputStream(in);
+ return parser;
+ }
+
public void handleMessage(Message message) {
if (message.getContentFormats().contains(XMLStreamReader.class)
|| !isHttpVerbSupported(message)) {
@@ -60,8 +66,11 @@
}
String ct = (String)message.get(Message.CONTENT_TYPE);
- if (ct != null && ct.indexOf("fastinfoset") != -1) {
- message.put(XMLInputFactory.class.getName(), factory);
+ if (ct != null && ct.indexOf("fastinfoset") != -1
+ && message.getContent(InputStream.class) != null
+ && message.getContent(XMLStreamReader.class) == null) {
+ message.setContent(XMLStreamReader.class, getParser(message.getContent(InputStream.class)));
+
ct = ct.replace("fastinfoset", "xml");
if (ct.contains("application/xml")) {
ct = ct.replace("application/xml", "text/xml");
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=907887&r1=907886&r2=907887&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 Tue Feb 9 02:32:19 2010
@@ -20,15 +20,18 @@
package org.apache.cxf.interceptor;
+import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
+import java.util.ResourceBundle;
-import javax.xml.stream.XMLOutputFactory;
+import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamWriter;
-import com.sun.xml.fastinfoset.stax.factory.StAXOutputFactory;
+import com.sun.xml.fastinfoset.stax.StAXDocumentSerializer;
+import org.apache.cxf.common.i18n.BundleUtils;
import org.apache.cxf.helpers.CastUtils;
import org.apache.cxf.message.Message;
import org.apache.cxf.message.MessageUtils;
@@ -41,9 +44,11 @@
*/
public class FIStaxOutInterceptor extends AbstractPhaseInterceptor<Message> {
public static final String FI_ENABLED = "org.apache.cxf.fastinfoset.enabled";
-
+ private static final String OUTPUT_STREAM_HOLDER = FIStaxOutInterceptor.class.getName() + ".outputstream";
+ private static final FIStaxOutEndingInterceptor ENDING = new FIStaxOutEndingInterceptor();
+ private static final ResourceBundle BUNDLE = BundleUtils.getBundle(FIStaxOutInterceptor.class);
+
boolean force;
- XMLOutputFactory factory = new StAXOutputFactory();
public FIStaxOutInterceptor() {
super(Phase.PRE_STREAM);
@@ -55,13 +60,22 @@
force = f;
}
-
+ @Override
+ public void handleFault(Message message) {
+ super.handleFault(message);
+ OutputStream os = (OutputStream)message.get(OUTPUT_STREAM_HOLDER);
+ if (os != null) {
+ message.setContent(OutputStream.class, os);
+ }
+ }
public void handleMessage(Message message) {
+ OutputStream out = message.getContent(OutputStream.class);
XMLStreamWriter writer = message.getContent(XMLStreamWriter.class);
- if (writer != null) {
+ if (out == null || writer != null) {
return;
- }
+ }
+
boolean req = isRequestor(message);
Object o = message.getContextualProperty(FI_ENABLED);
if (!req) {
@@ -91,9 +105,14 @@
if (force
|| MessageUtils.isTrue(o)) {
+ StAXDocumentSerializer serializer = getOutput(message, out);
+ message.setContent(XMLStreamWriter.class, serializer);
- message.put(XMLOutputFactory.class.getName(),
- factory);
+ message.removeContent(OutputStream.class);
+ message.put(OUTPUT_STREAM_HOLDER, out);
+ message.put(AbstractOutDatabindingInterceptor.DISABLE_OUTPUTSTREAM_OPTIMIZATION,
+ Boolean.TRUE);
+
String s = (String)message.get(Message.CONTENT_TYPE);
if (s.contains("application/soap+xml")) {
s = s.replace("application/soap+xml", "application/soap+fastinfoset");
@@ -101,7 +120,61 @@
} else {
message.put(Message.CONTENT_TYPE, "application/fastinfoset");
}
+
+ try {
+ serializer.writeStartDocument();
+ } catch (XMLStreamException e) {
+ throw new Fault(e);
+ }
+ message.getInterceptorChain().add(ENDING);
+ }
+ }
+
+ private StAXDocumentSerializer getOutput(Message m, OutputStream out) {
+ /*
+ StAXDocumentSerializer serializer = (StAXDocumentSerializer)m.getExchange().get(Endpoint.class)
+ .remove(StAXDocumentSerializer.class.getName());
+ if (serializer != null) {
+ serializer.setOutputStream(out);
+ } else {
+ serializer = new StAXDocumentSerializer(out);
}
+ return serializer;
+ */
+ return new StAXDocumentSerializer(out);
}
+ public static class FIStaxOutEndingInterceptor extends AbstractPhaseInterceptor<Message> {
+ public FIStaxOutEndingInterceptor() {
+ super(Phase.PRE_STREAM_ENDING);
+ getAfter().add(AttachmentOutInterceptor.AttachmentOutEndingInterceptor.class.getName());
+ }
+
+ public void handleMessage(Message message) throws Fault {
+ try {
+ XMLStreamWriter xtw = message.getContent(XMLStreamWriter.class);
+ if (xtw != null) {
+ xtw.writeEndDocument();
+ xtw.flush();
+ xtw.close();
+ }
+ /*
+ if (xtw instanceof StAXDocumentSerializer) {
+ ((StAXDocumentSerializer)xtw).setOutputStream(null);
+ message.getExchange().get(Endpoint.class)
+ .put(StAXDocumentSerializer.class.getName(), xtw);
+ }
+ */
+
+ OutputStream os = (OutputStream)message.get(OUTPUT_STREAM_HOLDER);
+ if (os != null) {
+ message.setContent(OutputStream.class, os);
+ }
+ message.removeContent(XMLStreamWriter.class);
+ } catch (XMLStreamException e) {
+ throw new Fault(new org.apache.cxf.common.i18n.Message("STAX_WRITE_EXC", BUNDLE), e);
+ }
+ }
+
+ }
}
Modified: cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/StaxOutInterceptor.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/StaxOutInterceptor.java?rev=907887&r1=907886&r2=907887&view=diff
==============================================================================
--- cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/StaxOutInterceptor.java (original)
+++ cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/StaxOutInterceptor.java Tue Feb 9 02:32:19 2010
@@ -161,6 +161,7 @@
XMLStreamWriter xtw = message.getContent(XMLStreamWriter.class);
if (xtw != null) {
xtw.writeEndDocument();
+ xtw.flush();
xtw.close();
}
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java?rev=907887&r1=907886&r2=907887&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java Tue Feb 9 02:32:19 2010
@@ -355,7 +355,9 @@
if (mbw != null) {
try {
mbw.writeTo(o, cls, type, anns, contentType, headers, os);
- os.flush();
+ if (os != null) {
+ os.flush();
+ }
} catch (Exception ex) {
throw new WebApplicationException(ex);
}
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/WebClient.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/WebClient.java?rev=907887&r1=907886&r2=907887&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/WebClient.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/WebClient.java Tue Feb 9 02:32:19 2010
@@ -39,6 +39,7 @@
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.ResponseBuilder;
import javax.ws.rs.core.UriBuilder;
+import javax.xml.stream.XMLStreamWriter;
import org.apache.cxf.Bus;
@@ -620,7 +621,8 @@
public void handleMessage(Message outMessage) throws Fault {
OutputStream os = outMessage.getContent(OutputStream.class);
- if (os == null) {
+ XMLStreamWriter writer = outMessage.getContent(XMLStreamWriter.class);
+ if (os == null && writer == null) {
return;
}
MessageContentsList objs = MessageContentsList.getContentsList(outMessage);
@@ -633,7 +635,9 @@
try {
writeBody(body, outMessage, body.getClass(), body.getClass(), new Annotation[]{},
headers, os);
- os.flush();
+ if (os != null) {
+ os.flush();
+ }
} catch (Exception ex) {
throw new Fault(ex);
}
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=907887&r1=907886&r2=907887&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 Tue Feb 9 02:32:19 2010
@@ -83,6 +83,10 @@
}
public <T> T getContent(Class<T> format) {
+ if (isRequestor() && m.getExchange().getInMessage() != null) {
+ Message inMessage = m.getExchange().getInMessage();
+ return inMessage.getContent(format);
+ }
return m.getContent(format);
}
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java?rev=907887&r1=907886&r2=907887&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java Tue Feb 9 02:32:19 2010
@@ -47,6 +47,7 @@
import org.apache.cxf.interceptor.AbstractOutDatabindingInterceptor;
import org.apache.cxf.io.CachedOutputStream;
import org.apache.cxf.jaxrs.ext.ResponseHandler;
+import org.apache.cxf.jaxrs.impl.MetadataMap;
import org.apache.cxf.jaxrs.lifecycle.ResourceProvider;
import org.apache.cxf.jaxrs.model.ClassResourceInfo;
import org.apache.cxf.jaxrs.model.OperationResourceInfo;
@@ -169,9 +170,15 @@
} else {
message.put(Message.PROTOCOL_HEADERS, response.getMetadata());
}
- MultivaluedMap<String, Object> responseHeaders =
- (MultivaluedMap)message.get(Message.PROTOCOL_HEADERS);
- setResponseDate(responseHeaders, firstTry);
+ Map<String, List<Object>> rh =
+ (Map<String, List<Object>>)message.get(Message.PROTOCOL_HEADERS);
+ MultivaluedMap<String, Object> responseHeaders;
+ if (!(rh instanceof MultivaluedMap)) {
+ responseHeaders = new MetadataMap<String, Object>(rh);
+ } else {
+ responseHeaders = (MultivaluedMap)rh;
+ }
+ setResponseDate((MultivaluedMap)responseHeaders, firstTry);
if (isResponseNull(responseObj)) {
return;
}
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=907887&r1=907886&r2=907887&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 Tue Feb 9 02:32:19 2010
@@ -189,7 +189,6 @@
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) {
@@ -335,9 +334,17 @@
XMLStreamWriter writer = getStreamWriter(obj, os, mt);
if (writer != null) {
if (mc != null) {
+ if (mc.getContent(XMLStreamWriter.class) != null) {
+ ms.setProperty(Marshaller.JAXB_FRAGMENT, true);
+ }
mc.put(XMLStreamWriter.class.getName(), writer);
- }
+ }
marshalToWriter(ms, obj, writer, mt);
+ if (mc != null && mc.getContent(XMLStreamWriter.class) != null) {
+ writer.writeEndDocument();
+ writer.flush();
+ writer.close();
+ }
} else {
marshalToOutputStream(ms, obj, os, mt);
}