dims 2002/12/20 09:28:23 Modified: java/src/org/apache/axis/encoding/ser ArrayDeserializer.java ArraySerializer.java BeanDeserializer.java JAFDataHandlerDeserializer.java JAFDataHandlerSerializer.java java/src/org/apache/axis Constants.java java/src/org/apache/axis/encoding DefaultTypeMappingImpl.java DeserializerImpl.java SerializationContextImpl.java TypeMappingImpl.java java/test/soap12 PackageTests.java TestDeser.java TestSer.java java/src/org/apache/axis/handlers MD5AttachHandler.java java/src/org/apache/axis/message MessageElement.java RPCHandler.java SOAPFaultDetailsBuilder.java SOAPHeaderElement.java java/src/org/apache/axis/i18n resource.properties java/src/org/apache/axis/providers/java RPCProvider.java java/src/org/apache/axis/soap SOAP11Constants.java SOAP12Constants.java SOAPConstants.java java/src/org/apache/axis/handlers/soap SOAPService.java Added: java/test/soap12 Echo.java TestFault.java TestHrefs.java TestRPC.java Log: Fix and test cases for Bug 15363 - soap 1.2 patches for rpc array ser/deser, rpc result, href attr, notunderstood header, etc. from [EMAIL PROTECTED] (Andras Avar) Revision Changes Path 1.33 +79 -20 xml-axis/java/src/org/apache/axis/encoding/ser/ArrayDeserializer.java Index: ArrayDeserializer.java =================================================================== RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/encoding/ser/ArrayDeserializer.java,v retrieving revision 1.32 retrieving revision 1.33 diff -u -r1.32 -r1.33 --- ArrayDeserializer.java 11 Dec 2002 22:38:15 -0000 1.32 +++ ArrayDeserializer.java 20 Dec 2002 17:28:20 -0000 1.33 @@ -67,6 +67,9 @@ import org.apache.axis.utils.Messages; import org.apache.axis.wsdl.symbolTable.SchemaUtils; import org.apache.commons.logging.Log; +import org.apache.axis.soap.SOAPConstants; +import org.apache.axis.MessageContext; + import org.xml.sax.Attributes; import org.xml.sax.SAXException; @@ -99,6 +102,7 @@ Class arrayClass = null; ArrayList mDimLength = null; // If set, array of multi-dim lengths ArrayList mDimFactor = null; // If set, array of factors for multi-dim [] + SOAPConstants soapConstants = SOAPConstants.SOAP11_CONSTANTS; /** * This method is invoked after startElement when the element requires @@ -146,6 +150,11 @@ log.debug("Enter: ArrayDeserializer::startElement()"); } + MessageContext msgContext = context.getMessageContext(); + if (msgContext != null) { + soapConstants = msgContext.getSOAPConstants(); + } + // Get the qname for the array type=, set it to null if // the generic type is used. QName typeQName = context.getTypeFromAttributes(namespace, @@ -164,7 +173,7 @@ QName arrayTypeValue = context.getQNameFromString( Constants.getValue(attributes, Constants.URIS_SOAP_ENC, - Constants.ATTR_ARRAY_TYPE)); + soapConstants.getAttrItemType())); // The first part of the arrayType expression is // the default item type qname. @@ -177,6 +186,8 @@ arrayTypeValue.getNamespaceURI(); String arrayTypeValueLocalPart = arrayTypeValue.getLocalPart(); + + if (soapConstants != SOAPConstants.SOAP12_CONSTANTS) { int leftBracketIndex = arrayTypeValueLocalPart.lastIndexOf('['); int rightBracketIndex = @@ -209,6 +220,33 @@ defaultItemType = new QName(arrayTypeValueNamespaceURI, arrayTypeValueLocalPart); } + + } else { + String arraySizeValue = attributes.getValue(soapConstants.getEncodingURI(), Constants.ATTR_ARRAY_SIZE); + int leftStarIndex = arraySizeValue.lastIndexOf('*'); + + // Skip to num if any + if (leftStarIndex != -1) { + // "*" => "" + if (leftStarIndex == 0 && arraySizeValue.length() == 1) { + // "* *" => "" + } else if (leftStarIndex == (arraySizeValue.length() - 1)) { + innerQName = arrayTypeValue; + innerDimString = arraySizeValue.substring(0, leftStarIndex - 1); + // "* N" => "N" + } else { + dimString = arraySizeValue.substring(leftStarIndex + 2); + innerQName = arrayTypeValue; + innerDimString = arraySizeValue.substring(0, leftStarIndex + 1); + } + } + + if (innerDimString == null) { + defaultItemType = Constants.SOAP_ARRAY12; + } else { + defaultItemType = arrayTypeValue; + } + } } // If no type QName and no defaultItemType qname, use xsd:anyType @@ -226,27 +264,38 @@ // Get an array of the default item type. Class arrayItemClass = null; QName compQName = defaultItemType; - String dims = "[]"; + // Nested array, use the innermost qname + String dims = "[]"; if (innerQName != null) { compQName = innerQName; + + if (soapConstants == SOAPConstants.SOAP12_CONSTANTS) { + int offset = 0; + while ((offset = innerDimString.indexOf('*', offset)) != -1) { + dims += "[]"; + offset ++; + } + } else { dims += innerDimString; } - arrayItemClass = context.getTypeMapping(). - getClassForQName(compQName); - if (arrayItemClass != null) { - try { - arrayClass = ClassUtils.forName( - JavaUtils.getLoadableClassName( - JavaUtils.getTextClassName(arrayItemClass.getName()) + - dims)); - } catch (Exception e) { - throw new SAXException( - Messages.getMessage("noComponent00", - "" + defaultItemType)); - } + } + + arrayItemClass = context.getTypeMapping(). + getClassForQName(compQName); + if (arrayItemClass != null) { + try { + arrayClass = ClassUtils.forName( + JavaUtils.getLoadableClassName( + JavaUtils.getTextClassName(arrayItemClass.getName()) + + dims)); + } catch (Exception e) { + throw new SAXException( + Messages.getMessage("noComponent00", + "" + defaultItemType)); } } + } if (arrayClass == null) { throw new SAXException( @@ -260,13 +309,15 @@ else { try { - StringTokenizer tokenizer = new StringTokenizer(dimString, - "[],"); + StringTokenizer tokenizer; + if (soapConstants == SOAPConstants.SOAP12_CONSTANTS) { + tokenizer = new StringTokenizer(dimString); + } else { + tokenizer = new StringTokenizer(dimString, "[],"); + } length = Integer.parseInt(tokenizer.nextToken()); - - if (tokenizer.hasMoreTokens()) - { + if (tokenizer.hasMoreTokens()) { // If the array is passed as a multi-dimensional array // (i.e. int[2][3]) then store all of the // mult-dim lengths. @@ -304,6 +355,10 @@ Constants.URIS_SOAP_ENC, Constants.ATTR_OFFSET); if (offset != null) { + if (soapConstants == SOAPConstants.SOAP12_CONSTANTS) { + throw new SAXException(Messages.getMessage("noSparseArray")); + } + int leftBracketIndex = offset.lastIndexOf('['); int rightBracketIndex = offset.lastIndexOf(']'); @@ -357,6 +412,10 @@ Constants.URIS_SOAP_ENC, Constants.ATTR_POSITION); if (pos != null) { + if (soapConstants == SOAPConstants.SOAP12_CONSTANTS) { + throw new SAXException(Messages.getMessage("noSparseArray")); + } + int leftBracketIndex = pos.lastIndexOf('['); int rightBracketIndex = pos.lastIndexOf(']'); 1.45 +42 -8 xml-axis/java/src/org/apache/axis/encoding/ser/ArraySerializer.java Index: ArraySerializer.java =================================================================== RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/encoding/ser/ArraySerializer.java,v retrieving revision 1.44 retrieving revision 1.45 diff -u -r1.44 -r1.45 --- ArraySerializer.java 11 Dec 2002 22:38:15 -0000 1.44 +++ ArraySerializer.java 20 Dec 2002 17:28:20 -0000 1.45 @@ -144,7 +144,10 @@ String dims = ""; while (componentType.isArray()) { componentType = componentType.getComponentType(); - dims += "[]"; + if (soap == SOAPConstants.SOAP12_CONSTANTS) + dims += "* "; + else + dims += "[]"; } // Get the QName of the componentType. @@ -170,8 +173,11 @@ String compType = prefix + ":" + componentQName.getLocalPart(); int len = (list == null) ? Array.getLength(value) : list.size(); - String arrayType = compType + dims + "[" + len + "]"; - + String arrayType; + if (soap == SOAPConstants.SOAP12_CONSTANTS) + arrayType = dims + len; + else + arrayType = dims + "[" + len + "]"; // Discover whether array can be serialized directly as a two-dimensional // array (i.e. arrayType=int[2,3]) versus an array of arrays. @@ -231,7 +237,10 @@ // Update the arrayType to use mult-dim array encoding if (okay) { dims = dims.substring(0, dims.length()-2); - arrayType = compType + dims + "[" + len + "," + dim2Len + "]"; + if (soap == SOAPConstants.SOAP12_CONSTANTS) + arrayType = dims + len + " " + dim2Len; + else + arrayType = dims + "[" + len + "," + dim2Len + "]"; } else { dim2Len = -1; } @@ -255,15 +264,33 @@ attrs = new AttributesImpl(attributes); } - if (attrs.getIndex(soap.getEncodingURI(), - Constants.ATTR_ARRAY_TYPE) == -1) { + + if (attrs.getIndex(soap.getEncodingURI(), soap.getAttrItemType()) == -1) { String encprefix = context.getPrefixForURI(soap.getEncodingURI()); + + if (soap != SOAPConstants.SOAP12_CONSTANTS) { + compType = compType + arrayType; + attrs.addAttribute(soap.getEncodingURI(), - Constants.ATTR_ARRAY_TYPE, + soap.getAttrItemType(), encprefix + ":arrayType", "CDATA", + compType); + + } else { + attrs.addAttribute(soap.getEncodingURI(), + soap.getAttrItemType(), + encprefix + ":itemType", + "CDATA", + compType); + + attrs.addAttribute(soap.getEncodingURI(), + "arraySize", + encprefix + ":arraySize", + "CDATA", arrayType); + } } // Force type to be SOAP_ARRAY for all array serialization. @@ -286,12 +313,19 @@ String qname = context.getPrefixForURI(schema.getXsiURI(), "xsi") + ":type"; + QName soapArray; + if (soap == SOAPConstants.SOAP12_CONSTANTS) { + soapArray = Constants.SOAP_ARRAY12; + } else { + soapArray = Constants.SOAP_ARRAY; + } + attrs.setAttribute(typeI, schema.getXsiURI(), "type", qname, "CDATA", - context.qName2String(Constants.SOAP_ARRAY)); + context.qName2String(soapArray)); } attributes = attrs; } 1.59 +3 -1 xml-axis/java/src/org/apache/axis/encoding/ser/BeanDeserializer.java Index: BeanDeserializer.java =================================================================== RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/encoding/ser/BeanDeserializer.java,v retrieving revision 1.58 retrieving revision 1.59 diff -u -r1.58 -r1.59 --- BeanDeserializer.java 11 Dec 2002 22:38:15 -0000 1.58 +++ BeanDeserializer.java 20 Dec 2002 17:28:20 -0000 1.59 @@ -66,6 +66,7 @@ import org.apache.axis.message.SOAPHandler; import org.apache.axis.utils.BeanPropertyDescriptor; import org.apache.axis.utils.Messages; +import org.apache.axis.soap.SOAPConstants; import org.apache.commons.logging.Log; import org.xml.sax.Attributes; import org.xml.sax.SAXException; @@ -187,6 +188,7 @@ BeanPropertyDescriptor propDesc = null; FieldDesc fieldDesc = null; + SOAPConstants soapConstants = context.getMessageContext().getSOAPConstants(); String encodingStyle = context.getMessageContext().getEncodingStyle(); boolean isEncoded = Constants.isSOAP_ENC(encodingStyle); @@ -265,7 +267,7 @@ localName, attributes); - String href = attributes.getValue("href"); + String href = attributes.getValue(soapConstants.getAttrHref()); // If no xsi:type or href, check the meta-data for the field if (childXMLType == null && fieldDesc != null && href == null) { 1.18 +4 -2 xml-axis/java/src/org/apache/axis/encoding/ser/JAFDataHandlerDeserializer.java Index: JAFDataHandlerDeserializer.java =================================================================== RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/encoding/ser/JAFDataHandlerDeserializer.java,v retrieving revision 1.17 retrieving revision 1.18 diff -u -r1.17 -r1.18 --- JAFDataHandlerDeserializer.java 11 Dec 2002 22:38:15 -0000 1.17 +++ JAFDataHandlerDeserializer.java 20 Dec 2002 17:28:20 -0000 1.18 @@ -61,6 +61,7 @@ import org.apache.axis.encoding.DeserializerImpl; import org.apache.axis.message.SOAPHandler; import org.apache.axis.utils.Messages; +import org.apache.axis.soap.SOAPConstants; import org.apache.commons.logging.Log; import org.xml.sax.Attributes; import org.xml.sax.SAXException; @@ -89,6 +90,8 @@ } // super.startElement(namespace, localName, qName, attributes, context); + SOAPConstants soapConstants = context.getMessageContext().getSOAPConstants(); + QName type = context.getTypeFromAttributes(namespace, localName, attributes); @@ -96,8 +99,7 @@ log.debug(Messages.getMessage("gotType00", "Deser", "" + type)); } - String href = attributes.getValue("href"); - log.debug("href=" + href); + String href = attributes.getValue(soapConstants.getAttrHref()); if (href != null) { Object ref = context.getObjectByRef(href); try{ 1.23 +3 -1 xml-axis/java/src/org/apache/axis/encoding/ser/JAFDataHandlerSerializer.java Index: JAFDataHandlerSerializer.java =================================================================== RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/encoding/ser/JAFDataHandlerSerializer.java,v retrieving revision 1.22 retrieving revision 1.23 diff -u -r1.22 -r1.23 --- JAFDataHandlerSerializer.java 4 Nov 2002 17:01:27 -0000 1.22 +++ JAFDataHandlerSerializer.java 20 Dec 2002 17:28:20 -0000 1.23 @@ -63,6 +63,7 @@ import org.apache.axis.encoding.Serializer; import org.apache.axis.utils.Messages; import org.apache.axis.wsdl.fromJava.Types; +import org.apache.axis.soap.SOAPConstants; import org.apache.commons.logging.Log; import org.w3c.dom.Element; import org.xml.sax.Attributes; @@ -99,6 +100,7 @@ // we used to do, throw something meaningful. throw new IOException(Messages.getMessage("noAttachments")); } + SOAPConstants soapConstants = context.getMessageContext().getSOAPConstants(); Part attachmentPart= attachments.createAttachmentPart(dh); @@ -114,7 +116,7 @@ attrs.removeAttribute(typeIndex); } - attrs.addAttribute("", Constants.ATTR_HREF, "href", + attrs.addAttribute("", soapConstants.getAttrHref(), soapConstants.getAttrHref(), "CDATA", attachmentPart.getContentIdRef() ); context.startElement(name, attrs); 1.101 +5 -1 xml-axis/java/src/org/apache/axis/Constants.java Index: Constants.java =================================================================== RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/Constants.java,v retrieving revision 1.100 retrieving revision 1.101 diff -u -r1.100 -r1.101 --- Constants.java 11 Dec 2002 22:38:06 -0000 1.100 +++ Constants.java 20 Dec 2002 17:28:21 -0000 1.101 @@ -406,7 +406,7 @@ public static final String ELEM_BODY = "Body" ; public static final String ELEM_FAULT = "Fault" ; - public static final String ELEM_MISUNDERSTOOD = "Misunderstood"; + public static final String ELEM_NOTUNDERSTOOD = "NotUnderstood"; public static final String ELEM_FAULT_CODE = "faultcode" ; public static final String ELEM_FAULT_STRING = "faultstring" ; @@ -428,8 +428,11 @@ public static final String ATTR_ROOT = "root" ; public static final String ATTR_ID = "id" ; public static final String ATTR_HREF = "href" ; + public static final String ATTR_REF = "ref" ; public static final String ATTR_QNAME = "qname"; public static final String ATTR_ARRAY_TYPE = "arrayType"; + public static final String ATTR_ITEM_TYPE = "itemType"; + public static final String ATTR_ARRAY_SIZE = "arraySize"; public static final String ATTR_OFFSET = "offset"; public static final String ATTR_POSITION = "position"; public static final String ATTR_TYPE = "type"; @@ -558,6 +561,7 @@ public static final QName SOAP_INTEGER = new QName(URI_DEFAULT_SOAP_ENC, "integer"); public static final QName SOAP_DECIMAL = new QName(URI_DEFAULT_SOAP_ENC, "decimal"); public static final QName SOAP_ARRAY = new QName(URI_DEFAULT_SOAP_ENC, "Array"); + public static final QName SOAP_ARRAY12 = new QName(URI_SOAP12_ENC, "Array"); public static final QName SOAP_MAP = new QName(NS_URI_XMLSOAP, "Map"); public static final QName SOAP_ELEMENT = new QName(NS_URI_XMLSOAP, "Element"); 1.66 +12 -0 xml-axis/java/src/org/apache/axis/encoding/DefaultTypeMappingImpl.java Index: DefaultTypeMappingImpl.java =================================================================== RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/encoding/DefaultTypeMappingImpl.java,v retrieving revision 1.65 retrieving revision 1.66 diff -u -r1.65 -r1.66 --- DefaultTypeMappingImpl.java 11 Dec 2002 22:38:13 -0000 1.65 +++ DefaultTypeMappingImpl.java 20 Dec 2002 17:28:21 -0000 1.66 @@ -594,6 +594,18 @@ new ArrayDeserializerFactory() ); + // TODO: move it to the DefaultSOAPEncodingTypeMappingImpl class + myRegister(Constants.SOAP_ARRAY12, java.util.Collection.class, + new ArraySerializerFactory(), + new ArrayDeserializerFactory() + ); + + myRegister(Constants.SOAP_ARRAY12, Object[].class, + new ArraySerializerFactory(), + new ArrayDeserializerFactory() + ); + + // // Now register the schema specific types // 1.33 +4 -1 xml-axis/java/src/org/apache/axis/encoding/DeserializerImpl.java Index: DeserializerImpl.java =================================================================== RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/encoding/DeserializerImpl.java,v retrieving revision 1.32 retrieving revision 1.33 diff -u -r1.32 -r1.33 --- DeserializerImpl.java 11 Dec 2002 22:38:13 -0000 1.32 +++ DeserializerImpl.java 20 Dec 2002 17:28:21 -0000 1.33 @@ -64,6 +64,7 @@ import org.apache.axis.message.SAXOutputter; import org.apache.axis.message.SOAPHandler; import org.apache.axis.utils.Messages; +import org.apache.axis.soap.SOAPConstants; import org.apache.commons.logging.Log; import org.xml.sax.Attributes; import org.xml.sax.SAXException; @@ -360,6 +361,8 @@ return; } + SOAPConstants soapConstants = context.getMessageContext().getSOAPConstants(); + // If this element has an id, then associate the value with the id. // (Prior to this association, the MessageElement of the element is // associated with the id. Failure to replace the MessageElement at this @@ -376,7 +379,7 @@ context.registerFixup("#" + id, this); } - String href = attributes.getValue("href"); + String href = attributes.getValue(soapConstants.getAttrHref()); if (href != null) { isHref = true; 1.88 +1 -1 xml-axis/java/src/org/apache/axis/encoding/SerializationContextImpl.java Index: SerializationContextImpl.java =================================================================== RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/encoding/SerializationContextImpl.java,v retrieving revision 1.87 retrieving revision 1.88 diff -u -r1.87 -r1.88 --- SerializationContextImpl.java 17 Dec 2002 21:07:36 -0000 1.87 +++ SerializationContextImpl.java 20 Dec 2002 17:28:21 -0000 1.88 @@ -745,7 +745,7 @@ AttributesImpl attrs = new AttributesImpl(); if (attributes != null && 0 < attributes.getLength()) attrs.setAttributes(attributes); - attrs.addAttribute("", Constants.ATTR_HREF, "href", + attrs.addAttribute("", soapConstants.getAttrHref(), soapConstants.getAttrHref(), "CDATA", '#' + id); startElement(elemQName, attrs); 1.38 +11 -1 xml-axis/java/src/org/apache/axis/encoding/TypeMappingImpl.java Index: TypeMappingImpl.java =================================================================== RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/encoding/TypeMappingImpl.java,v retrieving revision 1.37 retrieving revision 1.38 diff -u -r1.37 -r1.38 --- TypeMappingImpl.java 11 Dec 2002 22:38:14 -0000 1.37 +++ TypeMappingImpl.java 20 Dec 2002 17:28:21 -0000 1.38 @@ -573,7 +573,17 @@ if (xmlType == null && (javaType.isArray() || javaType == List.class || List.class.isAssignableFrom(javaType))) { - xmlType = Constants.SOAP_ARRAY; + + // get the registered array if any + pair = (Pair) class2Pair.get(Object[].class); + // TODO: it always returns the last registered one, + // so that's why the soap 1.2 typemappings have to + // move to an other registry to differentiate them + if (pair != null) { + xmlType = pair.xmlType; + } else { + xmlType = Constants.SOAP_ARRAY; + } } //log.debug("getTypeQName xmlType =" + xmlType); 1.2 +4 -1 xml-axis/java/test/soap12/PackageTests.java Index: PackageTests.java =================================================================== RCS file: /home/cvs/xml-axis/java/test/soap12/PackageTests.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- PackageTests.java 20 Nov 2002 18:05:44 -0000 1.1 +++ PackageTests.java 20 Dec 2002 17:28:21 -0000 1.2 @@ -71,7 +71,10 @@ suite.addTestSuite(TestDeser.class); suite.addTestSuite(TestHeaderAttrs.class); - //suite.addTestSuite(TestSer.class); + suite.addTestSuite(TestSer.class); + suite.addTestSuite(TestFault.class); + suite.addTestSuite(TestHrefs.class); + suite.addTestSuite(TestRPC.class); return suite; } 1.3 +209 -31 xml-axis/java/test/soap12/TestDeser.java Index: TestDeser.java =================================================================== RCS file: /home/cvs/xml-axis/java/test/soap12/TestDeser.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- TestDeser.java 11 Dec 2002 22:40:18 -0000 1.2 +++ TestDeser.java 20 Dec 2002 17:28:21 -0000 1.3 @@ -4,63 +4,121 @@ import org.apache.axis.Constants; import org.apache.axis.Message; import org.apache.axis.MessageContext; +import org.apache.axis.encoding.TypeMapping; +import org.apache.axis.encoding.TypeMappingRegistry; import org.apache.axis.message.RPCElement; import org.apache.axis.message.RPCParam; import org.apache.axis.message.SOAPEnvelope; import org.apache.axis.server.AxisServer; import org.apache.axis.soap.SOAPConstants; +import org.apache.axis.utils.JavaUtils; import org.apache.axis.utils.Messages; +import javax.xml.namespace.QName; +import java.lang.reflect.Array; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; import java.util.Vector; + /** * Test deserialization of SOAP responses */ public class TestDeser extends TestCase { + private AxisServer server = null; - private AxisServer server = new AxisServer(); public TestDeser(String name) { super(name); + + server = new AxisServer(); + + TypeMappingRegistry tmr = server.getTypeMappingRegistry(); + TypeMapping tm = (TypeMapping) tmr.createTypeMapping(); + tm.setSupportedEncodings(new String[] {Constants.URI_SOAP12_ENC}); + tmr.register(Constants.URI_SOAP12_ENC, tm); + tm.register(java.lang.String[].class, + new QName("http://soapinterop.org/xsd", "ArrayOfString"), + new org.apache.axis.encoding.ser.ArraySerializerFactory(), + new org.apache.axis.encoding.ser.ArrayDeserializerFactory()); } - - String text1 = + + private final String SOAP_HEAD = "<?xml version=\"1.0\"?>\n" + "<soap:Envelope " + "xmlns:soap=\"http://www.w3.org/2002/06/soap-envelope\" " + - "xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\" " + - "xmlns:me=\"http://soapinterop.org/xsd\" " + - "xmlns:this=\"http://encoding.test\" " + + "xmlns:soapenc=\"http://www.w3.org/2002/06/soap-encoding\" " + + "xmlns:this=\"http://encoding.test\" " + "xmlns:xsi=\"" + Constants.URI_DEFAULT_SCHEMA_XSI + "\" " + - "xmlns:xsd=\"" + Constants.URI_DEFAULT_SCHEMA_XSD + "\">\n" + - "<soap:Body>\n" + - "<methodResult xmlns=\"http://tempuri.org/\">\n" + - "<item xsi:type=\"xsd:string\">abc</item>\n" + - "</methodResult>\n" + + "xmlns:xsd=\"" + Constants.URI_DEFAULT_SCHEMA_XSD + "\">\n"; + + private final String ITEM = + "<item xsi:type=\"xsd:string\">abc</item>\n"; + + private final String BODY_HEAD = + "<soap:Body>\n"; + + private final String METHOD_HEAD = + "<methodResult xmlns=\"http://tempuri.org/\">\n"; + + private final String METHOD_TAIL = + "</methodResult>\n"; + + private final String BODY_TAIL = "</soap:Body>\n"; - String text2 = + + private final String SOAP_TAIL = "</soap:Envelope>\n"; - public void testDeser1() throws Exception { - assertEquals(deserialize(""), "abc"); - } - - public void testDeser2() throws Exception { - boolean expectedExceptionThrown = false; - try { - deserialize("<hello/>"); - } catch (org.apache.axis.AxisFault af) { - String expected = Messages.getMessage("noElemAfterBody12"); - if(af.getFaultString().indexOf(expected)!=-1) - expectedExceptionThrown = true; - } - assertTrue(expectedExceptionThrown); + + private final String HEAD = SOAP_HEAD + BODY_HEAD + METHOD_HEAD; + private final String TAIL = METHOD_TAIL + BODY_TAIL + SOAP_TAIL; + + + private static boolean equals(Object obj1, Object obj2) { + if ( (obj1 == null) || (obj2 == null) ) return (obj1 == obj2); + if (obj1.equals(obj2)) return true; + if (obj2.getClass().isArray() && obj1.getClass().isArray()) { + if (Array.getLength(obj1) != Array.getLength(obj2)) return false; + for (int i=0; i<Array.getLength(obj1); i++) + if (!equals(Array.get(obj1,i),Array.get(obj2,i))) return false; + return true; + } + if ((obj1 instanceof List) && (obj2 instanceof List)) { + List list1 = (List)obj1; + List list2 = (List)obj2; + if (list1.size() != list2.size()) return false; + for (int i=0; i < list1.size(); i++) { + if (!equals(list1.get(i), list2.get(i))) return false; + } + return true; + } + if ((obj1 instanceof Map) && (obj2 instanceof Map)) { + Map map1 = (Map)obj1; + Map map2 = (Map)obj2; + Set keys1 = map1.keySet(); + Set keys2 = map2.keySet(); + if (!(keys1.equals(keys2))) return false; + Iterator i = keys1.iterator(); + while (i.hasNext()) { + Object key = i.next(); + if (!map1.get(key).equals(map2.get(key))) + return false; + } + return true; + } + + return false; } - - public String deserialize (String extra) throws Exception { - Message message = new Message(text1 + extra + text2); + + + public void deserialize(String soap, Object expected, boolean tryConvert) throws Exception { + Message message = new Message(soap); MessageContext context = new MessageContext(server); context.setSOAPConstants(SOAPConstants.SOAP12_CONSTANTS); - + message.setMessageContext(context); SOAPEnvelope envelope = message.getSOAPEnvelope(); @@ -76,6 +134,126 @@ RPCParam param = (RPCParam) arglist.get(0); assertNotNull("SOAP param should not be null", param); - return (String)param.getValue(); + Object result = param.getValue(); + if (!equals(result, expected)) { + // Try to convert to the expected class + if (tryConvert) { + Object result2 = JavaUtils.convert(result, expected.getClass()); + if (!equals(result2, expected)) { + assertEquals("The result is not what is expected.", expected, result); + } + } else { + assertEquals("The result is not what is expected.", expected, result); + } + } + } + + public void testDeser1() throws Exception { + deserialize(SOAP_HEAD + BODY_HEAD + METHOD_HEAD + ITEM + METHOD_TAIL + BODY_TAIL + SOAP_TAIL, "abc", false); + } + + public void testDeser2() throws Exception { + boolean expectedExceptionThrown = false; + try { + deserialize(SOAP_HEAD + BODY_HEAD + METHOD_HEAD + ITEM + METHOD_TAIL + BODY_TAIL + "<hello/>" + SOAP_TAIL, null, false); + } catch (org.apache.axis.AxisFault af) { + String expected = Messages.getMessage("noElemAfterBody12"); + if(af.getFaultString().indexOf(expected)!=-1) + expectedExceptionThrown = true; + } + assertTrue(expectedExceptionThrown); + } + + public void testAfterBody() throws Exception { + boolean expectedExceptionThrown = false; + try { + deserialize(SOAP_HEAD + BODY_HEAD + METHOD_HEAD + ITEM + METHOD_TAIL + "<hello/>" + BODY_TAIL + SOAP_TAIL, null, false); + } catch (org.apache.axis.AxisFault af) { + // Should drop an ex about soap 1.2 doesn't permit any element after body + String expected = Messages.getMessage("onlyOneBodyFor12"); + if(af.getFaultString().indexOf(expected)!=-1) + expectedExceptionThrown = true; + } + assertTrue(expectedExceptionThrown); + } + + public void testArray() throws Exception { + Vector v = new Vector(); + v.addElement("abc"); + v.addElement("def"); + deserialize(HEAD + + "<result xsi:type=\"soapenc:Array\" " + + "soapenc:itemType=\"xsd:string\" soapenc:arraySize=\"2\"> " + + "<item xsi:type=\"xsd:string\">abc</item>" + + "<item xsi:type=\"xsd:string\">def</item>" + + "</result>" + + TAIL, + v, true); } + + public void testSparseArray1() throws Exception { + ArrayList list = new ArrayList(4); + list.add(null); + list.add(null); + list.add("abc"); + list.add("def"); + boolean expectedExceptionThrown = false; + try { + deserialize(HEAD + + "<result xsi:type=\"soapenc:Array\" " + + "soapenc:itemType=\"xsd:string\" soapenc:arraySize=\"4\" " + + " soapenc:offset=\"[2]\">" + + "<item xsi:type=\"xsd:string\">abc</item>" + + "<item xsi:type=\"xsd:string\">def</item>" + + "</result>" + + TAIL, + list, true); + } catch (Exception af) { + String expected = Messages.getMessage("noSparseArray"); + if(af.toString().indexOf(expected)!=-1) + expectedExceptionThrown = true; + } + assertTrue(expectedExceptionThrown); + } + + public void testSparseArray2() throws Exception { + ArrayList list = new ArrayList(4); + list.add("abc"); + list.add(null); + list.add("def"); + list.add(null); + + boolean expectedExceptionThrown = false; + try { + deserialize(HEAD + + "<result xsi:type=\"soapenc:Array\" " + + "soapenc:itemType=\"xsd:string\" soapenc:arraySize=\"4\">" + + "<item soapenc:position=\"[0]\" xsi:type=\"xsd:string\">abc</item>" + + "<item soapenc:position=\"[2]\" xsi:type=\"xsd:string\">def</item>" + + "</result>" + + TAIL, + list, true); + } catch (Exception af) { + String expected = Messages.getMessage("noSparseArray"); + if(af.toString().indexOf(expected)!=-1) + expectedExceptionThrown = true; + } + assertTrue(expectedExceptionThrown); + } + + public void testNoSizeDefinedArray() throws Exception { + ArrayList a = new ArrayList(); + a.add("abc"); + a.add("def"); + + deserialize(HEAD + + "<result xsi:type=\"soapenc:Array\" " + + "soapenc:itemType=\"xsd:string\" soapenc:arraySize=\"*\">" + + "<item xsi:type=\"xsd:string\">abc</item>" + + "<item xsi:type=\"xsd:string\">def</item>" + + "</result>" + + TAIL, + a, true); + } + } 1.3 +7 -8 xml-axis/java/test/soap12/TestSer.java Index: TestSer.java =================================================================== RCS file: /home/cvs/xml-axis/java/test/soap12/TestSer.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- TestSer.java 11 Dec 2002 22:40:18 -0000 1.2 +++ TestSer.java 20 Dec 2002 17:28:21 -0000 1.3 @@ -15,6 +15,7 @@ import org.apache.axis.message.SOAPEnvelope; import org.apache.axis.server.AxisServer; import org.apache.axis.soap.SOAPConstants; +import org.apache.axis.utils.XMLUtils; import org.apache.commons.logging.Log; import org.w3c.dom.Document; import org.xml.sax.InputSource; @@ -23,8 +24,6 @@ import test.encoding.DataSerFactory; import javax.xml.namespace.QName; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; import java.io.StringReader; import java.io.StringWriter; import java.io.Writer; @@ -70,8 +69,8 @@ // Create a TypeMapping and register the specialized Type Mapping TypeMappingRegistry reg = context.getTypeMappingRegistry(); TypeMapping tm = (TypeMapping) reg.createTypeMapping(); - tm.setSupportedEncodings(new String[] {Constants.URI_DEFAULT_SOAP_ENC}); - reg.register(Constants.URI_DEFAULT_SOAP_ENC, tm); + tm.setSupportedEncodings(new String[] {Constants.URI_SOAP12_ENC}); + reg.register(Constants.URI_SOAP12_ENC, tm); QName dataQName = new QName("typeNS", "Data"); tm.register(Data.class, dataQName, new DataSerFactory(), new DataDeserFactory()); @@ -126,8 +125,9 @@ { try { MessageContext msgContext = new MessageContext(new AxisServer()); + msgContext.setSOAPConstants(SOAPConstants.SOAP12_CONSTANTS); String req = - "<xsd1:A xmlns:xsd1='urn:myNamespace'>" + "<xsd1:A xmlns:xsd1=\"urn:myNamespace\">" + "<xsd1:B>" + "<xsd1:C>foo bar</xsd1:C>" + "</xsd1:B>" @@ -137,12 +137,11 @@ StringReader reqReader = new StringReader(req); InputSource reqSource = new InputSource(reqReader); - DocumentBuilder xdb = DocumentBuilderFactory.newInstance().newDocumentBuilder(); - Document document = xdb.parse(reqSource ); + Document document = XMLUtils.newDocument(reqSource); String msgString = null; - SOAPEnvelope msg = new SOAPEnvelope(); + SOAPEnvelope msg = new SOAPEnvelope(SOAPConstants.SOAP12_CONSTANTS); RPCParam arg1 = new RPCParam("urn:myNamespace", "testParam", document.getFirstChild()); arg1.setXSITypeGeneration(Boolean.FALSE); 1.1 xml-axis/java/test/soap12/Echo.java Index: Echo.java =================================================================== package test.soap12; public class Echo { public String echo(String text) { return text; } } 1.1 xml-axis/java/test/soap12/TestFault.java Index: TestFault.java =================================================================== package test.soap12; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; import org.apache.axis.AxisFault; import org.apache.axis.Message; import org.apache.axis.MessageContext; import org.apache.axis.encoding.SerializationContext; import org.apache.axis.encoding.SerializationContextImpl; import org.apache.axis.message.SOAPBodyElement; import org.apache.axis.message.SOAPEnvelope; import org.apache.axis.message.SOAPFault; import org.apache.axis.server.AxisServer; import org.apache.axis.soap.SOAPConstants; import javax.xml.namespace.QName; import java.io.StringWriter; import java.io.Writer; /** * A test of soap 1.2 fault serialization and deserialization. * * @author Andras Avar ([EMAIL PROTECTED]) */ public class TestFault extends TestCase { public static Test suite() { return new TestSuite(TestFault.class); } public TestFault(String name) { super(name); } public void setUp() throws Exception { } public static final QName FAULTCODE = new QName("http://c","faultcode_c"); public static final QName FAULTSUBCODE[] = { new QName("http://a","subcode_a"), new QName("http://b","subcode_b") }; public static final String FAULTREASON = "reason"; public static final String FAULTROLE = "role"; public static final String FAULTNODE = "node"; public void testFault() throws Exception { // Serialize MessageContext msgContext = new MessageContext(new AxisServer()); msgContext.setSOAPConstants(SOAPConstants.SOAP12_CONSTANTS); SOAPEnvelope msg = new SOAPEnvelope(SOAPConstants.SOAP12_CONSTANTS); SOAPFault fault = new SOAPFault(new AxisFault(FAULTCODE, FAULTSUBCODE ,FAULTREASON, FAULTROLE, FAULTNODE, null)); msg.addBodyElement(fault); Writer stringWriter = new StringWriter(); SerializationContext context = new SerializationContextImpl(stringWriter, msgContext); context.setDoMultiRefs(false); msg.output(context); String msgString = stringWriter.toString(); // Deserialize and check AxisServer server = new AxisServer(); Message message = new Message(msgString); message.setMessageContext(new MessageContext(server)); SOAPEnvelope envelope = (SOAPEnvelope) message.getSOAPEnvelope(); assertNotNull("envelope should not be null", envelope); SOAPBodyElement respBody = envelope.getFirstBody(); assertTrue("respBody should be a SOAPFaultElement", respBody instanceof SOAPFault); AxisFault aFault = ((SOAPFault) respBody).getFault(); assertNotNull("Fault should not be null", aFault); assertTrue(aFault.getFaultCode().equals(FAULTCODE)); assertTrue(aFault.getFaultReason().equals(FAULTREASON)); assertTrue(aFault.getFaultRole().equals(FAULTROLE)); assertTrue(aFault.getFaultNode().equals(FAULTNODE)); QName q[] = aFault.getFaultSubCodes(); for (int i = 0; i < q.length; i++) assertTrue(q[i].equals(FAULTSUBCODE[i])); } } 1.1 xml-axis/java/test/soap12/TestHrefs.java Index: TestHrefs.java =================================================================== package test.soap12; import junit.framework.TestCase; import org.apache.axis.Constants; import org.apache.axis.Message; import org.apache.axis.MessageContext; import org.apache.axis.message.RPCElement; import org.apache.axis.message.RPCParam; import org.apache.axis.message.SOAPEnvelope; import org.apache.axis.server.AxisServer; import java.util.Vector; /** * Test deserialization of SOAP 1.2 messages with references, by putting the * actual value in various places in the message. */ public class TestHrefs extends TestCase { private String HEAD; private String HEADERT; private String BODYT; public TestHrefs(String name) { this(name, Constants.URI_DEFAULT_SCHEMA_XSI, Constants.URI_DEFAULT_SCHEMA_XSD); } public TestHrefs(String name, String NS_XSI, String NS_XSD) { super(name); HEAD = "<?xml version=\"1.0\"?>\n" + "<soap:Envelope " + "xmlns:soap=\"http://www.w3.org/2002/06/soap-envelope\" " + "xmlns:soapenc=\"http://www.w3.org/2002/06/soap-encoding\" " + "xmlns:xsi=\"" + NS_XSI + "\" " + "xmlns:xsd=\"" + NS_XSD + "\">\n" + "<soap:Header>\n"; HEADERT = "</soap:Header>\n" + "<soap:Body>\n" + "<methodResult xmlns=\"http://tempuri.org/\">\n"; BODYT = "</methodResult>\n" + "</soap:Body>\n" + "</soap:Envelope>\n"; } private void deserialize(String data, Object expected, int pos) throws Exception { Message message = new Message(data); message.setMessageContext(new MessageContext(new AxisServer())); SOAPEnvelope envelope = (SOAPEnvelope)message.getSOAPEnvelope(); assertNotNull("SOAP envelope should not be null", envelope); RPCElement body = (RPCElement)envelope.getFirstBody(); assertNotNull("SOAP body should not be null", body); Vector arglist = body.getParams(); assertNotNull("arglist", arglist); assertTrue("SOAP param.size()<=0 {Should be > 0}", arglist.size()>0); RPCParam param = (RPCParam) arglist.get(pos); assertNotNull("SOAP param should not be null", param); Object result = param.getValue(); assertEquals("Expected result not received", expected, result); } public void testStringReference1() throws Exception { String result = HEAD + HEADERT + "<result root=\"0\" id=\"1\" xsi:type=\"xsd:string\">abc</result>" + "<reference ref=\"#1\"/>\n" + BODYT; deserialize(result, "abc", 1); } public void testIntReference1() throws Exception { String result = HEAD + HEADERT + "<result root=\"0\" id=\"1\" xsi:type=\"xsd:int\">567</result>" + "<reference ref=\"#1\"/>\n" + BODYT; deserialize(result, new Integer(567), 1); } public void testStringReferenceInHeader() throws Exception { String result = HEAD + "<result root=\"0\" id=\"1\" xsi:type=\"xsd:string\">abc</result>" + HEADERT + "<reference ref=\"#1\"/>\n" + BODYT; deserialize(result, "abc", 0); } } 1.1 xml-axis/java/test/soap12/TestRPC.java Index: TestRPC.java =================================================================== package test.soap12; import junit.framework.TestCase; import org.apache.axis.AxisFault; import org.apache.axis.Message; import org.apache.axis.MessageContext; import org.apache.axis.configuration.SimpleProvider; import org.apache.axis.description.ServiceDesc; import org.apache.axis.handlers.soap.SOAPService; import org.apache.axis.message.RPCElement; import org.apache.axis.message.RPCParam; import org.apache.axis.message.SOAPEnvelope; import org.apache.axis.providers.java.RPCProvider; import org.apache.axis.server.AxisServer; import org.apache.axis.soap.SOAPConstants; import org.apache.axis.transport.local.LocalTransport; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; import java.util.Vector; /** * A test for RPC response * * @author Andras Avar ([EMAIL PROTECTED]) */ public class TestRPC extends TestCase { private SimpleProvider provider = new SimpleProvider(); private AxisServer server = new AxisServer(provider); public TestRPC(String name) { super(name); server.init(); } private RPCElement rpc(String method, Object[] params) throws AxisFault, SAXException { String SERVICE_NAME = "echoservice"; LocalTransport transport = new LocalTransport(server); SOAPService service = new SOAPService(new RPCProvider()); service.setOption("className", "test.soap12.Echo"); service.setOption("allowedMethods", "*"); ServiceDesc desc = service.getInitializedServiceDesc(null); desc.setDefaultNamespace(method); provider.deployService(SERVICE_NAME, service); MessageContext msgContext = new MessageContext(server); msgContext.setSOAPConstants(SOAPConstants.SOAP12_CONSTANTS); String methodNS = null; msgContext.setTargetService(SERVICE_NAME); // Construct the soap request SOAPEnvelope envelope = new SOAPEnvelope(); msgContext.setRequestMessage(new Message(envelope)); RPCElement body = new RPCElement(methodNS, method, params); envelope.addBodyElement(body); server.invoke(msgContext); Message message = msgContext.getResponseMessage(); envelope = (SOAPEnvelope)message.getSOAPEnvelope(); assertNotNull("SOAP envelope was null", envelope); body = (RPCElement)envelope.getFirstBody(); return body; } public void testRPCReturn() throws Exception { RPCElement body = rpc("echo", new Object[] {"abc"}); assertNotNull("SOAP body was null", body); // Check RPC result Vector arglist = body.getParams(); assertNotNull("SOAP argument list was null", arglist); RPCParam param = (RPCParam) arglist.get(1); assertTrue("Not expected result", ((String)param.getValue()).equals("abc")); // Check DOM Element e = body.getAsDOM(); NodeList l = e.getElementsByTagNameNS("http://www.w3.org/2002/06/soap-rpc","result"); assertTrue("No result element was fount", l.getLength() == 1); String ptr = l.item(0).getFirstChild().getNodeValue(); assertNotNull("Ptr to the result value was null", ptr); l = e.getElementsByTagName(ptr); assertTrue("No return element was fount", l.getLength() == 1); String res = l.item(0).getFirstChild().getNodeValue(); assertTrue("Not expected result", res.equals("abc")); } } 1.21 +4 -2 xml-axis/java/src/org/apache/axis/handlers/MD5AttachHandler.java Index: MD5AttachHandler.java =================================================================== RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/handlers/MD5AttachHandler.java,v retrieving revision 1.20 retrieving revision 1.21 diff -u -r1.20 -r1.21 --- MD5AttachHandler.java 11 Dec 2002 22:38:18 -0000 1.20 +++ MD5AttachHandler.java 20 Dec 2002 17:28:22 -0000 1.21 @@ -60,6 +60,7 @@ import org.apache.axis.Message; import org.apache.axis.MessageContext; import org.apache.axis.components.logger.LogFactory; +import org.apache.axis.soap.SOAPConstants; import org.apache.axis.utils.Messages; import org.apache.commons.logging.Log; @@ -78,6 +79,7 @@ try { // log.debug("IN MD5"); Message msg = msgContext.getRequestMessage(); + SOAPConstants soapConstants = msgContext.getSOAPConstants(); org.apache.axis.message.SOAPEnvelope env = (org.apache.axis.message.SOAPEnvelope) msg.getSOAPEnvelope(); org.apache.axis.message.SOAPBodyElement sbe = env.getFirstBody();//env.getBodyByName("ns1", "addedfile"); org.w3c.dom.Element sbElement = sbe.getAsDOM(); @@ -87,7 +89,7 @@ for (; n != null && !(n instanceof org.w3c.dom.Element); n = n.getNextSibling()); org.w3c.dom.Element paramElement = (org.w3c.dom.Element) n; //Get the href associated with the attachment. - String href = paramElement.getAttribute(org.apache.axis.Constants.ATTR_HREF); + String href = paramElement.getAttribute(soapConstants.getAttrHref()); org.apache.axis.Part ap = msg.getAttachmentsImpl().getAttachmentByReference(href); javax.activation.DataHandler dh = org.apache.axis.attachments.AttachmentUtils.getActivationDataHandler(ap); org.w3c.dom.Node timeNode = paramElement.getFirstChild(); @@ -136,7 +138,7 @@ n = sbElement.getFirstChild(); for (; n != null && !(n instanceof org.w3c.dom.Element); n = n.getNextSibling()); paramElement = (org.w3c.dom.Element) n; - // paramElement.setAttribute(org.apache.axis.Constants.ATTR_HREF, respHref); + // paramElement.setAttribute(soapConstants.getAttrHref(), respHref); String MD5String = org.apache.axis.encoding.Base64.encode(md.digest()); String senddata = " elapsedTime=" + elapsedTimeStr + " MD5=" + MD5String; 1.140 +7 -6 xml-axis/java/src/org/apache/axis/message/MessageElement.java Index: MessageElement.java =================================================================== RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/message/MessageElement.java,v retrieving revision 1.139 retrieving revision 1.140 diff -u -r1.139 -r1.140 --- MessageElement.java 11 Dec 2002 22:38:20 -0000 1.139 +++ MessageElement.java 20 Dec 2002 17:28:22 -0000 1.140 @@ -237,18 +237,19 @@ } } - href = attributes.getValue(Constants.ATTR_HREF); - - // If there's an arrayType attribute, we can pretty well guess that we're an Array??? - if (attributes.getValue(Constants.URI_DEFAULT_SOAP_ENC, Constants.ATTR_ARRAY_TYPE) != null) - typeQName = Constants.SOAP_ARRAY; - // Set the encoding style to the attribute value. If null, // we just automatically use our parent's (see getEncodingStyle) MessageContext mc = context.getMessageContext(); SOAPConstants sc = (mc != null) ? mc.getSOAPConstants() : SOAPConstants.SOAP11_CONSTANTS; + + href = attributes.getValue(sc.getAttrHref()); + + // If there's an arrayType attribute, we can pretty well guess that we're an Array??? + if (attributes.getValue(Constants.URI_DEFAULT_SOAP_ENC, Constants.ATTR_ARRAY_TYPE) != null) + typeQName = Constants.SOAP_ARRAY; + encodingStyle = attributes.getValue(sc.getEncodingURI(), 1.69 +8 -0 xml-axis/java/src/org/apache/axis/message/RPCHandler.java Index: RPCHandler.java =================================================================== RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/message/RPCHandler.java,v retrieving revision 1.68 retrieving revision 1.69 diff -u -r1.68 -r1.69 --- RPCHandler.java 11 Dec 2002 22:38:20 -0000 1.68 +++ RPCHandler.java 20 Dec 2002 17:28:22 -0000 1.69 @@ -70,6 +70,7 @@ import org.apache.axis.encoding.MethodTarget; import org.apache.axis.utils.JavaUtils; import org.apache.axis.utils.Messages; +import org.apache.axis.soap.SOAPConstants; import org.apache.commons.logging.Log; import org.xml.sax.Attributes; import org.xml.sax.SAXException; @@ -171,6 +172,13 @@ QName type = null; QName qname = new QName(namespace, localName); ParameterDesc paramDesc = null; + + SOAPConstants soapConstants = context.getMessageContext().getSOAPConstants(); + if (soapConstants == SOAPConstants.SOAP12_CONSTANTS && + Constants.QNAME_RPC_RESULT.equals(qname)) { + // TODO: fix it ... now we just skip it + return new DeserializerImpl(); + } Vector params = rpcElem.getParams(); 1.7 +3 -1 xml-axis/java/src/org/apache/axis/message/SOAPFaultDetailsBuilder.java Index: SOAPFaultDetailsBuilder.java =================================================================== RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/message/SOAPFaultDetailsBuilder.java,v retrieving revision 1.6 retrieving revision 1.7 diff -u -r1.6 -r1.7 --- SOAPFaultDetailsBuilder.java 11 Dec 2002 22:38:20 -0000 1.6 +++ SOAPFaultDetailsBuilder.java 20 Dec 2002 17:28:22 -0000 1.7 @@ -64,6 +64,7 @@ import org.apache.axis.encoding.Deserializer; import org.apache.axis.encoding.DeserializerImpl; import org.apache.axis.utils.ClassUtils; +import org.apache.axis.soap.SOAPConstants; import org.xml.sax.Attributes; import org.xml.sax.SAXException; @@ -106,6 +107,7 @@ // Look up this element in our faultMap // if we find a match, this element is the fault data MessageContext msgContext = context.getMessageContext(); + SOAPConstants soapConstants = msgContext.getSOAPConstants(); OperationDesc op = msgContext.getOperation(); if (op != null) { FaultDesc faultDesc = op.getFaultByQName(qn); @@ -129,7 +131,7 @@ builder.setWaiting(true); // register callback for the data, use the xmlType from fault info Deserializer dser = null; - if (attributes.getValue("href") == null) { + if (attributes.getValue(soapConstants.getAttrHref()) == null) { dser = context.getDeserializerForType(faultDesc.getXmlType()); } else { dser = new DeserializerImpl(); 1.18 +2 -2 xml-axis/java/src/org/apache/axis/message/SOAPHeaderElement.java Index: SOAPHeaderElement.java =================================================================== RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/message/SOAPHeaderElement.java,v retrieving revision 1.17 retrieving revision 1.18 diff -u -r1.17 -r1.18 --- SOAPHeaderElement.java 11 Dec 2002 22:38:20 -0000 1.17 +++ SOAPHeaderElement.java 20 Dec 2002 17:28:22 -0000 1.18 @@ -111,7 +111,7 @@ Constants.ATTR_MUST_UNDERSTAND); if (soapConstants == SOAPConstants.SOAP12_CONSTANTS) - mustUnderstand = ((val != null) && val.equals("true")) ? true : false; + mustUnderstand = ((val != null) && (val.equals("true") || val.equals("1"))) ? true : false; else mustUnderstand = ((val != null) && val.equals("1")) ? true : false; @@ -153,7 +153,7 @@ Constants.ATTR_MUST_UNDERSTAND); if (soapConstants == SOAPConstants.SOAP12_CONSTANTS) - mustUnderstand = ((val != null) && val.equals("true")) ? true : false; + mustUnderstand = ((val != null) && (val.equals("true") || val.equals("1"))) ? true : false; else mustUnderstand = ((val != null) && val.equals("1")) ? true : false; 1.38 +1 -0 xml-axis/java/src/org/apache/axis/i18n/resource.properties Index: resource.properties =================================================================== RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/i18n/resource.properties,v retrieving revision 1.37 retrieving revision 1.38 diff -u -r1.37 -r1.38 --- resource.properties 18 Dec 2002 00:39:55 -0000 1.37 +++ resource.properties 20 Dec 2002 17:28:22 -0000 1.38 @@ -992,6 +992,7 @@ onlyOneBodyFor12=Only one body allowed for SOAP 1.2 RPC noElemAfterBody12=No element allowed after SOAP 1.2 body +noSparseArray=Partially transmitted and sparse arrays is not supported in SOAP 1.2 differentTypes00=Error: The input and output parameter have the same name, ''{0}'', but are defined with type ''{1}'' and also with type ''{2}''. badMsgMethodParam=Message service must take either a single Vector or a Document - method {0} takes a single {1} 1.102 +8 -6 xml-axis/java/src/org/apache/axis/providers/java/RPCProvider.java Index: RPCProvider.java =================================================================== RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/providers/java/RPCProvider.java,v retrieving revision 1.101 retrieving revision 1.102 diff -u -r1.101 -r1.102 --- RPCProvider.java 11 Dec 2002 22:38:21 -0000 1.101 +++ RPCProvider.java 20 Dec 2002 17:28:22 -0000 1.102 @@ -325,15 +325,17 @@ returnQName = new QName("", methodName + "Return"); } - // For SOAP 1.2, add a result - if (msgContext.getSOAPConstants() == - SOAPConstants.SOAP12_CONSTANTS) { - returnQName = Constants.QNAME_RPC_RESULT; - } - RPCParam param = new RPCParam(returnQName, objRes); param.setParamDesc(operation.getReturnParamDesc()); + if (!operation.isReturnHeader()) { + // For SOAP 1.2 rpc style, add a result + if (msgContext.getSOAPConstants() == SOAPConstants.SOAP12_CONSTANTS && + !(serviceDesc.getStyle().equals(Style.DOCUMENT))) { + RPCParam resultParam = new RPCParam(Constants.QNAME_RPC_RESULT, returnQName); + resultParam.setXSITypeGeneration(Boolean.FALSE); + resBody.addParam(resultParam); + } resBody.addParam(param); } else { resEnv.addHeader(new RPCHeaderParam(param)); 1.8 +15 -0 xml-axis/java/src/org/apache/axis/soap/SOAP11Constants.java Index: SOAP11Constants.java =================================================================== RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/soap/SOAP11Constants.java,v retrieving revision 1.7 retrieving revision 1.8 diff -u -r1.7 -r1.8 --- SOAP11Constants.java 16 Oct 2002 15:03:04 -0000 1.7 +++ SOAP11Constants.java 20 Dec 2002 17:28:23 -0000 1.8 @@ -113,4 +113,19 @@ public String getNextRoleURI() { return Constants.URI_SOAP11_NEXT_ACTOR; } + + /** + * Obtain the ref attribute name + */ + public String getAttrHref() { + return Constants.ATTR_HREF; + } + + /** + * Obtain the item type name of an array + */ + public String getAttrItemType() { + return Constants.ATTR_ARRAY_TYPE; + } + } 1.9 +16 -0 xml-axis/java/src/org/apache/axis/soap/SOAP12Constants.java Index: SOAP12Constants.java =================================================================== RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/soap/SOAP12Constants.java,v retrieving revision 1.8 retrieving revision 1.9 diff -u -r1.8 -r1.9 --- SOAP12Constants.java 16 Oct 2002 15:03:04 -0000 1.8 +++ SOAP12Constants.java 20 Dec 2002 17:28:23 -0000 1.9 @@ -118,4 +118,20 @@ public String getNextRoleURI() { return Constants.URI_SOAP12_NEXT_ACTOR; } + + /** + * Obtain the ref attribute name + */ + public String getAttrHref() { + return Constants.ATTR_REF; + } + + /** + * Obtain the item type name of an array + */ + public String getAttrItemType() { + return Constants.ATTR_ITEM_TYPE; + } + + } 1.9 +14 -0 xml-axis/java/src/org/apache/axis/soap/SOAPConstants.java Index: SOAPConstants.java =================================================================== RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/soap/SOAPConstants.java,v retrieving revision 1.8 retrieving revision 1.9 diff -u -r1.8 -r1.9 --- SOAPConstants.java 11 Dec 2002 22:38:22 -0000 1.8 +++ SOAPConstants.java 20 Dec 2002 17:28:23 -0000 1.9 @@ -113,4 +113,18 @@ * Obtain the "next" role/actor URI */ public String getNextRoleURI(); + + /** + * Obtain the href attribute name + */ + public String getAttrHref(); + + /** + * Obtain the item type name of an array + */ + public String getAttrItemType(); + + + + } 1.91 +6 -6 xml-axis/java/src/org/apache/axis/handlers/soap/SOAPService.java Index: SOAPService.java =================================================================== RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/handlers/soap/SOAPService.java,v retrieving revision 1.90 retrieving revision 1.91 diff -u -r1.90 -r1.91 --- SOAPService.java 11 Dec 2002 22:38:19 -0000 1.90 +++ SOAPService.java 20 Dec 2002 17:28:23 -0000 1.91 @@ -162,11 +162,11 @@ } /** - * SOAPRequestHandler is used to inject SOAP semantics just before + * SOAPResponseHandler is used to inject SOAP semantics just before * the pivot handler. */ - private class SOAPRequestHandler extends BasicHandler { - public SOAPRequestHandler() {} + private class SOAPResponseHandler extends BasicHandler { + public SOAPResponseHandler() {} public void invoke(MessageContext msgContext) throws AxisFault { // Do SOAP semantics here @@ -217,7 +217,7 @@ SOAPHeaderElement newHeader = new SOAPHeaderElement(Constants.URI_SOAP12_FAULT, - Constants.ELEM_MISUNDERSTOOD); + Constants.ELEM_NOTUNDERSTOOD); newHeader.addAttribute(null, Constants.ATTR_QNAME, badQName); @@ -254,7 +254,7 @@ public SOAPService(Handler reqHandler, Handler pivHandler, Handler respHandler) { this(); - init(reqHandler, new SOAPRequestHandler(), pivHandler, null, respHandler); + init(reqHandler, null, pivHandler, new SOAPResponseHandler(), respHandler); } public TypeMappingRegistry getTypeMappingRegistry() @@ -267,7 +267,7 @@ */ public SOAPService(Handler serviceHandler) { - init(null, new SOAPRequestHandler(), serviceHandler, null, null); + init(null, null, serviceHandler, new SOAPResponseHandler(), null); } /** Tell this service which engine it's deployed to.