org.apache.axis2.jaxws.message.util.MessageUtils Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of axis2-jaxws Show documentation
Show all versions of axis2-jaxws Show documentation
Axis2 JAXWS Implementation
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.axis2.jaxws.message.util;
import org.apache.axiom.soap.SOAPEnvelope;
import org.apache.axis2.AxisFault;
import org.apache.axis2.Constants;
import org.apache.axis2.Constants.Configuration;
import org.apache.axis2.context.ConfigurationContext;
import org.apache.axis2.context.MessageContext;
import org.apache.axis2.context.OperationContext;
import org.apache.axis2.jaxws.ExceptionFactory;
import org.apache.axis2.jaxws.handler.AttachmentsAdapter;
import org.apache.axis2.jaxws.handler.SOAPHeadersAdapter;
import org.apache.axis2.jaxws.handler.TransportHeadersAdapter;
import org.apache.axis2.jaxws.i18n.Messages;
import org.apache.axis2.jaxws.message.Message;
import org.apache.axis2.jaxws.message.Protocol;
import org.apache.axis2.jaxws.message.factory.MessageFactory;
import org.apache.axis2.jaxws.registry.FactoryRegistry;
import org.apache.axis2.jaxws.utility.JavaUtils;
import org.apache.axis2.transport.http.HTTPConstants;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import javax.activation.DataHandler;
import javax.xml.soap.AttachmentPart;
import javax.xml.soap.SOAPMessage;
import javax.xml.ws.WebServiceException;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.Map;
/** Miscellaneous Utilities that may be useful inside and outside the Message subcomponent. */
public class MessageUtils {
private static final Log log = LogFactory.getLog(MessageUtils.class);
/**
* Create an SAAJ AttachmentPart from a JAXWS Attachment
* @param cid String content id
* @param dh DataHandler
* @param message SOAPMessage
* @return AttachmentPart
*/
public static AttachmentPart createAttachmentPart(String cid, DataHandler dh, SOAPMessage message) {
// Create the Attachment Part
AttachmentPart ap = message.createAttachmentPart(dh);
// REVIEW
// Do we need to copy the content type from the datahandler ?
// Preserve the original content id
ap.setContentId(cid);
return ap;
}
/**
* Create a JAX-WS Message from the information on an Axis 2 Message Context
*
* @param msgContext
* @return Message
*/
public static Message getMessageFromMessageContext(MessageContext msgContext)
throws WebServiceException {
if (log.isDebugEnabled()) {
log.debug("Start getMessageFromMessageContext");
}
Message message = null;
// If the Axis2 MessageContext that was passed in has a SOAPEnvelope
// set on it, grab that and create a JAX-WS Message out of it.
SOAPEnvelope soapEnv = msgContext.getEnvelope();
if (soapEnv != null) {
MessageFactory msgFactory =
(MessageFactory)FactoryRegistry.getFactory(MessageFactory.class);
try {
Protocol protocol = msgContext.isDoingREST() ? Protocol.rest : null;
message = msgFactory.createFrom(soapEnv, protocol);
} catch (Exception e) {
throw ExceptionFactory.makeWebServiceException(
Messages.getMessage("msgFromMsgErr"), e);
}
Object property = msgContext.getProperty(Constants.Configuration.ENABLE_MTOM);
if (property != null && JavaUtils.isTrueExplicitly(property)) {
message.setMTOMEnabled(true);
}
// Add all the MimeHeaders from the Axis2 MessageContext
Map headerMap = (Map)msgContext.getProperty(MessageContext.TRANSPORT_HEADERS);
if (headerMap != null) {
message.setMimeHeaders(headerMap);
}
// TODO: This is a WORKAROUND for missing SOAPFault data. If we do a toString on the
// SOAPEnvelope, then all the data will be available to the provider. Otherwise, it
// will be missing the element corresponding to the element.
// The SOAPFaultProviderTests will check for this failure.
if (soapEnv.hasFault()) {
soapEnv.toString();
}
}
return message;
}
/**
* Put the JAX-WS Message onto the Axis2 MessageContext
*
* @param message JAX-WS Message
* @param msgContext Axis2MessageContext
*/
public static void putMessageOnMessageContext(Message message, MessageContext msgContext)
throws AxisFault, WebServiceException {
// Put the XML message on the Axis 2 Message Context
SOAPEnvelope envelope = (SOAPEnvelope)message.getAsOMElement();
msgContext.setEnvelope(envelope);
// Put the Headers onto the MessageContext
Map headerMap = message.getMimeHeaders();
msgContext.setProperty(MessageContext.TRANSPORT_HEADERS, headerMap);
msgContext.setProperty(HTTPConstants.HTTP_HEADERS, headerMap);
if (message.getProtocol() == Protocol.rest) {
msgContext.setDoingREST(true);
msgContext.setProperty(Constants.Configuration.CONTENT_TYPE, HTTPConstants.MEDIA_TYPE_APPLICATION_XML);
}
// Detect if a SOAPAction header is set as a Mime header in request message
String soapAction = (String) headerMap.get("SOAPAction");
if (soapAction != null) {
if (log.isDebugEnabled()) {
log.debug("Found SOAPAction as Mime header: " + soapAction);
}
// Set on MessageContext and it will be written out in request
msgContext.setSoapAction(soapAction);
}
// Make sure the the JAX-WS AttachmentAdapter is correctly installed
// So that any user attachments provide are moved to the Axiom Attachments
// Map
if (message.getMessageContext() != null) {
AttachmentsAdapter.install(message.getMessageContext());
TransportHeadersAdapter.install(message.getMessageContext());
SOAPHeadersAdapter.install(message.getMessageContext());
}
if (message.isDoingSWA()) {
// Enable SWA on the Axis2 MessageContext
msgContext.setDoingSwA(true);
msgContext.setProperty(Configuration.ENABLE_SWA, "true");
}
// Enable MTOM Attachments
if (message.isMTOMEnabled()) {
// Enable MTOM on the Axis2 MessageContext
msgContext.setProperty(Configuration.ENABLE_MTOM, "true");
}
}
/**
* This is for debug purposes only
* @param mc
*/
private static void persistMessageContext(MessageContext mc) {
try {
ConfigurationContext cc = mc.getConfigurationContext();
OperationContext op = mc.getOperationContext();
if (cc == null && op != null) {
cc = op.getConfigurationContext();
}
File theFile = null;
theFile = File.createTempFile("DebugPersist", null);
// Setup an output stream to a physical file
FileOutputStream outStream = new FileOutputStream(theFile);
// Attach a stream capable of writing objects to the
// stream connected to the file
ObjectOutputStream outObjStream = new ObjectOutputStream(outStream);
// Try to save the message context
outObjStream.writeObject(mc);
outObjStream.flush();
outObjStream.close();
outStream.flush();
outStream.close();
// Now read in the persisted message
// Setup an input stream to the file
FileInputStream inStream = new FileInputStream(theFile);
// attach a stream capable of reading objects from the
// stream connected to the file
ObjectInputStream inObjStream = new ObjectInputStream(inStream);
org.apache.axis2.context.MessageContext restoredMC =
(org.apache.axis2.context.MessageContext) inObjStream.readObject();
inObjStream.close();
inStream.close();
if (cc == null && op == null) {
return;
}
if (cc != null) {
restoredMC.activate(cc);
} else {
restoredMC.activateWithOperationContext(op);
}
if (restoredMC.getServiceContext() == null) {
throw ExceptionFactory.makeWebServiceException("No Service Group!");
}
if (cc != null) {
mc.activate(cc);
} else {
mc.activateWithOperationContext(op);
}
if (mc.getOperationContext() == null) {
throw new RuntimeException("No Operation Context");
}
if (mc.getOperationContext().getServiceContext() == null) {
throw new RuntimeException("No Service Context");
}
return;
} catch (FileNotFoundException e) {
} catch (IOException e) {
} catch (ClassNotFoundException e) {
}
return;
}
}