antelder 2002/12/16 09:54:17 Modified: java/src/org/apache/wsif/providers/soap/apacheaxis WSIFOperation_ApacheAxis.java Added: java/src/org/apache/wsif/providers/soap/apacheaxis MIMEHelper.java Log: Fix AXIS provider to: - allow attachements with messaging operations - remove depedancy on mail and activation jars when not using attachments Revision Changes Path 1.48 +26 -120 xml-axis-wsif/java/src/org/apache/wsif/providers/soap/apacheaxis/WSIFOperation_ApacheAxis.java Index: WSIFOperation_ApacheAxis.java =================================================================== RCS file: /home/cvs/xml-axis-wsif/java/src/org/apache/wsif/providers/soap/apacheaxis/WSIFOperation_ApacheAxis.java,v retrieving revision 1.47 retrieving revision 1.48 diff -u -r1.47 -r1.48 --- WSIFOperation_ApacheAxis.java 16 Dec 2002 09:24:16 -0000 1.47 +++ WSIFOperation_ApacheAxis.java 16 Dec 2002 17:54:16 -0000 1.48 @@ -57,9 +57,6 @@ package org.apache.wsif.providers.soap.apacheaxis; -import java.awt.Image; -import java.io.IOException; -import java.io.InputStream; import java.rmi.RemoteException; import java.util.ArrayList; import java.util.HashMap; @@ -68,11 +65,7 @@ import java.util.Map; import java.util.Vector; -import javax.activation.DataHandler; import javax.jms.TextMessage; -import javax.mail.MessagingException; -import javax.mail.internet.MimeMultipart; -import javax.swing.ImageIcon; import javax.wsdl.Binding; import javax.wsdl.BindingFault; import javax.wsdl.BindingInput; @@ -94,11 +87,6 @@ import javax.wsdl.extensions.soap.SOAPOperation; import javax.xml.namespace.QName; import javax.xml.rpc.ParameterMode; -import javax.xml.soap.AttachmentPart; -import javax.xml.soap.SOAPException; -import javax.xml.transform.dom.DOMSource; -import javax.xml.transform.sax.SAXSource; -import javax.xml.transform.stream.StreamSource; import org.apache.axis.AxisEngine; import org.apache.axis.AxisFault; @@ -115,8 +103,6 @@ import org.apache.axis.encoding.ser.ArraySerializerFactory; import org.apache.axis.encoding.ser.BeanDeserializerFactory; import org.apache.axis.encoding.ser.BeanSerializerFactory; -import org.apache.axis.encoding.ser.JAFDataHandlerDeserializerFactory; -import org.apache.axis.encoding.ser.JAFDataHandlerSerializerFactory; import org.apache.axis.message.RPCElement; import org.apache.axis.message.RPCParam; import org.apache.axis.message.SOAPBodyElement; @@ -1244,11 +1230,10 @@ Part returnPart = null; if (soapParts.size() > 0) { returnPart = (Part)soapParts.get(0); + setSOAPMessagePart(outMsg,returnPart.getName(), resp); } else if (outputMIMEParts.size() > 0) { returnPart = (Part)outputMIMEParts.get(0); - } - if (returnPart != null) { - setMessagePart( + setMIMEMessagePart( outMsg, returnPart.getName(), resp, @@ -1277,11 +1262,7 @@ Part p = (Part) soapParts.get(i); String name = p.getName(); Object value = respParms.get(name); - setMessagePart( - outMsg, - name, - value, - value == null ? null : value.getClass()); + setSOAPMessagePart(outMsg, name, value); } int startMIMEindex; if (soapParts.size() > 0) { @@ -1293,7 +1274,7 @@ Part p = (Part) outputMIMEParts.get(i); String name = p.getName(); Object value = respParms.get(name); - setMessagePart( + setMIMEMessagePart( outMsg, name, value, @@ -1304,7 +1285,21 @@ } - private static void setMessagePart( + private static void setSOAPMessagePart( + WSIFMessage msg, + String name, + Object value) + throws WSIFException { + Trc.entry(null, msg, name, value); + + //TODO type checking against the WSDL part type + msg.setObjectPart(name, value); + + Trc.exit(); + } + + + private static void setMIMEMessagePart( WSIFMessage msg, String name, Object value, @@ -1312,92 +1307,7 @@ throws WSIFException { Trc.entry(null, msg, name, value, type); - Class valueType = value == null ? null : value.getClass(); - try { - if (valueType != null - && DataHandler.class.equals(type) - && AttachmentPart.class.isAssignableFrom(valueType)) { - AttachmentPart ap = (AttachmentPart) value; - DataHandler dh = ap.getDataHandler(); - msg.setObjectPart(name, dh); - } else if ( - // Attachments that are Strings, Images, etc are unsupported at present. - // Attachments can only be DataHandlers. - valueType - != null - && (String.class.equals(type) - || Image.class.equals(type) - || StreamSource.class.equals(type) - || DOMSource.class.equals(type) - || SAXSource.class.equals(type) - || MimeMultipart.class.equals(type)) - && AttachmentPart.class.isAssignableFrom(valueType)) { - - AttachmentPart ap = (AttachmentPart) value; - InputStream is = ap.getDataHandler().getInputStream(); - - if (String.class.equals(type)) { - byte[] bBuff = new byte[is.available()]; - is.read(bBuff); - msg.setObjectPart(name, new String(bBuff)); - } else if (Image.class.equals(type)) { - byte[] bBuff = new byte[is.available()]; - is.read(bBuff); - msg.setObjectPart(name, new ImageIcon(bBuff).getImage()); - } else if (StreamSource.class.equals(type)) - // Warning: this next line of code has never been tested. - msg.setObjectPart(name, new StreamSource(is)); - else if (DOMSource.class.equals(type)) - throw new WSIFException("DOMSource is not supported"); - else if (SAXSource.class.equals(type)) - throw new WSIFException("SAXSource is not supported"); - else if (MimeMultipart.class.equals(type)) - // Warning: this next line of code has never been tested. - msg.setObjectPart( - name, - new MimeMultipart(ap.getDataHandler().getDataSource())); - } else if ( - valueType != null - && type != null // will be null for async responses - && !type.isPrimitive() - && !(type.isAssignableFrom(valueType))) { - throw new WSIFException( - "return value " - + value - + " has unexpected type " - + valueType - + " instead of " - + type); - } else - msg.setObjectPart(name, value); - } catch (SOAPException se) { - Trc.exception(se); - throw new WSIFException( - "WSIFOperation_ApacheAxis.setMessagePart messageName=" - + (msg.getName() == null ? "null" : msg.getName()) - + " partName=" - + name - + " caught " - + se); - } catch (IOException ioe) { - Trc.exception(ioe); - throw new WSIFException( - "WSIFOperation_ApacheAxis.setMessagePart messageName=" - + (msg.getName() == null ? "null" : msg.getName()) - + " partName=" - + name - + " caught " - + ioe); - } catch (MessagingException me) { - Trc.exception(me); - throw new WSIFException( - "WSIFOperation_ApacheAxis.setMessagePart messageName=" - + (msg.getName() == null ? "null" : msg.getName()) - + " partName=" - + name - + " caught " - + me); - } + MIMEHelper.setMIMEMessagePart(msg, name, value, type); Trc.exit(); } @@ -1802,16 +1712,16 @@ boolean workedOK = false; Object[] inputValues = getInputMessageValues(inMsg, null); - SOAPBodyElement[] axisInputs = new SOAPBodyElement[inputValues.length]; + ArrayList soapBodies = new ArrayList(); for (int i = 0; i < inputValues.length; i++) { if (inputValues[i] instanceof Element) { - axisInputs[i] = new SOAPBodyElement((Element) inputValues[i]); - } else { + soapBodies.add(new SOAPBodyElement((Element) inputValues[i])); + } else if (!MIMEHelper.addAttachementIfMIMEPart(call, inputValues[i])){ throw new WSIFException( "unexpected input type: " + inputValues[i]); } } - + Object[] axisInputs = soapBodies.toArray(); call.setOperationStyle(WSIFAXISConstants.AXIS_STYLE_MESSAGE); Trc.event(this, "Invoking AXIS call", call, axisInputs); @@ -2008,18 +1918,14 @@ private void registerMIMETypes( List mimeParts, Call call) { - if (mimeParts != null) { + if (mimeParts != null && !mimeParts.isEmpty()) { for (Iterator i = mimeParts.iterator(); i.hasNext(); ) { Part p = (Part) i.next(); QName type = p.getTypeName(); if (type == null) { type = p.getElementName(); } - call.registerTypeMapping( - DataHandler.class, - type, - JAFDataHandlerSerializerFactory.class, - JAFDataHandlerDeserializerFactory.class); + MIMEHelper.registerAttachmentType(call, type); } } } 1.1 xml-axis-wsif/java/src/org/apache/wsif/providers/soap/apacheaxis/MIMEHelper.java Index: MIMEHelper.java =================================================================== /* * The Apache Software License, Version 1.1 * * * Copyright (c) 2002 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, * if any, must include the following acknowledgment: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowledgment may appear in the software itself, * if and wherever such third-party acknowledgments normally appear. * * 4. The names "WSIF" and "Apache Software Foundation" must * not be used to endorse or promote products derived from this * software without prior written permission. For written * permission, please contact [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache", * nor may "Apache" appear in their name, without prior written * permission of the Apache Software Foundation. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation and was * originally based on software copyright (c) 2001, 2002, International * Business Machines, Inc., http://www.apache.org. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. */ package org.apache.wsif.providers.soap.apacheaxis; import java.awt.Image; import java.io.IOException; import java.io.InputStream; import javax.activation.DataHandler; import javax.mail.MessagingException; import javax.mail.internet.MimeMultipart; import javax.swing.ImageIcon; import javax.xml.namespace.QName; import javax.xml.soap.SOAPException; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.sax.SAXSource; import javax.xml.transform.stream.StreamSource; import org.apache.axis.attachments.AttachmentPart; import org.apache.axis.client.Call; import org.apache.axis.encoding.ser.JAFDataHandlerDeserializerFactory; import org.apache.axis.encoding.ser.JAFDataHandlerSerializerFactory; import org.apache.wsif.WSIFException; import org.apache.wsif.WSIFMessage; import org.apache.wsif.logging.Trc; /** * The sole purpose of this class is to collect all the code that uses * attachement classes outside of the WSIFOperation_ApacheAxis class * so that there is not a runtime requirement on activation.jar and * mail.jar unless attachements are actually being used. * * @author Ant Elder <[EMAIL PROTECTED]> */ public class MIMEHelper { public static void registerAttachmentType(Call call, QName type) { call.registerTypeMapping( DataHandler.class, type, JAFDataHandlerSerializerFactory.class, JAFDataHandlerDeserializerFactory.class); } public static boolean addAttachementIfMIMEPart(Call call, Object o) { Trc.entry(null, call, o); boolean ok; if (o instanceof DataHandler) { call.addAttachmentPart(new AttachmentPart((DataHandler)o)); ok = true; } else { ok = false; } Trc.exit(new Boolean(ok)); return ok; } public static void setMIMEMessagePart( WSIFMessage msg, String name, Object value, Class type) throws WSIFException { Trc.entry(null, msg, name, value, type); Class valueType = value == null ? null : value.getClass(); try { if (valueType != null && DataHandler.class.equals(type) && AttachmentPart.class.isAssignableFrom(valueType)) { AttachmentPart ap = (AttachmentPart) value; DataHandler dh = ap.getDataHandler(); msg.setObjectPart(name, dh); } else if ( // Attachments that are Strings, Images, etc are unsupported at present. // Attachments can only be DataHandlers. valueType != null && (String.class.equals(type) || Image.class.equals(type) || StreamSource.class.equals(type) || DOMSource.class.equals(type) || SAXSource.class.equals(type) || MimeMultipart.class.equals(type)) && AttachmentPart.class.isAssignableFrom(valueType)) { AttachmentPart ap = (AttachmentPart) value; InputStream is = ap.getDataHandler().getInputStream(); if (String.class.equals(type)) { byte[] bBuff = new byte[is.available()]; is.read(bBuff); msg.setObjectPart(name, new String(bBuff)); } else if (Image.class.equals(type)) { byte[] bBuff = new byte[is.available()]; is.read(bBuff); msg.setObjectPart(name, new ImageIcon(bBuff).getImage()); } else if (StreamSource.class.equals(type)) // Warning: this next line of code has never been tested. msg.setObjectPart(name, new StreamSource(is)); else if (DOMSource.class.equals(type)) throw new WSIFException("DOMSource is not supported"); else if (SAXSource.class.equals(type)) throw new WSIFException("SAXSource is not supported"); else if (MimeMultipart.class.equals(type)) // Warning: this next line of code has never been tested. msg.setObjectPart( name, new MimeMultipart(ap.getDataHandler().getDataSource())); } else if ( valueType != null && type != null // will be null for async responses && !type.isPrimitive() && !(type.isAssignableFrom(valueType))) { throw new WSIFException( "return value " + value + " has unexpected type " + valueType + " instead of " + type); } else msg.setObjectPart(name, value); } catch (SOAPException se) { Trc.exception(se); throw new WSIFException( "WSIFOperation_ApacheAxis.setMessagePart messageName=" + (msg.getName() == null ? "null" : msg.getName()) + " partName=" + name + " caught " + se); } catch (IOException ioe) { Trc.exception(ioe); throw new WSIFException( "WSIFOperation_ApacheAxis.setMessagePart messageName=" + (msg.getName() == null ? "null" : msg.getName()) + " partName=" + name + " caught " + ioe); } catch (MessagingException me) { Trc.exception(me); throw new WSIFException( "WSIFOperation_ApacheAxis.setMessagePart messageName=" + (msg.getName() == null ? "null" : msg.getName()) + " partName=" + name + " caught " + me); } Trc.exit(); } }