This is way cool!

Personally, I'd prefer an array rather than a Vector, so someone writing a bean from 
scratch could just do:

  public String [] attrs = new String [] { "attribute" };
  public String [] getAttributeElements() {
    return attrs;
  }

Easier to write than vec.add(), vec.add(), vec.add()... just my opinion.

--Glen

> -----Original Message-----
> From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]]
> Sent: Thursday, February 21, 2002 1:51 PM
> To: [EMAIL PROTECTED]
> Subject: cvs commit: xml-axis/java/src/org/apache/axis/encoding/ser
> BeanSerializer.java
> 
> 
> tomj        02/02/21 10:51:24
> 
>   Modified:    java/test/wsdl Wsdl2javaTestSuite.xml
>                java/src/org/apache/axis/wsdl/fromJava Types.java
>                java/src/org/apache/axis/wsdl/toJava SymbolTable.java
>                         SchemaUtils.java JavaTypeWriter.java
>                         JavaComplexTypeWriter.java
>                java/src/org/apache/axis/utils resources.properties
>                java/src/org/apache/axis/encoding/ser 
> BeanSerializer.java
>   Log:
>   Support for <attribute> WSDL (required for interop tests).
>   
>   WSDL2Java will generate bean fields for XML element 
> attributes if specified
>   in the WSDL.  It wil also generate a getAttributeElements() 
> static function in
>   the bean that the bean serializer/deserializer uses.  (The 
> modifications to the
>   serialization code have already been committed.)
>   Sample:
>   public class AccessPoint implements java.io.Serializable {
>       private String element;
>       private String myAttribute;  // attribute
>   ...
>       public static java.util.Vector getAttributeElements() {
>           java.util.Vector v = new java.util.Vector();
>           v.add("myAttribute");
>           return v;
>       }
>   }
>   
>   Java2WSDL will generate <attribute> in the type schema for 
> beans that have
>   the getAttributeElements()  method to id which fields 
> should be attributes.
>   This involved moving the WSDL type generation for beans out 
> of Java2WSDL
>   and in to the serializer itself.
>   
>   TBD:
>    - we do not handle all forms of attributes and the UDDI 
> WSDL in our test
>   suite is commented out (this WSDL uses LOTS of attributes).
>   
>   - The generation of type Schema should live in the 
> serializers for all types.
>   Currently only Map and Bean have this code.
>   
>   - For command line Java2WSDL, type serializers are 
> generally not registered,
>   so we default to the BeanSerializer for everything that 
> isn't built in.
>   
>   Revision  Changes    Path
>   1.77      +2 -0      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.76
>   retrieving revision 1.77
>   diff -u -r1.76 -r1.77
>   --- Wsdl2javaTestSuite.xml  20 Feb 2002 20:41:14 -0000      1.76
>   +++ Wsdl2javaTestSuite.xml  21 Feb 2002 18:51:23 -0000      1.77
>   @@ -565,6 +565,7 @@
>        </wsdl2java>
>    
>        <!-- UDDI 1.0 WSDL's -->
>   +<!-- tomj: turn these off while attribute processing is in flux
>        <wsdl2java url="http://www.uddi.org/wsdl/inquire_v1.wsdl";
>                   output="build/work"
>                   testcase="no"
>   @@ -585,6 +586,7 @@
>            <mapping namespace="urn:uddi-org:api" 
> package="org.uddi.api"/>
>            <mapping namespace="urn:uddi-org:publication" 
> package="org.uddi.publication"/>
>        </wsdl2java>
>   +-->
>    
>        <!-- XMethods Delayed Quote Service from 
> http://www.xmethods.net/detail.html?id=2 -->
>        <wsdl2java 
> url="http://services.xmethods.net/soap/urn:xmethods-delayed-qu
> otes.wsdl"
>   
>   
>   
>   1.16      +43 -86    
> xml-axis/java/src/org/apache/axis/wsdl/fromJava/Types.java
>   
>   Index: Types.java
>   ===================================================================
>   RCS file: 
> /home/cvs/xml-axis/java/src/org/apache/axis/wsdl/fromJava/Types.java,v
>   retrieving revision 1.15
>   retrieving revision 1.16
>   diff -u -r1.15 -r1.16
>   --- Types.java      8 Feb 2002 16:52:12 -0000       1.15
>   +++ Types.java      21 Feb 2002 18:51:23 -0000      1.16
>   @@ -57,10 +57,13 @@
>    package org.apache.axis.wsdl.fromJava;
>    
>    import org.apache.axis.Constants;
>   +import org.apache.axis.AxisFault;
>    import org.apache.axis.encoding.TypeMapping;
>    import org.apache.axis.encoding.Serializer;
>    import org.apache.axis.encoding.SerializerFactory;
>   +import org.apache.axis.encoding.ser.BeanSerializerFactory;
>    import org.apache.axis.utils.XMLUtils;
>   +import org.apache.axis.utils.JavaUtils;
>    
>    import org.w3c.dom.Attr;
>    import org.w3c.dom.Document;
>   @@ -338,14 +341,7 @@
>         * @throws Exception
>         */
>        public String writeType(Class type) throws Exception {
>   -        Serializer ser = null;
>   -        if (tm != null) {
>   -        SerializerFactory factory = 
> (SerializerFactory)tm.getSerializer(type);
>   -        if (factory != null) {
>   -            ser = 
> (Serializer)factory.getSerializerAs(Constants.AXIS_SAX);
>   -        }
>   -        }
>   -
>   +      
>            // Quick return if schema type
>            if (isSimpleSchemaType(type))
>                return Constants.NSPREFIX_SCHEMA_XSD + ":" +
>   @@ -354,7 +350,27 @@
>                return Constants.NSPREFIX_SOAP_ENC + ":" +
>                        getTypeQName(type).getLocalPart();
>    
>   -        // Write the namespace
>   +        // look up the serializer in the TypeMappingRegistry
>   +        Serializer ser = null;
>   +        SerializerFactory factory = null;
>   +        if (tm != null) {
>   +            factory = (SerializerFactory)tm.getSerializer(type);
>   +        } else {
>   +            factory = 
> (SerializerFactory)defaultTM.getSerializer(type);
>   +        }
>   +        if (factory == null) {
>   +            factory = new BeanSerializerFactory(type, 
> getTypeQName(type));
>   +        }
>   +        if (factory != null) {
>   +            ser = 
> (Serializer)factory.getSerializerAs(Constants.AXIS_SAX);
>   +        }
>   +        
>   +        // if we can't get a serializer, that is bad.
>   +        if (ser == null)
>   +            throw new AxisFault(
>   +                    JavaUtils.getMessage("NoSerializer00", 
> type.getName()));
>   +        
>   +          // Write the namespace
>            QName qName = writeTypeNamespace(type);
>    
>            // If an array the component type should be processed first
>   @@ -397,10 +413,7 @@
>                if (isEnumClass(type)) {
>                    writeEnumType(qName, type);
>                } else {
>   -                if (ser != null)
>   -                    ser.writeSchema(this);
>   -                else
>   -                    writeBeanClassType(qName, type);
>   +                ser.writeSchema(this);
>                }
>            }
>            return prefixedName;
>   @@ -508,83 +521,13 @@
>        }
>    
>        /**
>   -     * Write Bean Class Complex Type
>   -     * @param qname QName of type.
>   -     * @param type class of type
>   -     */
>   -    public void writeBeanClassType(javax.wsdl.QName qName, 
> Class cls)
>   -            throws Exception  {
>   -        // ComplexType representation of bean class
>   -        Element complexType = 
> docHolder.createElement("complexType");
>   -        writeSchemaElement(qName, complexType);
>   -        complexType.setAttribute("name", qName.getLocalPart());
>   -
>   -        // See if there is a super class, stop if we hit a 
> stop class
>   -        Element e = null;
>   -        Class superClass = cls.getSuperclass();
>   -        if (superClass != null &&
>   -                superClass != java.lang.Object.class &&
>   -                (stopClasses == null || 
> !stopClasses.contains(superClass.getName()))) {
>   -            // Write out the super class
>   -            String base = writeType(superClass);
>   -            Element complexContent = 
> docHolder.createElement("complexContent");
>   -            complexType.appendChild(complexContent);
>   -            Element extension = 
> docHolder.createElement("extension");
>   -            complexContent.appendChild(extension);
>   -            extension.setAttribute("base", base);
>   -            e = extension;
>   -        } else {
>   -            e = complexType;
>   -        }
>   -
>   -        // Add fields under all element
>   -        Element all = docHolder.createElement("all");
>   -        e.appendChild(all);
>   -
>   -        // Build a ClassRep that represents the bean class.  This
>   -        // allows users to provide their own field mapping.
>   -        ClassRep clsRep = beanBuilder.build(cls);
>   -
>   -        // Write out fields
>   -        Vector fields = clsRep.getFields();
>   -        for (int i=0; i < fields.size(); i++) {
>   -            FieldRep field = (FieldRep) fields.elementAt(i);
>   -
>   -            writeField(field.getName(), field.getType(), 
> field.getIndexed(), all);
>   -        }
>   -    }
>   -
>   -    /**
>   -     * write a schema representation of the given Class 
> field and append it to the where Node     * recurse on complex types
>   -     * @param fieldName name of the field
>   -     * @param fieldType type of the field
>   -     * @param isUnbounded causes maxOccurs="unbounded" if set
>   -     * @param where location for the generated schema node
>   -     * @throws Exception
>   -     */
>   -    private void writeField(String fieldName,
>   -                            Class fieldType,
>   -                            boolean isUnbounded,
>   -                            Element where) throws Exception {
>   -        String elementType = writeType(fieldType);
>   -        Element elem = createElement(fieldName,
>   -                                     elementType,
>   -                                     isNullable(fieldType),
>   -                                     where.getOwnerDocument());
>   -        if (isUnbounded) {
>   -            elem.setAttribute("maxOccurs", "unbounded");
>   -        }
>   -        where.appendChild(elem);
>   -    }
>   -
>   -    /**
>         * Create Element with a given name and type
>         * @param elementName the name of the created element
>         * @param elementType schema type representation of the element
>         * @param nullable nullable attribute of the element
>         * @return the created Element
>         */
>   -    private Element createElement(String elementName,
>   +    public Element createElement(String elementName,
>                                      String elementType,
>                                      boolean nullable,
>                                      Document docHolder) {
>   @@ -612,7 +555,7 @@
>         * @param type input Class
>         * @return true if the type is a simple schema type
>         */
>   -    boolean isSimpleSchemaType(Class type) {
>   +    public boolean isSimpleSchemaType(Class type) {
>          return (type == java.lang.String.class ||
>                  type == java.lang.Boolean.TYPE  ||
>                  type == java.lang.Byte.TYPE ||
>   @@ -752,7 +695,7 @@
>         * @param type input Class
>         * @return true if nullable
>         */
>   -    private boolean isNullable(Class type) {
>   +    public boolean isNullable(Class type) {
>            if (type.isPrimitive() ||
>                (type.isArray() && type.getComponentType() == 
> byte.class))
>                return false;
>   @@ -783,6 +726,20 @@
>                              doc.importNode(wsdlTypesElem, true),
>                              
> doc.getDocumentElement().getFirstChild());
>            }
>   +    }
>   +
>   +    /**
>   +     * Return the list of classes that we should not emit WSDL for.
>   +     */ 
>   +    public Vector getStopClasses() {
>   +        return stopClasses;
>   +    }
>   +
>   +    /**
>   +     * Return the class rep that allows users to build 
> their own beans
>   +     */ 
>   +    public BuilderBeanClassRep getBeanBuilder() {
>   +        return beanBuilder;
>        }
>    
>        /**
>   
>   
>   
>   1.34      +19 -0     
> xml-axis/java/src/org/apache/axis/wsdl/toJava/SymbolTable.java
>   
>   Index: SymbolTable.java
>   ===================================================================
>   RCS file: 
> /home/cvs/xml-axis/java/src/org/apache/axis/wsdl/toJava/Symbol
> Table.java,v
>   retrieving revision 1.33
>   retrieving revision 1.34
>   diff -u -r1.33 -r1.34
>   --- SymbolTable.java        19 Feb 2002 20:55:00 -0000      1.33
>   +++ SymbolTable.java        21 Feb 2002 18:51:23 -0000      1.34
>   @@ -566,6 +566,25 @@
>                         
> Constants.isSchemaXSD(nodeKind.getNamespaceURI())) {
>                    // we can no longer do .NET stuff and 
> treat document as rpc style
>                    this.dotNet = false;
>   +                // Create symbol table entry for attribute type
>   +                QName refQName = 
> Utils.getNodeTypeRefQName(node, "type");
>   +                if (refQName == null) {
>   +                    TypeEntry refType = 
> getTypeEntry(refQName, false);
>   +                    if (refType != null) {
>   +                        // Not defined yet, add one
>   +                        String baseName = 
> btm.getBaseName(refQName);
>   +                        if (baseName != null) {
>   +                            BaseType bt = new BaseType(refQName);
>   +                            bt.setIsReferenced(true);
>   +                            symbolTablePut(bt);
>   +                        }
>   +                        else {
>   +                            throw new IOException(
>   +                                    "Attribute type is not 
> simple:" + refQName.toString());
>   +                        }
>   +                    }
>   +                }
>   +                
>                }
>            }
>    
>   
>   
>   
>   1.10      +53 -0     
> xml-axis/java/src/org/apache/axis/wsdl/toJava/SchemaUtils.java
>   
>   Index: SchemaUtils.java
>   ===================================================================
>   RCS file: 
> /home/cvs/xml-axis/java/src/org/apache/axis/wsdl/toJava/Schema
> Utils.java,v
>   retrieving revision 1.9
>   retrieving revision 1.10
>   diff -u -r1.9 -r1.10
>   --- SchemaUtils.java        15 Feb 2002 23:02:19 -0000      1.9
>   +++ SchemaUtils.java        21 Feb 2002 18:51:23 -0000      1.10
>   @@ -852,5 +852,58 @@
>            return null;
>        }
>    
>   +    /**
>   +     * Return the attribute names and types if any in the node
>   +     * The even indices are the element types (TypeEntry) and
>   +     * the odd indices are the corresponding names (Strings).
>   +     * 
>   +     * Example:
>   +     * <complexType name="Person">
>   +     *   <sequence>
>   +     *     <element minOccurs="1" maxOccurs="1" name="Age" 
> type="double" />
>   +     *     <element minOccurs="1" maxOccurs="1" name="ID" 
> type="xsd:float" />
>   +     *   </sequence>
>   +     *   <attribute name="Name" type="string" />
>   +     *   <attribute name="Male" type="boolean" />
>   +     * </complexType>
>   +     * 
>   +     */ 
>   +    public static Vector getComplexElementAttributes(Node node, 
>   +                                                     
> SymbolTable symbolTable) 
>   +    {
>   +        Vector v = null;    // return value
>   +        
>   +        if (node == null) {
>   +            return null;
>   +        }
>   +        
>   +        // examine children of the node for <attribute> elements
>   +        NodeList children = node.getChildNodes();
>   +        for (int i = 0; i < children.getLength(); i++) {
>   +            Node child = children.item(i);
>   +            QName nodeKind = Utils.getNodeQName(child);
>   +            if (nodeKind == null ||
>   +                ! nodeKind.getLocalPart().equals("attribute"))
>   +                continue;
>   +            
>   +            // we have an attribute node
>   +            if (v == null)
>   +                v = new Vector();
>   +            
>   +            // type
>   +            QName typeAttr = 
> Utils.getNodeTypeRefQName(child, "type");
>   +            TypeEntry type = 
> symbolTable.getTypeEntry(typeAttr, false);
>   +            // name
>   +            QName name = Utils.getNodeNameQName(child);
>   +            // 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) {
>   +                v.add(type);
>   +                v.add(name.getLocalPart());
>   +            }
>   +        }
>   +        
>   +        return v;
>   +    }
>    
>    }
>   
>   
>   
>   1.5       +9 -3      
> xml-axis/java/src/org/apache/axis/wsdl/toJava/JavaTypeWriter.java
>   
>   Index: JavaTypeWriter.java
>   ===================================================================
>   RCS file: 
> /home/cvs/xml-axis/java/src/org/apache/axis/wsdl/toJava/JavaTy
> peWriter.java,v
>   retrieving revision 1.4
>   retrieving revision 1.5
>   diff -u -r1.4 -r1.5
>   --- JavaTypeWriter.java     23 Jan 2002 17:53:05 -0000      1.4
>   +++ JavaTypeWriter.java     21 Feb 2002 18:51:23 -0000      1.5
>   @@ -94,9 +94,15 @@
>                    Vector v = 
> SchemaUtils.getComplexElementTypesAndNames(
>                            node, symbolTable);
>                    if (v != null) {
>   -                    typeWriter = new 
> JavaComplexTypeWriter(emitter, type, v,
>   -                            
> SchemaUtils.getComplexElementExtensionBase(
>   -                            node, symbolTable));
>   +                    typeWriter = new 
>   +                            JavaComplexTypeWriter(emitter, 
>   +                                                  type, 
>   +                                                  v,
>   +                                                  
> SchemaUtils.getComplexElementExtensionBase(
>   +                                                          
> node, symbolTable), 
>   +                                                  
> SchemaUtils.getComplexElementAttributes(
>   +                                                          node, 
>   +                                                          
> symbolTable));
>                    }
>                    else {
>                        v = SchemaUtils.getEnumerationBaseAndValues(
>   
>   
>   
>   1.7       +37 -3     
> xml-axis/java/src/org/apache/axis/wsdl/toJava/JavaComplexTypeW
> riter.java
>   
>   Index: JavaComplexTypeWriter.java
>   ===================================================================
>   RCS file: 
> /home/cvs/xml-axis/java/src/org/apache/axis/wsdl/toJava/JavaCo
> mplexTypeWriter.java,v
>   retrieving revision 1.6
>   retrieving revision 1.7
>   diff -u -r1.6 -r1.7
>   --- JavaComplexTypeWriter.java      5 Feb 2002 21:53:49 
> -0000 1.6
>   +++ JavaComplexTypeWriter.java      21 Feb 2002 18:51:23 
> -0000 1.7
>   @@ -70,6 +70,7 @@
>    public class JavaComplexTypeWriter extends JavaWriter {
>        private TypeEntry type;
>        private Vector elements;
>   +    private Vector attributes;
>        private TypeEntry extendType;  
>    
>        /**
>   @@ -81,11 +82,16 @@
>         */
>        protected JavaComplexTypeWriter(
>                Emitter emitter,
>   -            TypeEntry type, Vector elements, TypeEntry 
> extendType) {
>   +            TypeEntry type, 
>   +            Vector elements, 
>   +            TypeEntry extendType,
>   +            Vector attributes)
>   +    {
>            super(emitter, type, "", "java",
>                    JavaUtils.getMessage("genType00"), "complexType");
>            this.type = type;
>            this.elements = elements;
>   +        this.attributes = attributes;
>            this.extendType = extendType;
>        } // ctor
>    
>   @@ -109,12 +115,25 @@
>                names.add(((TypeEntry) elements.get(i)).getName());
>                names.add( Utils.xmlNameToJava((String) 
> elements.get(i + 1)));
>            }
>   +       // add the attributes to the names list (which will 
> be bean elements too)
>   +       if (attributes != null) {
>   +           for (int i=0; i < attributes.size(); i+=2) {
>   +               names.add(((TypeEntry) 
> attributes.get(i)).getName());
>   +               names.add( Utils.xmlNameToJava((String) 
> attributes.get(i + 1)));
>   +           }
>   +       }
>   +       
>    
>            pw.println("public class " + className + 
> extendsText + " implements java.io.Serializable {");
>    
>            for (int i = 0; i < names.size(); i += 2) {
>                String variable = (String) names.get(i + 1);
>   -            pw.println("    private " + names.get(i) + " " 
> + variable + ";");
>   +            pw.print("    private " + names.get(i) + " " + 
> variable + ";");
>   +            // label the attribute fields.
>   +            if (i >= elements.size())
>   +                pw.println("  // attribute");
>   +            else
>   +                pw.println();
>            }
>    
>            pw.println();
>   @@ -163,7 +182,8 @@
>                // like the reasonable approach to take for 
> collection types.
>                // (It may be more efficient to handle this 
> with an ArrayList...but
>                // for the initial support it was easier to 
> use an actual array.) 
>   -            if 
> (((TypeEntry)elements.elementAt(i)).getQName().getLocalPart().
> indexOf("[")>0) {
>   +            if (i < elements.size() &&
>   +                
> ((TypeEntry)elements.elementAt(i)).getQName().getLocalPart().i
> ndexOf("[")>0) {
>    
>                    String compName = typeName.substring(0, 
> typeName.lastIndexOf("["));
>    
>   @@ -191,6 +211,20 @@
>                    pw.println();
>                }
>            }
>   +       
>   +       // if we have attributes, create metadata function 
> which returns the
>   +       // list of properties that are attributes instead 
> of elements
>   +       if (attributes != null) {
>   +           pw.println("    public static java.util.Vector 
> getAttributeElements() {");
>   +           pw.println("        java.util.Vector v = new 
> java.util.Vector();");
>   +           for (int i=0; i < attributes.size(); i+=2) {
>   +               pw.println("        v.add(\"" + 
> Utils.xmlNameToJava((String) attributes.get(i + 1)) + "\");");
>   +           }
>   +           pw.println("        return v;");
>   +           pw.println("    }");
>   +           pw.println();
>   +       }
>   +       
>            pw.println("}");
>            pw.close();
>        } // writeOperation
>   
>   
>   
>   1.57      +2 -1      
> xml-axis/java/src/org/apache/axis/utils/resources.properties
>   
>   Index: resources.properties
>   ===================================================================
>   RCS file: 
> /home/cvs/xml-axis/java/src/org/apache/axis/utils/resources.pr
> operties,v
>   retrieving revision 1.56
>   retrieving revision 1.57
>   diff -u -r1.56 -r1.57
>   --- resources.properties    20 Feb 2002 17:17:35 -0000      1.56
>   +++ resources.properties    21 Feb 2002 18:51:23 -0000      1.57
>   @@ -643,7 +643,8 @@
>    
>    literalTypePart00=Error: Message part {0} of operation or 
> fault {1} is specified as a type and the soap:body use of 
> binding "{2}" is literal.  This WSDL is not currently supported.
>    BadServiceName00=Error: Empty or missing service name
>   -AttrNotSimpleType00=Attribute {0} is of type {1}, which is 
> not a simple type
>   +AttrNotSimpleType00=Bean attribute {0} is of type {1}, 
> which is not a simple type
>   +NoSerializer00=Unable to find serializer for type {0}
>    
>    
>    optionTypeMapping00=indicate 1.1 or 1.2.  The default is 
> 1.2 (SOAP 1.2 JAX-RPC compliant)
>   
>   
>   
>   1.6       +105 -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/BeanS
> erializer.java,v
>   retrieving revision 1.5
>   retrieving revision 1.6
>   diff -u -r1.5 -r1.6
>   --- BeanSerializer.java     19 Feb 2002 20:50:46 -0000      1.5
>   +++ BeanSerializer.java     21 Feb 2002 18:51:23 -0000      1.6
>   @@ -71,6 +71,8 @@
>    import org.apache.axis.encoding.DeserializationContext;
>    import org.apache.axis.encoding.DeserializerImpl;
>    import org.apache.axis.InternalException;
>   +import org.apache.axis.AxisFault;
>   +import org.apache.axis.utils.JavaUtils;
>    import org.apache.axis.wsdl.fromJava.ClassRep;
>    import org.apache.axis.wsdl.fromJava.FieldRep;
>    import org.apache.axis.wsdl.fromJava.Types;
>   @@ -289,8 +291,110 @@
>         * @see org.apache.axis.wsdl.fromJava.Types
>         */
>        public boolean writeSchema(Types types) throws Exception {
>   -        
> types.writeBeanClassType(types.getWsdlQName(xmlType), javaType);
>   +
>   +        javax.wsdl.QName qName = types.getWsdlQName(xmlType);
>   +
>   +        // ComplexType representation of bean class
>   +        Element complexType = types.createElement("complexType");
>   +        types.writeSchemaElement(qName, complexType);
>   +        complexType.setAttribute("name", qName.getLocalPart());
>   +
>   +        // See if there is a super class, stop if we hit a 
> stop class
>   +        Element e = null;
>   +        Class superClass = javaType.getSuperclass();
>   +        Vector stopClasses = types.getStopClasses();
>   +        if (superClass != null &&
>   +                superClass != java.lang.Object.class &&
>   +                (stopClasses == null || 
>   +                !(stopClasses.contains(superClass.getName()))) ) {
>   +            // Write out the super class
>   +            String base = types.writeType(superClass);
>   +            Element complexContent = 
> types.createElement("complexContent");
>   +            complexType.appendChild(complexContent);
>   +            Element extension = types.createElement("extension");
>   +            complexContent.appendChild(extension);
>   +            extension.setAttribute("base", base);
>   +            e = extension;
>   +        } else {
>   +            e = complexType;
>   +        }
>   +
>   +        // Add fields under all element
>   +        Element all = types.createElement("all");
>   +        e.appendChild(all);
>   +
>   +        // Build a ClassRep that represents the bean class.  This
>   +        // allows users to provide their own field mapping.
>   +        ClassRep clsRep = types.getBeanBuilder().build(javaType);
>   +
>   +        // Write out fields
>   +        Vector fields = clsRep.getFields();
>   +        for (int i=0; i < fields.size(); i++) {
>   +            FieldRep field = (FieldRep) fields.elementAt(i);
>   +
>   +            // if bean fields are attributes, write 
> attribute element
>   +            if (beanAttributeNames.contains(field.getName()))
>   +                writeAttribute(types, field.getName(),
>   +                               field.getType(), 
>   +                               complexType);
>   +            else            
>   +                writeField(types, field.getName(), 
>   +                           field.getType(), 
>   +                           field.getIndexed(), 
>   +                           all);
>   +        }
>   +        // done
>            return true;
>   +    }
>   +
>   +    /**
>   +     * write a schema representation of the given Class 
> field and append it to    
>   +     * the where Node, recurse on complex types
>   +     * @param fieldName name of the field
>   +     * @param fieldType type of the field
>   +     * @param isUnbounded causes maxOccurs="unbounded" if set
>   +     * @param where location for the generated schema node
>   +     * @throws Exception
>   +     */
>   +    private void writeField(Types types, String fieldName,
>   +                            Class fieldType,
>   +                            boolean isUnbounded,
>   +                            Element where) throws Exception {
>   +        String elementType = types.writeType(fieldType);
>   +        Element elem = types.createElement(fieldName,
>   +                                           elementType,
>   +                                           
> types.isNullable(fieldType),
>   +                                           
> where.getOwnerDocument());
>   +        if (isUnbounded) {
>   +            elem.setAttribute("maxOccurs", "unbounded");
>   +        }
>   +        where.appendChild(elem);
>   +    }
>   +    
>   +    /**
>   +     * write aa attribute element and append it to the 'where' Node
>   +     * @param fieldName name of the field
>   +     * @param fieldType type of the field
>   +     * @param where location for the generated schema node
>   +     * @throws Exception
>   +     */
>   +    private void writeAttribute(Types types, 
>   +                                String fieldName,
>   +                                Class fieldType,
>   +                                Element where) throws Exception {
>   +        
>   +        // Attribute must be a simple type.
>   +        if (!types.isSimpleSchemaType(fieldType))
>   +            throw new 
> AxisFault(JavaUtils.getMessage("AttrNotSimpleType00", 
>   +                                                     fieldName,
>   +                                                     
> fieldType.getName()));
>   +        
>   +        String elementType = types.writeType(fieldType);
>   +        Element elem = types.createElement(fieldName,
>   +                                           elementType,
>   +                                           false,
>   +                                           
> where.getOwnerDocument());
>   +        where.appendChild(elem);
>        }
>    
>        /**
>   
>   
>   
> 

Reply via email to