tomj 2002/07/01 09:09:39 Modified: java/test/wsdl Wsdl2javaTestSuite.xml java/src/org/apache/axis/encoding SerializationContextImpl.java SerializationContext.java java/src/org/apache/axis/wsdl/symbolTable SchemaUtils.java java/src/org/apache/axis/utils NSStack.java java/src/org/apache/axis/wsdl/toJava JavaWriter.java JavaBeanWriter.java JavaBeanHelperWriter.java java/src/org/apache/axis/encoding/ser BeanSerializer.java Added: java/test/wsdl/qualify2 AttributeQualify_ServiceTestCase.java AttributeQualify_BindingImpl.java attribute-qualify.wsdl Log: Fix for bug 9406: support for attribute qualification. http://nagoya.apache.org/bugzilla/show_bug.cgi?id=9405 Add a test case. Serialize and deserialize attributes on beans. Example: <person age="35" ns1:hair="brown" xmlns:ns1="urn:namespace"> </person> This involved tweaking the prefix regitration in the serializer. Also fixed a minor bug with the WSDL2Java verbose output. Revision Changes Path 1.110 +13 -2 xml-axis/java/test/wsdl/Wsdl2javaTestSuite.xml Index: Wsdl2javaTestSuite.xml =================================================================== RCS file: /home/cvs/xml-axis/java/test/wsdl/Wsdl2javaTestSuite.xml,v retrieving revision 1.109 retrieving revision 1.110 diff -u -r1.109 -r1.110 --- Wsdl2javaTestSuite.xml 27 Jun 2002 16:36:10 -0000 1.109 +++ Wsdl2javaTestSuite.xml 1 Jul 2002 16:09:38 -0000 1.110 @@ -884,11 +884,20 @@ <wsdl2java url="test/wsdl/qualify/qualifytest.wsdl" output="build/work" serverSide="yes" - testcase="yes"> + testcase="no"> <mapping namespace="urn:qualifyTest" package="test.wsdl.qualify"/> </wsdl2java> - <!-- This tests element qualification. --> + <!-- test for qualified or unqualified attributes --> + <wsdl2java url="test/wsdl/qualify2/attribute-qualify.wsdl" + output="build/work" + serverSide="yes" + testcase="no"> + <mapping namespace="urn:attributeQualify" package="test.wsdl.qualify2"/> + </wsdl2java> + + + <!-- This tests Bug 9642 - Java Date not deserialize properly. --> <wsdl2java url="test/wsdl/ram/ram.wsdl" output="build/work" serverSide="yes" @@ -912,6 +921,8 @@ serverSide="yes" testcase="no"> </wsdl2java> + + <!-- The following WSDL are BAD. We're keeping them here so we can --> <!-- check periodically to see whether the owner has fixed them. --> 1.36 +33 -4 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.35 retrieving revision 1.36 diff -u -r1.35 -r1.36 --- SerializationContextImpl.java 30 Jun 2002 18:15:46 -0000 1.35 +++ SerializationContextImpl.java 1 Jul 2002 16:09:38 -0000 1.36 @@ -325,7 +325,7 @@ */ public String getPrefixForURI(String uri) { - return getPrefixForURI(uri, null); + return getPrefixForURI(uri, null, false); } /** @@ -336,16 +336,22 @@ */ public String getPrefixForURI(String uri, String defaultPrefix) { + return getPrefixForURI(uri, defaultPrefix, false); + } + public String getPrefixForURI(String uri, String defaultPrefix, boolean attribute) + { if ((uri == null) || (uri.equals(""))) return null; - String prefix = nsStack.getPrefix(uri); + // If we're looking for an attribute prefix, we shouldn't use the + // "" prefix, but always register/find one. + String prefix = nsStack.getPrefix(uri, attribute); if (prefix == null && uri.equals(soapConstants.getEncodingURI())) { prefix = Constants.NS_PREFIX_SOAP_ENC; registerPrefixForURI(prefix, uri); } - + if (prefix == null) { if (defaultPrefix == null) { prefix = "ns" + lastPrefixIndex++; @@ -422,6 +428,29 @@ { return qName2String(qName, false); } + + /** + * Convert attribute QName to a string of the form <prefix>:<localpart> + * There are slightly different rules for attributes: + * - There is no default namespace + * - any attribute in a namespace must have a prefix + * + * @param QName + * @return prefixed qname representation for serialization. + */ + public String attributeQName2String(QName qName) { + String prefix = null; + + if (! qName.getNamespaceURI().equals("")) { + prefix = getPrefixForURI(qName.getNamespaceURI(), null, true); + } + + String ret = (((prefix != null) && (!prefix.equals(""))) ? + prefix + ":" : "") + + qName.getLocalPart(); + return ret; + } + /** * Get the QName associated with the specified class. * @param cls Class of an object requiring serialization. @@ -759,7 +788,7 @@ if (idx > -1) { prefix = qname.substring(0, idx); prefix = getPrefixForURI(uri, - prefix); + prefix, true); } } if (!prefix.equals("")) { 1.77 +8 -0 xml-axis/java/src/org/apache/axis/encoding/SerializationContext.java Index: SerializationContext.java =================================================================== RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/encoding/SerializationContext.java,v retrieving revision 1.76 retrieving revision 1.77 diff -u -r1.76 -r1.77 --- SerializationContext.java 11 Jun 2002 14:53:54 -0000 1.76 +++ SerializationContext.java 1 Jul 2002 16:09:38 -0000 1.77 @@ -228,6 +228,14 @@ public String qName2String(QName qName); /** + * Convert attribute QName to a string of the form <prefix>:<localpart> + * There are some special rules for attributes + * @param QName + * @return prefixed qname representation for serialization. + */ + public String attributeQName2String(QName qName); + + /** * Get the QName associated with the specified class. * @param Class of an object requiring serialization. * @return appropriate QName associated with the class. 1.10 +42 -17 xml-axis/java/src/org/apache/axis/wsdl/symbolTable/SchemaUtils.java Index: SchemaUtils.java =================================================================== RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/wsdl/symbolTable/SchemaUtils.java,v retrieving revision 1.9 retrieving revision 1.10 diff -u -r1.9 -r1.10 --- SchemaUtils.java 20 Jun 2002 21:17:38 -0000 1.9 +++ SchemaUtils.java 1 Jul 2002 16:09:38 -0000 1.10 @@ -1049,28 +1049,53 @@ // we have an attribute node if (v == null) v = new Vector(); - - // type - QName typeAttr = Utils.getNodeTypeRefQName(child, "type"); - if (typeAttr == null) { - // Could be defined as an anonymous type - typeAttr = getAttributeAnonQName(child); - } - // Get the corresponding TypeEntry - TypeEntry type = symbolTable.getTypeEntry(typeAttr, false); + // Get the name and type qnames. + // The type qname is used to locate the TypeEntry, which is then + // used to retrieve the proper java name of the type. + QName attributeName = Utils.getNodeNameQName(child); + BooleanHolder forElement = new BooleanHolder(); + QName attributeType = Utils.getNodeTypeRefQName(child, forElement); - // Need to add code here to get the qualified or unqualified - // name. Similar to the code around line 350 for elements. - // Rich Scheuerle - - // Now get the name. - QName name = Utils.getNodeNameQName(child); + // An attribute is either qualified or unqualified. + // If the ref= attribute is used, the name of the ref'd element is used + // (which must be a root element). If the ref= attribute is not + // used, the name of the attribute is unqualified. + if (!forElement.value) { + // check the Form (or attributeFormDefault) attribute of + // this node to determine if it should be namespace + // quailfied or not. + String form = Utils.getAttribute(child, "form"); + if (form != null && form.equals("unqualified")) { + // Unqualified nodeName + attributeName = new QName("", attributeName.getLocalPart()); + } else if (form == null) { + // check attributeFormDefault on schema element + String def = Utils.getScopedAttribute(child, + "attributeFormDefault"); + if (def == null || def.equals("unqualified")) { + // Unqualified nodeName + attributeName = new QName("", attributeName.getLocalPart()); + } + } + } else { + attributeName = attributeType; + } + if (attributeType == null) { + attributeType = getAttributeAnonQName(child); + forElement.value = false; + } + + // Get the corresponding TypeEntry from the symbol table + TypeEntry type = + (TypeEntry)symbolTable.getTypeEntry(attributeType, + forElement.value); + // add type and name to vector, skip it if we couldn't parse it // XXX - this may need to be revisited. - if (type != null && name != null) { + if (type != null && attributeName != null) { v.add(type); - v.add(name.getLocalPart()); + v.add(attributeName); } } } 1.23 +7 -2 xml-axis/java/src/org/apache/axis/utils/NSStack.java Index: NSStack.java =================================================================== RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/utils/NSStack.java,v retrieving revision 1.22 retrieving revision 1.23 diff -u -r1.22 -r1.23 --- NSStack.java 5 Apr 2002 21:24:33 -0000 1.22 +++ NSStack.java 1 Jul 2002 16:09:38 -0000 1.23 @@ -189,7 +189,7 @@ * If we look for a prefix for "namespace" at the indicated spot, we won't * find one because "pre" is actually mapped to "otherNamespace" */ - public String getPrefix(String namespaceURI) { + public String getPrefix(String namespaceURI, boolean noDefault) { if ((namespaceURI == null) || (namespaceURI.equals(""))) return null; @@ -201,7 +201,8 @@ Mapping map = (Mapping)t.get(i); if (map.getNamespaceURI().equals(namespaceURI)) { String possiblePrefix = map.getPrefix(); - if (getNamespaceURI(possiblePrefix).equals(namespaceURI)) + if (getNamespaceURI(possiblePrefix).equals(namespaceURI) && + (!noDefault || !"".equals(possiblePrefix))) return possiblePrefix; } } @@ -211,6 +212,10 @@ if (parent != null) return parent.getPrefix(namespaceURI); return null; + } + + public String getPrefix(String namespaceURI) { + return getPrefix(namespaceURI, false); } public String getNamespaceURI(String prefix) { 1.17 +4 -1 xml-axis/java/src/org/apache/axis/wsdl/toJava/JavaWriter.java Index: JavaWriter.java =================================================================== RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/wsdl/toJava/JavaWriter.java,v retrieving revision 1.16 retrieving revision 1.17 diff -u -r1.16 -r1.17 --- JavaWriter.java 7 Jun 2002 12:45:08 -0000 1.16 +++ JavaWriter.java 1 Jul 2002 16:09:38 -0000 1.17 @@ -140,7 +140,10 @@ } registerFile(file); if (emitter.isVerbose()) { - System.out.println(verboseMessage(file)); + String msg = verboseMessage(file); + if (msg != null) { + System.out.println(msg); + } } PrintWriter pw = getPrintWriter(file); writeFileHeader(pw); 1.20 +6 -3 xml-axis/java/src/org/apache/axis/wsdl/toJava/JavaBeanWriter.java Index: JavaBeanWriter.java =================================================================== RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/wsdl/toJava/JavaBeanWriter.java,v retrieving revision 1.19 retrieving revision 1.20 diff -u -r1.19 -r1.20 --- JavaBeanWriter.java 17 Jun 2002 19:25:40 -0000 1.19 +++ JavaBeanWriter.java 1 Jul 2002 16:09:38 -0000 1.20 @@ -67,6 +67,8 @@ import org.w3c.dom.Node; +import javax.xml.namespace.QName; + /** * This is Wsdl2java's Complex Type Writer. It writes the <typeName>.java file. */ @@ -203,8 +205,9 @@ if (attributes != null) { for (int i = 0; i < attributes.size(); i += 2) { String typeName = ((TypeEntry) attributes.get(i)).getName(); + QName xmlName = (QName) attributes.get(i + 1); String variableName = - Utils.xmlNameToJava((String) attributes.get(i + 1)); + Utils.xmlNameToJava(xmlName.getLocalPart()); names.add(typeName); names.add(variableName); if (type.isSimpleType() && @@ -327,8 +330,8 @@ if (attributes != null) { for (int j=0; j<attributes.size(); j+=2) { paramTypes.add(((TypeEntry) attributes.get(j)).getName()); - paramNames.add(mangle + - Utils.xmlNameToJava((String) attributes.get(j + 1))); + String name = ((QName)attributes.get(j + 1)).getLocalPart(); + paramNames.add(mangle + Utils.xmlNameToJava(name)); } } // Process the elements 1.15 +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.14 retrieving revision 1.15 diff -u -r1.14 -r1.15 --- JavaBeanHelperWriter.java 27 Jun 2002 18:51:37 -0000 1.14 +++ JavaBeanHelperWriter.java 1 Jul 2002 16:09:38 -0000 1.15 @@ -134,6 +134,18 @@ } // registerFile /** + * Return the string: "Generating <file>". + * only if we are going to generate a new file. + */ + protected String verboseMessage(String file) { + if (wrapperPW == null) { + return super.verboseMessage(file); + } else { + return null; + } + } // verboseMessage + + /** * Only write the file header if the bean helper is not wrapped * within a bean. */ @@ -230,8 +242,9 @@ if (attributes != null) { for (int i = 0; i < attributes.size(); i += 2) { - String attrName = (String) attributes.get(i + 1); - String fieldName = Utils.xmlNameToJava(attrName); + QName attrName = (QName) attributes.get(i + 1); + String attrLocalName = attrName.getLocalPart(); + String fieldName = Utils.xmlNameToJava(attrLocalName); pw.print(" "); if (!wroteFieldType) { pw.print("org.apache.axis.description.FieldDesc "); @@ -239,11 +252,10 @@ } pw.println("field = new org.apache.axis.description.AttributeDesc();"); pw.println(" field.setFieldName(\"" + fieldName + "\");"); - if (!fieldName.equals(attrName)) { - pw.print(" field.setXmlName("); - pw.print("new javax.xml.namespace.QName(null, \""); - pw.println(attrName + "\"));"); - } + pw.print(" field.setXmlName("); + pw.print("new javax.xml.namespace.QName(\""); + pw.print(attrName.getNamespaceURI() + "\", \""); + pw.println(attrName.getLocalPart() + "\"));"); pw.println(" typeDesc.addFieldDesc(field);"); } } 1.38 +1 -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.37 retrieving revision 1.38 diff -u -r1.37 -r1.38 --- BeanSerializer.java 21 Jun 2002 21:40:03 -0000 1.37 +++ BeanSerializer.java 1 Jul 2002 16:09:39 -0000 1.38 @@ -488,7 +488,7 @@ attrs.addAttribute(namespace, localName, - context.qName2String(qname), + context.attributeQName2String(qname), "CDATA", propString); } 1.1 xml-axis/java/test/wsdl/qualify2/AttributeQualify_ServiceTestCase.java Index: AttributeQualify_ServiceTestCase.java =================================================================== /* * The Apache Software License, Version 1.1 * * * Copyright (c) 2001 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 "Axis" 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. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. */ /** * Qualify_ServiceTestCase.java * * This file was auto-generated from WSDL * by the Apache Axis Wsdl2java emitter. */ package test.wsdl.qualify2; import junit.framework.AssertionFailedError; import org.apache.axis.Message; import org.apache.axis.MessageContext; import org.apache.axis.utils.XMLUtils; import org.apache.axis.message.SOAPEnvelope; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.Document; import org.w3c.dom.NodeList; import org.w3c.dom.Attr; import org.xml.sax.InputSource; import javax.xml.rpc.ServiceException; import java.io.InputStream; import java.io.IOException; import java.io.Reader; import java.io.StringReader; import test.wsdl.qualify2.Phone; public class AttributeQualify_ServiceTestCase extends junit.framework.TestCase { public static final String NAMESPACE = "urn:attributeQualify"; public AttributeQualify_ServiceTestCase(String name) { super(name); } public void test1AttributeQualifyEchoPhone() { test.wsdl.qualify2.AttributeQualify_Port binding; test.wsdl.qualify2.AttributeQualify_ServiceLocator locator = new test.wsdl.qualify2.AttributeQualify_ServiceLocator(); try { binding = locator.getAttributeQualify(); } catch (javax.xml.rpc.ServiceException jre) { throw new junit.framework.AssertionFailedError("JAX-RPC ServiceException caught: " + jre); } assertTrue("binding is null", binding != null); try { test.wsdl.qualify2.Phone phone = new Phone(); phone.setAge(35); phone.setAreaCode(505); phone.setColor("red"); phone.setExchange("555"); phone.setHair("brown"); phone.setNumber("1212"); Phone result = binding.echoPhone(phone); // Check the response assertTrue(result.equals(phone)); // Validate XML reponse to make sure attributes are properly // qualified or not per the WSDL MessageContext mc = null; try { mc = locator.getCall().getMessageContext(); } catch (ServiceException e) { throw new AssertionFailedError("Unable to get call object from service"); } Message response = mc.getResponseMessage(); SOAPEnvelope env = response.getSOAPEnvelope(); String responseString = response.getSOAPPartAsString(); Element body; try { body = env.getFirstBody().getAsDOM(); } catch (Exception e) { throw new AssertionFailedError("Unable to get request body as DOM Element on server"); } // debug //System.out.println("Response:\n---------\n" + responseString + "\n------"); // Now we have a DOM Element, verfy namespace attributes // Here is what we think it looks like // <phone age="35" // ns1:color="red" // ns1:hair="brown" // xmlns:ns1="urn:attributeQualify"> // <areaCode>505</areaCode> // <exchange>555</exchange> // <number>1212</number> //</phone> String bodyNS = body.getNamespaceURI(); assertEquals("Namespace of body element incorrect", bodyNS, NAMESPACE); // Verify age does NOT have a namespace (unqualified) Attr ageAttr = body.getAttributeNode("age"); assertNull("namespace of attribute 'age' should be null", ageAttr.getNamespaceURI()); // Verify hair and color have the right namespace (are qualified). Attr hairAttr = body.getAttributeNodeNS(NAMESPACE, "hair"); assertNotNull("namespace of attribute 'hair' is not correct", hairAttr); Attr colorAttr = body.getAttributeNodeNS(NAMESPACE, "color"); assertNotNull("namespace of attribute 'color' is not correct", colorAttr); } catch (java.rmi.RemoteException re) { throw new AssertionFailedError("Remote Exception caught: " + re); } } } 1.1 xml-axis/java/test/wsdl/qualify2/AttributeQualify_BindingImpl.java Index: AttributeQualify_BindingImpl.java =================================================================== /* * The Apache Software License, Version 1.1 * * * Copyright (c) 2001 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 "Axis" 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. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. */ /** * AttributeQualify_BindingImpl.java * * Service implementation for Qualified/Nonqualified attributes in a complex * type. The service validates the request XML and the test client validates * the response XML to verify the attributes that should be namesapce qualified * are, and those that are not supposed to be aren't. */ package test.wsdl.qualify2; import org.apache.axis.AxisFault; import org.apache.axis.Message; import org.apache.axis.MessageContext; import org.apache.axis.message.SOAPEnvelope; import org.w3c.dom.Attr; import org.w3c.dom.Element; public class AttributeQualify_BindingImpl implements test.wsdl.qualify2.AttributeQualify_Port { public static final String NAMESPACE = "urn:attributeQualify"; public test.wsdl.qualify2.Phone echoPhone(test.wsdl.qualify2.Phone in) throws java.rmi.RemoteException { // Validate XML request to make sure elements are properly qualified // or not per the WSDL MessageContext mc = MessageContext.getCurrentContext(); Message request = mc.getRequestMessage(); SOAPEnvelope env = request.getSOAPEnvelope(); String requestString = request.getSOAPPartAsString(); Element body; try { body = env.getFirstBody().getAsDOM(); } catch (Exception e) { throw new AxisFault("Unable to get request body as DOM Element on server"); } // Now we have a DOM Element, verfy namespace attributes // Here is what we think it looks like // <phone age="35" // ns1:color="red" // ns1:hair="brown" // xmlns:ns1="urn:attributeQualify"> // <areaCode>505</areaCode> // <exchange>555</exchange> // <number>1212</number> //</phone> String bodyNS = body.getNamespaceURI(); if (! NAMESPACE.equals(bodyNS)) throw new AxisFault("On Server: Namespace of body element incorrect: " + bodyNS + " should be: " + NAMESPACE); // Verify age does NOT have a namespace (unqualified) Attr ageAttr = body.getAttributeNode("age"); if (ageAttr.getNamespaceURI() != null) { throw new AxisFault("On Server: Namespace of age attribute incorrect: " + ageAttr.getNamespaceURI() + " should be: NULL"); } // Verify hair and color have the right namespace (are qualified). Attr hairAttr = body.getAttributeNodeNS(NAMESPACE, "hair"); if (hairAttr == null) { throw new AxisFault("On Server: Missing namespace for attribute 'hair' should be: " + NAMESPACE); } Attr colorAttr = body.getAttributeNodeNS(NAMESPACE, "color"); if (hairAttr == null) { throw new AxisFault("On Server: Missing namespace for attribute 'color' should be: " + NAMESPACE); } // Echo input return in; } } 1.1 xml-axis/java/test/wsdl/qualify2/attribute-qualify.wsdl Index: attribute-qualify.wsdl =================================================================== <?xml version="1.0" encoding="utf-8"?> <definitions xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:s0="urn:attributeQualify" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" targetNamespace="urn:attributeQualify" xmlns="http://schemas.xmlsoap.org/wsdl/"> <documentation> This test tests the use and overriding of the "attributeFormDefault" attribute. </documentation> <types> <xsd:schema attributeFormDefault="qualified" targetNamespace="urn:attributeQualify"> <xsd:complexType name="phone"> <xsd:all> <xsd:element name="areaCode" type="xsd:int"/> <xsd:element name="exchange" type="xsd:string"/> <xsd:element name="number" type="xsd:string"/> </xsd:all> <!-- These attributes should be qualified --> <attribute name="color" type="xsd:string"/> <attribute name="hair" type="xsd:string" form="qualified"/> <!-- This attribute should not --> <attribute name="age" type="xsd:int" form="unqualified"/> </xsd:complexType> <xsd:element name="phone" type="s0:phone"/> </xsd:schema> </types> <message name="echoPhoneIn"> <part name="in" element="s0:phone" /> </message> <message name="echoPhoneOut"> <part name="out" element="s0:phone" /> </message> <portType name="AttributeQualify"> <operation name="echoPhone"> <input message="s0:echoPhoneIn" /> <output message="s0:echoPhoneOut" /> </operation> </portType> <binding name="AttributeQualify" type="s0:AttributeQualify"> <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document" /> <operation name="echoPhone"> <soap:operation soapAction="" style="document" /> <input> <soap:body use="literal" /> </input> <output> <soap:body use="literal" /> </output> </operation> </binding> <service name="AttributeQualify"> <port name="AttributeQualify" binding="s0:AttributeQualify"> <soap:address location="http://localhost:8080/axis/services/AttributeQualify" /> </port> </service> </definitions>