00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 package org.objectweb.proactive.core.exceptions.manager;
00032
00033 import javassist.ClassPool;
00034 import javassist.CtClass;
00035 import javassist.CtMethod;
00036 import javassist.CtNewConstructor;
00037 import javassist.CtNewMethod;
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048 interface Thrower {
00049 public void throwException(Throwable t);
00050 }
00051
00052
00053 public class ExceptionThrower {
00054 private static final String THROWER_CLASS_NAME = "TheActualExceptionThrower";
00055 private static final String THROWER_CLASS_PACKAGE = ExceptionThrower.class.getPackage()
00056 .getName();
00057 private static final String THROWER_CLASS_FULLNAME = THROWER_CLASS_PACKAGE +
00058 "." + THROWER_CLASS_NAME;
00059 private static Thrower thrower = null;
00060
00061 private static Class loadClassJavassist() {
00062 try {
00063 CtClass throwerClass = ClassPool.getDefault().makeClass(THROWER_CLASS_FULLNAME);
00064 throwerClass.addInterface(ClassPool.getDefault().get(Thrower.class.getName()));
00065 throwerClass.addConstructor(CtNewConstructor.defaultConstructor(throwerClass));
00066 CtMethod throwException = CtNewMethod.make("" +
00067 "public void throwException(Throwable t) {" +
00068 " throw t;}", throwerClass);
00069 throwerClass.addMethod(throwException);
00070 return loadClass(THROWER_CLASS_FULLNAME, throwerClass.toBytecode());
00071 } catch (Exception e) {
00072 e.printStackTrace();
00073 }
00074 return null;
00075 }
00076
00077
00078 private static Class loadClass(String className, byte[] b)
00079 throws Exception {
00080 Class clazz = null;
00081 ClassLoader loader = ClassLoader.getSystemClassLoader();
00082 Class cls = Class.forName("java.lang.ClassLoader");
00083 java.lang.reflect.Method method = cls.getDeclaredMethod("defineClass",
00084 new Class[] { String.class, byte[].class, int.class, int.class });
00085
00086
00087 method.setAccessible(true);
00088 try {
00089 Object[] args = new Object[] {
00090 className, b, new Integer(0), new Integer(b.length)
00091 };
00092 clazz = (Class) method.invoke(loader, args);
00093 } finally {
00094 method.setAccessible(false);
00095 }
00096 return clazz;
00097 }
00098
00099
00100 private static void activate() {
00101 try {
00102 Class clazz = loadClassJavassist();
00103 thrower = (Thrower) clazz.newInstance();
00104 } catch (Exception e) {
00105 e.printStackTrace();
00106 }
00107 }
00108
00109 public synchronized static void throwException(Throwable t) {
00110 if (thrower == null) {
00111 activate();
00112 }
00113
00114 if (thrower != null) {
00115 thrower.throwException(t);
00116 }
00117 }
00118 }