You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by sc...@apache.org on 2002/01/03 21:33:43 UTC

cvs commit: xml-axis/java/test/wsdl Java2WsdlAntTask.java Wsdl2javaTestSuite.xml

scheu       02/01/03 12:33:43

  Modified:    java/docs user-guide.html
               java/src/org/apache/axis/utils resources.properties
               java/src/org/apache/axis/wsdl Java2WSDL.java
               java/src/org/apache/axis/wsdl/fromJava
                        BuilderPortTypeClassRep.java ClassRep.java
                        DefaultBuilderBeanClassRep.java
                        DefaultBuilderPortTypeClassRep.java Emitter.java
                        MethodRep.java todo.txt
               java/src/org/apache/axis/wsdl/toJava UndefinedDelegate.java
               java/test/wsdl Java2WsdlAntTask.java Wsdl2javaTestSuite.xml
  Added:       java/src/org/apache/axis/utils JavapUtils.java
  Log:
  * Added Parameter Name Retrieval Feature described below.
  * Added new utils class JavapUtils, that can be used to obtain class information using javap.
  * Minor changes to support the new -i option.
  * Updated Java2WSDL text in user's guide.
  
  New Java2WSDL Feature
  ---------------------
  
  Previously, the Java2WSDL emitter used names such as in0 and inOut1 for
  the WSDL message part names.
  
  Now, Java2WSDL will query the debug information in the web service class file
  to determine the method parameter names.  These names are used to
  generate the WSDL message part names; thus there is no longer any
  loss of information.
  
  If the web service class file describes an interface, or if the class
  file was not compiled with -g, then the parameter names are not available.
  In such cases, the new -i <impl-class> option can be used to pass
  an alternate class.  This <impl-class> is only used to determine the names
  of the method parameters.  The <impl-class> can be an implementation class,
  a stub class or a skeleton class.
  
  In the event that Java2WSDL cannot access the parameter names, it will
  fallback and use the default in# and inOut## parameter names.
  
  Enjoy!
  
  Revision  Changes    Path
  1.33      +46 -20    xml-axis/java/docs/user-guide.html
  
  Index: user-guide.html
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/docs/user-guide.html,v
  retrieving revision 1.32
  retrieving revision 1.33
  diff -u -r1.32 -r1.33
  --- user-guide.html	20 Dec 2001 19:51:31 -0000	1.32
  +++ user-guide.html	3 Jan 2002 20:33:42 -0000	1.33
  @@ -828,10 +828,10 @@
   from a Java interface.
   <br>&nbsp;
   <h4>
  -Step 1: Provide a Java interface</h4>
  -Write and compile a Java interface that describes the web service interface.&nbsp;
  -Here is an example interface that describes a web services that can be
  -used to set/query the price of widgets ( <a href="../samples/userguide/example6/WidgetPrice.java">../samples/userguide/example6/WidgetPrice.java</a>
  +Step 1: Provide a Java interface or class</h4>
  +Write and compile a Java interface (or class) that describes the web service
  +interface.&nbsp; Here is an example interface that describes a web services
  +that can be used to set/query the price of widgets ( <a href="../samples/userguide/example6/WidgetPrice.java">../samples/userguide/example6/WidgetPrice.java</a>
   ):
   <p><tt><font color="#006600">package samples.userguide.example6;</font></tt>
   <p><tt><font color="#006600">/**</font></tt>
  @@ -845,7 +845,8 @@
   <br><tt><font color="#006600">&nbsp;&nbsp;&nbsp; public String getWidgetPrice(String
   widgetName);</font></tt>
   <br><tt><font color="#006600">}</font></tt>
  -<br>&nbsp;
  +<p><b>Note: </b>If you compile your class with debug information, Java2WSDL
  +will use the debug information to obtain the method parameter names.
   <h4>
   Step 2: Create WSDL using Java2WSDL</h4>
   Use the Java2WSDL tool to create a WSDL file from the interface above.
  @@ -884,7 +885,8 @@
   <h5>
   <a NAME="Java2WSDL Details"></a>Java2WSDL Details</h5>
   Here is the help message generated from the current tool:
  -<p><tt><font color="#993366">Usage: java org.apache.axis.wsdlgen.Java2WSDL
  +<p><tt><font color="#993366">Java2WSDL emitter</font></tt>
  +<br><tt><font color="#993366">Usage: java org.apache.axis.wsdl.Java2WSDL
   [options] class-of-portType</font></tt>
   <br><tt><font color="#993366">Options:</font></tt>
   <br><tt><font color="#993366">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  @@ -914,7 +916,7 @@
   <br><tt><font color="#993366">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
   -m, --methods &lt;argument></font></tt>
   <br><tt><font color="#993366">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  -space separated list of methods to export</font></tt>
  +space or comma separated list of methods to export</font></tt>
   <br><tt><font color="#993366">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
   -a, --all</font></tt>
   <br><tt><font color="#993366">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  @@ -934,20 +936,34 @@
   <br><tt><font color="#993366">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
   -O, --outputImpl &lt;argument></font></tt>
   <br><tt><font color="#993366">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  -output Implementation Wsdl filename, setting this causes --o</font></tt>
  -<br><tt><font color="#993366">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  -utputWsdlMode to be ignored</font></tt>
  -<br><tt><font color="#993366">Details:</font></tt>
  -<br><tt><font color="#993366">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  -portType&nbsp;&nbsp;&nbsp; name= &lt;class-of-portType name></font></tt>
  +output Implementation Wsdl filename, setting this causes --outputWsdlMode
  +to be ignored</font></tt>
   <br><tt><font color="#993366">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  -binding&nbsp;&nbsp;&nbsp;&nbsp; name= &lt;--service value>SoapBinding</font></tt>
  -<br><tt><font color="#993366">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  -service&nbsp;&nbsp;&nbsp;&nbsp; name= &lt;--service value>Service</font></tt>
  -<br><tt><font color="#993366">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  -port&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name= &lt;--service value></font></tt>
  +-f, --factory &lt;argument></font></tt>
  +<br><tt><font color="#993366">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  +name of the Java2WSDLFactory class for extending WSDL generation functions</font></tt>
   <br><tt><font color="#993366">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  -address location= &lt;--location value></font></tt>
  +-i, --implClass &lt;argument></font></tt>
  +<br><tt><font color="#993366">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  +optional class that contains implementation of methods in</font></tt>
  +<br><tt><font color="#993366">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  +class-of-portType.&nbsp; The debug information in the class is used</font></tt>
  +<br><tt><font color="#993366">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  +to obtain the method parameter names, which are used to set</font></tt>
  +<br><tt><font color="#993366">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  +the WSDL part names.</font></tt>
  +<br><tt><font color="#993366">Details:</font></tt>
  +<br><tt><font color="#993366">&nbsp;&nbsp; portType&nbsp;&nbsp;&nbsp; name=
  +&lt;class-of-portType name></font></tt>
  +<br><tt><font color="#993366">&nbsp;&nbsp; binding&nbsp;&nbsp;&nbsp;&nbsp;
  +name= &lt;--service value>SoapBinding</font></tt>
  +<br><tt><font color="#993366">&nbsp;&nbsp; service&nbsp;&nbsp;&nbsp;&nbsp;
  +name= &lt;--service value>Service</font></tt>
  +<br><tt><font color="#993366">&nbsp;&nbsp; port&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  +name= &lt;--service value></font></tt>
  +<br><tt><font color="#993366">&nbsp;&nbsp; address location= &lt;--location
  +value></font></tt>
  +<br><tt><font color="#993366"></font></tt>&nbsp;
   <p><b>-h , --help</b>
   <br>Prints the help message.
   <p><b>-o, --output &lt;wsdl file></b>
  @@ -1003,7 +1019,17 @@
   <br>Use this option to indicate the name of the output implementation wsdl
   file.&nbsp; If specified, Java2WSDL will produce interface and implementation
   wsdl files.&nbsp; If this option is used, the -w option is ignored.
  -<br>&nbsp;
  +<p><b>-f, --factory &lt;class></b>
  +<br>Use this expert option to extend and customize the WSDL2Java tool.
  +<p><b>-i, --implClass &lt;impl-class></b>
  +<br>The Java2WSLD tool uses method parameter names to construct the WSDL
  +message part names.&nbsp; The message names are obtained from the debug
  +information of the <b>&lt;class-of-portType> </b>class file.&nbsp; If that
  +class file was compiled without debug information or if <b>&lt;class-of-portType></b>
  +is an interface, the method parameter names are not available.&nbsp; In
  +these cases, you can use the --implClass option to provide an alternative
  +class from which to obtain method parameter names.&nbsp; The <b>&lt;impl-class></b>
  +could be the actual implementation class, a stub class or a skeleton class.
   <h4>
   Step 3: Create Bindings using WSDL2Java</h4>
   Use the generated wsdl file to build the appropriate client/server bindings
  
  
  
  1.35      +1 -0      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.properties,v
  retrieving revision 1.34
  retrieving revision 1.35
  diff -u -r1.34 -r1.35
  --- resources.properties	31 Dec 2001 20:35:07 -0000	1.34
  +++ resources.properties	3 Jan 2002 20:33:43 -0000	1.35
  @@ -602,5 +602,6 @@
   j2woptnamespaceImpl00=target namespace for implementation wsdl
   j2woptoutputImpl00=output Implementation Wsdl filename, setting this causes --outputWsdlMode to be ignored
   j2woptfactory00=name of the Java2WSDLFactory class for extending WSDL generation functions
  +j2woptimplClass00=optional class that contains implementation of methods in class-of-portType.  The debug information in the class is used to obtain the method parameter names, which are used to set the WSDL part names.
   j2werror00=Error: {0}
   j2wmodeerror=Error Unrecognized Mode: {0} Use All, Interface or Implementation. Continuing with All. 
  
  
  
  1.1                  xml-axis/java/src/org/apache/axis/utils/JavapUtils.java
  
  Index: JavapUtils.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 apache@apache.org.
   *
   * 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/>.
   */
  
  package org.apache.axis.utils;
  
  import org.apache.log4j.Category;
  
  import java.lang.reflect.Method;
  
  import java.io.BufferedReader;
  import java.io.InputStreamReader;
  
  import java.util.StringTokenizer;
  import java.util.Vector;
  import java.util.Hashtable;
  
  /**
   * This is a utility class that can be used to extract information 
   * from class files using javap.  Currently the class is used to 
   * extract method parameter names for classes compiled with debug
   * information.
   *
   * @author Rich Scheuerle (scheu@us.ibm.com)      
   */
  public class JavapUtils
  {
      static Category category =
              Category.getInstance(JavapUtils.class.getName());
  
      private static Hashtable cache = new Hashtable();
  
      /**
       * Get the parameter names for the indicated method.
       * Returns null if no parameter names are available or accessible.
       * @param method is the Method
       * @return String[] of parameter names or null
       **/
      public static String[] getParameterNames(Method method) {
          // Get the javap output
          Vector text = javap(method.getDeclaringClass());
          if (text == null)
              return null;
  
          // Allocate the parameter names array
          int numParams = method.getParameterTypes().length;
          if (numParams ==0)
              return null;
          String[] paramNames = new String[numParams];
          
          // Get the Method signature without modifiers, return type and throws
          // Also javap puts a space after each comma
          String signature = method.toString();
          int start = signature.indexOf(method.getName()); 
          int end = signature.indexOf(")") +1;                
          signature = signature.substring(start,end);
  
          signature = JavaUtils.replace(signature, ",", ", ");
  
          // Find the Method
          String search = "Local variables for method ";
          int index = -1;    
          for (int i=0; i<text.size() && index<0; i++) {
              String line = (String) text.elementAt(i);
              if (line.startsWith(search) && 
                  line.endsWith(signature)) {
                  index = i;
              }
          }
          // If the line was not found, the parameter names are not available.
          // (Probably the class was not compiled with -g)
          if (index < 0)
              return null;
          
          // The lines after "Local variables..." will list 
          // the types and names of the parameters.  The "this" parameter
          // is ignored.  Here is an example javap snippet.
          //
          //Local variables for method int foo(short, int, java.lang.Object, short)
          //   my.Test this  pc=0, length=6, slot=0
          //   short parameter0  pc=0, length=6, slot=1
          //   int parameter1  pc=0, length=6, slot=2
          //   java.lang.Object parameter2  pc=0, length=6, slot=3
          //   short parameter3  pc=0, length=6, slot=4
          //   int localvar  pc=3, length=3, slot=5
          int paramIndex = 0;
          index++;
          while(paramIndex < paramNames.length && index < text.size()) {
              String line = (String) text.elementAt(index++);
              StringTokenizer st = new StringTokenizer(line);
              if (st.countTokens() >= 2) {
                  st.nextToken();
                  String name = st.nextToken();  // name is the second token
                  if (!name.equals("this")) {
                      paramNames[paramIndex++] = name;
                  }                    
              }
          }
          if (paramIndex == paramNames.length) {
              return paramNames;
          }
          return null;
      }
  
      /**
       * Invokes javap and returns each line of output.
       * @param class
       * @return Vector containing String objects representing output lines.
       **/
      public static synchronized Vector javap(Class cls) {
          if (cache.containsKey(cls)) {
              return (Vector) cache.get(cls);
          }
  
          Vector cachedInfo = null;        
          BufferedReader br = null;
          try {
              Runtime rt = Runtime.getRuntime();
              // The -l option is used to access the local variables.
              Process pr = rt.exec("javap -private -l " + cls.getName());
              br = new BufferedReader(new InputStreamReader(pr.getInputStream()));
              if (br != null) {
                  cachedInfo = new Vector();
                  String line = br.readLine();
                  while (line != null) {
                      cachedInfo.add(line);
                      line = br.readLine();
                  }
              }
          } catch (Exception e) {
              cachedInfo = null;  // Ignore anything that was read
          }
          cache.put(cls, cachedInfo);
          return cachedInfo;
      }
  }
  
  
  
  1.5       +11 -2     xml-axis/java/src/org/apache/axis/wsdl/Java2WSDL.java
  
  Index: Java2WSDL.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/wsdl/Java2WSDL.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- Java2WSDL.java	31 Dec 2001 20:35:07 -0000	1.4
  +++ Java2WSDL.java	3 Jan 2002 20:33:43 -0000	1.5
  @@ -87,6 +87,7 @@
       protected static final int METHODS_ALLOWED_OPT = 'm';
       protected static final int INHERITED_CLASS_OPT = 'a';
       protected static final int FACTORY_CLASS_OPT = 'f';
  +    protected static final int IMPL_CLASS_OPT = 'i';
   
       /**
        *  Define the understood options. Each CLOptionDescriptor contains:
  @@ -150,6 +151,10 @@
                   CLOptionDescriptor.ARGUMENT_REQUIRED,
                   FACTORY_CLASS_OPT,
                   JavaUtils.getMessage("j2woptfactory00")),
  +        new CLOptionDescriptor("implClass",
  +                CLOptionDescriptor.ARGUMENT_REQUIRED,
  +                IMPL_CLASS_OPT,
  +                JavaUtils.getMessage("j2woptimplClass00")),
   
       };
   
  @@ -208,6 +213,10 @@
                           emitter.setFactory(option.getArgument());
                           break;
   
  +                    case IMPL_CLASS_OPT:
  +                        emitter.setImplCls(option.getArgument());
  +                        break;
  +
                       case HELP_OPT:
                           printUsage();
                           break;
  @@ -271,8 +280,8 @@
                   emitter.setNamespaceMap(namespaceMap);
               }
   
  -            // Find the class using the name and optionally the classDir
  -            emitter.setCls(className, "");
  +            // Find the class using the name
  +            emitter.setCls(className);
   
               // Generate a full wsdl, or interface & implementation wsdls
               if (wsdlImplFilename == null) {
  
  
  
  1.2       +3 -1      xml-axis/java/src/org/apache/axis/wsdl/fromJava/BuilderPortTypeClassRep.java
  
  Index: BuilderPortTypeClassRep.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/wsdl/fromJava/BuilderPortTypeClassRep.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- BuilderPortTypeClassRep.java	21 Dec 2001 21:14:57 -0000	1.1
  +++ BuilderPortTypeClassRep.java	3 Jan 2002 20:33:43 -0000	1.2
  @@ -72,8 +72,10 @@
        * @param cls is the Class 
        * @param inhMethods if true, then the ClassRep will contain all methods inherited and
        *                   declared. If false, then ClassRep will contain just the declared methods.
  +     * @param implClass  An optional implClass can be passed in that implements/extends cls.
  +     *                   The purpose of the implClass is to find method parameter names.             
        **/
  -    public ClassRep build(Class cls, boolean inhMethods);
  +    public ClassRep build(Class cls, boolean inhMethods, Class implClass);
   
       /**
        * Returns a list of MethodReps to be used for portType operation processing.
  
  
  
  1.4       +164 -23   xml-axis/java/src/org/apache/axis/wsdl/fromJava/ClassRep.java
  
  Index: ClassRep.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/wsdl/fromJava/ClassRep.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- ClassRep.java	31 Dec 2001 21:36:12 -0000	1.3
  +++ ClassRep.java	3 Jan 2002 20:33:43 -0000	1.4
  @@ -59,10 +59,20 @@
   import java.lang.reflect.Field;
   import java.util.Vector;
   
  +import org.apache.axis.utils.JavapUtils;
  +
   /**
    * ClassRep is the representation of a class used inside the Java2WSDL
    * emitter.  The information in the ClassRep can be changed by 
    * user provided code to affect the emitted wsdl file.
  + *
  + * If you wish to change the functionality (for example change the
  + * getParameterNames(...) algorithm), here is one way to do it:
  + *   1) Extend ClassRep class (MyClassRep) and override the desired methods.
  + *   2) Extend the DefaultBuilderBeanClassRep and DefaultBuilderPortTypeClasses
  + *      and provide new build(...) methods that construct MyClassRep objects.
  + *   3) Extend the DefaultFactory class (MyFactory) so that it locates your new Builder classes.
  + *   4) Provide MyFactory as an option when your invoke Java2WSDL.
    *            
    *             name  
    * ClassRep +-+---------> String
  @@ -136,16 +146,64 @@
        * @param inhMethods if true, then the methods array will contain
        *                   methods declared and/or inherited else only
        *                   the declared methods are put in the list
  +     * @param implClass  This is an optional parameter which is a 
  +     *                   class that implements or extends cls.  The
  +     *                   implClass is used to obtain parameter names.
        */ 
       public ClassRep(Class cls, boolean inhMethods) {
  +        init(cls, inhMethods, null);
  +    }
  +    public ClassRep(Class cls, boolean inhMethods, Class implClass) {
  +        init(cls, inhMethods, implClass);
  +    }
  +    protected void init(Class cls, boolean inhMethods, Class implClass) {
           _name = cls.getName();
           _isInterface = cls.isInterface();
           _modifiers = cls.getModifiers();
  -        if (cls.getSuperclass() != null)
  +        if (cls.getSuperclass() != null &&
  +            cls.getSuperclass() != Object.class) {
               _super = new ClassRep(cls.getSuperclass(), inhMethods);
  +        }
           for (int i=0; i < cls.getInterfaces().length; i++) {
               _interfaces.add(new ClassRep(cls.getInterfaces()[i], inhMethods));
           }
  +        // Add the methods
  +        addMethods(cls, inhMethods, implClass);
  +
  +        // Add the fields
  +        addFields(cls);
  +    }
  +
  +
  +    /**
  +     * Getters/Setters
  +     **/
  +    public String   getName()                { return _name; }
  +    public void     setName(String name)     { _name = name; }
  +    public boolean  isInterface()            { return _isInterface; }
  +    public void     setIsInterface(boolean b){ _isInterface = b; }
  +    public int      getModifiers()           { return _modifiers; }
  +    public void     setModifiers(int m)      { _modifiers = m; }
  +    public ClassRep getSuper()               { return _super; }
  +    public void     setSuper(ClassRep cr)    { _super = cr; }
  +    public Vector   getInterfaces()          { return _interfaces; }
  +    public void     setInterfaces(Vector v)  { _interfaces = v; }
  +    public Vector   getMethods()             { return _methods; }
  +    public void     setMethods(Vector v)     { _methods = v; }
  +    public Vector   getFields()              { return _fields; }
  +    public void     setFields(Vector v)      { _fields = v; }
  +
  +    /**
  +     * Adds MethodReps to the ClassRep. 
  +     * @param cls the Class    
  +     * @param inhMethods if true, then the methods array will contain
  +     *                   methods declared and/or inherited else only
  +     *                   the declared methods are put in the list           
  +     * @param implClass  This is an optional parameter which is a 
  +     *                   class that implements or extends cls.  The
  +     *                   implClass is used to obtain parameter names.            
  +     */ 
  +    protected void addMethods(Class cls, boolean inhMethods, Class implClass) {
           // Constructs a vector of all the public methods
           Method[] m;
           if (inhMethods)
  @@ -154,9 +212,24 @@
               m = cls.getDeclaredMethods();
           for (int i=0; i < m.length; i++) {
               int mod = m[i].getModifiers();
  -            if (Modifier.isPublic(mod))
  -                _methods.add(new MethodRep(m[i]));
  +            if (Modifier.isPublic(mod)) {
  +                short[] modes = getParameterModes(m[i]);
  +                Class[] types = getParameterTypes(m[i]);
  +                _methods.add(new MethodRep(m[i], types, modes,
  +                                           getParameterNames(m[i], implClass, types)));
  +            }
           }
  +        return;
  +    }
  +
  +    /**
  +     * Adds FieldReps to the ClassRep.
  +     * @param cls the Class    
  +     * A complexType component element will be generated for each FieldRep.
  +     * This implementation generates FieldReps for public data fields and
  +     * also for properties exposed by java bean accessor methods.
  +     */ 
  +    protected void addFields(Class cls) {
   
           // Constructs a FieldRep for every public field and
           // for every field that has JavaBean accessor methods
  @@ -215,27 +288,95 @@
                   
               }
           }
  +        return;
  +    }
   
  +    /**
  +     * Get the list of parameter types for the specified method.
  +     * This implementation uses the specified type unless it is a holder class,
  +     * in which case the held type is used.
  +     * @param method is the Method.                          
  +     * @return array of parameter types.                                      
  +     */ 
  +    protected Class[] getParameterTypes(Method method) {
  +        Class[] types = new Class[method.getParameterTypes().length];
  +        for (int i=0; i < method.getParameterTypes().length; i++) {
  +            Class type = method.getParameterTypes()[i];
  +            if (holderClass(type) != null) {
  +                types[i] = holderClass(type);
  +            } else {
  +                types[i] = type;
  +            }
  +        }
  +        return types;
       }
  -       
  +
       /**
  -     * Getters/Setters
  -     **/
  -    public String   getName()                { return _name; }
  -    public void     setName(String name)     { _name = name; }
  -    public boolean  isInterface()            { return _isInterface; }
  -    public void     setIsInterface(boolean b){ _isInterface = b; }
  -    public int      getModifiers()           { return _modifiers; }
  -    public void     setModifiers(int m)      { _modifiers = m; }
  -    public ClassRep getSuper()               { return _super; }
  -    public void     setSuper(ClassRep cr)    { _super = cr; }
  -    public Vector   getInterfaces()          { return _interfaces; }
  -    public void     setInterfaces(Vector v)  { _interfaces = v; }
  -    public Vector   getMethods()             { return _methods; }
  -    public void     setMethods(Vector v)     { _methods = v; }
  -    public Vector   getFields()              { return _fields; }
  -    public void     setFields(Vector v)      { _fields = v; }
  +     * Get the list of parameter modes for the specified method.
  +     * This implementation assumes IN unless the type is a holder class
  +     * @param method is the Method.                          
  +     * @return array of parameter modes.                                      
  +     */ 
  +    protected short[] getParameterModes(Method method) {
  +        short[] modes = new short[method.getParameterTypes().length];
  +        for (int i=0; i < method.getParameterTypes().length; i++) {
  +            Class type = method.getParameterTypes()[i];
  +            if (holderClass(type) != null) {
  +                modes[i] = ParamRep.INOUT;
  +            } else {
  +                modes[i] = ParamRep.IN;
  +            }
  +        }
  +        return modes;
  +    }
   
  +    /**
  +     * Get the list of parameter names for the specified method.
  +     * This implementation uses javap to get the parameter names
  +     * from the class file.  If parameter names are not available 
  +     * for the method (perhaps the method is in an interface), the
  +     * corresponding method in the implClass is queried.
  +     * @param method is the Method to search.                
  +     * @param implClass  If the first search fails, the corresponding  
  +     *                   Method in this class is searched.           
  +     * @param types  are the parameter types after converting Holders.
  +     * @return array of parameter names or null.                              
  +     */ 
  +    protected String[] getParameterNames(Method method, Class implClass, Class[] types) {
  +        String[] paramNames = null;
  +        paramNames = JavapUtils.getParameterNames(method); 
  +
  +        // If failed, try getting a method of the impl class
  +        // It is possible that the impl class is a skeleton, thus the
  +        // method may have a different signature (no Holders).  This is
  +        // why the method search is done with two parameter lists.
  +        if (paramNames == null && implClass != null) {
  +            Method m = null;
  +            try {
  +                m = implClass.getDeclaredMethod(method.getName(), method.getParameterTypes());
  +            } catch (Exception e) {}
  +            if (m == null) { 
  +                try {
  +                    m = implClass.getMethod(method.getName(), method.getParameterTypes());
  +                } catch (Exception e) {}
  +            }
  +            if (m == null) { 
  +                try {
  +                    m = implClass.getDeclaredMethod(method.getName(), types);
  +                } catch (Exception e) {}
  +            }
  +            if (m == null) { 
  +                try {
  +                    m = implClass.getMethod(method.getName(), types);
  +                } catch (Exception e) {}
  +            }
  +            if (m != null) {
  +                paramNames = JavapUtils.getParameterNames(m); 
  +            }
  +        }            
  +
  +        return paramNames;
  +    }
   
       /**
        * Determines if the Property in the class has been compliant accessors. If so returns true,
  @@ -245,7 +386,7 @@
        * @param type is the type of the property
        * @return true if the Property has JavaBean style accessors
        */
  -    public static boolean isJavaBeanNormal(Class cls, String name, Class type) {
  +    protected boolean isJavaBeanNormal(Class cls, String name, Class type) {
           try {
               String propName = name.substring(0,1).toUpperCase()
                   + name.substring(1);
  @@ -282,7 +423,7 @@
        * @param type is the type of the property
        * @return true if the Property has JavaBean style accessors
        */
  -    public static boolean isJavaBeanIndexed(Class cls, String name, Class type) {
  +    protected boolean isJavaBeanIndexed(Class cls, String name, Class type) {
           // Must be an array
           if (!type.isArray())
               return false;
  @@ -322,7 +463,7 @@
        * @param type the Class
        * @return class of held type or null
        */
  -    public static Class holderClass(Class type) {
  +    protected Class holderClass(Class type) {
           if (type.getName() != null &&
               type.getName().endsWith("Holder")) {
               // Holder is supposed to have a public value field.
  
  
  
  1.2       +1 -1      xml-axis/java/src/org/apache/axis/wsdl/fromJava/DefaultBuilderBeanClassRep.java
  
  Index: DefaultBuilderBeanClassRep.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/wsdl/fromJava/DefaultBuilderBeanClassRep.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- DefaultBuilderBeanClassRep.java	21 Dec 2001 21:14:57 -0000	1.1
  +++ DefaultBuilderBeanClassRep.java	3 Jan 2002 20:33:43 -0000	1.2
  @@ -58,7 +58,7 @@
   
   /**
    * DefaultBuilderBeanClassRep:
  - * Extend this factory to provide your own functionality.
  + * Extend this class to provide your own functionality.
    * See Java2WSDLFactory and ClassRep for more details.
    *
    * @author Rich Scheuerle (scheu@us.ibm.com)
  
  
  
  1.2       +5 -3      xml-axis/java/src/org/apache/axis/wsdl/fromJava/DefaultBuilderPortTypeClassRep.java
  
  Index: DefaultBuilderPortTypeClassRep.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/wsdl/fromJava/DefaultBuilderPortTypeClassRep.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- DefaultBuilderPortTypeClassRep.java	21 Dec 2001 21:14:57 -0000	1.1
  +++ DefaultBuilderPortTypeClassRep.java	3 Jan 2002 20:33:43 -0000	1.2
  @@ -58,7 +58,7 @@
   
   /**
    * DefaultBuilderPortTypeClassRep:
  - * Extend this factory to provide your own functionality.
  + * Extend this class to provide your own functionality.
    * See Java2WSDLFactory and ClassRep for more details.
    *
    * @author Rich Scheuerle (scheu@us.ibm.com)
  @@ -75,8 +75,10 @@
        * @param cls is the Class 
        * @param inhMethods if true, then the ClassRep will contain all methods inherited and
        *                   declared. If false, then ClassRep will contain just the declared methods.
  +     * @param implClass  An optional implClass can be passed in that implements/extends cls.
  +     *                   The purpose of the implClass is to find method parameter names.             
        **/
  -    public ClassRep build(Class cls, boolean inhMethods) {
  +    public ClassRep build(Class cls, boolean inhMethods, Class implClass) {
           // Constructs a default ClassRep from the class
           // The Java2WSDL code examines the names/methods/params in ClassRep (and its super classes)
           // when constructing complexTypes.  So if you want to change the WSDL
  @@ -84,7 +86,7 @@
           // For example, if you want to supply your own parameter names, you 
           // could walk the ParamRep objects of each MethodRep and supply your own names.
           // (See getResolvedMethods for a way to deal with overloading conflicts)
  -        ClassRep cr = new ClassRep(cls, inhMethods);
  +        ClassRep cr = new ClassRep(cls, inhMethods, implClass);
   
           return cr;
       }
  
  
  
  1.8       +46 -12    xml-axis/java/src/org/apache/axis/wsdl/fromJava/Emitter.java
  
  Index: Emitter.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/wsdl/fromJava/Emitter.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- Emitter.java	2 Jan 2002 21:20:28 -0000	1.7
  +++ Emitter.java	3 Jan 2002 20:33:43 -0000	1.8
  @@ -117,6 +117,7 @@
       public static final int MODE_IMPLEMENTATION = 2;
   
       private Class cls;
  +    private Class implCls;                 // Optional class that is an implementation of cls
       private Vector allowedMethods = null;  // Names of methods to consider
       private boolean useInheritedMethods = false;
       private String intfNS;          
  @@ -502,7 +503,7 @@
           // objects representing the methods that should be contained in the portType.
           // This allows users to provide their own method/parameter mapping.
           BuilderPortTypeClassRep builder = factory.getBuilderPortTypeClassRep();
  -        ClassRep classRep = builder.build(cls, useInheritedMethods);
  +        ClassRep classRep = builder.build(cls, useInheritedMethods, implCls);
           Vector methods = builder.getResolvedMethods(classRep, allowedMethods);
   
           for(int i=0; i<methods.size(); i++) {
  @@ -749,7 +750,7 @@
       /**
        * Sets the <code>Class</code> to export.
        * If the class looks like a skeleton class, do some searching to find the
  -     * interface class.  
  +     * interface class and try and locate and implementation class.                 
        * @param cls the <code>Class</code> to export
        * @param name service name
        */
  @@ -779,8 +780,20 @@
                   intf = parms[0];
               }
           }
  -        if (intf != null)
  +        if (intf != null) {
               setCls(intf);
  +
  +            // There is no way right now to reflect on the skeleton to find
  +            // the implementation (and there might never be a way).  
  +            // Try to find an implementation and then use the skeleton as a last
  +            // resort (the skeleton won't always work due to signature differences).
  +            if (implCls == null) {
  +                setImplCls(cls.getName().substring(0,cls.getName().indexOf("Skeleton")) + "Impl");
  +                if (implCls == null) {
  +                    setImplCls(cls);  // Use skeleton as implementation class
  +                }
  +            }
  +        }
           else
               setCls(cls);
       }
  @@ -788,20 +801,41 @@
       /**
        * Sets the <code>Class</code> to export
        * @param className the name of the <code>Class</code> to export
  -     * @param classDir the directory containing the class (optional)
        */
  -    public void setCls(String className, String classDir) {
  +    public void setCls(String className) {
           try {
               cls = Class.forName(className);
           }
           catch (Exception ex) {
  -            /** @todo ravi: use classDir to load class directly into the class loader
  -             *  The case for it is that one can create a new directory, drop some source, compile and use a
  -             *  WSDL gen tool to generate wsdl - without editing the Wsdl gen tool's classpath
  -             *  Assuming all of the classes are either under classDir or otherwise in the classpath
  -             *
  -             *  Would this be useful?
  -             *  */
  +            ex.printStackTrace();
  +        }
  +    }
  +
  +    /**
  +     * Returns the implementation <code>Class</code> if set
  +     * @return the implementation Class or null
  +     */
  +    public Class getImplCls() {
  +        return implCls;
  +    }
  +
  +    /**
  +     * Sets the implementation <code>Class</code>
  +     * @param implCls the <code>Class</code> to export
  +     */
  +    public void setImplCls(Class implCls) {
  +        this.implCls = implCls;
  +    }
  +
  +    /**
  +     * Sets the implementation <code>Class</code>
  +     * @param className the name of the implementation <code>Class</code>
  +     */
  +    public void setImplCls(String className) {
  +        try {
  +            implCls = Class.forName(className);
  +        }
  +        catch (Exception ex) {
               ex.printStackTrace();
           }
       }
  
  
  
  1.2       +16 -7     xml-axis/java/src/org/apache/axis/wsdl/fromJava/MethodRep.java
  
  Index: MethodRep.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/wsdl/fromJava/MethodRep.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- MethodRep.java	21 Dec 2001 21:14:57 -0000	1.1
  +++ MethodRep.java	3 Jan 2002 20:33:43 -0000	1.2
  @@ -80,22 +80,31 @@
       /**
        * Constructor
        * Create a default representation of MethodRep
  -     * @param cls Class to use to create default MethodRep
  +     * @param method Method to use to create default MethodRep
  +     * @param types  This is an array of parameter types                       
  +     * @param modes  This is an array of parameter modes (IN, OUT, INOUT)      
  +     * @param paramNames This is an array of names to be used for the
  +     *                   parameter names.  If null, default names
  +     *                   are constructed.                                          
        */ 
  -    public MethodRep(Method method) {
  +    public MethodRep(Method method, Class[] types, short[] modes, String[] paramNames) {
           _name = method.getName();
           _returns = new ParamRep("return", method.getReturnType(), ParamRep.OUT);
   
           // Create a ParamRep for each parameter.  The holderClass() method
           // returns the name of the held type if this is a holder class.
           for (int i=0; i < method.getParameterTypes().length; i++) {
  -            Class type = method.getParameterTypes()[i];
  -            if (ClassRep.holderClass(type) == null) {
  -                _parameters.add(new ParamRep("in"+i, type, ParamRep.IN));
  +            String name; 
  +            if (paramNames !=null) {
  +                name = (String) paramNames[i];
  +            } else if (modes[i] == ParamRep.IN) {
  +                name = "in" + i;
  +            } else if (modes[i] == ParamRep.OUT) {
  +                name = "out" + i;
               } else {
  -                type = ClassRep.holderClass(type);
  -                _parameters.add(new ParamRep("inOut"+i, type, ParamRep.INOUT));
  +                name = "inOut" + i;
               }
  +            _parameters.add(new ParamRep(name, types[i], modes[i]));
           }
       }
          
  
  
  
  1.5       +6 -3      xml-axis/java/src/org/apache/axis/wsdl/fromJava/todo.txt
  
  Index: todo.txt
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/wsdl/fromJava/todo.txt,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- todo.txt	31 Dec 2001 20:35:08 -0000	1.4
  +++ todo.txt	3 Jan 2002 20:33:43 -0000	1.5
  @@ -8,7 +8,9 @@
   * Generate deployment - deploy.wsdd, undeploy.wsdd
   * Pluggable ParameterNameResolver for method parameters with complexType
     -Rich: Users can now use Java2WSDLFactory to provide this mapping.
  -         I may add a better default later.
  +  -Rich: If the class was compiled with -g, the parameter names are 
  +         obtained from the javap output and used as the message part names.
  +         Users can provide their own mapping by extending the Java2WSDLFactory.
   * Make PackageName=Namespace configurable using a properties file
   * Generate JAX-RPC style stub, skeleton and optionally refactor exporting 
     class as the impl class *** (see Note 1) ***
  @@ -25,8 +27,7 @@
   
   Group 3
   -------
  -* Address roundtrip behaviour - with the exception of type promotion and param 
  -  naming differences
  +* Address roundtrip behaviour - with the exception of type promotion
      - this has been started see test/sequence
   
   * A mechanism to register types (class:serializer:deserializer)
  @@ -39,9 +40,11 @@
            their own using new Java2WSDLFactory mechanism.
   * support exporting by interface - in addition to allowed methods
     -Rich: Users can provide their own resolution using Java2WSDLFactory mechanism.
  +  -Rich: Seems like we have enough bells and whistles here.
   * Output mode currently has ALL, Interface, Implementation -- need to add Types
   * Output and OUTPUT_IMPL options are there to generate "split" files -- need to 
     add OUTPUT_TYPES as well 
  +  -Rich: Might want to think about a separate "split WSDL tool" to do this stuff.
   * Allow options for just for Java->XML type generation
   
   
  
  
  
  1.3       +1 -1      xml-axis/java/src/org/apache/axis/wsdl/toJava/UndefinedDelegate.java
  
  Index: UndefinedDelegate.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/wsdl/toJava/UndefinedDelegate.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- UndefinedDelegate.java	13 Dec 2001 20:54:00 -0000	1.2
  +++ UndefinedDelegate.java	3 Jan 2002 20:33:43 -0000	1.3
  @@ -62,7 +62,7 @@
   import org.w3c.dom.Node;
   
   /**
  - * This Undefined interface is implemented by UndefinedType and UndefinedElement.
  + * This UndefinedDelegate class implements the common functions of UndefinedType and UndefinedElement.
    */
   public class UndefinedDelegate implements Undefined {
   
  
  
  
  1.3       +19 -1     xml-axis/java/test/wsdl/Java2WsdlAntTask.java
  
  Index: Java2WsdlAntTask.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/test/wsdl/Java2WsdlAntTask.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- Java2WsdlAntTask.java	11 Dec 2001 15:14:26 -0000	1.2
  +++ Java2WsdlAntTask.java	3 Jan 2002 20:33:43 -0000	1.3
  @@ -74,6 +74,8 @@
       private String output = "." ;
       private String className = "." ;
       private String service = null ;
  +    private String implClass = null;
  +    private String factory   = null;
   
       // The method executing the task
       public void execute() throws BuildException {
  @@ -84,6 +86,8 @@
               log("\tlocation:" + location, Project.MSG_VERBOSE);
               log("\toutput:" + output, Project.MSG_VERBOSE);
               log("\tclassName:" + className, Project.MSG_VERBOSE);
  +            log("\timplClass:" + implClass, Project.MSG_VERBOSE);
  +            log("\tfactory:"   + factory,   Project.MSG_VERBOSE);
               
               // Instantiate the emitter
               Emitter emitter = new Emitter();
  @@ -93,7 +97,11 @@
               }
               if (service != null)
                   emitter.setServiceName(service);
  -            emitter.setCls(className, "");
  +            emitter.setCls(className);
  +            if (implClass != null)
  +                emitter.setImplCls(implClass);
  +            if (factory != null)
  +                emitter.setFactory(factory);
               emitter.setIntfNamespace(namespace);
               emitter.setLocationUrl(location);
               emitter.emit(output, Emitter.MODE_ALL);
  @@ -115,6 +123,16 @@
       // The setter for the "className" attribute
       public void setClassName(String parameter) {
           this.className = parameter;
  +    }
  +
  +    // The setter for the "implClass" attribute
  +    public void setImplClass(String parameter) {
  +        this.implClass = parameter;
  +    }
  +
  +    // The setter for the "factory" attribute
  +    public void setFactory(String parameter) {
  +        this.factory = parameter;
       }
   
       // The setter for the "service" attribute
  
  
  
  1.50      +3 -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.49
  retrieving revision 1.50
  diff -u -r1.49 -r1.50
  --- Wsdl2javaTestSuite.xml	18 Dec 2001 21:28:21 -0000	1.49
  +++ Wsdl2javaTestSuite.xml	3 Jan 2002 20:33:43 -0000	1.50
  @@ -96,9 +96,9 @@
           <include name="SequenceInfo.java"/>
         </fileset>
       </copy>
  -    <!-- Compile Java -->
  +    <!-- Compile Java (debug is turned on so that Java2WSDL can access parm names) -->
       <javac srcdir="${build.dir}/work" destdir="${build.dest}"
  -           debug="${debug}">
  +           debug="on">
         <classpath refid="test-classpath" />
         <include name="test/sequence/**.java" />
         <exclude name="test/sequence/*TestCase.java" />
  @@ -107,6 +107,7 @@
       <!-- Now create a WSDL file from the Java classes -->
       <java2wsdl output="build/work/test/sequence/SequenceTest.wsdl"
                  className= "test.sequence.SequenceTestPortType"
  +               implClass= "test.sequence.SequenceTestSoapBindingImpl"
                  namespace="urn:SequenceTest2"
                  location="http://localhost:8080/axis/services/SequenceTest">
           <mapping namespace="urn:SequenceTest2" package="test.sequence"/>