blob: 9db33bdd1bb66df353f93d4400f3e32798500671 [file] [log] [blame]
/*
* Portions Copyright 2006 Sun Microsystems, Inc. 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. Sun designates this
* particular file as subject to the "Classpath" exception as provided
* by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
package com.sun.xml.internal.ws.encoding.soap;
import com.sun.xml.internal.bind.api.BridgeContext;
import com.sun.xml.internal.bind.api.JAXBRIContext;
import com.sun.xml.internal.ws.client.BindingProviderProperties;
import com.sun.xml.internal.ws.client.dispatch.DispatchContext;
import static com.sun.xml.internal.ws.client.BindingProviderProperties.JAXB_OUTPUTSTREAM;
import com.sun.xml.internal.ws.client.ContextMap;
import com.sun.xml.internal.ws.client.RequestContext;
import com.sun.xml.internal.ws.developer.JAXWSProperties;
import com.sun.xml.internal.ws.encoding.JAXWSAttachmentMarshaller;
import com.sun.xml.internal.ws.encoding.JAXWSAttachmentUnmarshaller;
import com.sun.xml.internal.ws.encoding.jaxb.JAXBBeanInfo;
import com.sun.xml.internal.ws.encoding.jaxb.JAXBBridgeInfo;
import com.sun.xml.internal.ws.encoding.jaxb.RpcLitPayload;
import com.sun.xml.internal.ws.encoding.jaxb.RpcLitPayloadSerializer;
import com.sun.xml.internal.ws.encoding.soap.internal.*;
import com.sun.xml.internal.ws.encoding.soap.message.SOAPFaultInfo;
import com.sun.xml.internal.ws.encoding.soap.streaming.SOAPNamespaceConstants;
import com.sun.xml.internal.ws.handler.HandlerContext;
import com.sun.xml.internal.ws.handler.SOAPHandlerContext;
import com.sun.xml.internal.ws.pept.encoding.Encoder;
import com.sun.xml.internal.ws.pept.ept.MessageInfo;
import com.sun.xml.internal.ws.pept.presentation.MessageStruct;
import com.sun.xml.internal.ws.server.RuntimeContext;
import com.sun.xml.internal.ws.server.ServerRtException;
import com.sun.xml.internal.ws.spi.runtime.InternalSoapEncoder;
import com.sun.xml.internal.ws.spi.runtime.MtomCallback;
import com.sun.xml.internal.ws.streaming.SourceReaderFactory;
import com.sun.xml.internal.ws.streaming.XMLStreamWriterFactory;
import com.sun.xml.internal.ws.util.ByteArrayBuffer;
import com.sun.xml.internal.ws.util.DOMUtil;
import com.sun.xml.internal.ws.util.MessageInfoUtil;
import com.sun.xml.internal.ws.util.xml.XmlUtil;
import org.w3c.dom.Document;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPMessage;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import javax.xml.stream.XMLStreamWriter;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.dom.DOMResult;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import javax.xml.ws.BindingProvider;
import javax.xml.ws.WebServiceException;
import javax.xml.ws.soap.SOAPBinding;
import java.io.OutputStream;
import java.nio.ByteBuffer;
import java.util.List;
import java.util.Map;
/**
* @author WS Development Team
*/
public abstract class SOAPEncoder implements Encoder, InternalSoapEncoder {
/*
* @see Encoder#encodeAndSend(MessageInfo)
*/
public void encodeAndSend(MessageInfo messageInfo) {
throw new UnsupportedOperationException();
}
/*
* @see Encoder#encode(MessageInfo)
*/
public ByteBuffer encode(MessageInfo messageInfo) {
throw new UnsupportedOperationException();
}
public InternalMessage toInternalMessage(MessageInfo messageInfo) {
return null;
}
public DOMSource toDOMSource(JAXBBridgeInfo bridgeInfo, MessageInfo messageInfo) {
RuntimeContext rtCtxt = MessageInfoUtil.getRuntimeContext(messageInfo);
BridgeContext bridgeContext = rtCtxt.getBridgeContext();
Document doc = DOMUtil.createDom();
bridgeInfo.serialize(bridgeContext, doc);
return new DOMSource(doc);
}
public DOMSource toDOMSource(RpcLitPayload rpcLitPayload, MessageInfo messageInfo) {
try {
ByteArrayBuffer baos = new ByteArrayBuffer();
XMLStreamWriter writer = XMLStreamWriterFactory.createXMLStreamWriter(baos);
writeRpcLitPayload(rpcLitPayload, messageInfo, writer);
writer.close();
baos.close();
Transformer transformer = XmlUtil.newTransformer();
StreamSource source = new StreamSource(baos.newInputStream());
DOMResult domResult = new DOMResult();
transformer.transform(source, domResult);
return new DOMSource(domResult.getNode());
} catch (TransformerException te) {
throw new WebServiceException(te);
} catch (XMLStreamException e) {
throw new WebServiceException(e);
}
}
public DOMSource toDOMSource(SOAPFaultInfo faultInfo, MessageInfo messageInfo) {
try {
ByteArrayBuffer baos = new ByteArrayBuffer();
XMLStreamWriter writer = XMLStreamWriterFactory.createXMLStreamWriter(baos);
writeFault(faultInfo, messageInfo, writer);
writer.writeEndDocument();
writer.close();
baos.close();
Transformer transformer = XmlUtil.newTransformer();
StreamSource source = new StreamSource(baos.newInputStream());
DOMResult domResult = new DOMResult();
transformer.transform(source, domResult);
return new DOMSource(domResult.getNode());
}
catch (TransformerException te) {
throw new WebServiceException(te);
}
catch (XMLStreamException xe) {
throw new WebServiceException(xe);
}
}
protected void writeRpcLitPayload(RpcLitPayload rpcLitPayload, MessageInfo messageInfo,
XMLStreamWriter writer) {
RuntimeContext rtCtxt = MessageInfoUtil.getRuntimeContext(messageInfo);
BridgeContext bridgeContext = rtCtxt.getBridgeContext();
RpcLitPayloadSerializer.serialize(rpcLitPayload, bridgeContext, messageInfo, writer);
}
protected void writeRpcLitPayload(RpcLitPayload rpcLitPayload, MessageInfo messageInfo,
OutputStream writer) {
RuntimeContext rtCtxt = MessageInfoUtil.getRuntimeContext(messageInfo);
BridgeContext bridgeContext = rtCtxt.getBridgeContext();
RpcLitPayloadSerializer.serialize(rpcLitPayload, bridgeContext, writer);
}
protected JAXBContext getJAXBContext(MessageInfo messageInfo) {
JAXBContext jc = null;
RequestContext context = (RequestContext) messageInfo.getMetaData(BindingProviderProperties.JAXWS_CONTEXT_PROPERTY);
if (context != null)
jc = (JAXBContext) context.get(BindingProviderProperties.JAXB_CONTEXT_PROPERTY);
return jc;
}
private void writeJAXBBeanInfo(JAXBBeanInfo beanInfo, MessageInfo messageInfo,
XMLStreamWriter writer) {
// Pass output stream directly to JAXB when available
OutputStream os = (OutputStream) messageInfo.getMetaData(JAXB_OUTPUTSTREAM);
Marshaller m = (Marshaller) messageInfo.getMetaData(BindingProviderProperties.DISPATCH_MARSHALLER);
Unmarshaller u = (Unmarshaller) messageInfo.getMetaData(BindingProviderProperties.DISPATCH_UNMARSHALLER);
beanInfo.setMarshallers(m, u);
if (os != null) {
try {
/*
* Make sure that current element is closed before passing the
* output stream to JAXB. Using Zephyr, it suffices to write
* an empty string (TODO: other StAX impls?).
*/
writer.writeCharacters("");
// Flush output of StAX serializer
writer.flush();
}
catch (XMLStreamException e) {
throw new WebServiceException(e);
}
beanInfo.writeTo(os);
} else {
beanInfo.writeTo(writer);
}
}
private void writeJAXBBeanInfo(JAXBBeanInfo beanInfo, OutputStream writer) {
beanInfo.writeTo(writer);
}
/*
protected void writeJAXBTypeInfo(JAXBTypeInfo typeInfo, XMLStreamWriter writer) {
QName name = typeInfo.getName();
Object value = typeInfo.getType();
writeJAXBTypeInfo(name, value, writer);
}
protected void writeJAXBTypeInfo(QName name, Object value, XMLStreamWriter writer) {
JAXBContext jaxbContext = encoderDecoderUtil.getJAXBContext();
Map<QName, Class> typeMapping = encoderDecoderUtil.getTypeMapping();
Class type = typeMapping.get(name);
JAXBTypeSerializer.getInstance().serialize(name, type, value,
writer, jaxbContext);
}
*/
protected void writeJAXBBridgeInfo(JAXBBridgeInfo bridgeInfo,
MessageInfo messageInfo, XMLStreamWriter writer) {
RuntimeContext rtCtxt = MessageInfoUtil.getRuntimeContext(messageInfo);
BridgeContext bridgeContext = rtCtxt.getBridgeContext();
// Pass output stream directly to JAXB when available
OutputStream os = (OutputStream) messageInfo.getMetaData(JAXB_OUTPUTSTREAM);
if (os != null) {
try {
/*
* Make sure that current element is closed before passing the
* output stream to JAXB. Using Zephyr, it suffices to write
* an empty string (TODO: other StAX impls?).
*/
writer.writeCharacters("");
// Flush output of StAX serializer
writer.flush();
}
catch (XMLStreamException e) {
throw new WebServiceException(e);
}
bridgeInfo.serialize(bridgeContext, os, writer.getNamespaceContext());
} else {
bridgeInfo.serialize(bridgeContext, writer);
}
}
protected void writeJAXBBridgeInfo(JAXBBridgeInfo bridgeInfo,
MessageInfo messageInfo, OutputStream writer) {
RuntimeContext rtCtxt = MessageInfoUtil.getRuntimeContext(messageInfo);
BridgeContext bridgeContext = rtCtxt.getBridgeContext();
bridgeInfo.serialize(bridgeContext, writer, null);
}
public SOAPMessage toSOAPMessage(InternalMessage internalMessage, MessageInfo messageInfo) {
return null;
}
/*
* Replace the body in SOAPMessage with the BodyBlock of InternalMessage
*/
public SOAPMessage toSOAPMessage(InternalMessage internalMessage,
SOAPMessage soapMessage) {
try {
BodyBlock bodyBlock = internalMessage.getBody();
if (bodyBlock == null)
return soapMessage;
Object value = bodyBlock.getValue();
if (value == null) {
return soapMessage;
}
if (value instanceof Source) {
Source source = (Source) value;
SOAPBody body = soapMessage.getSOAPBody();
body.removeContents();
Transformer transformer = XmlUtil.newTransformer();
transformer.transform(source, new DOMResult(body));
} else {
throw new UnsupportedOperationException("Unknown object in BodyBlock:" + value.getClass());
}
return soapMessage;
} catch (Exception e) {
throw new ServerRtException("soapencoder.err", new Object[]{e});
}
}
public static void serializeReader(XMLStreamReader reader, XMLStreamWriter writer) {
try {
int state;
do {
state = reader.next();
switch (state) {
case XMLStreamConstants.START_ELEMENT:
/*
* TODO: Is this necessary, shouldn't zephyr return "" instead of
* null for getNamespaceURI() and getPrefix()?
*/
String uri = reader.getNamespaceURI();
String prefix = reader.getPrefix();
String localName = reader.getLocalName();
if (prefix == null) {
if (uri == null) {
writer.writeStartElement(localName);
} else {
writer.writeStartElement(uri, localName);
}
} else {
assert uri != null;
if (prefix.length() > 0) {
/**
* Before we write the
*/
String writerURI = null;
if (writer.getNamespaceContext() != null)
writerURI = writer.getNamespaceContext().getNamespaceURI(prefix);
String writerPrefix = writer.getPrefix(uri);
if (declarePrefix(prefix, uri, writerPrefix, writerURI))
{
writer.writeStartElement(prefix, localName, uri);
writer.setPrefix(prefix, uri != null ? uri : "");
writer.writeNamespace(prefix, uri);
} else {
writer.writeStartElement(prefix, localName, uri);
}
} else {
writer.writeStartElement(prefix, localName, uri);
}
}
int n = reader.getNamespaceCount();
// Write namespace declarations
for (int i = 0; i < n; i++) {
String nsPrefix = reader.getNamespacePrefix(i);
if (nsPrefix == null) nsPrefix = "";
// StAX returns null for default ns
String writerURI = null;
if (writer.getNamespaceContext() != null)
writerURI = writer.getNamespaceContext().getNamespaceURI(nsPrefix);
// Zephyr: Why is this returning null?
// Compare nsPrefix with prefix because of [1] (above)
String readerURI = reader.getNamespaceURI(i);
/**
* write the namespace in 3 conditions
* - when the namespace URI is not bound to the prefix in writer(writerURI == 0)
* - when the readerPrefix and writerPrefix are ""
* - when readerPrefix and writerPrefix are not equal and the URI bound to them
* are different
*/
if (writerURI == null || ((nsPrefix.length() == 0) || (prefix.length() == 0)) ||
(!nsPrefix.equals(prefix) && !writerURI.equals(readerURI)))
{
writer.setPrefix(nsPrefix, readerURI != null ? readerURI : "");
writer.writeNamespace(nsPrefix, readerURI != null ? readerURI : "");
}
}
// Write attributes
n = reader.getAttributeCount();
for (int i = 0; i < n; i++) {
String attrPrefix = reader.getAttributePrefix(i);
String attrURI = reader.getAttributeNamespace(i);
writer.writeAttribute(attrPrefix != null ? attrPrefix : "",
attrURI != null ? attrURI : "",
reader.getAttributeLocalName(i),
reader.getAttributeValue(i));
// if the attribute prefix is undeclared in current writer scope then declare it
setUndeclaredPrefix(attrPrefix, attrURI, writer);
}
break;
case XMLStreamConstants.END_ELEMENT:
writer.writeEndElement();
break;
case XMLStreamConstants.CHARACTERS:
writer.writeCharacters(reader.getText());
}
} while (state != XMLStreamConstants.END_DOCUMENT);
}
catch (XMLStreamException e) {
throw new WebServiceException(e);
}
}
/**
* sets undeclared prefixes on the writer
*
* @param prefix
* @param writer
* @throws XMLStreamException
*/
private static void setUndeclaredPrefix(String prefix, String readerURI, XMLStreamWriter writer) throws XMLStreamException {
String writerURI = null;
if (writer.getNamespaceContext() != null)
writerURI = writer.getNamespaceContext().getNamespaceURI(prefix);
if (writerURI == null) {
writer.setPrefix(prefix, readerURI != null ? readerURI : "");
writer.writeNamespace(prefix, readerURI != null ? readerURI : "");
}
}
/**
* check if we need to declare
*
* @param rPrefix
* @param rUri
* @param wPrefix
* @param wUri
* @return
*/
private static boolean declarePrefix(String rPrefix, String rUri, String wPrefix, String wUri) {
if (wUri == null || ((wPrefix != null) && !rPrefix.equals(wPrefix)) ||
(rUri != null && !wUri.equals(rUri)))
return true;
return false;
}
protected void serializeSource(Source source, XMLStreamWriter writer) {
try {
XMLStreamReader reader = SourceReaderFactory.createSourceReader(source, true);
serializeReader(reader, writer);
reader.close();
}
catch (XMLStreamException e) {
throw new WebServiceException(e);
}
}
protected void serializeSource(Source source, OutputStream writer) {
try {
Transformer t = XmlUtil.newTransformer();
t.transform(source, new StreamResult(writer));
}
catch (Exception e) {
throw new WebServiceException(e);
}
}
/*
* writes start tag of envelope: <env:Envelope>
*/
protected void startEnvelope(XMLStreamWriter writer) {
try {
//write SOAP Envelope
writer.writeStartElement(SOAPNamespaceConstants.NSPREFIX_SOAP_ENVELOPE,
SOAPNamespaceConstants.TAG_ENVELOPE, SOAPNamespaceConstants.ENVELOPE);
writer.setPrefix(SOAPNamespaceConstants.NSPREFIX_SOAP_ENVELOPE,
SOAPNamespaceConstants.ENVELOPE);
writer.writeNamespace(SOAPNamespaceConstants.NSPREFIX_SOAP_ENVELOPE,
SOAPNamespaceConstants.ENVELOPE);
}
catch (XMLStreamException e) {
throw new WebServiceException(e);
}
}
/*
* write the known namespace declaration to the envelope
*/
protected void writeEnvelopeNamespaces(XMLStreamWriter writer, MessageInfo messageInfo)
throws XMLStreamException {
RuntimeContext rtCtxt = MessageInfoUtil.getRuntimeContext(messageInfo);
if (rtCtxt != null && rtCtxt.getModel() != null) {
writer.setPrefix("xsd", SOAPNamespaceConstants.XSD);
writer.writeNamespace("xsd", SOAPNamespaceConstants.XSD);
int i = 1;
String prefix;
for (String namespace : rtCtxt.getModel().getKnownNamespaceURIs()) {
prefix = "ns" + i++;
writer.setPrefix(prefix, namespace);
writer.writeNamespace(prefix, namespace);
}
writer.writeCharacters("");
}
}
/*
* writes start tag of Body: <env:Body>
*/
protected void startBody(XMLStreamWriter writer) {
try {
//write SOAP Body
writer.writeStartElement(SOAPNamespaceConstants.NSPREFIX_SOAP_ENVELOPE,
SOAPNamespaceConstants.TAG_BODY, SOAPNamespaceConstants.ENVELOPE);
}
catch (XMLStreamException e) {
throw new WebServiceException(e);
}
}
/*
* writes start tag of Header: <env:Header>
*/
protected void startHeader(XMLStreamWriter writer) {
try {
writer.writeStartElement(SOAPNamespaceConstants.NSPREFIX_SOAP_ENVELOPE,
SOAPNamespaceConstants.TAG_HEADER, SOAPNamespaceConstants.ENVELOPE); // <env:Header>
}
catch (XMLStreamException e) {
throw new WebServiceException(e);
}
}
/*
* writes multiple header elements in <env:Header> ... </env:Header>
*/
protected void writeHeaders(XMLStreamWriter writer, InternalMessage response,
MessageInfo messageInfo) {
try {
List<HeaderBlock> headerBlocks = response.getHeaders();
if (headerBlocks == null || headerBlocks.isEmpty()) {
return;
}
startHeader(writer); // <env:Header>
for (HeaderBlock headerBlock : headerBlocks) {
Object value = headerBlock.getValue();
if (value != null) {
if (value instanceof JAXBBridgeInfo) {
writeJAXBBridgeInfo((JAXBBridgeInfo) value,
messageInfo, writer);
} else {
throw new SerializationException("unknown.object",
value.getClass().getName());
}
} else {
// currently only in soap 1.2
if (headerBlock instanceof SOAP12NotUnderstoodHeaderBlock) {
((SOAP12NotUnderstoodHeaderBlock) headerBlock).write(
writer);
}
}
}
writer.writeEndElement(); // </env:Header>
}
catch (XMLStreamException e) {
throw new WebServiceException(e);
}
}
/*
* writes <env:Body> ... </env:Body>
*/
protected void writeBody(XMLStreamWriter writer, InternalMessage response,
MessageInfo messageInfo) {
try {
startBody(writer);
BodyBlock bodyBlock = response.getBody();
// BodyBlock can be null if there is no part in wsdl:message
if (bodyBlock != null) {
Object value = bodyBlock.getValue();
if (value instanceof JAXBBridgeInfo) {
writeJAXBBridgeInfo((JAXBBridgeInfo) value, messageInfo, writer);
} else if (value instanceof RpcLitPayload) {
writeRpcLitPayload((RpcLitPayload) value, messageInfo, writer);
} else if (value instanceof Source) {
serializeSource((Source) value, writer);
} else if (value instanceof SOAPFaultInfo) {
writeFault((SOAPFaultInfo) value, messageInfo, writer);
} else if (value instanceof JAXBBeanInfo) {
if (((JAXBBeanInfo)value).getBean() != null && (DispatchContext)
messageInfo.getMetaData(BindingProviderProperties.DISPATCH_CONTEXT) != null)
writeJAXBBeanInfo((JAXBBeanInfo) value, messageInfo, writer);
} else if (value == null && (DispatchContext)
messageInfo.getMetaData(BindingProviderProperties.DISPATCH_CONTEXT) != null) {
//bug 6400596 -Dispatch and null invocation parameter payload mode
//can skip this here as we want to write and empty SOAPBody
//writeJAXBBeanInfo((JAXBBeanInfo) value, messageInfo, writer);
} else {
throw new SerializationException("unknown.object",
value.getClass().getName());
}
}
writer.writeEndElement(); // </env:body>
}
catch (XMLStreamException e) {
throw new WebServiceException(e);
}
}
/**
* Pass reference of attachments Map from InternalMessage to JAXWSAttachmentMarshaller.
*
* @param mi
* @param im
*/
public void setAttachmentsMap(MessageInfo mi, InternalMessage im) {
Object rtc = mi.getMetaData(BindingProviderProperties.JAXWS_RUNTIME_CONTEXT);
if (rtc != null) {
BridgeContext bc = ((RuntimeContext) rtc).getBridgeContext();
if (bc == null)
return;
JAXWSAttachmentMarshaller am = (JAXWSAttachmentMarshaller) bc.getAttachmentMarshaller();
am.setAttachments(im.getAttachments());
am.setHandlerContaxt(((RuntimeContext) rtc).getHandlerContext());
HandlerContext hc = ((RuntimeContext) rtc).getHandlerContext();
Object mtomThreshold;
if (hc == null) {
//to be removed when client guarantees handlerContext
mtomThreshold = mi.getMetaData(JAXWSProperties.MTOM_THRESHOLOD_VALUE);
} else {
mtomThreshold = hc.getMessageContext().get(JAXWSProperties.MTOM_THRESHOLOD_VALUE);
}
if (mtomThreshold != null)
am.setMtomThresholdValue((Integer) mtomThreshold);
} else if (mi.getMetaData(BindingProviderProperties.DISPATCH_CONTEXT) != null){
ContextMap map = (ContextMap) mi.getMetaData(BindingProviderProperties.JAXWS_CONTEXT_PROPERTY);
BindingProvider provider = (BindingProvider)
map.get(BindingProviderProperties.JAXWS_CLIENT_HANDLE_PROPERTY);
JAXBContext jc = (JAXBContext) map.get(BindingProviderProperties.JAXB_CONTEXT_PROPERTY);
if (jc != null) {
try {
Marshaller m = jc.createMarshaller();
Unmarshaller um = jc.createUnmarshaller();
JAXWSAttachmentMarshaller am =
new JAXWSAttachmentMarshaller(((SOAPBinding) provider.getBinding()).isMTOMEnabled());
JAXWSAttachmentUnmarshaller uam = new JAXWSAttachmentUnmarshaller();
am.setAttachments(im.getAttachments());
m.setAttachmentMarshaller(am);
um.setAttachmentUnmarshaller(uam);
mi.setMetaData(BindingProviderProperties.DISPATCH_MARSHALLER, m);
mi.setMetaData(BindingProviderProperties.DISPATCH_UNMARSHALLER, um);
//set handlerContext
am.setHandlerContaxt((SOAPHandlerContext)
mi.getMetaData(BindingProviderProperties.JAXWS_HANDLER_CONTEXT_PROPERTY));
HandlerContext hc =
(HandlerContext)mi.getMetaData(BindingProviderProperties.JAXWS_HANDLER_CONTEXT_PROPERTY);
//set XOP optimization to true for jaxb
am.setXOPPackage(((SOAPBinding)provider.getBinding()).isMTOMEnabled());
uam.setXOPPackage(((SOAPBinding)provider.getBinding()).isMTOMEnabled());
Object mtomThreshold;
if (hc == null) {
//to be removed when client guarantees handlerContext
mtomThreshold = mi.getMetaData(JAXWSProperties.MTOM_THRESHOLOD_VALUE);
} else {
mtomThreshold = hc.getMessageContext().get(JAXWSProperties.MTOM_THRESHOLOD_VALUE);
}
if (mtomThreshold != null)
am.setMtomThresholdValue((Integer) mtomThreshold);
} catch (Exception e) {
throw new WebServiceException(e);
}
}
}
}
/**
* Add all the attachments in the InternalMessage to the SOAPMessage
*
* @param im
* @param msg
*/
protected void processAttachments(InternalMessage im, SOAPMessage msg) throws SOAPException {
for (Map.Entry<String, AttachmentBlock> e : im.getAttachments().entrySet()) {
AttachmentBlock block = e.getValue();
block.addTo(msg);
}
}
/*
* writes end tag of envelope: </env:Envelope>
*/
protected void endEnvelope(XMLStreamWriter writer) {
try {
writer.writeEndElement();
}
catch (XMLStreamException e) {
throw new WebServiceException(e);
}
}
protected void writeFault(SOAPFaultInfo instance, MessageInfo messageInfo, XMLStreamWriter writer) {
throw new UnsupportedOperationException();
}
protected void writeFault(SOAPFaultInfo instance, MessageInfo messageInfo, OutputStream out) {
XMLStreamWriter writer = XMLStreamWriterFactory.createXMLStreamWriter(out);
writeFault(instance, messageInfo, writer);
}
public void write(Object value, Object obj, OutputStream writer, MtomCallback mtomCallback) {
if (!(obj instanceof MessageInfo))
throw new SerializationException("incorrect.messageinfo", obj.getClass().getName());
MessageInfo mi = (MessageInfo) obj;
Object rtc = mi.getMetaData(BindingProviderProperties.JAXWS_RUNTIME_CONTEXT);
if (rtc != null) {
BridgeContext bc = ((RuntimeContext) rtc).getBridgeContext();
if (bc != null) {
JAXWSAttachmentMarshaller am = (JAXWSAttachmentMarshaller)
((RuntimeContext) rtc).getBridgeContext().getAttachmentMarshaller();
am.setMtomCallback(mtomCallback);
}
} else {
//dispatch
Marshaller m = (Marshaller)mi.getMetaData(BindingProviderProperties.DISPATCH_MARSHALLER);
if (m != null) {
JAXWSAttachmentMarshaller am = (JAXWSAttachmentMarshaller)m.getAttachmentMarshaller();
am.setMtomCallback(mtomCallback);
}
}
if (value instanceof JAXBBridgeInfo) {
writeJAXBBridgeInfo((JAXBBridgeInfo) value, mi, writer);
} else if (value instanceof RpcLitPayload) {
writeRpcLitPayload((RpcLitPayload) value, mi, writer);
} else if (value instanceof Source) {
serializeSource((Source) value, writer);
} else if (value instanceof SOAPFaultInfo) {
writeFault((SOAPFaultInfo) value, mi, writer);
} else if (value instanceof JAXBBeanInfo) {
writeJAXBBeanInfo((JAXBBeanInfo) value, writer);
} else {
throw new SerializationException("unknown.object", value.getClass().getName());
}
}
public void write(Object value, Object obj, XMLStreamWriter writer, MtomCallback mtomCallback) {
if (!(obj instanceof MessageInfo))
throw new SerializationException("incorrect.messageinfo", obj.getClass().getName());
MessageInfo mi = (MessageInfo) obj;
Object rtc = mi.getMetaData(BindingProviderProperties.JAXWS_RUNTIME_CONTEXT);
if (rtc != null) {
BridgeContext bc = ((RuntimeContext) rtc).getBridgeContext();
if (bc != null) {
JAXWSAttachmentMarshaller am = (JAXWSAttachmentMarshaller) ((RuntimeContext) rtc).getBridgeContext().getAttachmentMarshaller();
am.setMtomCallback(mtomCallback);
}
} else {
//dispatch
Marshaller m = (Marshaller)mi.getMetaData(BindingProviderProperties.DISPATCH_MARSHALLER);
if (m != null) {
JAXWSAttachmentMarshaller am = (JAXWSAttachmentMarshaller)m.getAttachmentMarshaller();
am.setMtomCallback(mtomCallback);
}
}
if (value instanceof JAXBBridgeInfo) {
writeJAXBBridgeInfo((JAXBBridgeInfo) value, mi, writer);
} else if (value instanceof RpcLitPayload) {
writeRpcLitPayload((RpcLitPayload) value, mi, writer);
} else if (value instanceof Source) {
serializeSource((Source) value, writer);
} else if (value instanceof SOAPFaultInfo) {
writeFault((SOAPFaultInfo) value, mi, writer);
} else if (value instanceof JAXBBeanInfo) {
writeJAXBBeanInfo((JAXBBeanInfo) value, mi, writer);
} else {
throw new SerializationException("unknown.object", value.getClass().getName());
}
}
}