I recently worked with my client to add an extension mechanism (in this case, a very simple plug-in system) to their intranet Java web application. It's initially meant for use by professional services staff and possibly other advanced users in the future. Our first thought was to go with JavaScript via the Java Scripting API, since that pair of technologies was already in use elsewhere in the system for simple filtering expressions (e.g., "value > 10 && value < 100"). I wrote a few examples and discovered that the code quickly became a weird hybrid of Java and JavaScript that was very hard to read. ("Is that a Java String or a JavaScript String?…") After a brief conversation with my client, we decided to instead go with Groovy for several reasons. We can keep the code around as Strings for now, but easily compile it to class files later if our needs change. Groovy's integration with Java is excellent and easy to understand. If the user knows Java, but isn't comfortable with Groovy's many cool features, he or she can write normal Java (except for inner classes) and have it interpreted/compiled as Groovy. What follows is a description of how I set it up. Please let me know what you think of this approach, especially if you can suggest a way to improve it.
Each extension is a Groovy class extending a Java abstract adapter class that provides default implementations of all but one of the methods in a Java interface (ScriptingInterface). The Java code used to load the extension gets a GroovyClassLoader using the following code:
GroovyClassLoader loader = new GroovyClassLoader(getClass().getClassLoader());
I use the following code to get the relevant class and instantiate it via its no-arg constructor, catching the (entertainingly-named) MultipleCompilationErrorsException along with several other exceptions:
String code = "<Groovy>"; Class<? extends ScriptingInterface> clazz = loader.parseClass(code); ScriptingInterface script = clazz.newInstance();
Does that sound like a reasonable way to do it? It definitely works, but I'm not sure it's the best way.
Update: Ack! For some reason, my Blogger settings changed from "New Posts Have Comments" to "New Posts Do Not Have Comments" through no action of my own! While I try to figure out how to fix it (now that this post is no longer new), you can add any comments to this post's listing on DZone.
Update2: Problem fixed. It turned out to be possible to turn on comments for a single post via the Blogger post editor.