/** * typecheck and then compile this rule unless either action has been tried before * * @return true if the rule successfully type checks and then compiles under this call or a * previous call or false if either operation has previously failed or fails under this call. */ private synchronized boolean ensureTypeCheckedCompiled() { if (checkFailed) { return false; } if (!checked) { // ensure we don't trigger any code inside the type check or compile // n.b. we may still allow recursive triggering while executing boolean triggerEnabled = false; String detail = ""; try { typeCheck(); compile(); checked = true; installed(); } catch (TypeWarningException te) { checkFailed = true; if (Transformer.isVerbose()) { StringWriter stringWriter = new StringWriter(); PrintWriter writer = new PrintWriter(stringWriter); writer.println( "Rule.ensureTypeCheckedCompiled : warning type checking rule " + getName()); te.printStackTrace(writer); detail = stringWriter.toString(); System.out.println(detail); } } catch (TypeException te) { checkFailed = true; StringWriter stringWriter = new StringWriter(); PrintWriter writer = new PrintWriter(stringWriter); writer.println("Rule.ensureTypeCheckedCompiled : error type checking rule " + getName()); te.printStackTrace(writer); detail = stringWriter.toString(); System.out.println(detail); } catch (CompileException ce) { checkFailed = true; StringWriter stringWriter = new StringWriter(); PrintWriter writer = new PrintWriter(stringWriter); writer.println("Rule.ensureTypeCheckedCompiled : error compiling rule " + getName()); ce.printStackTrace(writer); detail = stringWriter.toString(); System.out.println(detail); } ruleScript.recordCompile(triggerClass, loader, !checkFailed, detail); return !checkFailed; } return true; }