whitlock 2002/10/07 08:25:52 Modified: java/src/org/apache/wsif/wsdl/extensions/jms JMSExtensionRegistry.java JMSConstants.java java/src/org/apache/wsif/providers/jms JMSFormatter.java WSIFOperation_Jms.java java/test/util TestUtilities.java java/test/org/apache/wsif/util/jms NativeJMSRequestListener.java Added: java/src/org/apache/wsif/wsdl/extensions/jms JMSFaultPropertySerializer.java JMSFault.java JMSFaultIndicator.java JMSFaultProperty.java JMSFaultIndicatorSerializer.java JMSFaultSerializer.java java/test/jms JmsFaultTest.java JmsFault.wsdl Log: Add support for Native JMS faults Revision Changes Path 1.3 +9 -0 xml-axis-wsif/java/src/org/apache/wsif/wsdl/extensions/jms/JMSExtensionRegistry.java Index: JMSExtensionRegistry.java =================================================================== RCS file: /home/cvs/xml-axis-wsif/java/src/org/apache/wsif/wsdl/extensions/jms/JMSExtensionRegistry.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- JMSExtensionRegistry.java 19 Jul 2002 15:46:28 -0000 1.2 +++ JMSExtensionRegistry.java 7 Oct 2002 15:25:51 -0000 1.3 @@ -88,6 +88,15 @@ // Register JMS Output Serializer new JMSOutputSerializer().registerSerializer(this); + // Register JMS Fault Serializer + new JMSFaultSerializer().registerSerializer(this); + + // Register JMS Fault Indicator Serializer + new JMSFaultIndicatorSerializer().registerSerializer(this); + + // Register JMS Fault Property Serializer + new JMSFaultPropertySerializer().registerSerializer(this); + // Register JMS Property Serializer new JMSPropertySerializer().registerSerializer(this); 1.3 +12 -0 xml-axis-wsif/java/src/org/apache/wsif/wsdl/extensions/jms/JMSConstants.java Index: JMSConstants.java =================================================================== RCS file: /home/cvs/xml-axis-wsif/java/src/org/apache/wsif/wsdl/extensions/jms/JMSConstants.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- JMSConstants.java 24 Jun 2002 13:11:18 -0000 1.2 +++ JMSConstants.java 7 Oct 2002 15:25:51 -0000 1.3 @@ -79,6 +79,9 @@ public static final String ELEM_PROPERTY_VALUE = "propertyValue"; public static final String ELEM_INPUT = "input"; public static final String ELEM_OUTPUT = "output"; + public static final String ELEM_FAULT = "fault"; + public static final String ELEM_FAULT_INDICATOR = "faultIndicator"; + public static final String ELEM_FAULT_PROPERTY = "faultProperty"; public static final String ATTR_MESSAGE_TYPE = "type"; // managed environment elements @@ -142,6 +145,15 @@ public static final QName Q_ELEM_JMS_OUTPUT = new QName(NS_URI_JMS, ELEM_OUTPUT); + + public static final QName Q_ELEM_JMS_FAULT = + new QName(NS_URI_JMS, ELEM_FAULT); + + public static final QName Q_ELEM_JMS_FAULT_INDICATOR = + new QName(NS_URI_JMS, ELEM_FAULT_INDICATOR); + + public static final QName Q_ELEM_JMS_FAULT_PROPERTY = + new QName(NS_URI_JMS, ELEM_FAULT_PROPERTY); // Jms message (body) types public static final int MESSAGE_TYPE_NOTSET = 0; 1.1 xml-axis-wsif/java/src/org/apache/wsif/wsdl/extensions/jms/JMSFaultPropertySerializer.java Index: JMSFaultPropertySerializer.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.wsdl.extensions.jms; import java.io.Serializable; import javax.wsdl.Definition; import javax.wsdl.WSDLException; import javax.wsdl.extensions.ExtensibilityElement; import javax.wsdl.extensions.ExtensionDeserializer; import javax.wsdl.extensions.ExtensionRegistry; import javax.wsdl.extensions.ExtensionSerializer; import javax.xml.namespace.QName; import org.apache.wsif.logging.Trc; import org.w3c.dom.Element; import com.ibm.wsdl.Constants; import com.ibm.wsdl.util.xml.DOMUtils; /** * WSDL Jms extension * * @author Mark Whitlock <[EMAIL PROTECTED]> */ public class JMSFaultPropertySerializer implements ExtensionSerializer, ExtensionDeserializer, Serializable { /** * @see ExtensionSerializer#marshall(Class, QName, ExtensibilityElement, * PrintWriter, Definition, ExtensionRegistry) */ public void marshall( Class parentType, QName elementType, javax.wsdl.extensions.ExtensibilityElement extension, java.io.PrintWriter pw, javax.wsdl.Definition def, javax.wsdl.extensions.ExtensionRegistry extReg) throws javax.wsdl.WSDLException { Trc.entry(parentType, elementType, extension, pw, def, extReg); if (extension == null) { Trc.exit(); return; } JMSFaultProperty jmsFaultProperty = (JMSFaultProperty) extension; String tagName = DOMUtils.getQualifiedValue( JMSConstants.NS_URI_JMS, "faultProperty", def); pw.print(" <" + tagName); /** * handle attributes */ if (jmsFaultProperty.getName() != null) { DOMUtils.printAttribute( JMSConstants.ATTR_NAME, jmsFaultProperty.getName(), pw); } if (jmsFaultProperty.getType() != null) { DOMUtils.printQualifiedAttribute( JMSConstants.ATTR_TYPE, jmsFaultProperty.getType(), def, pw); } if (jmsFaultProperty.getValue() != null) { DOMUtils.printAttribute( JMSConstants.ATTR_VALUE, jmsFaultProperty.getValue(), pw); } Boolean required = extension.getRequired(); if (required != null) { DOMUtils.printQualifiedAttribute( Constants.Q_ATTR_REQUIRED, required.toString(), def, pw); } pw.println("/>"); Trc.exit(); } /** * Registers the serializer. */ public void registerSerializer(ExtensionRegistry registry) { Trc.entry(this, registry); // faultProperty registry.registerSerializer( JMSFaultIndicator.class, JMSConstants.Q_ELEM_JMS_FAULT_PROPERTY, this); registry.registerDeserializer( JMSFaultIndicator.class, JMSConstants.Q_ELEM_JMS_FAULT_PROPERTY, this); registry.mapExtensionTypes( JMSFaultIndicator.class, JMSConstants.Q_ELEM_JMS_FAULT_PROPERTY, JMSFaultProperty.class); Trc.exit(); } /** * @see ExtensionDeserializer#unmarshall(Class, QName, Element, Definition, * ExtensionRegistry) */ public ExtensibilityElement unmarshall( Class parentType, QName elementType, Element el, Definition def, ExtensionRegistry extReg) throws WSDLException { Trc.entry(this, parentType, elementType, el, def, extReg); JMSFaultProperty jmsFaultProperty = (JMSFaultProperty) extReg.createExtension(parentType, elementType); String name = DOMUtils.getAttribute(el, JMSConstants.ATTR_NAME); if (name != null) { jmsFaultProperty.setName(name); } QName type = DOMUtils.getQualifiedAttributeValue( el, JMSConstants.ATTR_TYPE, JMSConstants.ELEM_FAULT_PROPERTY, false); if (type != null) { jmsFaultProperty.setType(type); } String value = DOMUtils.getAttribute(el, JMSConstants.ATTR_VALUE); if (value != null) { jmsFaultProperty.setValue(value); } Trc.exit(jmsFaultProperty); return jmsFaultProperty; } } 1.1 xml-axis-wsif/java/src/org/apache/wsif/wsdl/extensions/jms/JMSFault.java Index: JMSFault.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.wsdl.extensions.jms; import java.io.Serializable; import java.util.List; import javax.wsdl.extensions.ExtensibilityElement; import javax.xml.namespace.QName; /** * WSDL Jms service-port extension * * @author Mark Whitlock <[EMAIL PROTECTED]> */ public class JMSFault implements ExtensibilityElement, Serializable { protected QName fieldElementType = JMSConstants.Q_ELEM_JMS_FAULT; // Uses the wrapper type so we can tell if it was set or not. protected Boolean fieldRequired = null; protected List fieldParts; /** * @see ExtensibilityElement#setElementType(QName) */ public void setElementType(QName elementType) { fieldElementType = elementType; } /** * @see ExtensibilityElement#getElementType() */ public QName getElementType() { return fieldElementType; } /** * @see ExtensibilityElement#setRequired(Boolean) */ public void setRequired(Boolean required) { fieldRequired = required; } /** * @see ExtensibilityElement#getRequired() */ public Boolean getRequired() { return fieldRequired; } /** * Gets the parts * @return Returns a String */ public List getParts() { return fieldParts; } /** * Sets the parts * @param parts The parts to set */ public void setParts(List parts) { this.fieldParts = parts; } public String toString() { StringBuffer strBuf = new StringBuffer(super.toString()); strBuf.append("\nJavaAddress (" + fieldElementType + "):"); strBuf.append("\nrequired=" + fieldRequired); strBuf.append("\nparts=" + fieldParts); return strBuf.toString(); } } 1.1 xml-axis-wsif/java/src/org/apache/wsif/wsdl/extensions/jms/JMSFaultIndicator.java Index: JMSFaultIndicator.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.wsdl.extensions.jms; import java.io.Serializable; import java.util.ArrayList; import java.util.List; import javax.wsdl.extensions.ExtensibilityElement; import javax.xml.namespace.QName; /** * WSDL Jms service-port extension * * @author Mark Whitlock <[EMAIL PROTECTED]> */ public class JMSFaultIndicator implements ExtensibilityElement, Serializable { protected QName fieldElementType = JMSConstants.Q_ELEM_JMS_FAULT_INDICATOR; // Uses the wrapper type so we can tell if it was set or not. protected Boolean fieldRequired = null; protected String fieldType; protected List faultProperties; /** * @see ExtensibilityElement#setElementType(QName) */ public void setElementType(QName elementType) { fieldElementType = elementType; } /** * @see ExtensibilityElement#getElementType() */ public QName getElementType() { return fieldElementType; } /** * @see ExtensibilityElement#setRequired(Boolean) */ public void setRequired(Boolean required) { fieldRequired = required; } /** * @see ExtensibilityElement#getRequired() */ public Boolean getRequired() { return fieldRequired; } /** * Gets the type * @return Returns a String */ public String getType() { return fieldType; } /** * Sets the type * @param type The type to set */ public void setType(String type) { this.fieldType = type; } public void addJMSFaultProperty(JMSFaultProperty jmsFaultProperty) { getJMSFaultProperties().add(jmsFaultProperty); } public List getJMSFaultProperties() { if (faultProperties == null) faultProperties = new ArrayList(); return faultProperties; } public String toString() { StringBuffer strBuf = new StringBuffer(super.toString()); strBuf.append("\nJavaAddress (" + fieldElementType + "):"); strBuf.append("\nrequired=" + fieldRequired); strBuf.append("\ntype=" + fieldType); strBuf.append("\nfaultProperties=" + faultProperties); return strBuf.toString(); } } 1.1 xml-axis-wsif/java/src/org/apache/wsif/wsdl/extensions/jms/JMSFaultProperty.java Index: JMSFaultProperty.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.wsdl.extensions.jms; import java.io.Serializable; import java.util.List; import javax.wsdl.extensions.ExtensibilityElement; import javax.xml.namespace.QName; /** * WSDL Jms service-port extension * * @author Mark Whitlock <[EMAIL PROTECTED]> */ public class JMSFaultProperty implements ExtensibilityElement, Serializable { protected QName fieldElementType = JMSConstants.Q_ELEM_JMS_FAULT_PROPERTY; // Uses the wrapper type so we can tell if it was set or not. protected Boolean fieldRequired = null; protected String fieldName; protected QName fieldType; protected String fieldValue; /** * @see ExtensibilityElement#setElementType(QName) */ public void setElementType(QName elementType) { fieldElementType = elementType; } /** * @see ExtensibilityElement#getElementType() */ public QName getElementType() { return fieldElementType; } /** * @see ExtensibilityElement#setRequired(Boolean) */ public void setRequired(Boolean required) { fieldRequired = required; } /** * @see ExtensibilityElement#getRequired() */ public Boolean getRequired() { return fieldRequired; } /** * Gets the Name * @return Returns a String */ public String getName() { return fieldName; } /** * Sets the Name * @param fieldName The name to set */ public void setName(String name) { this.fieldName = name; } /** * Gets the Type * @return Returns a String */ public QName getType() { return fieldType; } /** * Sets the Type * @param fieldType The type to set */ public void setType(QName type) { this.fieldType = type; } /** * Gets the Value * @return Returns a String */ public String getValue() { return fieldValue; } /** * Sets the Value * @param fieldValue The value to set */ public void setValue(String value) { this.fieldValue = value; } public String toString() { StringBuffer strBuf = new StringBuffer(super.toString()); strBuf.append("\nJavaAddress (" + fieldElementType + "):"); strBuf.append("\nrequired=" + fieldRequired); strBuf.append("\nname=" + fieldName); strBuf.append("\ntype=" + fieldType); strBuf.append("\nvalue=" + fieldValue); return strBuf.toString(); } } 1.1 xml-axis-wsif/java/src/org/apache/wsif/wsdl/extensions/jms/JMSFaultIndicatorSerializer.java Index: JMSFaultIndicatorSerializer.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.wsdl.extensions.jms; import java.io.Serializable; import java.util.Iterator; import javax.wsdl.Definition; import javax.wsdl.WSDLException; import javax.wsdl.extensions.ExtensibilityElement; import javax.wsdl.extensions.ExtensionDeserializer; import javax.wsdl.extensions.ExtensionRegistry; import javax.wsdl.extensions.ExtensionSerializer; import javax.xml.namespace.QName; import org.apache.wsif.logging.Trc; import org.w3c.dom.Element; import com.ibm.wsdl.Constants; import com.ibm.wsdl.util.xml.DOMUtils; import com.ibm.wsdl.util.xml.QNameUtils; /** * WSDL Jms extension * * @author Mark Whitlock <[EMAIL PROTECTED]> */ public class JMSFaultIndicatorSerializer implements ExtensionSerializer, ExtensionDeserializer, Serializable { JMSFaultPropertySerializer jmsFaultPropertySerializer; /** * @see ExtensionSerializer#marshall(Class, QName, ExtensibilityElement, * PrintWriter, Definition, ExtensionRegistry) */ public void marshall( Class parentType, QName elementType, javax.wsdl.extensions.ExtensibilityElement extension, java.io.PrintWriter pw, javax.wsdl.Definition def, javax.wsdl.extensions.ExtensionRegistry extReg) throws javax.wsdl.WSDLException { Trc.entry(parentType, elementType, extension, pw, def, extReg); if (extension == null) { Trc.exit(); return; } JMSFaultIndicator jmsFaultIndicator = (JMSFaultIndicator) extension; String tagName = DOMUtils.getQualifiedValue( JMSConstants.NS_URI_JMS, "faultIndicator", def); pw.print(" <" + tagName); /** * handle attributes */ if (jmsFaultIndicator.getType() != null) { DOMUtils.printAttribute( JMSConstants.ATTR_TYPE, jmsFaultIndicator.getType(), pw); } pw.println(">"); // Handle JMSFaultProperties Iterator i = jmsFaultIndicator.getJMSFaultProperties().iterator(); while (i.hasNext()) { JMSFaultProperty ee = (JMSFaultProperty) i.next(); getJMSFaultPropertySerializer().marshall( JMSFaultIndicator.class, JMSConstants.Q_ELEM_JMS_FAULT_PROPERTY, ee, pw, def, extReg); } Boolean required = extension.getRequired(); if (required != null) { DOMUtils.printQualifiedAttribute( Constants.Q_ATTR_REQUIRED, required.toString(), def, pw); } pw.println("</" + tagName + ">"); Trc.exit(); } /** * Registers the serializer. */ public void registerSerializer(ExtensionRegistry registry) { Trc.entry(this, registry); // input registry.registerSerializer( javax.wsdl.BindingFault.class, JMSConstants.Q_ELEM_JMS_FAULT_INDICATOR, this); registry.registerDeserializer( javax.wsdl.BindingFault.class, JMSConstants.Q_ELEM_JMS_FAULT_INDICATOR, this); registry.mapExtensionTypes( javax.wsdl.BindingFault.class, JMSConstants.Q_ELEM_JMS_FAULT_INDICATOR, JMSFaultIndicator.class); Trc.exit(); } /** * @see ExtensionDeserializer#unmarshall(Class, QName, Element, Definition, * ExtensionRegistry) */ public ExtensibilityElement unmarshall( Class parentType, QName elementType, Element el, Definition def, ExtensionRegistry extReg) throws WSDLException { Trc.entry(this, parentType, elementType, el, def, extReg); JMSFaultIndicator jmsFaultIndicator = (JMSFaultIndicator) extReg.createExtension(parentType, elementType); String type = DOMUtils.getAttribute(el, JMSConstants.ATTR_TYPE); if (type != null) { jmsFaultIndicator.setType(type); } // Handle JMSFaultProperty's Element tempEl = DOMUtils.getFirstChildElement(el); while (tempEl != null) { if (QNameUtils .matches(JMSConstants.Q_ELEM_JMS_FAULT_PROPERTY, tempEl)) { jmsFaultIndicator.addJMSFaultProperty( (JMSFaultProperty) getJMSFaultPropertySerializer() .unmarshall( JMSFaultIndicator.class, JMSConstants.Q_ELEM_JMS_FAULT_PROPERTY, tempEl, def, extReg)); } tempEl = DOMUtils.getNextSiblingElement(tempEl); } Trc.exit(jmsFaultIndicator); return jmsFaultIndicator; } private JMSFaultPropertySerializer getJMSFaultPropertySerializer() { if (jmsFaultPropertySerializer == null) jmsFaultPropertySerializer = new JMSFaultPropertySerializer(); return jmsFaultPropertySerializer; } } 1.1 xml-axis-wsif/java/src/org/apache/wsif/wsdl/extensions/jms/JMSFaultSerializer.java Index: JMSFaultSerializer.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.wsdl.extensions.jms; import java.io.Serializable; import javax.wsdl.Definition; import javax.wsdl.WSDLException; import javax.wsdl.extensions.ExtensibilityElement; import javax.wsdl.extensions.ExtensionDeserializer; import javax.wsdl.extensions.ExtensionRegistry; import javax.wsdl.extensions.ExtensionSerializer; import javax.xml.namespace.QName; import org.apache.wsif.logging.Trc; import org.w3c.dom.Element; import com.ibm.wsdl.Constants; import com.ibm.wsdl.util.xml.DOMUtils; /** * WSDL Jms extension * * @author Mark Whitlock <[EMAIL PROTECTED]> */ public class JMSFaultSerializer implements ExtensionSerializer, ExtensionDeserializer, Serializable { /** * @see ExtensionSerializer#marshall(Class, QName, ExtensibilityElement, PrintWriter, Definition, ExtensionRegistry) */ public void marshall( Class parentType, QName elementType, javax.wsdl.extensions.ExtensibilityElement extension, java.io.PrintWriter pw, javax.wsdl.Definition def, javax.wsdl.extensions.ExtensionRegistry extReg) throws javax.wsdl.WSDLException { Trc.entry(parentType, elementType, extension, pw, def, extReg); if (extension == null) { Trc.exit(); return; } JMSFault jmsFault = (JMSFault) extension; String tagName = DOMUtils.getQualifiedValue(JMSConstants.NS_URI_JMS, "fault", def); pw.print(" <" + tagName); /** * handle attributes */ if (jmsFault.getParts() != null) { DOMUtils.printAttribute( JMSConstants.ATTR_PARTS, com.ibm.wsdl.util.StringUtils.getNMTokens(jmsFault.getParts()), pw); } Boolean required = extension.getRequired(); if (required != null) { DOMUtils.printQualifiedAttribute( Constants.Q_ATTR_REQUIRED, required.toString(), def, pw); } pw.println("/>"); Trc.exit(); } /** * Registers the serializer. */ public void registerSerializer(ExtensionRegistry registry) { Trc.entry(this, registry); // fault registry.registerSerializer( javax.wsdl.BindingFault.class, JMSConstants.Q_ELEM_JMS_FAULT, this); registry.registerDeserializer( javax.wsdl.BindingFault.class, JMSConstants.Q_ELEM_JMS_FAULT, this); registry.mapExtensionTypes( javax.wsdl.BindingFault.class, JMSConstants.Q_ELEM_JMS_FAULT, JMSFault.class); Trc.exit(); } /** * @see ExtensionDeserializer#unmarshall(Class, QName, Element, Definition, ExtensionRegistry) */ public ExtensibilityElement unmarshall( Class parentType, QName elementType, Element el, Definition def, ExtensionRegistry extReg) throws WSDLException { Trc.entry(this, parentType, elementType, el, def, extReg); JMSFault jmsFault = (JMSFault) extReg.createExtension(parentType, elementType); String parts = DOMUtils.getAttribute(el, JMSConstants.ATTR_PARTS); if (parts != null) { jmsFault.setParts(com.ibm.wsdl.util.StringUtils.parseNMTokens(parts)); } Trc.exit(jmsFault); return jmsFault; } } 1.1 xml-axis-wsif/java/test/jms/JmsFaultTest.java Index: JmsFaultTest.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 jms; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; import org.apache.wsif.WSIFException; import org.apache.wsif.WSIFMessage; import org.apache.wsif.WSIFOperation; import org.apache.wsif.WSIFPort; import org.apache.wsif.WSIFService; import org.apache.wsif.WSIFServiceFactory; import util.TestUtilities; /** * Junit test to do various JMS tests * @author Mark Whitlock */ public class JmsFaultTest extends TestCase { String wsdlLocation = TestUtilities.getWsdlPath("java\\test\\jms") + "jmsfault.wsdl"; public JmsFaultTest(String name) { super(name); } public static void main(String[] args) { TestUtilities.startListeners(TestUtilities.NATIVEJMS_LISTENER); junit.textui.TestRunner.run (suite()); TestUtilities.stopListeners(); } public static Test suite() { return new TestSuite(JmsFaultTest.class); } public void setUp() { TestUtilities.setUpExtensionsAndProviders(); } public void testSoapDefault() { doit("throwSimple", false); } private void doit(String method, boolean exceptionExpected) { if (!TestUtilities.areWeTesting("jms")) return; try { WSIFServiceFactory factory = WSIFServiceFactory.newInstance(); WSIFService service = factory.getService( wsdlLocation, null, null, "http://jms/", "JmsFault"); WSIFPort port = service.getPort("default"); WSIFOperation operation = port.createOperation(method); WSIFMessage inputMessage = operation.createInputMessage(); WSIFMessage outputMessage = operation.createOutputMessage(); WSIFMessage faultMessage = operation.createFaultMessage(); boolean operationSucceeded = operation.executeRequestResponseOperation( inputMessage, outputMessage, faultMessage); if ("throwSimple".equals(method)) { String faultText = (String) faultMessage.getObjectPart("faultText"); assertTrue("A Simple Fault".equals(faultText)); } else assertTrue("noFault".equals(method)); assertTrue(!exceptionExpected); } catch (Exception e) { System.err.println("JmsFaultTest(" + method + ") caught exception " + e); if (!exceptionExpected || !(e instanceof WSIFException)) e.printStackTrace(); assertTrue(exceptionExpected && e instanceof WSIFException); } } } 1.1 xml-axis-wsif/java/test/jms/JmsFault.wsdl Index: JmsFault.wsdl =================================================================== <?xml version="1.0" ?> <definitions targetNamespace="http://jms/" xmlns:tns="http://jms/" xmlns:xsd="http://www.w3.org/1999/XMLSchema" xmlns:jms="http://schemas.xmlsoap.org/wsdl/jms/" xmlns:format="http://schemas.xmlsoap.org/wsdl/formatbinding/" xmlns="http://schemas.xmlsoap.org/wsdl/"> <!-- message declns --> <message name="NoFaultReq"/> <message name="NoFaultResp"/> <message name="SimpleReq"/> <message name="SimpleResp"/> <message name="SimpleFault"> <part name="faultText" type="xsd:string"/> </message> <message name="IntFault"> <part name="faultInt" type="xsd:int"/> </message> <!-- port type declns --> <portType name="JmsFault"> <operation name="noFault"> <input message="tns:NoFaultReq"/> <output message="tns:NoFaultResp"/> </operation> <operation name="throwSimple"> <input message="tns:SimpleReq"/> <output message="tns:SimpleResp"/> <fault name="SimpleFault" message="tns:SimpleFault"/> <fault name="IntFault" message="tns:IntFault"/> </operation> </portType> <!-- A todo list of other tests that should be included here ... - <jms:property in the <fault - need to implement output properties - <jms:fault included/excluded in the <fault - multiple <fault's as in a switch - parts="xxx" included/excluded in the <jms:fault - different types for the <jms:faultProperty - the jms property's value does not match a <jms:faultProperty is not an exception - async and sync - <fault with and without name="xxx" - <fault with and without message="xxx" (don't really know what that means) Error cases to test ... - <jms:faultIndicator type="trash" - when the <jms:faultProperty type does not match the real jms property type - no type="xxx" in the jms:faultIndicator is an error - no name, type, value in the <jms:faultProperty is an error - bad parts="xxx" in the <jms:fault - multiple parts="xxx" in the <jms:fault is an error - multiple <jms:fault in the <fault is an error A list of unanswered questions - Should multiple <jms:faultIndicator's in the <fault be and'ed or or'ed (I guess and'ed) - What if I mix <jms:faultProperty type's? - How do other providers handle fault messages? All providers should look the same. - How does this work with stubs? How do parts in the fault message get mapped to output parts on the stub? - for other providers, WSIF puts a fault string in the fault message ignoring any parts in the definition of the fault message. I guess WSIF should use the fault message definition but I can't really see how. Maybe WSIF should force the fault message to be a string, but that would fail on existing WSDL. --> <binding name="NativeJmsBinding" type="tns:JmsFault"> <jms:binding type="ObjectMessage"/> <format:typeMapping encoding="Java" style="Java"> <format:typeMap typeName="xsd:string" formatType="java.lang.String" /> </format:typeMapping> <operation name="noFault"> <input/> <output/> </operation> <operation name="throwSimple"> <input/> <output/> <fault name="SimpleFault"> <jms:faultIndicator type="property"> <jms:faultProperty name="faultIndicator" type="xsd:string" value="simple"/> </jms:faultIndicator> </fault> </operation> </binding> <!-- service decln --> <service name="JmsFaultService"> <port name="default" binding="tns:NativeJmsBinding"> <jms:address jndiDestinationName="NativeJmsRequestQueue" destinationStyle="queue" jndiConnectionFactoryName="WSIFSampleQCF" initialContextFactory="com.sun.jndi.fscontext.RefFSContextFactory" jndiProviderURL="file://C:/JNDI-Directory"/> </port> </service> </definitions> 1.8 +172 -36 xml-axis-wsif/java/src/org/apache/wsif/providers/jms/JMSFormatter.java Index: JMSFormatter.java =================================================================== RCS file: /home/cvs/xml-axis-wsif/java/src/org/apache/wsif/providers/jms/JMSFormatter.java,v retrieving revision 1.7 retrieving revision 1.8 diff -u -r1.7 -r1.8 --- JMSFormatter.java 13 Sep 2002 15:41:09 -0000 1.7 +++ JMSFormatter.java 7 Oct 2002 15:25:51 -0000 1.8 @@ -61,17 +61,31 @@ import java.io.OutputStream; import java.io.Serializable; import java.util.Iterator; +import java.util.List; import java.util.Map; +import javax.jms.JMSException; +import javax.wsdl.Binding; +import javax.wsdl.BindingFault; import javax.wsdl.BindingOperation; +import javax.wsdl.Fault; +import javax.wsdl.Operation; +import javax.wsdl.extensions.ExtensibilityElement; import org.apache.wsif.WSIFConstants; import org.apache.wsif.WSIFException; +import org.apache.wsif.WSIFMessage; import org.apache.wsif.WSIFRequest; import org.apache.wsif.WSIFResponse; import org.apache.wsif.format.WSIFFormatter; import org.apache.wsif.logging.Trc; import org.apache.wsif.util.WSIFUtils; +import org.apache.wsif.wsdl.extensions.jms.JMSFault; +import org.apache.wsif.wsdl.extensions.jms.JMSFaultIndicator; +import org.apache.wsif.wsdl.extensions.jms.JMSFaultProperty; +import org.apache.wsif.wsdl.extensions.jms.JMSInput; +import org.apache.wsif.wsdl.extensions.jms.JMSOutput; +import org.apache.wsif.wsdl.extensions.jms.JMSProperty; /** * JMSFormatter @@ -134,10 +148,10 @@ } public void formatRequest(WSIFRequest req, javax.jms.Message out) - throws org.apache.wsif.WSIFException { + throws WSIFException { Trc.entry(this, req, out); - javax.wsdl.Binding binding = fieldPort.getBinding(); + Binding binding = fieldPort.getBinding(); BindingOperation bop = binding.getBindingOperation( req.getOperationName(), @@ -163,13 +177,13 @@ } public WSIFRequest unformatRequest(javax.jms.Message in) - throws org.apache.wsif.WSIFException { + throws WSIFException { Trc.entry(this, in); // Need to construct the request. WSIFRequest req = createRequest(in); - javax.wsdl.Binding binding = fieldPort.getBinding(); - javax.wsdl.BindingOperation bop = + Binding binding = fieldPort.getBinding(); + BindingOperation bop = binding.getBindingOperation( req.getOperationName(), req.getInputName(), @@ -200,7 +214,7 @@ String input = null; String output = null; - javax.wsdl.Binding fieldBinding = fieldPort.getBinding(); + Binding fieldBinding = fieldPort.getBinding(); if (fieldBinding == null) throw new WSIFException("Unable to locate Binding"); @@ -210,7 +224,7 @@ while (services.hasNext() && serviceName ==null) { javax.wsdl.Service s = (javax.wsdl.Service)services.next(); - for (java.util.Iterator ports = s.getPorts().values().iterator(); ports.hasNext();) { + for (Iterator ports = s.getPorts().values().iterator(); ports.hasNext();) { javax.wsdl.Port p = (javax.wsdl.Port)ports.next(); if (p.getBinding() != null && p.getBinding().getQName().equals(fieldBinding.getQName())) { // Binding found @@ -228,7 +242,7 @@ // that one, otherwise use the one defined in the JMS message properties. javax.wsdl.PortType portType = fieldBinding.getPortType(); if (portType!= null) { - java.util.List operations = portType.getOperations(); + List operations = portType.getOperations(); if (operations != null && operations.size() == 1 ) { javax.wsdl.Operation o = (javax.wsdl.Operation)operations.get(0); operationName = o.getName(); @@ -272,7 +286,7 @@ String input = null; String output = null; - javax.wsdl.Binding fieldBinding = fieldPort.getBinding(); + Binding fieldBinding = fieldPort.getBinding(); if (fieldBinding == null) throw new WSIFException("Unable to locate Binding"); @@ -282,7 +296,7 @@ while (services.hasNext() && serviceName ==null) { javax.wsdl.Service s = (javax.wsdl.Service)services.next(); - for (java.util.Iterator ports = s.getPorts().values().iterator(); ports.hasNext();) { + for (Iterator ports = s.getPorts().values().iterator(); ports.hasNext();) { javax.wsdl.Port p = (javax.wsdl.Port)ports.next(); if (p.getBinding() != null && p.getBinding().getQName().equals(fieldBinding.getQName())) { // Binding found @@ -304,7 +318,7 @@ // Nothing defined. Resort to getting the info from the wsdl document javax.wsdl.PortType portType = fieldBinding.getPortType(); if (portType!= null) { - java.util.List operations = portType.getOperations(); + List operations = portType.getOperations(); if (operations != null) { if (operations.size() == 1) { javax.wsdl.Operation o = (javax.wsdl.Operation)operations.get(0); @@ -333,10 +347,10 @@ } public void formatResponse(WSIFResponse resp, javax.jms.Message out) - throws org.apache.wsif.WSIFException { + throws WSIFException { Trc.entry(this, resp, out); - javax.wsdl.Binding binding = fieldPort.getBinding(); - javax.wsdl.BindingOperation bop = + Binding binding = fieldPort.getBinding(); + BindingOperation bop = binding.getBindingOperation( resp.getOperationName(), resp.getInputName(), @@ -360,19 +374,26 @@ * @see WSIFFormatter#unformatResponse(InputStream) */ public WSIFResponse unformatResponse(javax.jms.Message out) - throws org.apache.wsif.WSIFException { + throws WSIFException { + Trc.entry(this, out); // Need to construct the response. WSIFResponse resp = createResponse(out); - javax.wsdl.Binding binding = fieldPort.getBinding(); - javax.wsdl.BindingOperation bop = + Binding binding = fieldPort.getBinding(); + BindingOperation bop = binding.getBindingOperation( resp.getOperationName(), resp.getInputName(), resp.getOutputName()); - - javax.wsdl.Output output = bop.getOperation().getOutput(); + + if (unformatResponseFault(resp, out, binding, bop)) { + Trc.exit(resp); + return resp; + } + + Operation op = bop.getOperation(); + javax.wsdl.Output output = op.getOutput(); if ( output != null ) { javax.wsdl.Message outMessage = output.getMessage(); @@ -392,50 +413,165 @@ return resp; } + /** + * If this message is a fault message, unformat it, else do nothing + * @return true for a fault, false if it is not a fault. + */ + private boolean unformatResponseFault( + WSIFResponse resp, + javax.jms.Message out, + Binding binding, + BindingOperation bop) + throws WSIFException { + + Trc.entry(this, resp, out, binding, bop); + + Map bndFs = bop.getBindingFaults(); + if (bndFs != null && !bndFs.isEmpty()) { + Iterator itBndFNames = bndFs.keySet().iterator(); + while (itBndFNames.hasNext()) { + String bndFName = (String) itBndFNames.next(); + BindingFault bndF = (BindingFault) bndFs.get(bndFName); + + List bndFElems = bndF.getExtensibilityElements(); + if (bndFElems == null || bndFElems.isEmpty()) + continue; + + Iterator itBndFElems = bndFElems.iterator(); + while (itBndFElems.hasNext()) { + Object bndFElem = itBndFElems.next(); + if (bndFElem instanceof JMSFaultIndicator) { + JMSFaultIndicator indic = (JMSFaultIndicator) bndFElem; + String type = indic.getType(); + if (type==null || !"property".equals(type)) continue; + + List fProps = indic.getJMSFaultProperties(); + if (fProps==null || fProps.isEmpty()) continue; + + Iterator itFProps = fProps.iterator(); + while (itFProps.hasNext()) { + JMSFaultProperty fProp = (JMSFaultProperty) itFProps.next(); + String propName = fProp.getName(); + if (propName == null + || fProp.getType() == null + || fProp.getValue() == null) + continue; + + String propValue = null; + try { + if (!out.propertyExists(propName)) + continue; + + // Need to sort out the type here ??? + // NativeJms propertyValues also ignore the type ??? + // We assume the type is a string. This is a HACK. + + propValue = out.getStringProperty(propName); + } catch (JMSException je) { + Trc.ignoredException(je); + continue; + } + + if (propValue != null + && propValue.equals(fProp.getValue())) { + + Operation op = bop.getOperation(); + Fault fault = op.getFault(bndFName); + if (fault != null) { + javax.wsdl.Message faultMessage = + fault.getMessage(); + + JMSMessage fhMsg = + new JMSMessage( + fieldDefinition, + binding, + faultMessage, + getFaultParts(bndF)); + + fhMsg.read(out); + + resp.setOutgoingMessage(fhMsg); + } + + resp.setIsFault(true); + Trc.exit(true); + return true; + } + + } + + } else if (bndFElem instanceof JMSProperty) { + JMSProperty prop = (JMSProperty) bndFElem; + } + } + } + } + Trc.exit(false); + return false; + } + void copyTo( - org.apache.wsif.WSIFMessage source, - org.apache.wsif.WSIFMessage target) + WSIFMessage source, + WSIFMessage target) throws WSIFException { if (source == null || target == null) return; - for (java.util.Iterator i = source.getPartNames(); i.hasNext();) { + for (Iterator i = source.getPartNames(); i.hasNext();) { String partName = i.next().toString(); target.setObjectPart(partName, source.getObjectPart(partName)); } } - private java.util.List getInputParts( - javax.wsdl.BindingOperation bindingOperation) { + private List getInputParts( + BindingOperation bindingOperation) { if (bindingOperation.getBindingInput() != null) { - java.util.Iterator inputIterator = + Iterator inputIterator = bindingOperation.getBindingInput().getExtensibilityElements().iterator(); while (inputIterator.hasNext()) { - javax.wsdl.extensions.ExtensibilityElement ele = - (javax.wsdl.extensions.ExtensibilityElement) inputIterator.next(); - if (ele instanceof org.apache.wsif.wsdl.extensions.jms.JMSInput) { - return ((org.apache.wsif.wsdl.extensions.jms.JMSInput) ele).getParts(); + ExtensibilityElement ele = + (ExtensibilityElement) inputIterator.next(); + if (ele instanceof JMSInput) { + return ((JMSInput) ele).getParts(); } } } return null; } - private java.util.List getOutputParts( - javax.wsdl.BindingOperation bindingOperation) { + private List getOutputParts( + BindingOperation bindingOperation) { if (bindingOperation.getBindingOutput() != null) { - java.util.Iterator outputIterator = + Iterator outputIterator = bindingOperation.getBindingOutput().getExtensibilityElements().iterator(); while (outputIterator.hasNext()) { - javax.wsdl.extensions.ExtensibilityElement ele = - (javax.wsdl.extensions.ExtensibilityElement) outputIterator.next(); - if (ele instanceof org.apache.wsif.wsdl.extensions.jms.JMSOutput) { - return ((org.apache.wsif.wsdl.extensions.jms.JMSOutput) ele).getParts(); + ExtensibilityElement ele = + (ExtensibilityElement) outputIterator.next(); + if (ele instanceof JMSOutput) { + return ((JMSOutput) ele).getParts(); } } } return null; + } + + private List getFaultParts(BindingFault bindingFault) { + Trc.entry(this, bindingFault); + + List list = null; + if (bindingFault != null) { + Iterator it = bindingFault.getExtensibilityElements().iterator(); + while (it.hasNext()) { + Object ele = it.next(); + if (ele instanceof JMSFault) { + list = ((JMSFault) ele).getParts(); + break; + } + } + } + Trc.exit(list); + return list; } private String getOperationName() { 1.29 +21 -18 xml-axis-wsif/java/src/org/apache/wsif/providers/jms/WSIFOperation_Jms.java Index: WSIFOperation_Jms.java =================================================================== RCS file: /home/cvs/xml-axis-wsif/java/src/org/apache/wsif/providers/jms/WSIFOperation_Jms.java,v retrieving revision 1.28 retrieving revision 1.29 diff -u -r1.28 -r1.29 --- WSIFOperation_Jms.java 1 Oct 2002 14:30:53 -0000 1.28 +++ WSIFOperation_Jms.java 7 Oct 2002 15:25:52 -0000 1.29 @@ -485,24 +485,27 @@ WSIFResponse resp = formatter.unformatResponse((javax.jms.Message) responseObject); - formatter.copyTo(resp.getFaultMessage(), fault); - - // the output message contains all response parts - // even if not defined in the WSDL. Any parts - // defined in the WSDL but not in the response - // default to null - ArrayList wsdlOutputParts = getWSDLOutputPartNames(); - WSIFMessage m = resp.getOutgoingMessage(); - if ( m != null ) { - String partName; - for (Iterator i = m.getPartNames(); i.hasNext();) { - partName = (String) i.next(); - output.setObjectPart( partName, m.getObjectPart(partName) ); - wsdlOutputParts.remove( partName ); - } - } - for (Iterator i = wsdlOutputParts.iterator(); i.hasNext(); ) { - output.setObjectPart( (String) i.next(), null ); + if (resp.getIsFault()) + formatter.copyTo(resp.getOutgoingMessage(), fault); + else { + + // the output message contains all response parts + // even if not defined in the WSDL. Any parts + // defined in the WSDL but not in the response + // default to null + ArrayList wsdlOutputParts = getWSDLOutputPartNames(); + WSIFMessage m = resp.getOutgoingMessage(); + if (m != null) { + String partName; + for (Iterator i = m.getPartNames(); i.hasNext();) { + partName = (String) i.next(); + output.setObjectPart(partName, m.getObjectPart(partName)); + wsdlOutputParts.remove(partName); + } + } + for (Iterator i = wsdlOutputParts.iterator(); i.hasNext();) { + output.setObjectPart((String) i.next(), null); + } } /** 1.10 +42 -24 xml-axis-wsif/java/test/util/TestUtilities.java Index: TestUtilities.java =================================================================== RCS file: /home/cvs/xml-axis-wsif/java/test/util/TestUtilities.java,v retrieving revision 1.9 retrieving revision 1.10 diff -u -r1.9 -r1.10 --- TestUtilities.java 1 Oct 2002 15:06:17 -0000 1.9 +++ TestUtilities.java 7 Oct 2002 15:25:52 -0000 1.10 @@ -88,6 +88,12 @@ private static JMSAsyncListener asyncListener = null; private static NativeJMSRequestListener nativeReqListener = null; + public static final int ADDRESSBOOK_LISTENER = 1; + public static final int STOCKQUOTE_LISTENER = 2; + public static final int ASYNC_LISTENER = 4; + public static final int NATIVEJMS_LISTENER = 8; + public static final int ALL_LISTENERS = 15; + public static final Class DEFAULT_SOAP_PROVIDER_CLASS = WSIFDynamicProvider_ApacheAxis.class; private static final String DEFAULT_SOAP_PROTOCOL = @@ -213,30 +219,42 @@ * NativeJMSRequestListener - for the native JMS provider * JMSAsynListener - for asynchronous operation tests */ - public static void startListeners() - { - if (TestUtilities.areWeTesting("jms")) - { - jmsAb = new BridgeThread("AddressBook"); - jmsSq = new BridgeThread("Stockquote"); - jmsAb.start(); - jmsSq.start(); - try { - nativeReqListener = - new NativeJMSRequestListener( - TestUtilities.getWsifProperty("wsif.nativejms.requestq") ); - } catch (WSIFException ex) { - ex.printStackTrace(); - } - } - if (TestUtilities.areWeTesting("async")) { - try { - asyncListener = - new JMSAsyncListener( TestUtilities.getWsifProperty("wsif.async.replytoq") ); - } catch (Exception ex) { - ex.printStackTrace(); - } - } + public static void startListeners() { + startListeners(ALL_LISTENERS); + } + + public static void startListeners(int which) { + if (TestUtilities.areWeTesting("jms")) { + if ((which & ADDRESSBOOK_LISTENER) > 0) { + jmsAb = new BridgeThread("AddressBook"); + jmsAb.start(); + } + + if ((which & STOCKQUOTE_LISTENER) > 0) { + jmsSq = new BridgeThread("Stockquote"); + jmsSq.start(); + } + + if ((which & NATIVEJMS_LISTENER) > 0) + try { + nativeReqListener = + new NativeJMSRequestListener( + TestUtilities.getWsifProperty( + "wsif.nativejms.requestq")); + } catch (WSIFException ex) { + ex.printStackTrace(); + } + } + + if ((which & ASYNC_LISTENER) > 0 + && TestUtilities.areWeTesting("async")) + try { + asyncListener = + new JMSAsyncListener( + TestUtilities.getWsifProperty("wsif.async.replytoq")); + } catch (Exception ex) { + ex.printStackTrace(); + } } /** 1.13 +27 -1 xml-axis-wsif/java/test/org/apache/wsif/util/jms/NativeJMSRequestListener.java Index: NativeJMSRequestListener.java =================================================================== RCS file: /home/cvs/xml-axis-wsif/java/test/org/apache/wsif/util/jms/NativeJMSRequestListener.java,v retrieving revision 1.12 retrieving revision 1.13 diff -u -r1.12 -r1.13 --- NativeJMSRequestListener.java 1 Oct 2002 15:06:16 -0000 1.12 +++ NativeJMSRequestListener.java 7 Oct 2002 15:25:52 -0000 1.13 @@ -263,6 +263,10 @@ } else if ( "whoami".equals( operationName ) ) { reply = inoutWhoami( (ObjectMessage) msg ); sendReply( msg, reply ); + } else if ( "noFault".equals( operationName ) ) { + noFault( (ObjectMessage) msg ); + } else if ( "throwSimple".equals( operationName ) ) { + throwSimple( (ObjectMessage) msg ); } else { System.err.println( "unknown operation: " + operationName ) ; } @@ -344,6 +348,28 @@ return hmr; } + private void noFault(ObjectMessage msg) throws Exception { + sendReply(msg,"No Fault"); + } + + private void throwSimple(ObjectMessage msg) throws Exception { + Queue replyTo = (Queue) (msg.getJMSReplyTo()); + if (replyTo == null) + return; + + ObjectMessage faultMsg = (ObjectMessage) session.createObjectMessage(); + faultMsg.setObject((Serializable) "A Simple Fault"); + + faultMsg.setStringProperty("faultIndicator","simple"); + setReplyToQueue(replyTo); + String o = msg.getJMSMessageID(); + try { + send(faultMsg, o, false); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + private String doFakeOp(String fake) { fake = fake.substring( 1 ); // remove leading quote fake = fake.substring( 0, fake.length() - 1 ); // remove trailing quote @@ -374,7 +400,7 @@ Message replyMsg = session.createObjectMessage(); ((ObjectMessage) replyMsg).setObject((Serializable) response); - setEchoProperties(msg, replyMsg); + setEchoProperties( msg, replyMsg ); setReplyToQueue(replyTo); String o = msg.getJMSMessageID();