You are viewing a plain text version of this content. The canonical link for it is here.
Posted to axis-cvs@ws.apache.org by de...@apache.org on 2005/12/19 10:19:41 UTC

svn commit: r357670 - in /webservices/axis2/trunk/java/modules: common/src/org/apache/axis2/i18n/ core/src/org/apache/axis2/context/ wsdl/src/org/apache/axis2/wsdl/java2wsdl/ wsdl/src/org/apache/axis2/wsdl/java2wsdl/bytecode/

Author: deepal
Date: Mon Dec 19 01:19:21 2005
New Revision: 357670

URL: http://svn.apache.org/viewcvs?rev=357670&view=rev
Log:
1. Coping byte code reading from Axis 1.x for java2wsdl
2. removing un-used code from Java2WOM
3. code improvement in configuration context factory  

Added:
    webservices/axis2/trunk/java/modules/wsdl/src/org/apache/axis2/wsdl/java2wsdl/bytecode/
    webservices/axis2/trunk/java/modules/wsdl/src/org/apache/axis2/wsdl/java2wsdl/bytecode/ChainedParamReader.java
    webservices/axis2/trunk/java/modules/wsdl/src/org/apache/axis2/wsdl/java2wsdl/bytecode/ClassReader.java
    webservices/axis2/trunk/java/modules/wsdl/src/org/apache/axis2/wsdl/java2wsdl/bytecode/MethodTable.java
    webservices/axis2/trunk/java/modules/wsdl/src/org/apache/axis2/wsdl/java2wsdl/bytecode/ParamNameExtractor.java
    webservices/axis2/trunk/java/modules/wsdl/src/org/apache/axis2/wsdl/java2wsdl/bytecode/ParamReader.java
Modified:
    webservices/axis2/trunk/java/modules/common/src/org/apache/axis2/i18n/resource.properties
    webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/context/ConfigurationContextFactory.java
    webservices/axis2/trunk/java/modules/wsdl/src/org/apache/axis2/wsdl/java2wsdl/Java2WOM.java
    webservices/axis2/trunk/java/modules/wsdl/src/org/apache/axis2/wsdl/java2wsdl/SchemaGenerator.java

Modified: webservices/axis2/trunk/java/modules/common/src/org/apache/axis2/i18n/resource.properties
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/common/src/org/apache/axis2/i18n/resource.properties?rev=357670&r1=357669&r2=357670&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/common/src/org/apache/axis2/i18n/resource.properties (original)
+++ webservices/axis2/trunk/java/modules/common/src/org/apache/axis2/i18n/resource.properties Mon Dec 19 01:19:21 2005
@@ -134,4 +134,9 @@
 failedJMSConnectorShutdown=failure in JMSConnectorShutdown
 #outMessageNull=Out message is null
 malformedURLException00=MalformedURLException:
-exception00=Exception:
\ No newline at end of file
+exception00=Exception:
+#Byte code reading for Java2WSDL
+badClassFile00=Error looking for paramter names in bytecode: input does not appear to be a valid class file
+cantLoadByecode=Unable to load bytecode for class "{0}"
+unexpectedEOF00=Error looking for paramter names in bytecode: unexpected end of file
+unexpectedBytes00=Error looking for paramter names in bytecode: unexpected bytes in file
\ No newline at end of file

Modified: webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/context/ConfigurationContextFactory.java
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/context/ConfigurationContextFactory.java?rev=357670&r1=357669&r2=357670&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/context/ConfigurationContextFactory.java (original)
+++ webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/context/ConfigurationContextFactory.java Mon Dec 19 01:19:21 2005
@@ -24,6 +24,24 @@
     private Log log = LogFactory.getLog(getClass());
 
     /**
+     * To create a AxisConfiguration depending on the user requiremnt , this method can be used.
+     * First create a AxisConfigurationCreator object giving necessary parameters into it.
+     * Depending on the implementation getAxisConfiguration(); will give the AxisConfiguration and
+     * using the ConfigurationContext will be created and return that.
+     *
+     * @param axisConfigurationCreator
+     * @return
+     * @throws AxisFault
+     */
+    public ConfigurationContext getConfigurationContext(
+            AxisConfigurationCreator axisConfigurationCreator) throws AxisFault {
+        AxisConfiguration axisConfig = axisConfigurationCreator.getAxisConfiguration();
+        ConfigurationContext configContext = new ConfigurationContext(axisConfig);
+        init(configContext);
+        return configContext;
+    }
+
+    /**
      * Builds the configuration for the client.
      *
      * @param axis2home the value can be null and resolves to the default axis2.xml file
@@ -33,12 +51,7 @@
     public ConfigurationContext buildClientConfigurationContext(String axis2home) throws AxisFault {
         AxisConfigurationCreator repoBasedConfigCreator =
                 new FileSystemConfigurationCreator(axis2home, false);
-        AxisConfiguration axisConfig = repoBasedConfigCreator.getAxisConfiguration();
-        ConfigurationContext configurationContext = new ConfigurationContext(axisConfig);
-
-        init(configurationContext);
-
-        return configurationContext;
+        return getConfigurationContext(repoBasedConfigCreator);
     }
 
     /**
@@ -51,12 +64,8 @@
     public ConfigurationContext buildConfigurationContext(String repositoryName) throws AxisFault {
         AxisConfigurationCreator repoBasedConfigCreator =
                 new FileSystemConfigurationCreator(repositoryName, true);
-        AxisConfiguration axisConfig = repoBasedConfigCreator.getAxisConfiguration();
-        ConfigurationContext configurationContext = new ConfigurationContext(axisConfig);
-
-        init(configurationContext);
+        return getConfigurationContext(repoBasedConfigCreator);
 
-        return configurationContext;
     }
 
     /**
@@ -145,17 +154,6 @@
                 }
             }
         }
-    }
-
-    public ConfigurationContext getConfigurationContext(
-            AxisConfigurationCreator axisConfigurationCreator)
-            throws AxisFault {
-        AxisConfiguration axisConfig = axisConfigurationCreator.getAxisConfiguration();
-        ConfigurationContext configContext = new ConfigurationContext(axisConfig);
-
-        init(configContext);
-
-        return configContext;
     }
 
     /**

Modified: webservices/axis2/trunk/java/modules/wsdl/src/org/apache/axis2/wsdl/java2wsdl/Java2WOM.java
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/wsdl/src/org/apache/axis2/wsdl/java2wsdl/Java2WOM.java?rev=357670&r1=357669&r2=357670&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/wsdl/src/org/apache/axis2/wsdl/java2wsdl/Java2WOM.java (original)
+++ webservices/axis2/trunk/java/modules/wsdl/src/org/apache/axis2/wsdl/java2wsdl/Java2WOM.java Mon Dec 19 01:19:21 2005
@@ -142,62 +142,6 @@
         return portType;
     }
 
-    private WSDLBinding generateBinding(WSDLComponentFactory wsdlComponentFactory,
-                                        WSDLDescription womDescription,
-                                        WSDLInterface portType, QName bindingName,
-                                        JMethod metods[],
-                                        String style,
-                                        String use,
-                                        String trsportURI,
-                                        String namespeceURI) {
-        WSDLBinding binding = wsdlComponentFactory.createBinding();
-        binding.setBoundInterface(portType);
-        binding.setName(bindingName);
-        womDescription.addBinding(binding);
-
-        SOAPBindingImpl soapbindingImpl = new SOAPBindingImpl();
-        soapbindingImpl.setStyle(style);
-        soapbindingImpl.setTransportURI(trsportURI);
-        binding.addExtensibilityElement(soapbindingImpl);
-        for (int i = 0; i < metods.length; i++) {
-            JMethod jmethod = metods[i];
-            //creating WSDLOperation     for the binding
-            WSDLBindingOperation bindingoperation = wsdlComponentFactory.createWSDLBindingOperation();
-            String methodName = jmethod.getSimpleName();
-            bindingoperation.setName(new QName(methodName));
-            bindingoperation.setOperation(portType.getOperation(methodName));
-            binding.addBindingOperation(bindingoperation);
-
-            SOAPOperationImpl soapOpimpl = new SOAPOperationImpl();
-            soapOpimpl.setStyle(style);
-            //to do heve to set a proper SOAPAction
-            soapOpimpl.setSoapAction(jmethod.getSimpleName());
-            bindingoperation.addExtensibilityElement(soapOpimpl);
-
-            //creating imput message
-            WSDLBindingMessageReference inMessage = wsdlComponentFactory.createWSDLBindingMessageReference();
-            inMessage.setDirection(org.apache.wsdl.WSDLConstants.WSDL_MESSAGE_DIRECTION_IN);
-            bindingoperation.setInput(inMessage);
-            SOAPBodyImpl requestSoapbody = new SOAPBodyImpl();
-            requestSoapbody.setUse(use);
-            //todo need to fix this
-            requestSoapbody.setNamespaceURI(namespeceURI);
-            inMessage.addExtensibilityElement(requestSoapbody);
-
-            if (!jmethod.getReturnType().isVoidType()) {
-                WSDLBindingMessageReference outMessage = wsdlComponentFactory.createWSDLBindingMessageReference();
-
-                outMessage.setDirection(org.apache.wsdl.WSDLConstants.WSDL_MESSAGE_DIRECTION_OUT);
-                bindingoperation.setOutput(outMessage);
-                SOAPBodyImpl resSoapbody = new SOAPBodyImpl();
-                resSoapbody.setUse(use);
-                resSoapbody.setNamespaceURI(namespeceURI);
-                outMessage.addExtensibilityElement(resSoapbody);
-            }
-        }
-        return binding;
-    }
-
     public WSDLService generateService(WSDLComponentFactory wsdlComponentFactory,
                                        WSDLDescription womDescription,
                                        WSDLBinding binding, String ServiceName) {

Modified: webservices/axis2/trunk/java/modules/wsdl/src/org/apache/axis2/wsdl/java2wsdl/SchemaGenerator.java
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/wsdl/src/org/apache/axis2/wsdl/java2wsdl/SchemaGenerator.java?rev=357670&r1=357669&r2=357670&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/wsdl/src/org/apache/axis2/wsdl/java2wsdl/SchemaGenerator.java (original)
+++ webservices/axis2/trunk/java/modules/wsdl/src/org/apache/axis2/wsdl/java2wsdl/SchemaGenerator.java Mon Dec 19 01:19:21 2005
@@ -1,321 +1,348 @@
-package org.apache.axis2.wsdl.java2wsdl;
-
-import org.apache.ws.commons.schema.*;
-import org.apache.xmlbeans.impl.jam.*;
-
-import javax.xml.namespace.QName;
-import java.util.Hashtable;
-/*
-* Copyright 2004,2005 The Apache Software Foundation.
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-*      http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*
-*/
-
-public class SchemaGenerator {
-    private ClassLoader classLoader;
-    private String className;
-    Hashtable prefixmap;
-    XmlSchemaCollection schemaCollection;
-    XmlSchema schema;
-    TypeTable typeTable;
-    private JMethod methods [];
-
-    public static String METHOD_REQUEST_WRAPPER = "Request";
-    public static String METHOD_RESPONSE_WRAPPER = "Response";
-    public static String TARGET_NAMESPACE = null;
-    public static String SCHEMA_TARGET_NAMESPACE = "http://ws.apache.org/axis2/xsd";
-    public static String SCHEMA_NAMESPACE_PREFIX = "ns1";
-    public static String TARGET_NAMESPACE_PREFIX = "tns";
-
-    public SchemaGenerator(ClassLoader loader, String className,
-                           String scheamtargetNamespace,
-                           String scheamtargetNamespacePrefix) {
-        this.classLoader = loader;
-        this.className = className;
-        TARGET_NAMESPACE = "http://" + className;
-        if (scheamtargetNamespace != null && !scheamtargetNamespace.trim().equals("")) {
-            SCHEMA_TARGET_NAMESPACE = scheamtargetNamespace;
-        }
-        if (scheamtargetNamespacePrefix != null && !scheamtargetNamespacePrefix.trim().equals("")) {
-            SCHEMA_NAMESPACE_PREFIX = scheamtargetNamespacePrefix;
-        }
-
-        prefixmap = new Hashtable();
-        prefixmap.put(SCHEMA_NAMESPACE_PREFIX, SCHEMA_TARGET_NAMESPACE);
-
-        schemaCollection = new XmlSchemaCollection();
-
-        schema = new XmlSchema(SCHEMA_TARGET_NAMESPACE, schemaCollection);
-        schema.setElementFormDefault(new XmlSchemaForm(XmlSchemaForm.QUALIFIED));
-        schema.setPrefixToNamespaceMap(prefixmap);
-        this.typeTable = new TypeTable();
-    }
-
-    /**
-     * Generates schema for all the parameters in method. It first generates schema for all different
-     * parameter type and later refers to them.
-     *
-     * @return Returns XmlSchema
-     * @throws Exception
-     */
-    public XmlSchema generateSchema() throws Exception {
-
-        JamServiceFactory factory = JamServiceFactory.getInstance();
-        JamServiceParams jam_service_parms = factory.createServiceParams();
-
-        //it can possible to add the classLoader as well
-        jam_service_parms.addClassLoader(classLoader);
-        jam_service_parms.includeClass(className);
-        JamService service = factory.createService(jam_service_parms);
-
-        JamClassIterator jClassIter = service.getClasses();
-        //all most all the time the ittr will have only one class in it
-        while (jClassIter.hasNext()) {
-            JClass jclass = (JClass) jClassIter.next();
-
-            //todo in the future , when we support annotation we can use this
-            //JAnnotation[] annotations = jclass.getAnnotations();
-
-            /**
-             * Schema generation done in two stage
-             *  1. Load all the methods and create type for methods parameters (if the parameters are
-             *     Beans then it will create Complex types for those , and if the parameters are simple
-             *     type which described in SimpleTypeTable nothing will happen)
-             *  2. In the next stage for all the methods messages and port types will be
-             *     created.
-             */
-            methods = jclass.getDeclaredMethods();
-
-            for (int i = 0; i < methods.length; i++) {
-                JMethod jMethod = methods[i];
-
-                JParameter [] params = jMethod.getParameters();
-                for (int j = 0; j < params.length; j++) {
-                    JParameter methodParameter = params[j];
-                    JClass paramType = methodParameter.getType();
-                    String classTypeName = paramType.getQualifiedName();
-                    if (paramType.isArrayType()) {
-                        classTypeName = paramType.getArrayComponentType().getQualifiedName();
-                        if (!typeTable.isSimpleType(classTypeName)) {
-                            generateSchema(paramType.getArrayComponentType());
-                        }
-                    } else {
-                        if (!typeTable.isSimpleType(classTypeName)) {
-                            generateSchema(methodParameter.getType());
-                        }
-                    }
-                    /**
-                     * 1. have to check whethet its a simple type
-                     * 2. then to check whther its a simple type array
-                     * 3. OM elemney
-                     * 4. Bean
-                     */
-
-                }
-                // for its return type
-                JClass returnType = jMethod.getReturnType();
-                if (!returnType.isVoidType()) {
-                    if (returnType.isArrayType()) {
-                        String returnTypeName = returnType.getArrayComponentType().getQualifiedName();
-                        if (!typeTable.isSimpleType(returnTypeName)) {
-                            generateSchema(returnType.getArrayComponentType());
-                        }
-                    } else {
-                        if (!typeTable.isSimpleType(returnType.getQualifiedName())) {
-                            generateSchema(returnType);
-                        }
-                    }
-                }
-
-            }
-            generateWrapperElements(methods);
-        }
-        return schema;
-    }
-
-    /**
-     * To generate wrapper element , if a method take more than one parameter
-     * if the method look like foo(Type1 para1, Type2 para2){}
-     * will creat e Wrapper element like
-     * <element name="fooInParameter type="tns:fooInParameterElement"">
-     * <complexType name="fooInParameterElement">
-     * <sequnce>
-     * <element name="para1" type="tns:Type1">
-     * <element name="para2" type="tns:Type2">
-     * </sequnce>
-     * </complexType>
-     * </element>
-     */
-    private void generateWrapperElements(JMethod methods[]) {
-        for (int i = 0; i < methods.length; i++) {
-            JMethod method = methods[i];
-            generateWrapperElementforMethod(method);
-        }
-    }
-
-    private void generateWrapperElementforMethod(JMethod method) {
-        String methodName = method.getSimpleName();
-        XmlSchemaComplexType complexType = new XmlSchemaComplexType(schema);
-        XmlSchemaSequence sequence = new XmlSchemaSequence();
-
-        XmlSchemaElement eltOuter = new XmlSchemaElement();
-        eltOuter.setName(methodName + METHOD_REQUEST_WRAPPER);
-        schema.getItems().add(eltOuter);
-        eltOuter.setSchemaType(complexType);
-        // adding this type to the table
-        //todo pls ask this from Ajith
-        QName elementName = new QName(SchemaGenerator.SCHEMA_TARGET_NAMESPACE,
-                eltOuter.getName(), SCHEMA_NAMESPACE_PREFIX);
-        typeTable.addComplexScheam(methodName + METHOD_REQUEST_WRAPPER, elementName);
-
-        JParameter [] params = method.getParameters();
-        if (params.length > 0) {
-            complexType.setParticle(sequence);
-        }
-        for (int j = 0; j < params.length; j++) {
-            JParameter methodParameter = params[j];
-            String classTypeName = methodParameter.getType().getQualifiedName();
-            boolean isArrayType = methodParameter.getType().isArrayType();
-            if (isArrayType) {
-                classTypeName = methodParameter.getType().getArrayComponentType().getQualifiedName();
-            }
-            if (typeTable.isSimpleType(classTypeName)) {
-                XmlSchemaElement elt1 = new XmlSchemaElement();
-                elt1.setName(methodParameter.getSimpleName());
-                elt1.setSchemaTypeName(typeTable.getSimpleSchemaTypeName(classTypeName));
-                sequence.getItems().add(elt1);
-                if (isArrayType) {
-                    elt1.setMaxOccurs(Long.MAX_VALUE);
-                }
-            } else {
-                XmlSchemaElement elt1 = new XmlSchemaElement();
-                elt1.setName(methodParameter.getSimpleName());
-                elt1.setSchemaTypeName(typeTable.getComplexScheamType(classTypeName));
-                sequence.getItems().add(elt1);
-                if (isArrayType) {
-                    elt1.setMaxOccurs(Long.MAX_VALUE);
-                }
-            }
-        }
-
-        //generating wrapper element for return element
-        JClass methodReturnType = method.getReturnType();
-        generateWrapperforReturnType(methodReturnType, methodName);
-
-    }
-
-    private void generateWrapperforReturnType(JClass returnType, String methodName) {
-        if (!returnType.isVoidType()) {
-            XmlSchemaComplexType return_com_type = new XmlSchemaComplexType(schema);
-            XmlSchemaElement ret_eltOuter = new XmlSchemaElement();
-            ret_eltOuter.setName(methodName + METHOD_RESPONSE_WRAPPER);
-            schema.getItems().add(ret_eltOuter);
-            ret_eltOuter.setSchemaType(return_com_type);
-            QName ret_comTypeName = new QName(SchemaGenerator.SCHEMA_TARGET_NAMESPACE,
-                    ret_eltOuter.getName(), SCHEMA_NAMESPACE_PREFIX);
-            typeTable.addComplexScheam(methodName + METHOD_RESPONSE_WRAPPER, ret_comTypeName);
-            String classTypeName = returnType.getQualifiedName();
-            boolean isArrayType = returnType.isArrayType();
-            XmlSchemaSequence sequence = new XmlSchemaSequence();
-            return_com_type.setParticle(sequence);
-            if (isArrayType) {
-                classTypeName = returnType.getArrayComponentType().getQualifiedName();
-            }
-            if (typeTable.isSimpleType(classTypeName)) {
-                XmlSchemaElement elt1 = new XmlSchemaElement();
-                elt1.setName("return");
-                elt1.setSchemaTypeName(typeTable.getSimpleSchemaTypeName(classTypeName));
-                sequence.getItems().add(elt1);
-                if (isArrayType) {
-                    elt1.setMaxOccurs(Long.MAX_VALUE);
-                }
-            } else {
-                XmlSchemaElement elt1 = new XmlSchemaElement();
-                elt1.setName("return");
-                elt1.setSchemaTypeName(typeTable.getComplexScheamType(classTypeName));
-                sequence.getItems().add(elt1);
-                if (isArrayType) {
-                    elt1.setMaxOccurs(Long.MAX_VALUE);
-                }
-            }
-        }
-    }
-
-
-    private void generateSchema(JClass javaType) {
-        String name = javaType.getQualifiedName();
-        if (typeTable.getComplexScheamType(name) == null) {
-            String simpleName = javaType.getSimpleName();
-
-            XmlSchemaComplexType complexType = new XmlSchemaComplexType(schema);
-            XmlSchemaSequence sequence = new XmlSchemaSequence();
-
-            XmlSchemaElement eltOuter = new XmlSchemaElement();
-            QName elemntName = new QName(SCHEMA_TARGET_NAMESPACE, simpleName, SCHEMA_NAMESPACE_PREFIX);
-            eltOuter.setName(simpleName);
-            eltOuter.setQName(elemntName);
-            complexType.setParticle(sequence);
-            complexType.setName(simpleName);
-
-            schema.getItems().add(eltOuter);
-            schema.getItems().add(complexType);
-            eltOuter.setSchemaTypeName(complexType.getQName());
-
-            // adding this type to the table
-            typeTable.addComplexScheam(name, eltOuter.getQName());
-
-            JProperty [] properties = javaType.getDeclaredProperties();
-            for (int i = 0; i < properties.length; i++) {
-                JProperty property = properties[i];
-                String propertyName = property.getType().getQualifiedName();
-                boolean isArrayType = property.getType().isArrayType();
-                if (isArrayType) {
-                    propertyName = property.getType().getArrayComponentType().getQualifiedName();
-                }
-                if (typeTable.isSimpleType(propertyName)) {
-                    XmlSchemaElement elt1 = new XmlSchemaElement();
-                    elt1.setName(property.getSimpleName());
-                    elt1.setSchemaTypeName(typeTable.getSimpleSchemaTypeName(propertyName));
-                    sequence.getItems().add(elt1);
-                    if (isArrayType) {
-                        //todo pls check this with Ajith
-                        elt1.setMaxOccurs(Long.MAX_VALUE);
-                    }
-                } else {
-                    if (isArrayType) {
-                        generateSchema(property.getType().getArrayComponentType());
-                    } else {
-                        generateSchema(property.getType());
-                    }
-                    XmlSchemaElement elt1 = new XmlSchemaElement();
-                    elt1.setName(property.getSimpleName());
-                    elt1.setSchemaTypeName(typeTable.getComplexScheamType(propertyName));
-                    sequence.getItems().add(elt1);
-                    if (isArrayType) {
-                        elt1.setMaxOccurs(Long.MAX_VALUE);
-                    }
-                }
-            }
-        }
-    }
-
-    public TypeTable getTypeTable() {
-        return typeTable;
-    }
-
-    public JMethod[] getMethods() {
-        return methods;
-    }
-
-}
+package org.apache.axis2.wsdl.java2wsdl;
+
+import org.apache.axis2.wsdl.java2wsdl.bytecode.MethodTable;
+import org.apache.ws.commons.schema.*;
+import org.apache.xmlbeans.impl.jam.*;
+
+import javax.xml.namespace.QName;
+import java.util.Hashtable;
+/*
+* Copyright 2004,2005 The Apache Software Foundation.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+*      http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*
+* @author : Deepal Jayasinghe (deepal@apache.org)
+*
+*/
+
+public class SchemaGenerator {
+    private ClassLoader classLoader;
+    private String className;
+    Hashtable prefixmap;
+    XmlSchemaCollection schemaCollection;
+    XmlSchema schema;
+    TypeTable typeTable;
+    private JMethod methods [];
+    private MethodTable methodTable;
+
+    public static String METHOD_REQUEST_WRAPPER = "Request";
+    public static String METHOD_RESPONSE_WRAPPER = "Response";
+    public static String TARGET_NAMESPACE = null;
+    public static String SCHEMA_TARGET_NAMESPASE = "http://org.apache.axis2/xsd";
+    public static String SCHEMA_NAMESPASE_PRFIX = "ns1";
+    public static String TARGET_NAMESPACE_PREFIX = "tns";
+
+    public SchemaGenerator(ClassLoader loader, String className,
+                           String scheamtargetNamespace,
+                           String scheamtargetNamespacePrefix) {
+        this.classLoader = loader;
+        this.className = className;
+        TARGET_NAMESPACE = "http://" + className;
+        if (scheamtargetNamespace != null && !scheamtargetNamespace.trim().equals("")) {
+            SCHEMA_TARGET_NAMESPASE = scheamtargetNamespace;
+        }
+        if (scheamtargetNamespacePrefix != null && !scheamtargetNamespacePrefix.trim().equals("")) {
+            SCHEMA_NAMESPASE_PRFIX = scheamtargetNamespacePrefix;
+        }
+
+        prefixmap = new Hashtable();
+        prefixmap.put(SCHEMA_NAMESPASE_PRFIX, SCHEMA_TARGET_NAMESPASE);
+
+        schemaCollection = new XmlSchemaCollection();
+
+        schema = new XmlSchema(SCHEMA_TARGET_NAMESPASE, schemaCollection);
+        schema.setElementFormDefault(new XmlSchemaForm(XmlSchemaForm.QUALIFIED));
+        schema.setPrefixToNamespaceMap(prefixmap);
+        this.typeTable = new TypeTable();
+
+        try {
+            Class clazz = Class.forName(className, true, loader);
+            methodTable = new MethodTable(clazz);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * To generate schema for all the parameters in method , first generate schema for all different
+     * parameter type and later refer to them
+     *
+     * @return
+     * @throws Exception
+     */
+    public XmlSchema generateSchema() throws Exception {
+
+        JamServiceFactory factory = JamServiceFactory.getInstance();
+        JamServiceParams jam_service_parms = factory.createServiceParams();
+        //setting the classLoder
+//        jam_service_parms.setParentClassLoader(factory.createJamClassLoader(classLoader));
+        //it can posible to add the classLoader as well
+        jam_service_parms.addClassLoader(classLoader);
+        jam_service_parms.includeClass(className);
+        JamService service = factory.createService(jam_service_parms);
+
+        JamClassIterator jClassIter = service.getClasses();
+        //all most all the time the ittr will have only one class in it
+        while (jClassIter.hasNext()) {
+            JClass jclass = (JClass) jClassIter.next();
+            // serviceName = jclass.getSimpleName();
+            //todo in the future , when we support annotation we can use this
+            //JAnnotation[] annotations = jclass.getAnnotations();
+
+            /**
+             * Schema genertaion done in two stage
+             *  1. Load all the methods and create type for methods parameters (if the parameters are
+             *     Bean then it will create Complex types for those , and if the parameters are simple
+             *     type which decribe in SimpleTypeTable nothing will happen)
+             *  2. In the next stage for all the methods messages and port types will be
+             *     creteated
+             */
+            methods = jclass.getDeclaredMethods();
+
+            for (int i = 0; i < methods.length; i++) {
+                JMethod jMethod = methods[i];
+
+                //it can easily get the annotations
+//                jMethod.getAnnotations();
+                JParameter [] paras = jMethod.getParameters();
+                for (int j = 0; j < paras.length; j++) {
+                    JParameter methodParameter = paras[j];
+                    JClass paraType = methodParameter.getType();
+                    String classTypeName = paraType.getQualifiedName();
+                    if (paraType.isArrayType()) {
+                        classTypeName = paraType.getArrayComponentType().getQualifiedName();
+                        if (!typeTable.isSimpleType(classTypeName)) {
+                            generateSchema(paraType.getArrayComponentType());
+                        }
+                    } else {
+                        if (!typeTable.isSimpleType(classTypeName)) {
+                            generateSchema(methodParameter.getType());
+                        }
+                    }
+                    /**
+                     * 1. have to check whethet its a simple type
+                     * 2. then to check whther its a simple type array
+                     * 3. OM elemney
+                     * 4. Bean
+                     */
+
+                }
+                // for its return type
+                JClass retuenType = jMethod.getReturnType();
+                if (!retuenType.isVoidType()) {
+                    if (retuenType.isArrayType()) {
+                        String returnTypeName = retuenType.getArrayComponentType().getQualifiedName();
+                        if (!typeTable.isSimpleType(returnTypeName)) {
+                            generateSchema(retuenType.getArrayComponentType());
+                        }
+                    } else {
+                        if (!typeTable.isSimpleType(retuenType.getQualifiedName())) {
+                            generateSchema(retuenType);
+                        }
+                    }
+                }
+
+            }
+            generateWrapperElements(methods);
+        }
+        return schema;
+    }
+
+    /**
+     * To generate wrapper element , if a method take more than one parameter
+     * if the method look like foo(Type1 para1, Type2 para2){}
+     * will creat e Wrapper element like
+     * <element name="fooInParameter type="tns:fooInParameterElement"">
+     * <complexType name="fooInParameterElement">
+     * <sequnce>
+     * <element name="para1" type="tns:Type1">
+     * <element name="para2" type="tns:Type2">
+     * </sequnce>
+     * </complexType>
+     * </element>
+     */
+    private void generateWrapperElements(JMethod methods[]) {
+        for (int i = 0; i < methods.length; i++) {
+            JMethod method = methods[i];
+            genereteWrapperElementforMethod(method);
+        }
+    }
+
+    private void genereteWrapperElementforMethod(JMethod method) {
+        String methodName = method.getSimpleName();
+        XmlSchemaComplexType complexType = new XmlSchemaComplexType(schema);
+        XmlSchemaSequence sequence = new XmlSchemaSequence();
+
+        XmlSchemaElement eltOuter = new XmlSchemaElement();
+        eltOuter.setName(methodName + METHOD_REQUEST_WRAPPER);
+//        String complexTypeName = methodName + METHOD_REQUEST_WRAPPER;
+//        complexType.setName(complexTypeName);
+        schema.getItems().add(eltOuter);
+//        schema.getItems().add(complexType);
+//        eltOuter.setSchemaTypeName(complexType.getQName());
+        eltOuter.setSchemaType(complexType);
+        // adding this type to the table
+        QName elementName = new QName(SchemaGenerator.SCHEMA_TARGET_NAMESPASE,
+                eltOuter.getName(), SCHEMA_NAMESPASE_PRFIX);
+        typeTable.addComplexScheam(methodName + METHOD_REQUEST_WRAPPER, elementName);
+
+        JParameter [] paras = method.getParameters();
+        if (paras.length > 0) {
+            complexType.setParticle(sequence);
+        }
+        String parameterNames [] = methodTable.getParameterNames(methodName);
+        for (int j = 0; j < paras.length; j++) {
+            JParameter methodParameter = paras[j];
+            String paraName = methodParameter.getSimpleName();
+            String classTypeName = methodParameter.getType().getQualifiedName();
+            boolean isArryType = methodParameter.getType().isArrayType();
+            if (isArryType) {
+                classTypeName = methodParameter.getType().getArrayComponentType().getQualifiedName();
+            }
+
+            if (parameterNames != null) {
+                paraName = parameterNames[j];
+            }
+
+            if (typeTable.isSimpleType(classTypeName)) {
+                XmlSchemaElement elt1 = new XmlSchemaElement();
+                elt1.setName(paraName);
+                elt1.setSchemaTypeName(typeTable.getSimpleSchemaTypeName(classTypeName));
+                sequence.getItems().add(elt1);
+                if (isArryType) {
+                    elt1.setMaxOccurs(Long.MAX_VALUE);
+                }
+            } else {
+                XmlSchemaElement elt1 = new XmlSchemaElement();
+                elt1.setName(paraName);
+                elt1.setSchemaTypeName(typeTable.getComplexScheamType(classTypeName));
+                sequence.getItems().add(elt1);
+                if (isArryType) {
+                    elt1.setMaxOccurs(Long.MAX_VALUE);
+                }
+            }
+        }
+
+        //generating wrapper element for retuen element
+        JClass methodReturnType = method.getReturnType();
+        generateWrapperforReturnType(methodReturnType, methodName);
+
+    }
+
+    private void generateWrapperforReturnType(JClass retuenType, String methodName) {
+        if (!retuenType.isVoidType()) {
+            XmlSchemaComplexType retuen_com_type = new XmlSchemaComplexType(schema);
+            XmlSchemaElement ret_eltOuter = new XmlSchemaElement();
+            ret_eltOuter.setName(methodName + METHOD_RESPONSE_WRAPPER);
+            schema.getItems().add(ret_eltOuter);
+            ret_eltOuter.setSchemaType(retuen_com_type);
+            QName ret_comTypeName = new QName(SchemaGenerator.SCHEMA_TARGET_NAMESPASE,
+                    ret_eltOuter.getName(), SCHEMA_NAMESPASE_PRFIX);
+            typeTable.addComplexScheam(methodName + METHOD_RESPONSE_WRAPPER, ret_comTypeName);
+            String classTypeName = retuenType.getQualifiedName();
+            boolean isArryType = retuenType.isArrayType();
+            XmlSchemaSequence sequence = new XmlSchemaSequence();
+            retuen_com_type.setParticle(sequence);
+            if (isArryType) {
+                classTypeName = retuenType.getArrayComponentType().getQualifiedName();
+            }
+            if (typeTable.isSimpleType(classTypeName)) {
+                XmlSchemaElement elt1 = new XmlSchemaElement();
+                elt1.setName("return");
+                elt1.setSchemaTypeName(typeTable.getSimpleSchemaTypeName(classTypeName));
+                sequence.getItems().add(elt1);
+                if (isArryType) {
+                    elt1.setMaxOccurs(Long.MAX_VALUE);
+                }
+            } else {
+                XmlSchemaElement elt1 = new XmlSchemaElement();
+                elt1.setName("return");
+                elt1.setSchemaTypeName(typeTable.getComplexScheamType(classTypeName));
+                sequence.getItems().add(elt1);
+                if (isArryType) {
+                    elt1.setMaxOccurs(Long.MAX_VALUE);
+                }
+            }
+        }
+    }
+
+
+    private void generateSchema(JClass javaType) {
+        String name = javaType.getQualifiedName();
+        if (typeTable.getComplexScheamType(name) == null) {
+            String simpleName = javaType.getSimpleName();
+
+            XmlSchemaComplexType complexType = new XmlSchemaComplexType(schema);
+            XmlSchemaSequence sequence = new XmlSchemaSequence();
+
+            XmlSchemaElement eltOuter = new XmlSchemaElement();
+            QName elemntName = new QName(SCHEMA_TARGET_NAMESPASE, simpleName, SCHEMA_NAMESPASE_PRFIX);
+            eltOuter.setName(simpleName);
+            eltOuter.setQName(elemntName);
+            complexType.setParticle(sequence);
+            complexType.setName(simpleName);
+
+            schema.getItems().add(eltOuter);
+            schema.getItems().add(complexType);
+            eltOuter.setSchemaTypeName(complexType.getQName());
+//            System.out.println("QNAme: " + eltOuter.getQName().getPrefix());
+
+            // adding this type to the table
+            //  typeTable.addComplexScheam(name, complexType.getQName());
+            typeTable.addComplexScheam(name, eltOuter.getQName());
+
+            JProperty [] properties = javaType.getDeclaredProperties();
+            for (int i = 0; i < properties.length; i++) {
+                JProperty property = properties[i];
+                String propertyName = property.getType().getQualifiedName();
+                boolean isArryType = property.getType().isArrayType();
+                if (isArryType) {
+                    propertyName = property.getType().getArrayComponentType().getQualifiedName();
+                }
+                if (typeTable.isSimpleType(propertyName)) {
+                    XmlSchemaElement elt1 = new XmlSchemaElement();
+                    elt1.setName(property.getSimpleName());
+                    elt1.setSchemaTypeName(typeTable.getSimpleSchemaTypeName(propertyName));
+                    sequence.getItems().add(elt1);
+                    if (isArryType) {
+                        //todo pls check this with Ajith
+                        elt1.setMaxOccurs(Long.MAX_VALUE);
+//                        elt1.setMinOccurs(2);
+                    }
+                } else {
+                    if (isArryType) {
+                        generateSchema(property.getType().getArrayComponentType());
+                    } else {
+                        generateSchema(property.getType());
+                    }
+                    XmlSchemaElement elt1 = new XmlSchemaElement();
+                    elt1.setName(property.getSimpleName());
+                    elt1.setSchemaTypeName(typeTable.getComplexScheamType(propertyName));
+                    sequence.getItems().add(elt1);
+                    if (isArryType) {
+                        elt1.setMaxOccurs(Long.MAX_VALUE);
+                    }
+                }
+            }
+        }
+    }
+
+    public TypeTable getTypeTable() {
+        return typeTable;
+    }
+
+    public JMethod[] getMethods() {
+        return methods;
+    }
+
+}
\ No newline at end of file

Added: webservices/axis2/trunk/java/modules/wsdl/src/org/apache/axis2/wsdl/java2wsdl/bytecode/ChainedParamReader.java
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/wsdl/src/org/apache/axis2/wsdl/java2wsdl/bytecode/ChainedParamReader.java?rev=357670&view=auto
==============================================================================
--- webservices/axis2/trunk/java/modules/wsdl/src/org/apache/axis2/wsdl/java2wsdl/bytecode/ChainedParamReader.java (added)
+++ webservices/axis2/trunk/java/modules/wsdl/src/org/apache/axis2/wsdl/java2wsdl/bytecode/ChainedParamReader.java Mon Dec 19 01:19:21 2005
@@ -0,0 +1,100 @@
+package org.apache.axis2.wsdl.java2wsdl.bytecode;
+
+import java.io.IOException;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Method;
+import java.util.*;
+
+/**
+ * Description: In ParamReader class, user can not get inherited method parameter
+ * from the class they passed in. This is done because of performance. This class
+ * is intended to setup the inheritant chain. If the method could not be found in
+ * the derived class, it will try to search it from super class, if not in the
+ * immedidate super class it will search super class's super class, until it reaches
+ * the root which is java.lang.Object. This is not an eager load since it only
+ * start searching the super class when it is asked to
+ * User: pengyu
+ * Date: Sep 6, 2003
+ * Time: 11:43:24 PM
+ */
+public class ChainedParamReader {
+    private List chain = new ArrayList();
+    private List clsChain = new ArrayList();
+    private Map methodToParamMap = new HashMap();
+
+    /**
+     * Process a given class's parameter names
+     *
+     * @param cls the class which user wants to get parameter info from
+     * @throws IOException
+     */
+    public ChainedParamReader(Class cls) throws IOException {
+        ParamReader reader = new ParamReader(cls);
+        chain.add(reader);
+        clsChain.add(cls);
+    }
+
+    //now I need to create deligate methods
+
+    /**
+     * return the names of the declared parameters for the given constructor.
+     * If we cannot determine the names, return null.  The returned array will
+     * have one name per parameter.  The length of the array will be the same
+     * as the length of the Class[] array returned by Constructor.getParameterTypes().
+     *
+     * @param ctor
+     * @return array of names, one per parameter, or null
+     */
+    public String[] getParameterNames(Constructor ctor) {
+        //there is no need for the constructor chaining.
+        return ((ParamReader) chain.get(0)).getParameterNames(ctor);
+    }
+
+    /**
+     * return the names of the declared parameters for the given method.
+     * If we cannot determine the names in the current class, we will try
+     * to search its parent class until we reach java.lang.Object. If we
+     * still can not find the method we will return null. The returned array
+     * will have one name per parameter. The length of the array will be the same
+     * as the length of the Class[] array returned by Method.getParameterTypes().
+     *
+     * @param method
+     * @return String[] array of names, one per parameter, or null
+     */
+    public String[] getParameterNames(Method method) {
+        //go find the one from the cache first
+        if (methodToParamMap.containsKey(method)) {
+            return (String[]) methodToParamMap.get(method);
+        }
+
+        String[] ret = null;
+        for (Iterator it = chain.iterator(); it.hasNext();) {
+            ParamReader reader = (ParamReader) it.next();
+            ret = reader.getParameterNames(method);
+            if (ret != null) {
+                methodToParamMap.put(method, ret);
+                return ret;
+            }
+        }
+        //if we here, it means we need to create new chain.
+        Class cls = (Class) clsChain.get(chain.size() - 1);
+        while (cls.getSuperclass() != null) {
+            Class superClass = cls.getSuperclass();
+            try {
+                ParamReader _reader = new ParamReader(superClass);
+                chain.add(_reader);
+                clsChain.add(cls);
+                ret = _reader.getParameterNames(method);
+                if (ret != null) { //we found it so just return it.
+                    methodToParamMap.put(method, ret);
+                    return ret;
+                }
+            } catch (IOException e) {
+                //can not find the super class in the class path, abort here
+                return null;
+            }
+        }
+        methodToParamMap.put(method, ret);
+        return null;
+    }
+}

Added: webservices/axis2/trunk/java/modules/wsdl/src/org/apache/axis2/wsdl/java2wsdl/bytecode/ClassReader.java
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/wsdl/src/org/apache/axis2/wsdl/java2wsdl/bytecode/ClassReader.java?rev=357670&view=auto
==============================================================================
--- webservices/axis2/trunk/java/modules/wsdl/src/org/apache/axis2/wsdl/java2wsdl/bytecode/ClassReader.java (added)
+++ webservices/axis2/trunk/java/modules/wsdl/src/org/apache/axis2/wsdl/java2wsdl/bytecode/ClassReader.java Mon Dec 19 01:19:21 2005
@@ -0,0 +1,409 @@
+package org.apache.axis2.wsdl.java2wsdl.bytecode;
+
+import org.apache.axis2.i18n.Messages;
+
+import java.io.*;
+import java.lang.reflect.*;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * This is the class file reader for obtaining the parameter names
+ * for declared methods in a class.  The class must have debugging
+ * attributes for us to obtain this information. <p>
+ * <p/>
+ * This does not work for inherited methods.  To obtain parameter
+ * names for inherited methods, you must use a paramReader for the
+ * class that originally declared the method. <p>
+ * <p/>
+ * don't get tricky, it's the bare minimum.  Instances of this class
+ * are not threadsafe -- don't share them. <p>
+ *
+ * @author Edwin Smith, Macromedia
+ */
+public class ClassReader extends ByteArrayInputStream {
+    // constants values that appear in java class files,
+    // from jvm spec 2nd ed, section 4.4, pp 103
+    private final int CONSTANT_Class = 7;
+    private final int CONSTANT_Fieldref = 9;
+    private final int CONSTANT_Methodref = 10;
+    private final int CONSTANT_InterfaceMethodref = 11;
+    private final int CONSTANT_String = 8;
+    private final int CONSTANT_Integer = 3;
+    private final int CONSTANT_Float = 4;
+    private final int CONSTANT_Long = 5;
+    private final int CONSTANT_Double = 6;
+    private final int CONSTANT_NameAndType = 12;
+    private final int CONSTANT_Utf8 = 1;
+    /**
+     * the constant pool.  constant pool indices in the class file
+     * directly index into this array.  The value stored in this array
+     * is the position in the class file where that constant begins.
+     */
+    private int[] cpoolIndex;
+    private Object[] cpool;
+
+    private Map attrMethods;
+
+    /**
+     * load the bytecode for a given class, by using the class's defining
+     * classloader and assuming that for a class named P.C, the bytecodes are
+     * in a resource named /P/C.class.
+     *
+     * @param c the class of interest
+     * @return a byte array containing the bytecode
+     * @throws IOException
+     */
+    protected static byte[] getBytes(Class c) throws IOException {
+        InputStream fin = c.getResourceAsStream('/' + c.getName().replace('.', '/') + ".class");
+        if (fin == null) {
+            throw new IOException(
+                    Messages.getMessage("cantLoadByecode", c.getName()));
+        }
+        try {
+            ByteArrayOutputStream out = new ByteArrayOutputStream();
+            byte[] buf = new byte[1024];
+            int actual;
+            do {
+                actual = fin.read(buf);
+                if (actual > 0) {
+                    out.write(buf, 0, actual);
+                }
+            } while (actual > 0);
+            return out.toByteArray();
+        } finally {
+            fin.close();
+        }
+    }
+
+    static String classDescriptorToName(String desc) {
+        return desc.replace('/', '.');
+    }
+
+    protected static Map findAttributeReaders(Class c) {
+        HashMap map = new HashMap();
+        Method[] methods = c.getMethods();
+
+        for (int i = 0; i < methods.length; i++) {
+            String name = methods[i].getName();
+            if (name.startsWith("read") && methods[i].getReturnType() == void.class) {
+                map.put(name.substring(4), methods[i]);
+            }
+        }
+
+        return map;
+    }
+
+
+    protected static String getSignature(Member method, Class[] paramTypes) {
+        // compute the method descriptor
+
+        StringBuffer b = new StringBuffer((method instanceof Method) ? method.getName() : "<init>");
+        b.append('(');
+
+        for (int i = 0; i < paramTypes.length; i++) {
+            addDescriptor(b, paramTypes[i]);
+        }
+
+        b.append(')');
+        if (method instanceof Method) {
+            addDescriptor(b, ((Method) method).getReturnType());
+        } else if (method instanceof Constructor) {
+            addDescriptor(b, void.class);
+        }
+
+        return b.toString();
+    }
+
+    private static void addDescriptor(StringBuffer b, Class c) {
+        if (c.isPrimitive()) {
+            if (c == void.class)
+                b.append('V');
+            else if (c == int.class)
+                b.append('I');
+            else if (c == boolean.class)
+                b.append('Z');
+            else if (c == byte.class)
+                b.append('B');
+            else if (c == short.class)
+                b.append('S');
+            else if (c == long.class)
+                b.append('J');
+            else if (c == char.class)
+                b.append('C');
+            else if (c == float.class)
+                b.append('F');
+            else if (c == double.class) b.append('D');
+        } else if (c.isArray()) {
+            b.append('[');
+            addDescriptor(b, c.getComponentType());
+        } else {
+            b.append('L').append(c.getName().replace('.', '/')).append(';');
+        }
+    }
+
+
+    /**
+     * @return the next unsigned 16 bit value
+     */
+    protected final int readShort() {
+        return (read() << 8) | read();
+    }
+
+    /**
+     * @return the next signed 32 bit value
+     */
+    protected final int readInt() {
+        return (read() << 24) | (read() << 16) | (read() << 8) | read();
+    }
+
+    /**
+     * skip n bytes in the input stream.
+     */
+    protected void skipFully(int n) throws IOException {
+        while (n > 0) {
+            int c = (int) skip(n);
+            if (c <= 0)
+                throw new EOFException(Messages.getMessage("unexpectedEOF00"));
+            n -= c;
+        }
+    }
+
+    protected final Member resolveMethod(int index) throws IOException, ClassNotFoundException, NoSuchMethodException {
+        int oldPos = pos;
+        try {
+            Member m = (Member) cpool[index];
+            if (m == null) {
+                pos = cpoolIndex[index];
+                Class owner = resolveClass(readShort());
+                NameAndType nt = resolveNameAndType(readShort());
+                String signature = nt.name + nt.type;
+                if (nt.name.equals("<init>")) {
+                    Constructor[] ctors = owner.getConstructors();
+                    for (int i = 0; i < ctors.length; i++) {
+                        String sig = getSignature(ctors[i], ctors[i].getParameterTypes());
+                        if (sig.equals(signature)) {
+                            cpool[index] = m = ctors[i];
+                            return m;
+                        }
+                    }
+                } else {
+                    Method[] methods = owner.getDeclaredMethods();
+                    for (int i = 0; i < methods.length; i++) {
+                        String sig = getSignature(methods[i], methods[i].getParameterTypes());
+                        if (sig.equals(signature)) {
+                            cpool[index] = m = methods[i];
+                            return m;
+                        }
+                    }
+                }
+                throw new NoSuchMethodException(signature);
+            }
+            return m;
+        } finally {
+            pos = oldPos;
+        }
+
+    }
+
+    protected final Field resolveField(int i) throws IOException, ClassNotFoundException, NoSuchFieldException {
+        int oldPos = pos;
+        try {
+            Field f = (Field) cpool[i];
+            if (f == null) {
+                pos = cpoolIndex[i];
+                Class owner = resolveClass(readShort());
+                NameAndType nt = resolveNameAndType(readShort());
+                cpool[i] = f = owner.getDeclaredField(nt.name);
+            }
+            return f;
+        } finally {
+            pos = oldPos;
+        }
+    }
+
+    private static class NameAndType {
+        String name;
+        String type;
+
+        public NameAndType(String name, String type) {
+            this.name = name;
+            this.type = type;
+        }
+    }
+
+    protected final NameAndType resolveNameAndType(int i) throws IOException {
+        int oldPos = pos;
+        try {
+            NameAndType nt = (NameAndType) cpool[i];
+            if (nt == null) {
+                pos = cpoolIndex[i];
+                String name = resolveUtf8(readShort());
+                String type = resolveUtf8(readShort());
+                cpool[i] = nt = new NameAndType(name, type);
+            }
+            return nt;
+        } finally {
+            pos = oldPos;
+        }
+    }
+
+
+    protected final Class resolveClass(int i) throws IOException, ClassNotFoundException {
+        int oldPos = pos;
+        try {
+            Class c = (Class) cpool[i];
+            if (c == null) {
+                pos = cpoolIndex[i];
+                String name = resolveUtf8(readShort());
+                cpool[i] = c = Class.forName(classDescriptorToName(name));
+            }
+            return c;
+        } finally {
+            pos = oldPos;
+        }
+    }
+
+    protected final String resolveUtf8(int i) throws IOException {
+        int oldPos = pos;
+        try {
+            String s = (String) cpool[i];
+            if (s == null) {
+                pos = cpoolIndex[i];
+                int len = readShort();
+                skipFully(len);
+                cpool[i] = s = new String(buf, pos - len, len, "utf-8");
+            }
+            return s;
+        } finally {
+            pos = oldPos;
+        }
+    }
+
+    protected final void readCpool() throws IOException {
+        int count = readShort(); // cpool count
+        cpoolIndex = new int[count];
+        cpool = new Object[count];
+        for (int i = 1; i < count; i++) {
+            int c = read();
+            cpoolIndex[i] = super.pos;
+            switch (c) // constant pool tag
+            {
+                case CONSTANT_Fieldref:
+                case CONSTANT_Methodref:
+                case CONSTANT_InterfaceMethodref:
+                case CONSTANT_NameAndType:
+
+                    readShort(); // class index or (12) name index
+                    // fall through
+
+                case CONSTANT_Class:
+                case CONSTANT_String:
+
+                    readShort(); // string index or class index
+                    break;
+
+                case CONSTANT_Long:
+                case CONSTANT_Double:
+
+                    readInt(); // hi-value
+
+                    // see jvm spec section 4.4.5 - double and long cpool
+                    // entries occupy two "slots" in the cpool table.
+                    i++;
+                    // fall through
+
+                case CONSTANT_Integer:
+                case CONSTANT_Float:
+
+                    readInt(); // value
+                    break;
+
+                case CONSTANT_Utf8:
+
+                    int len = readShort();
+                    skipFully(len);
+                    break;
+
+                default:
+                    // corrupt class file
+                    throw new IllegalStateException(
+                            Messages.getMessage("unexpectedBytes00"));
+            }
+        }
+    }
+
+    protected final void skipAttributes() throws IOException {
+        int count = readShort();
+        for (int i = 0; i < count; i++) {
+            readShort(); // name index
+            skipFully(readInt());
+        }
+    }
+
+    /**
+     * read an attributes array.  the elements of a class file that
+     * can contain attributes are: fields, methods, the class itself,
+     * and some other types of attributes.
+     */
+    protected final void readAttributes() throws IOException {
+        int count = readShort();
+        for (int i = 0; i < count; i++) {
+            int nameIndex = readShort(); // name index
+            int attrLen = readInt();
+            int curPos = pos;
+
+            String attrName = resolveUtf8(nameIndex);
+
+            Method m = (Method) attrMethods.get(attrName);
+
+            if (m != null) {
+                try {
+                    m.invoke(this, new Object[]{});
+                } catch (IllegalAccessException e) {
+                    pos = curPos;
+                    skipFully(attrLen);
+                } catch (InvocationTargetException e) {
+                    try {
+                        throw e.getTargetException();
+                    } catch (Error ex) {
+                        throw ex;
+                    } catch (RuntimeException ex) {
+                        throw ex;
+                    } catch (IOException ex) {
+                        throw ex;
+                    } catch (Throwable ex) {
+                        pos = curPos;
+                        skipFully(attrLen);
+                    }
+                }
+            } else {
+                // don't care what attribute this is
+                skipFully(attrLen);
+            }
+        }
+    }
+
+    /**
+     * read a code attribute
+     *
+     * @throws IOException
+     */
+    public void readCode() throws IOException {
+        readShort(); // max stack
+        readShort(); // max locals
+        skipFully(readInt()); // code
+        skipFully(8 * readShort()); // exception table
+
+        // read the code attributes (recursive).  This is where
+        // we will find the LocalVariableTable attribute.
+        readAttributes();
+    }
+
+    protected ClassReader(byte buf[], Map attrMethods) {
+        super(buf);
+
+        this.attrMethods = attrMethods;
+    }
+}
+

Added: webservices/axis2/trunk/java/modules/wsdl/src/org/apache/axis2/wsdl/java2wsdl/bytecode/MethodTable.java
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/wsdl/src/org/apache/axis2/wsdl/java2wsdl/bytecode/MethodTable.java?rev=357670&view=auto
==============================================================================
--- webservices/axis2/trunk/java/modules/wsdl/src/org/apache/axis2/wsdl/java2wsdl/bytecode/MethodTable.java (added)
+++ webservices/axis2/trunk/java/modules/wsdl/src/org/apache/axis2/wsdl/java2wsdl/bytecode/MethodTable.java Mon Dec 19 01:19:21 2005
@@ -0,0 +1,58 @@
+package org.apache.axis2.wsdl.java2wsdl.bytecode;
+
+import java.lang.reflect.Method;
+import java.util.HashMap;
+/*
+* Copyright 2004,2005 The Apache Software Foundation.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+*      http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*
+* @author : Deepal Jayasinghe (deepal@apache.org)
+*
+*/
+
+public class MethodTable {
+
+    private HashMap nameToMethodMap;
+    private ChainedParamReader cpr;
+
+    public MethodTable(Class cls) throws Exception {
+        cpr = new ChainedParamReader(cls);
+        nameToMethodMap = new HashMap();
+        loadMethods(cls);
+    }
+
+    /**
+     * To load all the methods in the given class by Java reflection
+     *
+     * @param cls
+     * @throws Exception
+     */
+    private void loadMethods(Class cls) throws Exception {
+        Method [] methods = cls.getMethods();
+        for (int i = 0; i < methods.length; i++) {
+            Method method = methods[i];
+            nameToMethodMap.put(method.getName(), method);
+        }
+    }
+
+    public String [] getParameterNames(String methodName) {
+        Method method = (Method) nameToMethodMap.get(methodName);
+        if (method == null) {
+            return null;
+        }
+        return cpr.getParameterNames(method);
+    }
+
+
+}

Added: webservices/axis2/trunk/java/modules/wsdl/src/org/apache/axis2/wsdl/java2wsdl/bytecode/ParamNameExtractor.java
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/wsdl/src/org/apache/axis2/wsdl/java2wsdl/bytecode/ParamNameExtractor.java?rev=357670&view=auto
==============================================================================
--- webservices/axis2/trunk/java/modules/wsdl/src/org/apache/axis2/wsdl/java2wsdl/bytecode/ParamNameExtractor.java (added)
+++ webservices/axis2/trunk/java/modules/wsdl/src/org/apache/axis2/wsdl/java2wsdl/bytecode/ParamNameExtractor.java Mon Dec 19 01:19:21 2005
@@ -0,0 +1,51 @@
+package org.apache.axis2.wsdl.java2wsdl.bytecode;
+
+import org.apache.axis2.i18n.Messages;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import java.io.IOException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
+
+/**
+ * This class retieves function parameter names from bytecode built with
+ * debugging symbols.  Used as a last resort when creating WSDL.
+ *
+ * @author <a href="mailto:tomj@macromedia.com">Tom Jordahl</a>
+ */
+public class ParamNameExtractor {
+
+    protected static Log log = LogFactory.getLog(ParamNameExtractor.class.getName());
+
+    /**
+     * Retrieve a list of function parameter names from a method
+     * Returns null if unable to read parameter names (i.e. bytecode not
+     * built with debug).
+     */
+    public static String[] getParameterNamesFromDebugInfo(Method method) {
+        // Don't worry about it if there are no params.
+        int numParams = method.getParameterTypes().length;
+        if (numParams == 0)
+            return null;
+
+        // get declaring class
+        Class c = method.getDeclaringClass();
+
+        // Don't worry about it if the class is a Java dynamic proxy
+        if (Proxy.isProxyClass(c)) {
+            return null;
+        }
+
+        try {
+            // get a parameter reader
+            ParamReader pr = new ParamReader(c);
+            // get the paramter names
+            return pr.getParameterNames(method);
+        } catch (IOException e) {
+            // log it and leave
+            log.info(Messages.getMessage("error00") + ":" + e);
+            return null;
+        }
+    }
+}
\ No newline at end of file

Added: webservices/axis2/trunk/java/modules/wsdl/src/org/apache/axis2/wsdl/java2wsdl/bytecode/ParamReader.java
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/wsdl/src/org/apache/axis2/wsdl/java2wsdl/bytecode/ParamReader.java?rev=357670&view=auto
==============================================================================
--- webservices/axis2/trunk/java/modules/wsdl/src/org/apache/axis2/wsdl/java2wsdl/bytecode/ParamReader.java (added)
+++ webservices/axis2/trunk/java/modules/wsdl/src/org/apache/axis2/wsdl/java2wsdl/bytecode/ParamReader.java Mon Dec 19 01:19:21 2005
@@ -0,0 +1,208 @@
+package org.apache.axis2.wsdl.java2wsdl.bytecode;
+
+import org.apache.axis2.i18n.Messages;
+
+import java.io.IOException;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Member;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * This is the class file reader for obtaining the parameter names
+ * for declared methods in a class.  The class must have debugging
+ * attributes for us to obtain this information. <p>
+ * <p/>
+ * This does not work for inherited methods.  To obtain parameter
+ * names for inherited methods, you must use a paramReader for the
+ * class that originally declared the method. <p>
+ * <p/>
+ * don't get tricky, it's the bare minimum.  Instances of this class
+ * are not threadsafe -- don't share them. <p>
+ *
+ * @author Edwin Smith, Macromedia
+ */
+public class ParamReader
+        extends ClassReader {
+    private String methodName;
+    private Map methods = new HashMap();
+    private Class[] paramTypes;
+
+    /**
+     * process a class file, given it's class.  We'll use the defining
+     * classloader to locate the bytecode.
+     *
+     * @param c
+     * @throws java.io.IOException
+     */
+    public ParamReader(Class c) throws IOException {
+        this(getBytes(c));
+    }
+
+    /**
+     * process the given class bytes directly.
+     *
+     * @param b
+     * @throws IOException
+     */
+    public ParamReader(byte[] b) throws IOException {
+        super(b, findAttributeReaders(ParamReader.class));
+
+        // check the magic number
+        if (readInt() != 0xCAFEBABE) {
+            // not a class file!
+            throw new IOException(Messages.getMessage("badClassFile00"));
+        }
+
+        readShort(); // minor version
+        readShort(); // major version
+
+        readCpool(); // slurp in the constant pool
+
+        readShort(); // access flags
+        readShort(); // this class name
+        readShort(); // super class name
+
+        int count = readShort(); // ifaces count
+        for (int i = 0; i < count; i++) {
+            readShort(); // interface index
+        }
+
+        count = readShort(); // fields count
+        for (int i = 0; i < count; i++) {
+            readShort(); // access flags
+            readShort(); // name index
+            readShort(); // descriptor index
+            skipAttributes(); // field attributes
+        }
+
+        count = readShort(); // methods count
+        for (int i = 0; i < count; i++) {
+            readShort(); // access flags
+            int m = readShort(); // name index
+            String name = resolveUtf8(m);
+            int d = readShort(); // descriptor index
+            this.methodName = name + resolveUtf8(d);
+            readAttributes(); // method attributes
+        }
+
+    }
+
+    public void readCode() throws IOException {
+        readShort(); // max stack
+        int maxLocals = readShort(); // max locals
+
+        MethodInfo info = new MethodInfo(maxLocals);
+        if (methods != null && methodName != null) {
+            methods.put(methodName, info);
+        }
+
+        skipFully(readInt()); // code
+        skipFully(8 * readShort()); // exception table
+        // read the code attributes (recursive).  This is where
+        // we will find the LocalVariableTable attribute.
+        readAttributes();
+    }
+
+    /**
+     * return the names of the declared parameters for the given constructor.
+     * If we cannot determine the names, return null.  The returned array will
+     * have one name per parameter.  The length of the array will be the same
+     * as the length of the Class[] array returned by Constructor.getParameterTypes().
+     *
+     * @param ctor
+     * @return String[] array of names, one per parameter, or null
+     */
+    public String[] getParameterNames(Constructor ctor) {
+        paramTypes = ctor.getParameterTypes();
+        return getParameterNames(ctor, paramTypes);
+    }
+
+    /**
+     * return the names of the declared parameters for the given method.
+     * If we cannot determine the names, return null.  The returned array will
+     * have one name per parameter.  The length of the array will be the same
+     * as the length of the Class[] array returned by Method.getParameterTypes().
+     *
+     * @param method
+     * @return String[] array of names, one per parameter, or null
+     */
+    public String[] getParameterNames(Method method) {
+        paramTypes = method.getParameterTypes();
+        return getParameterNames(method, paramTypes);
+    }
+
+    protected String[] getParameterNames(Member member, Class [] paramTypes) {
+        // look up the names for this method
+        MethodInfo info = (MethodInfo) methods.get(getSignature(member, paramTypes));
+
+        // we know all the local variable names, but we only need to return
+        // the names of the parameters.
+
+        if (info != null) {
+            String[] paramNames = new String[paramTypes.length];
+            int j = Modifier.isStatic(member.getModifiers()) ? 0 : 1;
+
+            boolean found = false;  // did we find any non-null names
+            for (int i = 0; i < paramNames.length; i++) {
+                if (info.names[j] != null) {
+                    found = true;
+                    paramNames[i] = info.names[j];
+                }
+                j++;
+                if (paramTypes[i] == double.class || paramTypes[i] == long.class) {
+                    // skip a slot for 64bit params
+                    j++;
+                }
+            }
+
+            if (found) {
+                return paramNames;
+            } else {
+                return null;
+            }
+        } else {
+            return null;
+        }
+    }
+
+    private static class MethodInfo {
+        String[] names;
+        int maxLocals;
+
+        public MethodInfo(int maxLocals) {
+            this.maxLocals = maxLocals;
+            names = new String[maxLocals];
+        }
+    }
+
+    private MethodInfo getMethodInfo() {
+        MethodInfo info = null;
+        if (methods != null && methodName != null) {
+            info = (MethodInfo) methods.get(methodName);
+        }
+        return info;
+    }
+
+    /**
+     * this is invoked when a LocalVariableTable attribute is encountered.
+     *
+     * @throws IOException
+     */
+    public void readLocalVariableTable() throws IOException {
+        int len = readShort(); // table length
+        MethodInfo info = getMethodInfo();
+        for (int j = 0; j < len; j++) {
+            readShort(); // start pc
+            readShort(); // length
+            int nameIndex = readShort(); // name_index
+            readShort(); // descriptor_index
+            int index = readShort(); // local index
+            if (info != null) {
+                info.names[index] = resolveUtf8(nameIndex);
+            }
+        }
+    }
+}