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 {