diff -r b5e266a4356c -r b80b84e87032 jaxws/src/java.xml.soap/share/classes/com/sun/xml/internal/messaging/saaj/soap/MessageFactoryImpl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jaxws/src/java.xml.soap/share/classes/com/sun/xml/internal/messaging/saaj/soap/MessageFactoryImpl.java Sun Aug 17 15:52:15 2014 +0100 @@ -0,0 +1,147 @@ +/* + * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.xml.internal.messaging.saaj.soap; + +import java.io.*; +import java.util.logging.Logger; + +import javax.xml.soap.*; +import javax.xml.stream.XMLStreamReader; + +import com.sun.xml.internal.messaging.saaj.packaging.mime.internet.ContentType; +import com.sun.xml.internal.messaging.saaj.packaging.mime.internet.ParseException; +import com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl; +import com.sun.xml.internal.messaging.saaj.soap.ver1_1.Message1_1Impl; +import com.sun.xml.internal.messaging.saaj.soap.ver1_2.Message1_2Impl; +import com.sun.xml.internal.messaging.saaj.util.LogDomainConstants; +import com.sun.xml.internal.messaging.saaj.util.TeeInputStream; + +/** + * A factory for creating SOAP messages. + * + * Converted to a placeholder for common functionality between SOAP + * implementations. + * + * @author Phil Goodwin (phil.goodwin@sun.com) + */ +public class MessageFactoryImpl extends MessageFactory { + + protected static final Logger log = + Logger.getLogger(LogDomainConstants.SOAP_DOMAIN, + "com.sun.xml.internal.messaging.saaj.soap.LocalStrings"); + + protected OutputStream listener; + + protected boolean lazyAttachments = false; + + public OutputStream listen(OutputStream newListener) { + OutputStream oldListener = listener; + listener = newListener; + return oldListener; + } + + public SOAPMessage createMessage() throws SOAPException { + throw new UnsupportedOperationException(); + } + + public SOAPMessage createMessage(String protocol) throws SOAPException { + if (SOAPConstants.SOAP_1_1_PROTOCOL.equals(protocol)) + return new com.sun.xml.internal.messaging.saaj.soap.ver1_1.Message1_1Impl(); + else + return new com.sun.xml.internal.messaging.saaj.soap.ver1_2.Message1_2Impl(); + } + + public SOAPMessage createMessage(boolean isFastInfoset, + boolean acceptFastInfoset) throws SOAPException + { + throw new UnsupportedOperationException(); + } + + public SOAPMessage createMessage(MimeHeaders headers, XMLStreamReader reader) throws SOAPException, IOException { + String contentTypeString = MessageImpl.getContentType(headers); + + if (listener != null) { + throw new SOAPException("Listener OutputStream is not supported with XMLStreamReader"); + } + + try { + ContentType contentType = new ContentType(contentTypeString); + int stat = MessageImpl.identifyContentType(contentType); + + if (MessageImpl.isSoap1_1Content(stat)) { + return new Message1_1Impl(headers,contentType,stat,reader); + } else if (MessageImpl.isSoap1_2Content(stat)) { + return new Message1_2Impl(headers,contentType,stat,reader); + } else { + log.severe("SAAJ0530.soap.unknown.Content-Type"); + throw new SOAPExceptionImpl("Unrecognized Content-Type"); + } + } catch (ParseException e) { + log.severe("SAAJ0531.soap.cannot.parse.Content-Type"); + throw new SOAPExceptionImpl( + "Unable to parse content type: " + e.getMessage()); + } + } + public SOAPMessage createMessage(MimeHeaders headers, InputStream in) + throws SOAPException, IOException { + String contentTypeString = MessageImpl.getContentType(headers); + + if (listener != null) { + in = new TeeInputStream(in, listener); + } + + try { + ContentType contentType = new ContentType(contentTypeString); + int stat = MessageImpl.identifyContentType(contentType); + + if (MessageImpl.isSoap1_1Content(stat)) { + return new Message1_1Impl(headers,contentType,stat,in); + } else if (MessageImpl.isSoap1_2Content(stat)) { + return new Message1_2Impl(headers,contentType,stat,in); + } else { + log.severe("SAAJ0530.soap.unknown.Content-Type"); + throw new SOAPExceptionImpl("Unrecognized Content-Type"); + } + } catch (ParseException e) { + log.severe("SAAJ0531.soap.cannot.parse.Content-Type"); + throw new SOAPExceptionImpl( + "Unable to parse content type: " + e.getMessage()); + } + } + + protected static final String getContentType(MimeHeaders headers) { + String[] values = headers.getHeader("Content-Type"); + if (values == null) + return null; + else + return values[0]; + } + + public void setLazyAttachmentOptimization(boolean flag) { + lazyAttachments = flag; + } + +}