gdaniels 2002/12/13 12:38:04 Modified: java/src/org/apache/axis/description OperationDesc.java java/src/org/apache/axis/encoding SerializationContextImpl.java java/src/org/apache/axis/message RPCParam.java java/src/org/apache/axis/utils JavaUtils.java java/test/functional TestMessageSample.java Log: * Fix bug: http://nagoya.apache.org/bugzilla/show_bug.cgi?id=15328 Correctly push()/pop() when registering namespaces in SerializationContextImpl. This should now really be fixed? * Invert expected + actual args in Message test (grrrr), and reset expected string since we are incrementing the ns index * When checking for polymorphic types in RPCParam, ignore the Holder/Held relationship - i.e. don't force xsi:type for this case * Fix getOutputParamByQName() in OperationDesc to scan past any non-output params with the desired QName. This problem was brought to light by the wrapped_holders test once the xsi: type problem above was fixed * Tiny speedup in JavaUtils.getHolderValueType() Revision Changes Path 1.29 +11 -12 xml-axis/java/src/org/apache/axis/description/OperationDesc.java Index: OperationDesc.java =================================================================== RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/description/OperationDesc.java,v retrieving revision 1.28 retrieving revision 1.29 diff -u -r1.28 -r1.29 --- OperationDesc.java 11 Dec 2002 22:38:13 -0000 1.28 +++ OperationDesc.java 13 Dec 2002 20:38:03 -0000 1.29 @@ -359,20 +359,19 @@ { ParameterDesc param = null; - param = getParamByQName(qname); - - if (param != null && param.getMode() == ParameterDesc.IN) { - param = null; + for (Iterator i = parameters.iterator(); i.hasNext();) { + param = (ParameterDesc) i.next(); + if (param.getQName().equals(qname) && + param.getMode() != ParameterDesc.IN) + return param; } - if ((param == null) || (param.getMode() == ParameterDesc.IN)) { - if (null == returnDesc.getQName() ){ - param= new ParameterDesc( returnDesc); //Create copy - param.setQName(qname); - } - else if ( qname.equals(returnDesc.getQName())) { - param = returnDesc; - } + if (null == returnDesc.getQName() ){ + param= new ParameterDesc( returnDesc); //Create copy + param.setQName(qname); + } + else if ( qname.equals(returnDesc.getQName())) { + param = returnDesc; } return param; 1.86 +47 -37 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.85 retrieving revision 1.86 diff -u -r1.85 -r1.86 --- SerializationContextImpl.java 11 Dec 2002 22:38:14 -0000 1.85 +++ SerializationContextImpl.java 13 Dec 2002 20:38:04 -0000 1.86 @@ -160,6 +160,7 @@ */ private HashMap multiRefValues = null; private int multiRefIndex = -1; + private boolean noNamespaceMappings = true; class MultiRefItem { String id; @@ -425,6 +426,10 @@ } if ((uri != null) && (prefix != null)) { + if (noNamespaceMappings) { + nsStack.push(); + noNamespaceMappings = false; + } nsStack.add(uri, prefix); } } @@ -810,7 +815,7 @@ "CDATA", encodingStyle); - // Make a copy of the keySet because it could be updated + // Make a copy of the keySet because it could be updated // during processing HashSet keys = new HashSet(); keys.addAll(multiRefValues.keySet()); @@ -926,25 +931,30 @@ } } - for (Mapping map=nsStack.topOfFrame(); map!=null; map=nsStack.next()) { - StringBuffer sb = new StringBuffer("xmlns"); - if (map.getPrefix().length() > 0) { - sb.append(':'); - sb.append(map.getPrefix()); - } - if ((vecQNames==null) || (vecQNames.indexOf(sb.toString())==-1)) { - writer.write(' '); - sb.append("=\""); - sb.append(map.getNamespaceURI()); - sb.append('"'); - writer.write(sb.toString()); + if (noNamespaceMappings) { + nsStack.push(); + } else { + for (Mapping map=nsStack.topOfFrame(); map!=null; map=nsStack.next()) { + StringBuffer sb = new StringBuffer("xmlns"); + if (map.getPrefix().length() > 0) { + sb.append(':'); + sb.append(map.getPrefix()); + } + if ((vecQNames==null) || (vecQNames.indexOf(sb.toString())==-1)) { + writer.write(' '); + sb.append("=\""); + sb.append(map.getNamespaceURI()); + sb.append('"'); + writer.write(sb.toString()); + } } + + noNamespaceMappings = true; } writingStartTag = true; elementStack.push(elementQName); - nsStack.push(); onlyXML=true; } @@ -1167,7 +1177,7 @@ } // Set currentXMLType to the one desired one. - // Note for maxOccurs usage this xmlType is the + // Note for maxOccurs usage this xmlType is the // type of the component not the type of the array. currentXMLType = xmlType; @@ -1179,17 +1189,17 @@ // Try getting a serializer for the prefered xmlType QNameHolder actualXMLType = new QNameHolder(); - Serializer ser = getSerializer(javaType, xmlType, + Serializer ser = getSerializer(javaType, xmlType, actualXMLType); if ( ser != null ) { // Send the xmlType if indicated or if - // the actual xmlType is different than the + // the actual xmlType is different than the // prefered xmlType - if (shouldSendType || - (xmlType != null && + if (shouldSendType || + (xmlType != null && (!xmlType.equals(actualXMLType.value)))) { - attributes = setTypeAttribute(attributes, + attributes = setTypeAttribute(attributes, actualXMLType.value); } @@ -1209,9 +1219,9 @@ return; } - // if no serializer was configured try to find one dynamically using WSDLJava + // if no serializer was configured try to find one dynamically using WSDLJava // generated metadata - try { + try { Method method = value.getClass().getMethod( "getSerializer", getSerializerClasses); if (method != null) { @@ -1221,10 +1231,10 @@ if (typedesc != null) { QName qname = typedesc.getXmlType(); if (qname != null) { - attributes = setTypeAttribute(attributes, + attributes = setTypeAttribute(attributes, qname); } - } + } serializer.serialize(elemQName, attributes, value, this); return; } @@ -1248,10 +1258,10 @@ /** * Walk the interfaces of a class looking for a serializer for that * interface. Include any parent interfaces in the search also. - * - */ - private SerializerFactory getSerializerFactoryFromInterface(Class javaType, - QName xmlType, + * + */ + private SerializerFactory getSerializerFactoryFromInterface(Class javaType, + QName xmlType, TypeMapping tm) { SerializerFactory serFactory = null ; @@ -1265,22 +1275,22 @@ serFactory = getSerializerFactoryFromInterface(iface, xmlType, tm); if (serFactory != null) break; - + } } return serFactory; } - + /** * getSerializer * Attempts to get a serializer for the indicated javaType and xmlType. * @param javaType is the type of the object * @param xmlType is the preferred qname type. - * @param actualXMLType is set to a QNameHolder or null. + * @param actualXMLType is set to a QNameHolder or null. * If a QNameHolder, the actual xmlType is returned. * @return found class/serializer or null **/ - private Serializer getSerializer(Class javaType, QName xmlType, + private Serializer getSerializer(Class javaType, QName xmlType, QNameHolder actualXMLType) { SerializerFactory serFactory = null ; TypeMapping tm = getTypeMapping(); @@ -1295,7 +1305,7 @@ // Walk my interfaces... serFactory = getSerializerFactoryFromInterface(javaType, xmlType, tm); - + // Finally, head to my superclass if (serFactory != null) break; @@ -1307,18 +1317,18 @@ Serializer ser = null; if ( serFactory != null ) { ser = (Serializer) serFactory.getSerializerAs(Constants.AXIS_SAX); - + if (actualXMLType != null) { // Get the actual qname xmlType from the factory. // If not found via the factory, fall back to a less // performant solution. if (serFactory instanceof BaseSerializerFactory) { - actualXMLType.value = + actualXMLType.value = ((BaseSerializerFactory) serFactory).getXMLType(); } if (actualXMLType.value == null) { - actualXMLType.value = - ((TypeMappingImpl) tm).getXMLType(javaType, + actualXMLType.value = + ((TypeMappingImpl) tm).getXMLType(javaType, xmlType); } } 1.53 +6 -3 xml-axis/java/src/org/apache/axis/message/RPCParam.java Index: RPCParam.java =================================================================== RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/message/RPCParam.java,v retrieving revision 1.52 retrieving revision 1.53 diff -u -r1.52 -r1.53 --- RPCParam.java 11 Dec 2002 22:38:20 -0000 1.52 +++ RPCParam.java 13 Dec 2002 20:38:04 -0000 1.53 @@ -58,6 +58,7 @@ import org.apache.axis.description.ParameterDesc; import org.apache.axis.encoding.SerializationContext; import org.apache.axis.utils.Messages; +import org.apache.axis.utils.JavaUtils; import org.apache.commons.logging.Log; import javax.xml.namespace.QName; @@ -213,9 +214,11 @@ javaType = paramDesc.getJavaType() != null ? paramDesc.getJavaType(): javaType; } else if (!(javaType.equals(paramDesc.getJavaType()))) { - // This must (assumedly) be a polymorphic type - in ALL - // such cases, we must send an xsi:type attribute. - wantXSIType = Boolean.TRUE; + if (!(javaType.equals( + JavaUtils.getHolderValueType(paramDesc.getJavaType())))) + // This must (assumedly) be a polymorphic type - in ALL + // such cases, we must send an xsi:type attribute. + wantXSIType = Boolean.TRUE; } xmlType = paramDesc.getTypeQName(); } 1.87 +1 -1 xml-axis/java/src/org/apache/axis/utils/JavaUtils.java Index: JavaUtils.java =================================================================== RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/utils/JavaUtils.java,v retrieving revision 1.86 retrieving revision 1.87 diff -u -r1.86 -r1.87 --- JavaUtils.java 11 Dec 2002 22:38:27 -0000 1.86 +++ JavaUtils.java 13 Dec 2002 20:38:04 -0000 1.87 @@ -861,7 +861,7 @@ if (type != null) { Class[] intf = type.getInterfaces(); boolean isHolder = false; - for (int i=0; i<intf.length; i++) { + for (int i=0; i<intf.length && !isHolder; i++) { if (intf[i] == javax.xml.rpc.holders.Holder.class) { isHolder = true; } 1.12 +4 -4 xml-axis/java/test/functional/TestMessageSample.java Index: TestMessageSample.java =================================================================== RCS file: /home/cvs/xml-axis/java/test/functional/TestMessageSample.java,v retrieving revision 1.11 retrieving revision 1.12 diff -u -r1.11 -r1.12 --- TestMessageSample.java 11 Dec 2002 22:40:16 -0000 1.11 +++ TestMessageSample.java 13 Dec 2002 20:38:04 -0000 1.12 @@ -81,13 +81,13 @@ String[] args = { }; String res = (new TestMsg()).doit(args); String expected="Res elem[0]=<ns1:e1 xmlns:ns1=\"urn:foo\">Hello</ns1:e1>" - +"Res elem[1]=<ns1:e1 xmlns:ns1=\"urn:foo\">World</ns1:e1>" - +"Res elem[2]=<ns1:e3 xmlns:ns1=\"urn:foo\">" + +"Res elem[1]=<ns2:e1 xmlns:ns2=\"urn:foo\">World</ns2:e1>" + +"Res elem[2]=<ns3:e3 xmlns:ns3=\"urn:foo\">" +"<![CDATA[" +"Text with\n\tImportant <b> whitespace </b> and tags! " +"]]>" - +"</ns1:e3>"; - assertEquals("test result elements", res, expected); + +"</ns3:e3>"; + assertEquals("test result elements", expected, res); } public void doTestUndeploy () throws Exception {