| /* |
| * 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 <Reason> element corresponding to the <faultstring> 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; |
| } |
| } |