Author: fhanik Date: Thu Apr 27 09:56:52 2006 New Revision: 397588 URL: http://svn.apache.org/viewcvs?rev=397588&view=rev Log: Independent build script for jar and documentation generation
Added: tomcat/container/tc5.5.x/modules/groupcom/test/org/apache/catalina/tribes/demos/IntrospectionUtils.java Modified: tomcat/container/tc5.5.x/modules/groupcom/build/build.xml Modified: tomcat/container/tc5.5.x/modules/groupcom/build/build.xml URL: http://svn.apache.org/viewcvs/tomcat/container/tc5.5.x/modules/groupcom/build/build.xml?rev=397588&r1=397587&r2=397588&view=diff ============================================================================== --- tomcat/container/tc5.5.x/modules/groupcom/build/build.xml (original) +++ tomcat/container/tc5.5.x/modules/groupcom/build/build.xml Thu Apr 27 09:56:52 2006 @@ -26,6 +26,9 @@ <path id="tribes.classpath"> <pathelement location="${basedir}/build/commons-logging-api.jar"/> + <!-- + <pathelement location="${basedir}/build/commons-logging.jar"/> + --> </path> @@ -42,7 +45,13 @@ </target> <target name="compile" depends="init"> - <javac debug="true" deprecation="true" destdir="${compile.path}" nowarn="true" source="1.4" target="1.4"> + <javac debug="true" + deprecation="true" + destdir="${compile.path}" + nowarn="true" + source="1.4" + target="1.4"> + <classpath refid="tribes.classpath"/> <src refid="java.sourcepath" /> </javac> <!--include all the other resources, including source code--> Added: tomcat/container/tc5.5.x/modules/groupcom/test/org/apache/catalina/tribes/demos/IntrospectionUtils.java URL: http://svn.apache.org/viewcvs/tomcat/container/tc5.5.x/modules/groupcom/test/org/apache/catalina/tribes/demos/IntrospectionUtils.java?rev=397588&view=auto ============================================================================== --- tomcat/container/tc5.5.x/modules/groupcom/test/org/apache/catalina/tribes/demos/IntrospectionUtils.java (added) +++ tomcat/container/tc5.5.x/modules/groupcom/test/org/apache/catalina/tribes/demos/IntrospectionUtils.java Thu Apr 27 09:56:52 2006 @@ -0,0 +1,1002 @@ +/* + * Copyright 1999-2004 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. + */ + +package org.apache.catalina.tribes.demos; + +import java.io.File; +import java.io.FilenameFilter; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.net.InetAddress; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.UnknownHostException; +import java.util.Hashtable; +import java.util.StringTokenizer; +import java.util.Vector; + +// Depends: JDK1.1 + +/** + * Utils for introspection and reflection + */ +public final class IntrospectionUtils { + + + private static org.apache.commons.logging.Log log= + org.apache.commons.logging.LogFactory.getLog( IntrospectionUtils.class ); + + /** + * Call execute() - any ant-like task should work + */ + public static void execute(Object proxy, String method) throws Exception { + Method executeM = null; + Class c = proxy.getClass(); + Class params[] = new Class[0]; + // params[0]=args.getClass(); + executeM = findMethod(c, method, params); + if (executeM == null) { + throw new RuntimeException("No execute in " + proxy.getClass()); + } + executeM.invoke(proxy, (Object[]) null);//new Object[] { args }); + } + + /** + * Call void setAttribute( String ,Object ) + */ + public static void setAttribute(Object proxy, String n, Object v) + throws Exception { + if (proxy instanceof AttributeHolder) { + ((AttributeHolder) proxy).setAttribute(n, v); + return; + } + + Method executeM = null; + Class c = proxy.getClass(); + Class params[] = new Class[2]; + params[0] = String.class; + params[1] = Object.class; + executeM = findMethod(c, "setAttribute", params); + if (executeM == null) { + if (log.isDebugEnabled()) + log.debug("No setAttribute in " + proxy.getClass()); + return; + } + if (false) + if (log.isDebugEnabled()) + log.debug("Setting " + n + "=" + v + " in " + proxy); + executeM.invoke(proxy, new Object[] { n, v }); + return; + } + + /** + * Call void getAttribute( String ) + */ + public static Object getAttribute(Object proxy, String n) throws Exception { + Method executeM = null; + Class c = proxy.getClass(); + Class params[] = new Class[1]; + params[0] = String.class; + executeM = findMethod(c, "getAttribute", params); + if (executeM == null) { + if (log.isDebugEnabled()) + log.debug("No getAttribute in " + proxy.getClass()); + return null; + } + return executeM.invoke(proxy, new Object[] { n }); + } + + /** + * Construct a URLClassLoader. Will compile and work in JDK1.1 too. + */ + public static ClassLoader getURLClassLoader(URL urls[], ClassLoader parent) { + try { + Class urlCL = Class.forName("java.net.URLClassLoader"); + Class paramT[] = new Class[2]; + paramT[0] = urls.getClass(); + paramT[1] = ClassLoader.class; + Method m = findMethod(urlCL, "newInstance", paramT); + if (m == null) + return null; + + ClassLoader cl = (ClassLoader) m.invoke(urlCL, new Object[] { urls, + parent }); + return cl; + } catch (ClassNotFoundException ex) { + // jdk1.1 + return null; + } catch (Exception ex) { + ex.printStackTrace(); + return null; + } + } + + public static String guessInstall(String installSysProp, + String homeSysProp, String jarName) { + return guessInstall(installSysProp, homeSysProp, jarName, null); + } + + /** + * Guess a product install/home by analyzing the class path. It works for + * product using the pattern: lib/executable.jar or if executable.jar is + * included in classpath by a shell script. ( java -jar also works ) + * + * Insures both "install" and "home" System properties are set. If either or + * both System properties are unset, "install" and "home" will be set to the + * same value. This value will be the other System property that is set, or + * the guessed value if neither is set. + */ + public static String guessInstall(String installSysProp, + String homeSysProp, String jarName, String classFile) { + String install = null; + String home = null; + + if (installSysProp != null) + install = System.getProperty(installSysProp); + + if (homeSysProp != null) + home = System.getProperty(homeSysProp); + + if (install != null) { + if (home == null) + System.getProperties().put(homeSysProp, install); + return install; + } + + // Find the directory where jarName.jar is located + + String cpath = System.getProperty("java.class.path"); + String pathSep = System.getProperty("path.separator"); + StringTokenizer st = new StringTokenizer(cpath, pathSep); + while (st.hasMoreTokens()) { + String path = st.nextToken(); + // log( "path " + path ); + if (path.endsWith(jarName)) { + home = path.substring(0, path.length() - jarName.length()); + try { + if ("".equals(home)) { + home = new File("./").getCanonicalPath(); + } else if (home.endsWith(File.separator)) { + home = home.substring(0, home.length() - 1); + } + File f = new File(home); + String parentDir = f.getParent(); + if (parentDir == null) + parentDir = home; // unix style + File f1 = new File(parentDir); + install = f1.getCanonicalPath(); + if (installSysProp != null) + System.getProperties().put(installSysProp, install); + if (home == null && homeSysProp != null) + System.getProperties().put(homeSysProp, install); + return install; + } catch (Exception ex) { + ex.printStackTrace(); + } + } else { + String fname = path + (path.endsWith("/") ? "" : "/") + + classFile; + if (new File(fname).exists()) { + try { + File f = new File(path); + String parentDir = f.getParent(); + if (parentDir == null) + parentDir = path; // unix style + File f1 = new File(parentDir); + install = f1.getCanonicalPath(); + if (installSysProp != null) + System.getProperties().put(installSysProp, install); + if (home == null && homeSysProp != null) + System.getProperties().put(homeSysProp, install); + return install; + } catch (Exception ex) { + ex.printStackTrace(); + } + } + } + } + + // if install directory can't be found, use home as the default + if (home != null) { + System.getProperties().put(installSysProp, home); + return home; + } + + return null; + } + + /** + * Debug method, display the classpath + */ + public static void displayClassPath(String msg, URL[] cp) { + if (log.isDebugEnabled()) { + log.debug(msg); + for (int i = 0; i < cp.length; i++) { + log.debug(cp[i].getFile()); + } + } + } + + public static String PATH_SEPARATOR = System.getProperty("path.separator"); + + /** + * Adds classpath entries from a vector of URL's to the "tc_path_add" System + * property. This System property lists the classpath entries common to web + * applications. This System property is currently used by Jasper when its + * JSP servlet compiles the Java file for a JSP. + */ + public static String classPathAdd(URL urls[], String cp) { + if (urls == null) + return cp; + + for (int i = 0; i < urls.length; i++) { + if (cp != null) + cp += PATH_SEPARATOR + urls[i].getFile(); + else + cp = urls[i].getFile(); + } + return cp; + } + + /** + * Find a method with the right name If found, call the method ( if param is + * int or boolean we'll convert value to the right type before) - that means + * you can have setDebug(1). + */ + public static void setProperty(Object o, String name, String value) { + if (dbg > 1) + d("setProperty(" + o.getClass() + " " + name + "=" + value + ")"); + + String setter = "set" + capitalize(name); + + try { + Method methods[] = findMethods(o.getClass()); + Method setPropertyMethod = null; + + // First, the ideal case - a setFoo( String ) method + for (int i = 0; i < methods.length; i++) { + Class paramT[] = methods[i].getParameterTypes(); + if (setter.equals(methods[i].getName()) && paramT.length == 1 + && "java.lang.String".equals(paramT[0].getName())) { + + methods[i].invoke(o, new Object[] { value }); + return; + } + } + + // Try a setFoo ( int ) or ( boolean ) + for (int i = 0; i < methods.length; i++) { + boolean ok = true; + if (setter.equals(methods[i].getName()) + && methods[i].getParameterTypes().length == 1) { + + // match - find the type and invoke it + Class paramType = methods[i].getParameterTypes()[0]; + Object params[] = new Object[1]; + + // Try a setFoo ( int ) + if ("java.lang.Integer".equals(paramType.getName()) + || "int".equals(paramType.getName())) { + try { + params[0] = new Integer(value); + } catch (NumberFormatException ex) { + ok = false; + } + // Try a setFoo ( long ) + }else if ("java.lang.Long".equals(paramType.getName()) + || "long".equals(paramType.getName())) { + try { + params[0] = new Long(value); + } catch (NumberFormatException ex) { + ok = false; + } + + // Try a setFoo ( boolean ) + } else if ("java.lang.Boolean".equals(paramType.getName()) + || "boolean".equals(paramType.getName())) { + params[0] = new Boolean(value); + + // Try a setFoo ( InetAddress ) + } else if ("java.net.InetAddress".equals(paramType + .getName())) { + try { + params[0] = InetAddress.getByName(value); + } catch (UnknownHostException exc) { + d("Unable to resolve host name:" + value); + ok = false; + } + + // Unknown type + } else { + d("Unknown type " + paramType.getName()); + } + + if (ok) { + methods[i].invoke(o, params); + return; + } + } + + // save "setProperty" for later + if ("setProperty".equals(methods[i].getName())) { + setPropertyMethod = methods[i]; + } + } + + // Ok, no setXXX found, try a setProperty("name", "value") + if (setPropertyMethod != null) { + Object params[] = new Object[2]; + params[0] = name; + params[1] = value; + setPropertyMethod.invoke(o, params); + } + + } catch (IllegalArgumentException ex2) { + log.warn("IAE " + o + " " + name + " " + value, ex2); + } catch (SecurityException ex1) { + if (dbg > 0) + d("SecurityException for " + o.getClass() + " " + name + "=" + + value + ")"); + if (dbg > 1) + ex1.printStackTrace(); + } catch (IllegalAccessException iae) { + if (dbg > 0) + d("IllegalAccessException for " + o.getClass() + " " + name + + "=" + value + ")"); + if (dbg > 1) + iae.printStackTrace(); + } catch (InvocationTargetException ie) { + if (dbg > 0) + d("InvocationTargetException for " + o.getClass() + " " + name + + "=" + value + ")"); + if (dbg > 1) + ie.printStackTrace(); + } + } + + public static Object getProperty(Object o, String name) { + String getter = "get" + capitalize(name); + String isGetter = "is" + capitalize(name); + + try { + Method methods[] = findMethods(o.getClass()); + Method getPropertyMethod = null; + + // First, the ideal case - a getFoo() method + for (int i = 0; i < methods.length; i++) { + Class paramT[] = methods[i].getParameterTypes(); + if (getter.equals(methods[i].getName()) && paramT.length == 0) { + return methods[i].invoke(o, (Object[]) null); + } + if (isGetter.equals(methods[i].getName()) && paramT.length == 0) { + return methods[i].invoke(o, (Object[]) null); + } + + if ("getProperty".equals(methods[i].getName())) { + getPropertyMethod = methods[i]; + } + } + + // Ok, no setXXX found, try a getProperty("name") + if (getPropertyMethod != null) { + Object params[] = new Object[1]; + params[0] = name; + return getPropertyMethod.invoke(o, params); + } + + } catch (IllegalArgumentException ex2) { + log.warn("IAE " + o + " " + name, ex2); + } catch (SecurityException ex1) { + if (dbg > 0) + d("SecurityException for " + o.getClass() + " " + name + ")"); + if (dbg > 1) + ex1.printStackTrace(); + } catch (IllegalAccessException iae) { + if (dbg > 0) + d("IllegalAccessException for " + o.getClass() + " " + name + + ")"); + if (dbg > 1) + iae.printStackTrace(); + } catch (InvocationTargetException ie) { + if (dbg > 0) + d("InvocationTargetException for " + o.getClass() + " " + name + + ")"); + if (dbg > 1) + ie.printStackTrace(); + } + return null; + } + + /** + */ + public static void setProperty(Object o, String name) { + String setter = "set" + capitalize(name); + try { + Method methods[] = findMethods(o.getClass()); + Method setPropertyMethod = null; + // find setFoo() method + for (int i = 0; i < methods.length; i++) { + Class paramT[] = methods[i].getParameterTypes(); + if (setter.equals(methods[i].getName()) && paramT.length == 0) { + methods[i].invoke(o, new Object[] {}); + return; + } + } + } catch (Exception ex1) { + if (dbg > 0) + d("Exception for " + o.getClass() + " " + name); + if (dbg > 1) + ex1.printStackTrace(); + } + } + + /** + * Replace ${NAME} with the property value + * + * @deprecated Use the explicit method + */ + public static String replaceProperties(String value, Object getter) { + if (getter instanceof Hashtable) + return replaceProperties(value, (Hashtable) getter, null); + + if (getter instanceof PropertySource) { + PropertySource src[] = new PropertySource[] { (PropertySource) getter }; + return replaceProperties(value, null, src); + } + return value; + } + + /** + * Replace ${NAME} with the property value + */ + public static String replaceProperties(String value, Hashtable staticProp, + PropertySource dynamicProp[]) { + StringBuffer sb = new StringBuffer(); + int prev = 0; + // assert value!=nil + int pos; + while ((pos = value.indexOf("$", prev)) >= 0) { + if (pos > 0) { + sb.append(value.substring(prev, pos)); + } + if (pos == (value.length() - 1)) { + sb.append('$'); + prev = pos + 1; + } else if (value.charAt(pos + 1) != '{') { + sb.append('$'); + prev = pos + 1; // XXX + } else { + int endName = value.indexOf('}', pos); + if (endName < 0) { + sb.append(value.substring(pos)); + prev = value.length(); + continue; + } + String n = value.substring(pos + 2, endName); + String v = null; + if (staticProp != null) { + v = (String) ((Hashtable) staticProp).get(n); + } + if (v == null && dynamicProp != null) { + for (int i = 0; i < dynamicProp.length; i++) { + v = dynamicProp[i].getProperty(n); + if (v != null) { + break; + } + } + } + if (v == null) + v = "${" + n + "}"; + + sb.append(v); + prev = endName + 1; + } + } + if (prev < value.length()) + sb.append(value.substring(prev)); + return sb.toString(); + } + + /** + * Reverse of Introspector.decapitalize + */ + public static String capitalize(String name) { + if (name == null || name.length() == 0) { + return name; + } + char chars[] = name.toCharArray(); + chars[0] = Character.toUpperCase(chars[0]); + return new String(chars); + } + + public static String unCapitalize(String name) { + if (name == null || name.length() == 0) { + return name; + } + char chars[] = name.toCharArray(); + chars[0] = Character.toLowerCase(chars[0]); + return new String(chars); + } + + // -------------------- Class path tools -------------------- + + /** + * Add all the jar files in a dir to the classpath, represented as a Vector + * of URLs. + */ + public static void addToClassPath(Vector cpV, String dir) { + try { + String cpComp[] = getFilesByExt(dir, ".jar"); + if (cpComp != null) { + int jarCount = cpComp.length; + for (int i = 0; i < jarCount; i++) { + URL url = getURL(dir, cpComp[i]); + if (url != null) + cpV.addElement(url); + } + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + public static void addToolsJar(Vector v) { + try { + // Add tools.jar in any case + File f = new File(System.getProperty("java.home") + + "/../lib/tools.jar"); + + if (!f.exists()) { + // On some systems java.home gets set to the root of jdk. + // That's a bug, but we can work around and be nice. + f = new File(System.getProperty("java.home") + "/lib/tools.jar"); + if (f.exists()) { + if (log.isDebugEnabled()) + log.debug("Detected strange java.home value " + + System.getProperty("java.home") + + ", it should point to jre"); + } + } + URL url = new URL("file", "", f.getAbsolutePath()); + + v.addElement(url); + } catch (MalformedURLException ex) { + ex.printStackTrace(); + } + } + + /** + * Return all files with a given extension in a dir + */ + public static String[] getFilesByExt(String ld, String ext) { + File dir = new File(ld); + String[] names = null; + final String lext = ext; + if (dir.isDirectory()) { + names = dir.list(new FilenameFilter() { + public boolean accept(File d, String name) { + if (name.endsWith(lext)) { + return true; + } + return false; + } + }); + } + return names; + } + + /** + * Construct a file url from a file, using a base dir + */ + public static URL getURL(String base, String file) { + try { + File baseF = new File(base); + File f = new File(baseF, file); + String path = f.getCanonicalPath(); + if (f.isDirectory()) { + path += "/"; + } + if (!f.exists()) + return null; + return new URL("file", "", path); + } catch (Exception ex) { + ex.printStackTrace(); + return null; + } + } + + /** + * Add elements from the classpath <i>cp </i> to a Vector <i>jars </i> as + * file URLs (We use Vector for JDK 1.1 compat). + * <p> + * + * @param jars The jar list + * @param cp a String classpath of directory or jar file elements + * separated by path.separator delimiters. + * @throws IOException If an I/O error occurs + * @throws MalformedURLException Doh ;) + */ + public static void addJarsFromClassPath(Vector jars, String cp) + throws IOException, MalformedURLException { + String sep = System.getProperty("path.separator"); + String token; + StringTokenizer st; + if (cp != null) { + st = new StringTokenizer(cp, sep); + while (st.hasMoreTokens()) { + File f = new File(st.nextToken()); + String path = f.getCanonicalPath(); + if (f.isDirectory()) { + path += "/"; + } + URL url = new URL("file", "", path); + if (!jars.contains(url)) { + jars.addElement(url); + } + } + } + } + + /** + * Return a URL[] that can be used to construct a class loader + */ + public static URL[] getClassPath(Vector v) { + URL[] urls = new URL[v.size()]; + for (int i = 0; i < v.size(); i++) { + urls[i] = (URL) v.elementAt(i); + } + return urls; + } + + /** + * Construct a URL classpath from files in a directory, a cpath property, + * and tools.jar. + */ + public static URL[] getClassPath(String dir, String cpath, + String cpathProp, boolean addTools) throws IOException, + MalformedURLException { + Vector jarsV = new Vector(); + if (dir != null) { + // Add dir/classes first, if it exists + URL url = getURL(dir, "classes"); + if (url != null) + jarsV.addElement(url); + addToClassPath(jarsV, dir); + } + + if (cpath != null) + addJarsFromClassPath(jarsV, cpath); + + if (cpathProp != null) { + String cpath1 = System.getProperty(cpathProp); + addJarsFromClassPath(jarsV, cpath1); + } + + if (addTools) + addToolsJar(jarsV); + + return getClassPath(jarsV); + } + + // -------------------- Mapping command line params to setters + + public static boolean processArgs(Object proxy, String args[]) + throws Exception { + String args0[] = null; + if (null != findMethod(proxy.getClass(), "getOptions1", new Class[] {})) { + args0 = (String[]) callMethod0(proxy, "getOptions1"); + } + + if (args0 == null) { + //args0=findVoidSetters(proxy.getClass()); + args0 = findBooleanSetters(proxy.getClass()); + } + Hashtable h = null; + if (null != findMethod(proxy.getClass(), "getOptionAliases", + new Class[] {})) { + h = (Hashtable) callMethod0(proxy, "getOptionAliases"); + } + return processArgs(proxy, args, args0, null, h); + } + + public static boolean processArgs(Object proxy, String args[], + String args0[], String args1[], Hashtable aliases) throws Exception { + for (int i = 0; i < args.length; i++) { + String arg = args[i]; + if (arg.startsWith("-")) + arg = arg.substring(1); + if (aliases != null && aliases.get(arg) != null) + arg = (String) aliases.get(arg); + + if (args0 != null) { + boolean set = false; + for (int j = 0; j < args0.length; j++) { + if (args0[j].equalsIgnoreCase(arg)) { + setProperty(proxy, args0[j], "true"); + set = true; + break; + } + } + if (set) + continue; + } + if (args1 != null) { + for (int j = 0; j < args1.length; j++) { + if (args1[j].equalsIgnoreCase(arg)) { + i++; + if (i >= args.length) + return false; + setProperty(proxy, arg, args[i]); + break; + } + } + } else { + // if args1 is not specified,assume all other options have param + i++; + if (i >= args.length) + return false; + setProperty(proxy, arg, args[i]); + } + + } + return true; + } + + // -------------------- other utils -------------------- + public static void clear() { + objectMethods.clear(); + } + + public static String[] findVoidSetters(Class c) { + Method m[] = findMethods(c); + if (m == null) + return null; + Vector v = new Vector(); + for (int i = 0; i < m.length; i++) { + if (m[i].getName().startsWith("set") + && m[i].getParameterTypes().length == 0) { + String arg = m[i].getName().substring(3); + v.addElement(unCapitalize(arg)); + } + } + String s[] = new String[v.size()]; + for (int i = 0; i < s.length; i++) { + s[i] = (String) v.elementAt(i); + } + return s; + } + + public static String[] findBooleanSetters(Class c) { + Method m[] = findMethods(c); + if (m == null) + return null; + Vector v = new Vector(); + for (int i = 0; i < m.length; i++) { + if (m[i].getName().startsWith("set") + && m[i].getParameterTypes().length == 1 + && "boolean".equalsIgnoreCase(m[i].getParameterTypes()[0] + .getName())) { + String arg = m[i].getName().substring(3); + v.addElement(unCapitalize(arg)); + } + } + String s[] = new String[v.size()]; + for (int i = 0; i < s.length; i++) { + s[i] = (String) v.elementAt(i); + } + return s; + } + + static Hashtable objectMethods = new Hashtable(); + + public static Method[] findMethods(Class c) { + Method methods[] = (Method[]) objectMethods.get(c); + if (methods != null) + return methods; + + methods = c.getMethods(); + objectMethods.put(c, methods); + return methods; + } + + public static Method findMethod(Class c, String name, Class params[]) { + Method methods[] = findMethods(c); + if (methods == null) + return null; + for (int i = 0; i < methods.length; i++) { + if (methods[i].getName().equals(name)) { + Class methodParams[] = methods[i].getParameterTypes(); + if (methodParams == null) + if (params == null || params.length == 0) + return methods[i]; + if (params == null) + if (methodParams == null || methodParams.length == 0) + return methods[i]; + if (params.length != methodParams.length) + continue; + boolean found = true; + for (int j = 0; j < params.length; j++) { + if (params[j] != methodParams[j]) { + found = false; + break; + } + } + if (found) + return methods[i]; + } + } + return null; + } + + /** Test if the object implements a particular + * method + */ + public static boolean hasHook(Object obj, String methodN) { + try { + Method myMethods[] = findMethods(obj.getClass()); + for (int i = 0; i < myMethods.length; i++) { + if (methodN.equals(myMethods[i].getName())) { + // check if it's overriden + Class declaring = myMethods[i].getDeclaringClass(); + Class parentOfDeclaring = declaring.getSuperclass(); + // this works only if the base class doesn't extend + // another class. + + // if the method is declared in a top level class + // like BaseInterceptor parent is Object, otherwise + // parent is BaseInterceptor or an intermediate class + if (!"java.lang.Object".equals(parentOfDeclaring.getName())) { + return true; + } + } + } + } catch (Exception ex) { + ex.printStackTrace(); + } + return false; + } + + public static void callMain(Class c, String args[]) throws Exception { + Class p[] = new Class[1]; + p[0] = args.getClass(); + Method m = c.getMethod("main", p); + m.invoke(c, new Object[] { args }); + } + + public static Object callMethod1(Object target, String methodN, + Object param1, String typeParam1, ClassLoader cl) throws Exception { + if (target == null || param1 == null) { + d("Assert: Illegal params " + target + " " + param1); + } + if (dbg > 0) + d("callMethod1 " + target.getClass().getName() + " " + + param1.getClass().getName() + " " + typeParam1); + + Class params[] = new Class[1]; + if (typeParam1 == null) + params[0] = param1.getClass(); + else + params[0] = cl.loadClass(typeParam1); + Method m = findMethod(target.getClass(), methodN, params); + if (m == null) + throw new NoSuchMethodException(target.getClass().getName() + " " + + methodN); + return m.invoke(target, new Object[] { param1 }); + } + + public static Object callMethod0(Object target, String methodN) + throws Exception { + if (target == null) { + d("Assert: Illegal params " + target); + return null; + } + if (dbg > 0) + d("callMethod0 " + target.getClass().getName() + "." + methodN); + + Class params[] = new Class[0]; + Method m = findMethod(target.getClass(), methodN, params); + if (m == null) + throw new NoSuchMethodException(target.getClass().getName() + " " + + methodN); + return m.invoke(target, emptyArray); + } + + static Object[] emptyArray = new Object[] {}; + + public static Object callMethodN(Object target, String methodN, + Object params[], Class typeParams[]) throws Exception { + Method m = null; + m = findMethod(target.getClass(), methodN, typeParams); + if (m == null) { + d("Can't find method " + methodN + " in " + target + " CLASS " + + target.getClass()); + return null; + } + Object o = m.invoke(target, params); + + if (dbg > 0) { + // debug + StringBuffer sb = new StringBuffer(); + sb.append("" + target.getClass().getName() + "." + methodN + "( "); + for (int i = 0; i < params.length; i++) { + if (i > 0) + sb.append(", "); + sb.append(params[i]); + } + sb.append(")"); + d(sb.toString()); + } + return o; + } + + public static Object convert(String object, Class paramType) { + Object result = null; + if ("java.lang.String".equals(paramType.getName())) { + result = object; + } else if ("java.lang.Integer".equals(paramType.getName()) + || "int".equals(paramType.getName())) { + try { + result = new Integer(object); + } catch (NumberFormatException ex) { + } + // Try a setFoo ( boolean ) + } else if ("java.lang.Boolean".equals(paramType.getName()) + || "boolean".equals(paramType.getName())) { + result = new Boolean(object); + + // Try a setFoo ( InetAddress ) + } else if ("java.net.InetAddress".equals(paramType + .getName())) { + try { + result = InetAddress.getByName(object); + } catch (UnknownHostException exc) { + d("Unable to resolve host name:" + object); + } + + // Unknown type + } else { + d("Unknown type " + paramType.getName()); + } + if (result == null) { + throw new IllegalArgumentException("Can't convert argument: " + object); + } + return result; + } + + // -------------------- Get property -------------------- + // This provides a layer of abstraction + + public static interface PropertySource { + + public String getProperty(String key); + + } + + public static interface AttributeHolder { + + public void setAttribute(String key, Object o); + + } + + // debug -------------------- + static final int dbg = 0; + + static void d(String s) { + if (log.isDebugEnabled()) + log.debug("IntrospectionUtils: " + s); + } +} --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]