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 di...@apache.org on 2005/12/21 18:55:52 UTC
svn commit: r358336 - in /webservices/axis2/trunk/java: ./
modules/wsdl/src/org/apache/axis2/wsdl/java2wsdl/bytecode/
Author: dims
Date: Wed Dec 21 09:55:46 2005
New Revision: 358336
URL: http://svn.apache.org/viewcvs?rev=358336&view=rev
Log:
- fix javadocs a bit
- fix build.xml (add adb)
Modified:
webservices/axis2/trunk/java/build.xml
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/ParamNameExtractor.java
webservices/axis2/trunk/java/modules/wsdl/src/org/apache/axis2/wsdl/java2wsdl/bytecode/ParamReader.java
Modified: webservices/axis2/trunk/java/build.xml
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/build.xml?rev=358336&r1=358335&r2=358336&view=diff
==============================================================================
--- webservices/axis2/trunk/java/build.xml (original)
+++ webservices/axis2/trunk/java/build.xml Wed Dec 21 09:55:46 2005
@@ -146,6 +146,7 @@
source="1.4"
classpathref="classpath">
<include name="addressing/src/**/*.java"/>
+ <include name="adb/src/**/*.java"/>
<include name="codegen/src/**/*.java"/>
<include name="common/src/**/*.java"/>
<include name="core/src/**/*.java"/>
Modified: 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=358336&r1=358335&r2=358336&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/wsdl/src/org/apache/axis2/wsdl/java2wsdl/bytecode/ChainedParamReader.java (original)
+++ webservices/axis2/trunk/java/modules/wsdl/src/org/apache/axis2/wsdl/java2wsdl/bytecode/ChainedParamReader.java Wed Dec 21 09:55:46 2005
@@ -1,100 +1,97 @@
-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;
- }
-}
+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 cannot get inherited method parameter
+ * from the class they passed in for performance reasons This class
+ * is walks up the inheritance chain. If the method is not found in
+ * the derived class, search in super class. If not found in the immedidate super
+ * class, search super class's super class, until the root, which is java.lang.Object,
+ * is reached. This is not an eager load since it only start searching the super class
+ * when it is asked to.
+ */
+public class ChainedParamReader {
+ private List chain = new ArrayList();
+ private List clsChain = new ArrayList();
+ private Map methodToParamMap = new HashMap();
+
+ /**
+ * Processes 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
+
+ /**
+ * Returns 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 Returns 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);
+ }
+
+ /**
+ * Returns the names of the declared parameters for the given method.
+ * If cannot determine the names in the current class, search its parent
+ * class until we reach java.lang.Object. If still can not find the method,
+ * returns null. The returned array has 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[] Returns 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;
+ }
+}
Modified: 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=358336&r1=358335&r2=358336&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/wsdl/src/org/apache/axis2/wsdl/java2wsdl/bytecode/ClassReader.java (original)
+++ webservices/axis2/trunk/java/modules/wsdl/src/org/apache/axis2/wsdl/java2wsdl/bytecode/ClassReader.java Wed Dec 21 09:55:46 2005
@@ -1,409 +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;
- }
-}
-
+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;
+
+ /**
+ * Loads 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 Returns 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 Returns the next unsigned 16 bit value.
+ */
+ protected final int readShort() {
+ return (read() << 8) | read();
+ }
+
+ /**
+ * @return Returns the next signed 32 bit value.
+ */
+ protected final int readInt() {
+ return (read() << 24) | (read() << 16) | (read() << 8) | read();
+ }
+
+ /**
+ * Skips 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());
+ }
+ }
+
+ /**
+ * Reads 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);
+ }
+ }
+ }
+
+ /**
+ * Reads 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;
+ }
+}
+
Modified: 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=358336&r1=358335&r2=358336&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/wsdl/src/org/apache/axis2/wsdl/java2wsdl/bytecode/ParamNameExtractor.java (original)
+++ webservices/axis2/trunk/java/modules/wsdl/src/org/apache/axis2/wsdl/java2wsdl/bytecode/ParamNameExtractor.java Wed Dec 21 09:55:46 2005
@@ -1,51 +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
+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 retrieves 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());
+
+ /**
+ * Retrieves 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;
+ }
+ }
+}
Modified: 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=358336&r1=358335&r2=358336&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/wsdl/src/org/apache/axis2/wsdl/java2wsdl/bytecode/ParamReader.java (original)
+++ webservices/axis2/trunk/java/modules/wsdl/src/org/apache/axis2/wsdl/java2wsdl/bytecode/ParamReader.java Wed Dec 21 09:55:46 2005
@@ -1,208 +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);
- }
- }
- }
-}
+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;
+
+ /**
+ * Processes 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));
+ }
+
+ /**
+ * Processes 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();
+ }
+
+ /**
+ * Returns 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 Returns String[] array of names, one per parameter, or null
+ */
+ public String[] getParameterNames(Constructor ctor) {
+ paramTypes = ctor.getParameterTypes();
+ return getParameterNames(ctor, paramTypes);
+ }
+
+ /**
+ * Returns 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 Returns 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);
+ }
+ }
+ }
+}