From ded7ddadf3ddcb6b1d6233b43b03ee0121d413f6 Mon Sep 17 00:00:00 2001 From: erilong Date: Wed, 5 Nov 2014 14:28:41 +0000 Subject: [PATCH] 0002047: Add extension service that can read extensions from database --- .../service/impl/ExtensionService.java | 25 +++++++++++++------ .../jumpmind/util/SimpleClassCompiler.java | 3 +++ .../util/SimpleClassCompilerException.java | 4 +++ 3 files changed, 25 insertions(+), 7 deletions(-) diff --git a/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/ExtensionService.java b/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/ExtensionService.java index 8492541f96..1f055e2128 100644 --- a/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/ExtensionService.java +++ b/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/ExtensionService.java @@ -43,6 +43,9 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import bsh.EvalError; +import bsh.Interpreter; + /** * This service registers {@link IExtensionPoint}s defined both by SymmetricDS * and others found in the {@link ApplicationContext}. @@ -93,16 +96,21 @@ public void refresh() { if (extension.getExtensionType().equalsIgnoreCase(Extension.EXTENSION_TYPE_JAVA)) { try { Object ext = SimpleClassCompiler.getInstance().getCompiledClass(extension.getExtensionText()); - if (ext instanceof IExtensionPoint) { - registerExtension(extension.getExtensionId(), (IExtensionPoint) ext); - } else { - log.error("Missing IExtensionPoint interface for extension " + extension.getExtensionId()); - } + registerExtension(extension.getExtensionId(), (IExtensionPoint) ext); } catch (Exception e) { - log.error("Error while compiling extension " + extension.getExtensionId(), e); + log.error("Error while compiling Java extension " + extension.getExtensionId(), e); } } else if (extension.getExtensionType().equalsIgnoreCase(Extension.EXTENSION_TYPE_BSH)) { - // TODO: implement BSH wrapper interface + try { + Interpreter interpreter = new Interpreter(); + interpreter.eval(extension.getExtensionText()); + Object ext = interpreter.getInterface(Class.forName(extension.getInterfaceName())); + registerExtension(extension.getExtensionId(), (IExtensionPoint) ext); + } catch (EvalError e) { + log.error("Error while parsing BSH extension " + extension.getExtensionId(), e); + } catch (ClassNotFoundException e) { + log.error("Interface class not found for BSH extension " + extension.getExtensionId(), e); + } } else { log.error("Skipping extension " + extension.getExtensionId() + ", unknown extension type " + extension.getExtensionType()); } @@ -111,6 +119,9 @@ public void refresh() { } protected boolean registerExtension(String name, IExtensionPoint ext) { + if (! (ext instanceof IExtensionPoint)) { + log.error("Missing IExtensionPoint interface for extension " + name); + } return registerExtension(name, ext, true); } diff --git a/symmetric-util/src/main/java/org/jumpmind/util/SimpleClassCompiler.java b/symmetric-util/src/main/java/org/jumpmind/util/SimpleClassCompiler.java index 7e73321560..c345f8aaff 100644 --- a/symmetric-util/src/main/java/org/jumpmind/util/SimpleClassCompiler.java +++ b/symmetric-util/src/main/java/org/jumpmind/util/SimpleClassCompiler.java @@ -96,6 +96,9 @@ public Object getCompiledClass(String javaCode) throws Exception { } JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); + if (compiler == null) { + throw new SimpleClassCompilerException("Missing Java compiler: the JDK is required for compiling classes."); + } JavaFileManager fileManager = new ClassFileManager(compiler.getStandardFileManager(null, null, null)); DiagnosticCollector diag = new DiagnosticCollector(); List javaFiles = new ArrayList(); diff --git a/symmetric-util/src/main/java/org/jumpmind/util/SimpleClassCompilerException.java b/symmetric-util/src/main/java/org/jumpmind/util/SimpleClassCompilerException.java index 9384a0e655..afe64ce046 100644 --- a/symmetric-util/src/main/java/org/jumpmind/util/SimpleClassCompilerException.java +++ b/symmetric-util/src/main/java/org/jumpmind/util/SimpleClassCompilerException.java @@ -30,6 +30,10 @@ public class SimpleClassCompilerException extends RuntimeException { private static final long serialVersionUID = 1L; List> diagnostics; + + public SimpleClassCompilerException(String message) { + super(message); + } public SimpleClassCompilerException(List> diagnostics) { this.diagnostics = diagnostics;