Return-Path: Delivered-To: apmail-cxf-commits-archive@www.apache.org Received: (qmail 75846 invoked from network); 9 Feb 2010 02:32:45 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.3) by minotaur.apache.org with SMTP; 9 Feb 2010 02:32:45 -0000 Received: (qmail 16089 invoked by uid 500); 9 Feb 2010 02:32:45 -0000 Delivered-To: apmail-cxf-commits-archive@cxf.apache.org Received: (qmail 16005 invoked by uid 500); 9 Feb 2010 02:32:45 -0000 Mailing-List: contact commits-help@cxf.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@cxf.apache.org Delivered-To: mailing list commits@cxf.apache.org Received: (qmail 15984 invoked by uid 99); 9 Feb 2010 02:32:45 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 09 Feb 2010 02:32:45 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 09 Feb 2010 02:32:42 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 9790723888E8; Tue, 9 Feb 2010 02:32:20 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: 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... Date: Tue, 09 Feb 2010 02:32:20 -0000 To: commits@cxf.apache.org From: dkulp@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20100209023220.9790723888E8@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org 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 { 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 { 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 { + 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 getContent(Class 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 responseHeaders = - (MultivaluedMap)message.get(Message.PROTOCOL_HEADERS); - setResponseDate(responseHeaders, firstTry); + Map> rh = + (Map>)message.get(Message.PROTOCOL_HEADERS); + MultivaluedMap responseHeaders; + if (!(rh instanceof MultivaluedMap)) { + responseHeaders = new MetadataMap(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); }