public static Class getHelperAdapter(Rule rule, Class helperClass, boolean compileToBytecode) throws CompileException { Class adapterClass; // ok we have to create the adapter class // n.b. we don't bother synchronizing here -- if another rule is racing to create an adapter // in parallel we don't really care about generating two of them -- we can use whichever // one gets installed last try { String helperName = Type.getInternalName(helperClass); String compiledHelperName; // we put the helper in the if (compileToBytecode) { compiledHelperName = helperName + "_HelperAdapter_Compiled_" + nextId(); } else { compiledHelperName = helperName + "_HelperAdapter_Interpreted_" + nextId(); } byte[] classBytes = compileBytes(rule, helperClass, helperName, compiledHelperName, compileToBytecode); String externalName = compiledHelperName.replace('/', '.'); // dump the compiled class bytes if required Transformer.maybeDumpClass(externalName, classBytes); // ensure the class is loaded // think we need to load the generated helper using the class loader of the trigger class ClassLoader loader = rule.getLoader(); adapterClass = loadHelperAdapter(loader, externalName, classBytes); } catch (CompileException ce) { throw ce; } catch (Throwable th) { if (compileToBytecode) { throw new CompileException( "Compiler.createHelperAdapter : exception creating compiled helper adapter for " + helperClass.getName(), th); } else { throw new CompileException( "Compiler.createHelperAdapter : exception creating interpreted helper adapter for " + helperClass.getName(), th); } } return adapterClass; }