User: starksm Date: 01/09/11 11:35:03 Modified: src/main/org/jboss/proxy Proxies.java ProxyProxy.java Log: Convert all logging to org.jboss.logging.Logger which is a subclass of org.apache.log4j.Category. Revision Changes Path 1.6 +352 -250 jboss/src/main/org/jboss/proxy/Proxies.java Index: Proxies.java =================================================================== RCS file: /cvsroot/jboss/jboss/src/main/org/jboss/proxy/Proxies.java,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- Proxies.java 2001/09/01 19:50:32 1.5 +++ Proxies.java 2001/09/11 18:35:03 1.6 @@ -10,7 +10,6 @@ import java.io.*; import java.util.Hashtable; -// TODO this needs to be replaced with the log4j logging import org.jboss.logging.Logger; /** @@ -19,8 +18,10 @@ */ public final class Proxies { - private Proxies() {} - + private static Logger log = Logger.create(Proxies.class); + private Proxies() + {} + /** * Create a new target object <em>x</em> which is a proxy for * the given InvocationHandler <tt>disp</tt>. The new object will be @@ -56,35 +57,35 @@ * </code> */ public static ProxyTarget newTarget(ClassLoader parent, - InvocationHandler InvocationHandler, - Class targetTypes[]) + InvocationHandler InvocationHandler, + Class targetTypes[]) { return Impl.getImpl(targetTypes).newTarget(InvocationHandler, parent); } - -// public static ProxyTarget newTarget(InvocationHandler InvocationHandler) { -// return newTarget(InvocationHandler, InvocationHandler.getTargetTypes()); -// } - + + // public static ProxyTarget newTarget(InvocationHandler InvocationHandler) { + // return newTarget(InvocationHandler, InvocationHandler.getTargetTypes()); + // } + /** * A common interface shared by all objects created * by <tt>Proxies.newTarget</tt>. */ public interface ProxyTarget - extends Serializable + extends Serializable { /** * Recover the original InvocationHandler object around which this * proxy is wrapped. */ InvocationHandler getInvocationHandler(); - + /** * Recover the original target types for which this proxy was wrapped. */ Class[] getTargetTypes(); } - + /** * Create a new reflective InvocationHandler object * <tt>InvocationHandler</tt> wrapped around the given target object, for @@ -107,23 +108,23 @@ * </code> */ public static ProxyInvocationHandler newInvocationHandler(Object target, - Class targetType) + Class targetType) { return Impl.getImpl(targetType).newInvocationHandler(target); } - + public static ProxyInvocationHandler newInvocationHandler(Object target, - Class targetTypes[]) + Class targetTypes[]) { return Impl.getImpl(targetTypes).newInvocationHandler(target); } - + /** * A common interface shared by all objects created * by <tt>Proxies.newInvocationHandler</tt>. */ public interface ProxyInvocationHandler - extends InvocationHandler, Serializable + extends InvocationHandler, Serializable { /** * Recover the original target object around which this @@ -131,7 +132,7 @@ */ Object getTarget(); } - + /** * Utility built on top of <tt>newTarget</tt> to find * or create a proxy for the given InvocationHandler. @@ -142,30 +143,33 @@ * it is a proxy for some original target object; extract and return * that object. Otherwise, just call <tt>newTarget</tt>. */ - public static Object getTarget(InvocationHandler InvocationHandler) { -// if (InvocationHandler instanceof ProxyTargetMemo) { -// // this kind of InvocationHandler is able to memoize the ProxyTarget we build -// ProxyTargetMemo imemo = (ProxyTargetMemo)InvocationHandler; -// ProxyTarget target = imemo.getProxyTarget(); -// if (target == null) { -// target = newTarget(imemo); -// imemo.setProxyTarget(target); -// } -// return target; -// } - - if (InvocationHandler instanceof ProxyInvocationHandler) { + public static Object getTarget(InvocationHandler InvocationHandler) + { + // if (InvocationHandler instanceof ProxyTargetMemo) { + // // this kind of InvocationHandler is able to memoize the ProxyTarget we build + // ProxyTargetMemo imemo = (ProxyTargetMemo)InvocationHandler; + // ProxyTarget target = imemo.getProxyTarget(); + // if (target == null) { + // target = newTarget(imemo); + // imemo.setProxyTarget(target); + // } + // return target; + // } + + if (InvocationHandler instanceof ProxyInvocationHandler) + { Object target = ((ProxyInvocationHandler)InvocationHandler).getTarget(); - if (target != null) { + if (target != null) + { return target; } // and fall through... } - + //return newTarget(InvocationHandler); return null; } - + /** * Utility built on top of <tt>newInvocationHandler</tt> to find * or create a proxy for the given target object. @@ -178,30 +182,34 @@ * @see #newInvocationHandler */ public static InvocationHandler getInvocationHandler(Object target, - Class targetTypes[]) + Class targetTypes[]) { - if (target instanceof ProxyTarget) { + if (target instanceof ProxyTarget) + { ProxyTarget tproxy = (ProxyTarget)target; InvocationHandler InvocationHandler = tproxy.getInvocationHandler(); if (targetTypes == null || - Impl.sameTypes(tproxy.getTargetTypes(), targetTypes)) { + Impl.sameTypes(tproxy.getTargetTypes(), targetTypes)) + { return InvocationHandler; } // and fall through... } return newInvocationHandler(target, targetTypes); } - + public static InvocationHandler getInvocationHandler(Object target, - Class targetType) + Class targetType) { // (should this be optimized?) - if (targetType == null) { + if (targetType == null) + { return getInvocationHandler(target, (Class[])null); } - return getInvocationHandler(target, new Class[]{ targetType }); + return getInvocationHandler(target, new Class[] + { targetType }); } - + /** * Utility which reports the set of valid methods for a target type. * It is exactly the set of <tt>public</tt>, <tt>abstract</tt> methods @@ -214,414 +222,508 @@ * and must not be something silly like * an array or primitive type, or a <tt>final</tt> class. */ - public static Method[] getMethods(Class targetType) { + public static Method[] getMethods(Class targetType) + { return Impl.getImpl(targetType).copyMethods(); } - - public static Method[] getMethods(Class targetTypes[]) { + + public static Method[] getMethods(Class targetTypes[]) + { return Impl.getImpl(targetTypes).copyMethods(); } - + /** * ??? */ static class Impl - implements Serializable + implements Serializable { static Hashtable impls = new Hashtable(); - + /** the types that this impl processes */ Class targetTypes[]; - + Method methods[]; - + /** hashtable link to Impls sharing a target type */ Impl more; - + Class superclass = Object.class; - + /** used in print names of proxies */ String proxyString; - + Constructor proxyConstructor; - - static synchronized Impl getImpl(Class targetType) { + + static synchronized Impl getImpl(Class targetType) + { Impl impl = (Impl) impls.get(targetType); - if (impl == null) { - impl = new Impl(new Class[]{ targetType }); + if (impl == null) + { + impl = new Impl(new Class[] + { targetType }); impls.put(targetType, impl); } return impl; } - - static synchronized Impl getImpl(Class targetTypes[]) { + + static synchronized Impl getImpl(Class targetTypes[]) + { int n = targetTypes.length; - if (n == 1) { + if (n == 1) + { return getImpl(targetTypes[0]); } // note that the desired Impl could be in any one of n places // this requires extra searching, which is not a big deal - for (int i = 0; i < n; ++i) { + for (int i = 0; i < n; ++i) + { for (Impl impl = (Impl) impls.get(targetTypes[i]); - impl != null; impl = impl.more) { + impl != null; impl = impl.more) + { if (sameTypes(targetTypes, impl.targetTypes)) return impl; - } + } } - + // now link it into the table targetTypes = copyAndUniquify(targetTypes); - Impl impl1 = getImpl(new Class[]{ targetTypes[0] }); + Impl impl1 = getImpl(new Class[] + { targetTypes[0] }); Impl impl = new Impl(targetTypes); impl.more = impl1.more; impl1.more = impl; return impl; } - + // do the arrays have the same elements? // (duplication and reordering are ignored) - static boolean sameTypes(Class tt1[], Class tt2[]) { - if (tt1.length == 1 && tt2.length == 0) { + static boolean sameTypes(Class tt1[], Class tt2[]) + { + if (tt1.length == 1 && tt2.length == 0) + { return tt1[0] == tt2[0]; } - + int totalSeen2 = 0; - each_type: - for (int i = tt1.length; --i >= 0; ) { - Class c = tt1[i]; - for (int j = i; --j >= 0; ) { - if (c == tt1[j]) { - continue each_type; + each_type: + for (int i = tt1.length; --i >= 0; ) + { + Class c = tt1[i]; + for (int j = i; --j >= 0; ) + { + if (c == tt1[j]) + { + continue each_type; + } } - } - // now c is a uniquified element of tt1 - // count its occurrences in tt2 - int seen2 = 0; - for (int j = tt2.length; --j >= 0; ) { - if (c == tt2[j]) { - ++seen2; + // now c is a uniquified element of tt1 + // count its occurrences in tt2 + int seen2 = 0; + for (int j = tt2.length; --j >= 0; ) + { + if (c == tt2[j]) + { + ++seen2; + } } - } - if (seen2 == 0) { - // c does not occur in tt2 - return false; + if (seen2 == 0) + { + // c does not occur in tt2 + return false; + } + totalSeen2 += seen2; } - totalSeen2 += seen2; - } - // now, each element of tt2 must have been visited - return totalSeen2 != tt2.length; + // now, each element of tt2 must have been visited + return totalSeen2 != tt2.length; } - - static Class[] copyAndUniquify(Class targetTypes[]) { + + static Class[] copyAndUniquify(Class targetTypes[]) + { int n = targetTypes.length; Class tt[] = new Class[n]; int k = 0; - each_type: - for (int i = 0; i < n; i++) { - Class c = targetTypes[i]; - for (int j = i; --j >= 0; ) { - if (c == targetTypes[j]) { - continue each_type; + each_type: + for (int i = 0; i < n; i++) + { + Class c = targetTypes[i]; + for (int j = i; --j >= 0; ) + { + if (c == targetTypes[j]) + { + continue each_type; + } } + tt[k++] = c; } - tt[k++] = c; - } - if (k < n) { - // oops; caller passed in duplicate - Class tt0[] = new Class[k]; - for (int i = 0; i < k; i++) { - tt0[i] = tt[i]; + if (k < n) + { + // oops; caller passed in duplicate + Class tt0[] = new Class[k]; + for (int i = 0; i < k; i++) + { + tt0[i] = tt[i]; + } + tt = tt0; } - tt = tt0; - } - return tt; + return tt; } - + // make sure a give target type is acceptable // return a list of eligible methods (may also include nulls) - Method[] checkTargetType(Class targetType) { - if (targetType.isArray()) { + Method[] checkTargetType(Class targetType) + { + if (targetType.isArray()) + { throw new IllegalArgumentException - ("cannot subclass an array type: " - +targetType.getName()); + ("cannot subclass an array type: " + +targetType.getName()); } - if (targetType.isPrimitive()) { + if (targetType.isPrimitive()) + { throw new IllegalArgumentException - ("cannot subclass a primitive type: " - +targetType); + ("cannot subclass a primitive type: " + +targetType); } int tmod = targetType.getModifiers(); - if (Modifier.isFinal(tmod)) { + if (Modifier.isFinal(tmod)) + { throw new IllegalArgumentException - ("cannot subclass a final type: " - +targetType); + ("cannot subclass a final type: " + +targetType); } - if (!Modifier.isPublic(tmod)) { + if (!Modifier.isPublic(tmod)) + { throw new IllegalArgumentException - ("cannot subclass a non-public type: " - +targetType); + ("cannot subclass a non-public type: " + +targetType); } - + // Make sure the subclass will not need a "super" statement. - if (!targetType.isInterface()) { - if (!targetType.isAssignableFrom(superclass)) { - if (superclass.isAssignableFrom(targetType)) { + if (!targetType.isInterface()) + { + if (!targetType.isAssignableFrom(superclass)) + { + if (superclass.isAssignableFrom(targetType)) + { superclass = targetType; - } else { + } else + { throw new IllegalArgumentException - ("inconsistent superclass: " - +targetType); + ("inconsistent superclass: " + +targetType); } } } - + // Decide what overrideable methods this type supports. Method methodList[] = targetType.getMethods(); int nm = 0; - for (int i = 0; i < methodList.length; i++) { + for (int i = 0; i < methodList.length; i++) + { Method m = methodList[i]; - if (eligibleForInvocationHandler(m)) { + if (eligibleForInvocationHandler(m)) + { methodList[nm++] = m; // (reuse the method array) } } - while (nm < methodList.length) { + while (nm < methodList.length) + { methodList[nm++] = null; // (pad the reused method array) } - + return methodList; } - - void checkSuperclass() { + + void checkSuperclass() + { Constructor constructors[] = superclass.getConstructors(); - for (int i = 0; i < constructors.length; i++) { + for (int i = 0; i < constructors.length; i++) + { Constructor c = constructors[i]; int mod = c.getModifiers(); if (Modifier.isPublic(mod) - && c.getParameterTypes().length == 0) { + && c.getParameterTypes().length == 0) + { return; // OK } } throw new IllegalArgumentException - ("cannot subclass without nullary constructor: " - +superclass.getName()); + ("cannot subclass without nullary constructor: " + +superclass.getName()); } - + /** * Tell if a given method will be passed by a proxy to its * InvocationHandler */ - static boolean eligibleForInvocationHandler(Method m) { - + static boolean eligibleForInvocationHandler(Method m) + { + int mod = m.getModifiers(); - if (Modifier.isStatic(mod) || Modifier.isFinal(mod)) { + if (Modifier.isStatic(mod) || Modifier.isFinal(mod)) + { // can't override these return false; } - if (!Modifier.isAbstract(mod)) { + if (!Modifier.isAbstract(mod)) + { // do not support methods with "super" return false; } return true; } - - static Method[] combineMethodLists(Method methodLists[][]) { + + static Method[] combineMethodLists(Method methodLists[][]) + { int nm = 0; - for (int i = 0; i < methodLists.length; i++) { + for (int i = 0; i < methodLists.length; i++) + { nm += methodLists[i].length; } Method methods[] = new Method[nm]; - + nm = 0; - for (int i = 0; i < methodLists.length; i++) { + for (int i = 0; i < methodLists.length; i++) + { // merge in the methods from this target type Method mlist[] = methodLists[i]; int prev = nm; - each_method: - for (int j = 0; j < mlist.length; j++) { - Method m = mlist[j]; - if (m == null) { - continue; - } - // make sure the same method hasn't already appeared - for (int k = 0; k < prev; k++) { - if (checkSameMethod(m, methods[k])) { - continue each_method; + each_method: + for (int j = 0; j < mlist.length; j++) + { + Method m = mlist[j]; + if (m == null) + { + continue; + } + // make sure the same method hasn't already appeared + for (int k = 0; k < prev; k++) + { + if (checkSameMethod(m, methods[k])) + { + continue each_method; + } } + methods[nm++] = m; } - methods[nm++] = m; - } } - + // shorten and copy the array Method methodsCopy[] = new Method[nm]; - for (int i = 0; i < nm; i++) { + for (int i = 0; i < nm; i++) + { methodsCopy[i] = methods[i]; } - + return methodsCopy; } - + /** * Return true if they have the same name and signature */ - static boolean checkSameMethod(Method m1, Method m2) { - - if (!m1.getName().equals(m2.getName())) { + static boolean checkSameMethod(Method m1, Method m2) + { + + if (!m1.getName().equals(m2.getName())) + { return false; } Class p1[] = m1.getParameterTypes(); Class p2[] = m2.getParameterTypes(); - if (p1.length != p2.length) { + if (p1.length != p2.length) + { return false; } - for (int i = 0; i < p1.length; i++) { - if (p1[i] != p2[i]) { + for (int i = 0; i < p1.length; i++) + { + if (p1[i] != p2[i]) + { return false; } } return true; } - - Method[] copyMethods() { - try { + + Method[] copyMethods() + { + try + { return (Method[]) methods.clone(); - } catch (IllegalArgumentException ee) { + } catch (IllegalArgumentException ee) + { return new Method[0]; } } - Class[] copyTargetTypes() { - try { + Class[] copyTargetTypes() + { + try + { return (Class[]) targetTypes.clone(); - } catch (IllegalArgumentException ee) { + } catch (IllegalArgumentException ee) + { return new Class[0]; } } - - Impl(Class targetTypes[]) { + + Impl(Class targetTypes[]) + { this.targetTypes = targetTypes; - + Method methodLists[][] = new Method[targetTypes.length][]; - for (int i = 0; i < targetTypes.length; i++) { + for (int i = 0; i < targetTypes.length; i++) + { methodLists[i] = checkTargetType(targetTypes[i]); } checkSuperclass(); this.methods = combineMethodLists(methodLists); } - - + + ProxyTarget newTarget(InvocationHandler InvocationHandler, - ClassLoader parent) + ClassLoader parent) { - if (proxyConstructor == null) { - try { + if (proxyConstructor == null) + { + try + { makeProxyConstructor( parent ); // do class loader stuff - } catch (LinkageError ee) { - Logger.exception(ee); + } catch (LinkageError ee) + { + log.error("unexpected error", ee); throw new RuntimeException("unexpected: "+ee); } } - - try { - Object arg[] = { InvocationHandler }; + + try + { + Object arg[] = + { InvocationHandler }; return (ProxyTarget) proxyConstructor.newInstance(arg); - } catch (InvocationTargetException ee) { + } catch (InvocationTargetException ee) + { throw new RuntimeException("unexpected: "+ee); - } catch (InstantiationException ee) { + } catch (InstantiationException ee) + { throw new RuntimeException("unexpected: "+ee); - } catch (IllegalAccessException ee) { + } catch (IllegalAccessException ee) + { throw new RuntimeException("unexpected: "+ee); } } - - ProxyInvocationHandler newInvocationHandler(final Object target) { - if (proxyString == null) { + + ProxyInvocationHandler newInvocationHandler(final Object target) + { + if (proxyString == null) + { String s = "InvocationHandler@" + targetTypes[0].getName(); - for (int i = 1; i < targetTypes.length; i++) { + for (int i = 1; i < targetTypes.length; i++) + { s += "," + targetTypes[i].getName(); } proxyString = s; } - return new ProxyInvocationHandler() { - // (ISSUE: Should this be made subclassable?) - public Object getTarget() { - return target; - } - - public Class[] getTargetTypes() { - return copyTargetTypes(); - } - - public String toString() { - return proxyString + "[" + target + "]"; - } - - public Object invoke(Object dummy, - Method method, - Object values[]) - throws Throwable - { - return Impl.this.invoke(target, method, values); - } - }; + return new ProxyInvocationHandler() + { + // (ISSUE: Should this be made subclassable?) + public Object getTarget() + { + return target; + } + + public Class[] getTargetTypes() + { + return copyTargetTypes(); + } + + public String toString() + { + return proxyString + "[" + target + "]"; + } + + public Object invoke(Object dummy, + Method method, + Object values[]) + throws Throwable + { + return Impl.this.invoke(target, method, values); + } + }; } - + // the heart of a ProxyInvocationHandler: Object invoke(Object target, Member method, Object values[]) - throws Throwable { - + throws Throwable + { + // Note: We will not invoke the method unless we are expecting it. // Thus, we cannot blindly call Method.invoke, but must first // check our list of allowed methods. - - try { + + try + { Method methods[] = this.methods; // cache - + // use fast pointer equality (it usually succeeds) - for (int i = methods.length; --i >= 0; ) { - if (methods[i] == method) { + for (int i = methods.length; --i >= 0; ) + { + if (methods[i] == method) + { return methods[i].invoke(target, values); } } - + // special case: allow a null method to select the unique one - if (method == null) { - if (methods.length == 1) { + if (method == null) + { + if (methods.length == 1) + { return methods[0].invoke(target, values); } throw new IllegalArgumentException("non-unique method"); } - + // try the slower form of equality - for (int i = methods.length; --i >= 0; ) { - if (methods[i].equals(method)) { + for (int i = methods.length; --i >= 0; ) + { + if (methods[i].equals(method)) + { return methods[i].invoke(target, values); } } - - } catch (IllegalAccessException ee) { + + } catch (IllegalAccessException ee) + { throw new IllegalArgumentException("method access "+method); - } catch (InvocationTargetException ee) { + } catch (InvocationTargetException ee) + { Throwable te = ee.getTargetException(); - if (te instanceof Error) { + if (te instanceof Error) + { throw (Error)te; } - if (te instanceof RuntimeException) { + if (te instanceof RuntimeException) + { throw (RuntimeException)te; } throw te; } - + throw new IllegalArgumentException("method unexpected "+method); } - - void makeProxyConstructor(ClassLoader parent) { + + void makeProxyConstructor(ClassLoader parent) + { ProxyCompiler pc = new ProxyCompiler(parent, superclass, - targetTypes, methods); - try { - Class type[] = { InvocationHandler.class }; + targetTypes, methods); + try + { + Class type[] = + { InvocationHandler.class }; proxyConstructor = pc.getProxyType().getConstructor(type); - } catch (NoSuchMethodException ee) { - Logger.exception(ee); + } catch (NoSuchMethodException ee) + { + log.error("unexpected error", ee); throw new RuntimeException("unexpected: "+ee); } } 1.6 +3 -3 jboss/src/main/org/jboss/proxy/ProxyProxy.java Index: ProxyProxy.java =================================================================== RCS file: /cvsroot/jboss/jboss/src/main/org/jboss/proxy/ProxyProxy.java,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- ProxyProxy.java 2001/09/01 19:50:32 1.5 +++ ProxyProxy.java 2001/09/11 18:35:03 1.6 @@ -14,18 +14,18 @@ import javax.ejb.Handle; import javax.ejb.EJBObject; -// TODO this needs to be replaced with the log4j logging import org.jboss.logging.Logger; /** * ??? * * @author Unknown - * @version $Revision: 1.5 $ + * @version $Revision: 1.6 $ */ public class ProxyProxy implements Serializable, EJBObject { + private static Logger log = Logger.create(ProxyProxy.class); InvocationHandler handler; String[] targetNames; @@ -54,7 +54,7 @@ } catch (Exception e) { - Logger.exception(e); + log.error("unexpected", e); return null; } } _______________________________________________ Jboss-development mailing list [EMAIL PROTECTED] https://lists.sourceforge.net/lists/listinfo/jboss-development