tomj 2002/09/19 13:25:13 Modified: java/test/wsdl/extensibility build.xml ExtensibilityQueryTestCase.java server-deploy.wsdd java/test/encoding TestBeanDeser2.java TestDeser.java java/src/org/apache/axis/wsdl/toJava JavaBeanHelperWriter.java java/src/org/apache/axis/encoding/ser BeanDeserializer.java BeanSerializer.java java/src/org/apache/axis/description FieldDesc.java Log: Fix bug 12339 - xsd:date uses Calendar Serializer/Deserializer instead of Date - Enhanced the FieldDesc class to have getter/setter for xmlType QName. - JavaBeanHelper will set this element for fields (but not array types). - The BeanDeserializer now uses the xmlType in the FieldDesc when looking up the correct deserializer for the bean element. - The BeanSerializer passes the xmlType in preference to looking up the QName of the java class. This prevents the wrong serializer from getting used if a class is mapped to more than one XML type (i.e. java.utils.Date). Test fixes and improvements: - Fix up the namespaces (which now count) in Deserailization test - Added a few new assertions to TestBeanDeser2.java Extensibility WSDL test: - Correct type mappings in config WSDD and client - Improve the way we call AdminClient and print a reasonable error - Copy the Extensibility test server-config.wsdd to the work directory Revision Changes Path 1.8 +1 -0 xml-axis/java/test/wsdl/extensibility/build.xml Index: build.xml =================================================================== RCS file: /home/cvs/xml-axis/java/test/wsdl/extensibility/build.xml,v retrieving revision 1.7 retrieving revision 1.8 diff -u -r1.7 -r1.8 --- build.xml 10 Sep 2002 16:06:53 -0000 1.7 +++ build.xml 19 Sep 2002 20:25:12 -0000 1.8 @@ -74,6 +74,7 @@ <fileset dir="${axis.home}/test/wsdl/extensibility"> <include name="*TestCase.java"/> <include name="*Impl.java"/> + <include name="server-deploy.wsdd"/> </fileset> </copy> 1.13 +30 -2 xml-axis/java/test/wsdl/extensibility/ExtensibilityQueryTestCase.java Index: ExtensibilityQueryTestCase.java =================================================================== RCS file: /home/cvs/xml-axis/java/test/wsdl/extensibility/ExtensibilityQueryTestCase.java,v retrieving revision 1.12 retrieving revision 1.13 diff -u -r1.12 -r1.13 --- ExtensibilityQueryTestCase.java 18 Aug 2002 14:19:50 -0000 1.12 +++ ExtensibilityQueryTestCase.java 19 Sep 2002 20:25:12 -0000 1.13 @@ -9,6 +9,7 @@ import org.apache.axis.EngineConfiguration; import org.apache.axis.AxisEngine; +import org.apache.axis.utils.Options; import org.apache.axis.message.MessageElement; import org.apache.axis.client.AdminClient; import org.apache.axis.encoding.TypeMappingRegistry; @@ -21,6 +22,10 @@ import javax.xml.rpc.encoding.TypeMapping; import javax.xml.namespace.QName; import java.util.Calendar; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.FileNotFoundException; public class ExtensibilityQueryTestCase extends junit.framework.TestCase { public ExtensibilityQueryTestCase(String name) { @@ -56,11 +61,15 @@ bookQuery.setBookQuery(book); MessageElement el = new MessageElement("foo", "Bar", bookQuery); expression.set_any(new MessageElement [] { el }); + // call the operation ExtensibilityType any = binding.query(expression); + // validate results MessageElement [] anyContent = any.get_any(); assertEquals(1, anyContent.length); QueryResultElement resEl = (QueryResultElement )anyContent[0].getObjectValue(); + assertNotNull("QueryResultElement back from anyContent[0].getObjectValue()", resEl); ResultListType result = resEl.getResultList(); + assertNotNull("ResultListType back from getResultList()", result); QueryResultType[] queryResult = result.getResult(); assertTrue(queryResult.length == 2); isValid(queryResult[0], "Computer Science", "The Grid"); @@ -86,7 +95,7 @@ TypeMapping mapping = registry.createTypeMapping(); addBeanMapping(mapping, "FindBooksQueryExpressionElement", FindBooksQueryExpressionElement.class); addBeanMapping(mapping, "BookType", BookType.class); - addBeanMapping(mapping, "resultList", ResultListType.class); + addBeanMapping(mapping, "ResultListType", ResultListType.class); addBeanMapping(mapping, "QueryResultType", QueryResultType.class); addBeanMapping(mapping, "QueryResultElement", QueryResultElement.class); registry.register("",mapping); @@ -103,7 +112,26 @@ } private void deployServer() { - AdminClient.main(new String[] { "test/wsdl/extensibility/server-deploy.wsdd" }); + final String INPUT_FILE = "server-deploy.wsdd"; + + InputStream is = getClass().getResourceAsStream(INPUT_FILE); + if (is == null) { + // try current directory + try { + is = new FileInputStream(INPUT_FILE); + } catch (FileNotFoundException e) { + is = null; + } + } + assertNotNull("Unable to find " + INPUT_FILE + ". Make sure it is on the classpath or in the current directory.", is); + AdminClient admin = new AdminClient(); + try { + Options opts = new Options( null ); + opts.setDefaultURL("http://localhost:8080/axis/services/AdminService"); + admin.process(opts, is); + } catch (Exception e) { + assertTrue("Unable to deploy " + INPUT_FILE + ". ERROR: " + e, false); + } } } 1.6 +1 -1 xml-axis/java/test/wsdl/extensibility/server-deploy.wsdd Index: server-deploy.wsdd =================================================================== RCS file: /home/cvs/xml-axis/java/test/wsdl/extensibility/server-deploy.wsdd,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- server-deploy.wsdd 16 Aug 2002 11:07:10 -0000 1.5 +++ server-deploy.wsdd 19 Sep 2002 20:25:12 -0000 1.6 @@ -63,7 +63,7 @@ /> <typeMapping - qname="query:bookQuery" + qname="query:BookType" type="java:test.wsdl.extensibility.BookType" serializer="org.apache.axis.encoding.ser.BeanSerializerFactory" deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory" 1.2 +1 -0 xml-axis/java/test/encoding/TestBeanDeser2.java Index: TestBeanDeser2.java =================================================================== RCS file: /home/cvs/xml-axis/java/test/encoding/TestBeanDeser2.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- TestBeanDeser2.java 28 Jun 2002 12:36:51 -0000 1.1 +++ TestBeanDeser2.java 19 Sep 2002 20:25:12 -0000 1.2 @@ -124,6 +124,7 @@ "</multiRef>"; test.encoding.beans.SbTravelRequest travelRequest = (test.encoding.beans.SbTravelRequest) deserialize(response); + assertNotNull("supPliers array missing", travelRequest.supPliers); assertTrue(travelRequest.supPliers.length==1); assertTrue(travelRequest.supPliers[0].searchType.intValue()==0); assertTrue(travelRequest.supPliers[0].supplierCode.equals("SC**")); 1.40 +10 -10 xml-axis/java/test/encoding/TestDeser.java Index: TestDeser.java =================================================================== RCS file: /home/cvs/xml-axis/java/test/encoding/TestDeser.java,v retrieving revision 1.39 retrieving revision 1.40 diff -u -r1.39 -r1.40 --- TestDeser.java 28 Jun 2002 06:17:55 -0000 1.39 +++ TestDeser.java 19 Sep 2002 20:25:12 -0000 1.40 @@ -50,7 +50,7 @@ "<soap:Envelope " + "xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" " + "xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\" " + - "xmlns:me=\"urn:me\" " + + "xmlns:me=\"http://soapinterop.org/xsd\" " + "xmlns:xsi=\"" + NS_XSI + "\" " + "xmlns:xsd=\"" + NS_XSD + "\">\n" + "<soap:Body>\n" + @@ -66,33 +66,33 @@ tm.setSupportedEncodings(new String[] {Constants.URI_DEFAULT_SOAP_ENC}); tmr.register(Constants.URI_DEFAULT_SOAP_ENC, tm); tm.register(java.lang.String[].class, - new QName("urn:me", "ArrayOfString"), + new QName("http://soapinterop.org/xsd", "ArrayOfString"), new org.apache.axis.encoding.ser.ArraySerializerFactory(), new org.apache.axis.encoding.ser.ArrayDeserializerFactory()); tm.register(java.lang.Object[].class, - new QName("urn:me", "ArrayOfObject"), + new QName("http://soapinterop.org/xsd", "ArrayOfObject"), new org.apache.axis.encoding.ser.ArraySerializerFactory(), new org.apache.axis.encoding.ser.ArrayDeserializerFactory()); tm.register(samples.echo.SOAPStruct.class, - new QName("urn:me", "SOAPStruct"), + new QName("http://soapinterop.org/xsd", "SOAPStruct"), new org.apache.axis.encoding.ser.BeanSerializerFactory( samples.echo.SOAPStruct.class, - new QName("urn:me", "SOAPStruct")), + new QName("http://soapinterop.org/xsd", "SOAPStruct")), new org.apache.axis.encoding.ser.BeanDeserializerFactory( samples.echo.SOAPStruct.class, - new QName("urn:me", "SOAPStruct"))); + new QName("http://soapinterop.org/xsd", "SOAPStruct"))); tm.register(samples.echo.SOAPStruct[].class, - new QName("urn:me", "ArrayOfSOAPStruct"), + new QName("http://soapinterop.org/xsd", "ArrayOfSOAPStruct"), new org.apache.axis.encoding.ser.ArraySerializerFactory(), new org.apache.axis.encoding.ser.ArrayDeserializerFactory()); tm.register(samples.echo.SOAPStructStruct.class, - new QName("urn:me", "SOAPStructStruct"), + new QName("http://soapinterop.org/xsd", "SOAPStructStruct"), new org.apache.axis.encoding.ser.BeanSerializerFactory( samples.echo.SOAPStructStruct.class, - new QName("urn:me", "SOAPStructStruct")), + new QName("http://soapinterop.org/xsd", "SOAPStructStruct")), new org.apache.axis.encoding.ser.BeanDeserializerFactory( samples.echo.SOAPStructStruct.class, - new QName("urn:me", "SOAPStructStruct"))); + new QName("http://soapinterop.org/xsd", "SOAPStructStruct"))); } /** 1.24 +19 -7 xml-axis/java/src/org/apache/axis/wsdl/toJava/JavaBeanHelperWriter.java Index: JavaBeanHelperWriter.java =================================================================== RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/wsdl/toJava/JavaBeanHelperWriter.java,v retrieving revision 1.23 retrieving revision 1.24 diff -u -r1.23 -r1.24 --- JavaBeanHelperWriter.java 18 Sep 2002 19:14:12 -0000 1.23 +++ JavaBeanHelperWriter.java 19 Sep 2002 20:25:12 -0000 1.24 @@ -60,6 +60,7 @@ import java.util.Vector; import javax.xml.namespace.QName; +import javax.xml.rpc.holders.BooleanHolder; import org.apache.axis.utils.Messages; @@ -236,10 +237,12 @@ if (attributes != null) { for (int i = 0; i < attributes.size(); i += 2) { + TypeEntry te = (TypeEntry) attributes.get(i); QName attrName = (QName) attributes.get(i + 1); String attrLocalName = attrName.getLocalPart(); String fieldName = Utils.xmlNameToJava(attrLocalName); fieldName = getAsFieldName(fieldName); + QName attrXmlType = te.getQName(); pw.print(" "); if (!wroteFieldType) { pw.print("org.apache.axis.description.FieldDesc "); @@ -247,10 +250,10 @@ } pw.println("field = new org.apache.axis.description.AttributeDesc();"); pw.println(" field.setFieldName(\"" + fieldName + "\");"); - pw.print(" field.setXmlName("); - pw.print("new javax.xml.namespace.QName(\""); - pw.print(attrName.getNamespaceURI() + "\", \""); - pw.println(attrName.getLocalPart() + "\"));"); + pw.println(" field.setXmlName(" + Utils.getNewQName(attrName) + ");"); + if (attrXmlType != null) { + pw.println(" field.setXmlType(" + Utils.getNewQName(attrXmlType) + ");"); + } pw.println(" typeDesc.addFieldDesc(field);"); } } @@ -267,6 +270,14 @@ String fieldName = Utils.xmlNameToJava(elemLocalName); fieldName = getAsFieldName(fieldName); QName xmlName = elem.getName(); + + // Some special handling for arrays + QName xmlType = elem.getType().getQName(); + if (xmlType != null && xmlType.getLocalPart().indexOf("[") > 0) { + // Skip array types, because they are special + xmlType = null; + } + pw.print(" "); if (!wroteFieldType) { pw.print("org.apache.axis.description.FieldDesc "); @@ -274,9 +285,10 @@ } pw.println("field = new org.apache.axis.description.ElementDesc();"); pw.println(" field.setFieldName(\"" + fieldName + "\");"); - pw.print( " field.setXmlName(new javax.xml.namespace.QName(\""); - pw.println(xmlName.getNamespaceURI() + "\", \"" + - xmlName.getLocalPart() + "\"));"); + pw.println(" field.setXmlName(" + Utils.getNewQName(xmlName) + ");"); + if (xmlType != null) { + pw.println(" field.setXmlType(" + Utils.getNewQName(xmlType) + ");"); + } if (elem.getMinOccursIs0()) { pw.println(" field.setMinOccursIs0(true);"); } 1.54 +8 -0 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.53 retrieving revision 1.54 diff -u -r1.53 -r1.54 --- BeanDeserializer.java 18 Sep 2002 16:10:35 -0000 1.53 +++ BeanDeserializer.java 19 Sep 2002 20:25:12 -0000 1.54 @@ -56,6 +56,7 @@ import org.apache.axis.Constants; import org.apache.axis.description.TypeDesc; +import org.apache.axis.description.FieldDesc; import org.apache.axis.encoding.DeserializationContext; import org.apache.axis.encoding.Deserializer; import org.apache.axis.encoding.DeserializerImpl; @@ -189,6 +190,7 @@ throws SAXException { BeanPropertyDescriptor propDesc = null; + FieldDesc fieldDesc = null; String encodingStyle = context.getMessageContext().getEncodingStyle(); boolean isEncoded = Constants.isSOAP_ENC(encodingStyle); @@ -206,6 +208,7 @@ String fieldName = typeDesc.getFieldNameForElement(elemQName, isEncoded); propDesc = (BeanPropertyDescriptor)propertyMap.get(fieldName); + fieldDesc = typeDesc.getFieldByName(fieldName); } if (propDesc == null) { @@ -255,6 +258,11 @@ QName childXMLType = context.getTypeFromXSITypeAttr(namespace, localName, attributes); + + // If no xsi:type, check the meta-data for the field + if (childXMLType == null && fieldDesc != null) { + childXMLType = fieldDesc.getXmlType(); + } // Get Deserializer for child, default to using DeserializerImpl Deserializer dSer = getDeserializer(childXMLType, propDesc.getType(), 1.57 +8 -1 xml-axis/java/src/org/apache/axis/encoding/ser/BeanSerializer.java Index: BeanSerializer.java =================================================================== RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/encoding/ser/BeanSerializer.java,v retrieving revision 1.56 retrieving revision 1.57 diff -u -r1.56 -r1.57 --- BeanSerializer.java 18 Sep 2002 16:10:35 -0000 1.56 +++ BeanSerializer.java 19 Sep 2002 20:25:12 -0000 1.57 @@ -161,6 +161,7 @@ if (propName.equals("class")) continue; QName qname = null; + QName xmlType = null; boolean isOmittable = false; // If we have type metadata, check to see what we're doing @@ -184,6 +185,7 @@ qname = field.getXmlName(); } isOmittable = field.isMinOccursIs0(); + xmlType = field.getXmlType(); } } @@ -193,6 +195,11 @@ qname = new QName("", propName); } + if (xmlType == null) { + // look up the type QName using the class + xmlType = context.getQNameForClass(propertyDescriptor[i].getType()); + } + // Read the value from the property if(propertyDescriptor[i].isReadable()) { if (!propertyDescriptor[i].isIndexed()) { @@ -210,7 +217,7 @@ context.serialize(qname, null, propValue, - context.getQNameForClass(propertyDescriptor[i].getType()), + xmlType, true, null); } else { 1.7 +14 -0 xml-axis/java/src/org/apache/axis/description/FieldDesc.java Index: FieldDesc.java =================================================================== RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/description/FieldDesc.java,v retrieving revision 1.6 retrieving revision 1.7 diff -u -r1.6 -r1.7 --- FieldDesc.java 21 Aug 2002 18:48:43 -0000 1.6 +++ FieldDesc.java 19 Sep 2002 20:25:13 -0000 1.7 @@ -126,6 +126,20 @@ } /** + * Returns the XML type (e.g. xsd:string) for this field + */ + public QName getXmlType() { + return xmlType; + } + + /** + * Returns the XML type (e.g. xsd:string) for this field + */ + public void setXmlType(QName xmlType) { + this.xmlType = xmlType; + } + + /** * Check if this is an element or an attribute. * * @return true if this is an ElementDesc, or false if an AttributeDesc