Author: dkulp
Date: Tue Mar 30 11:51:11 2010
New Revision: 929096
URL: http://svn.apache.org/viewvc?rev=929096&view=rev
Log:
Recorded merge of revisions 907887 via svnmerge from
https://svn.apache.org/repos/asf/cxf/trunk
........
r907887 | dkulp | 2010-02-08 21:32:19 -0500 (Mon, 08 Feb 2010) | 2 lines
Use the FI internal stuff directly. The Stax factories are a LOT
slower and almost defeats the purpose of FI.
........
Modified:
cxf/branches/2.2.x-fixes/ (props changed)
cxf/branches/2.2.x-fixes/rt/core/src/main/java/org/apache/cxf/interceptor/FIStaxInInterceptor.java
cxf/branches/2.2.x-fixes/rt/core/src/main/java/org/apache/cxf/interceptor/FIStaxOutInterceptor.java
cxf/branches/2.2.x-fixes/rt/core/src/main/java/org/apache/cxf/interceptor/StaxOutInterceptor.java
cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java
cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/WebClient.java
cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ext/MessageContextImpl.java
cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java
cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JAXBElementProvider.java
Propchange: cxf/branches/2.2.x-fixes/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Mar 30 11:51:11 2010
@@ -1 +1 @@
-/cxf/trunk:925337,925378,925995,927169
+/cxf/trunk:907887,925337,925378,925995,927169
Propchange: cxf/branches/2.2.x-fixes/
------------------------------------------------------------------------------
Binary property 'svnmerge-blocked' - no diff available.
Propchange: cxf/branches/2.2.x-fixes/
------------------------------------------------------------------------------
Binary property 'svnmerge-integrated' - no diff available.
Modified:
cxf/branches/2.2.x-fixes/rt/core/src/main/java/org/apache/cxf/interceptor/FIStaxInInterceptor.java
URL:
http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/rt/core/src/main/java/org/apache/cxf/interceptor/FIStaxInInterceptor.java?rev=929096&r1=929095&r2=929096&view=diff
==============================================================================
---
cxf/branches/2.2.x-fixes/rt/core/src/main/java/org/apache/cxf/interceptor/FIStaxInInterceptor.java
(original)
+++
cxf/branches/2.2.x-fixes/rt/core/src/main/java/org/apache/cxf/interceptor/FIStaxInInterceptor.java
Tue Mar 30 11:51:11 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 @@ import org.apache.cxf.phase.Phase;
*/
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 @@ public class FIStaxInInterceptor extends
return
Boolean.TRUE.equals(message.containsKey(Message.REQUESTOR_ROLE));
}
+ private 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.getContent(XMLStreamReader.class) != null
|| !isHttpVerbSupported(message)) {
@@ -60,8 +66,11 @@ public class FIStaxInInterceptor extends
}
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/branches/2.2.x-fixes/rt/core/src/main/java/org/apache/cxf/interceptor/FIStaxOutInterceptor.java
URL:
http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/rt/core/src/main/java/org/apache/cxf/interceptor/FIStaxOutInterceptor.java?rev=929096&r1=929095&r2=929096&view=diff
==============================================================================
---
cxf/branches/2.2.x-fixes/rt/core/src/main/java/org/apache/cxf/interceptor/FIStaxOutInterceptor.java
(original)
+++
cxf/branches/2.2.x-fixes/rt/core/src/main/java/org/apache/cxf/interceptor/FIStaxOutInterceptor.java
Tue Mar 30 11:51:11 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 @@ import org.apache.cxf.phase.Phase;
*/
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 @@ public class FIStaxOutInterceptor extend
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 @@ public class FIStaxOutInterceptor extend
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 @@ public class FIStaxOutInterceptor extend
} 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/branches/2.2.x-fixes/rt/core/src/main/java/org/apache/cxf/interceptor/StaxOutInterceptor.java
URL:
http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/rt/core/src/main/java/org/apache/cxf/interceptor/StaxOutInterceptor.java?rev=929096&r1=929095&r2=929096&view=diff
==============================================================================
---
cxf/branches/2.2.x-fixes/rt/core/src/main/java/org/apache/cxf/interceptor/StaxOutInterceptor.java
(original)
+++
cxf/branches/2.2.x-fixes/rt/core/src/main/java/org/apache/cxf/interceptor/StaxOutInterceptor.java
Tue Mar 30 11:51:11 2010
@@ -161,6 +161,7 @@ public class StaxOutInterceptor extends
XMLStreamWriter xtw =
message.getContent(XMLStreamWriter.class);
if (xtw != null) {
xtw.writeEndDocument();
+ xtw.flush();
xtw.close();
}
Modified:
cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java
URL:
http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java?rev=929096&r1=929095&r2=929096&view=diff
==============================================================================
---
cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java
(original)
+++
cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java
Tue Mar 30 11:51:11 2010
@@ -390,7 +390,9 @@ public class AbstractClient implements C
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/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/WebClient.java
URL:
http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/WebClient.java?rev=929096&r1=929095&r2=929096&view=diff
==============================================================================
---
cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/WebClient.java
(original)
+++
cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/WebClient.java
Tue Mar 30 11:51:11 2010
@@ -41,6 +41,7 @@ import javax.ws.rs.core.PathSegment;
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;
import org.apache.cxf.bus.spring.SpringBusFactory;
@@ -632,7 +633,8 @@ public class WebClient extends AbstractC
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);
@@ -645,7 +647,9 @@ public class WebClient extends AbstractC
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/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ext/MessageContextImpl.java
URL:
http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ext/MessageContextImpl.java?rev=929096&r1=929095&r2=929096&view=diff
==============================================================================
---
cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ext/MessageContextImpl.java
(original)
+++
cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ext/MessageContextImpl.java
Tue Mar 30 11:51:11 2010
@@ -83,6 +83,10 @@ public class MessageContextImpl implemen
}
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/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java
URL:
http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java?rev=929096&r1=929095&r2=929096&view=diff
==============================================================================
---
cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java
(original)
+++
cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java
Tue Mar 30 11:51:11 2010
@@ -47,6 +47,7 @@ import org.apache.cxf.common.logging.Log
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 @@ public class JAXRSOutInterceptor extends
} 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/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JAXBElementProvider.java
URL:
http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JAXBElementProvider.java?rev=929096&r1=929095&r2=929096&view=diff
==============================================================================
---
cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JAXBElementProvider.java
(original)
+++
cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JAXBElementProvider.java
Tue Mar 30 11:51:11 2010
@@ -193,7 +193,6 @@ public class JAXBElementProvider extends
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) {
@@ -367,9 +366,17 @@ public class JAXBElementProvider extends
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);
}