From 38e57db3ef03bb2cb157c030eb6aecbde52544fe Mon Sep 17 00:00:00 2001 From: Reinhard Pointner Date: Wed, 5 Apr 2017 16:57:58 +0800 Subject: [PATCH] Added GroovyRenameAction and ProcessRenameAction --- source/net/filebot/cli/ArgumentBean.java | 10 ++++++ .../net/filebot/cli/GroovyRenameAction.java | 16 ++++++++++ source/net/filebot/cli/ScriptShell.java | 32 +++++++++---------- 3 files changed, 42 insertions(+), 16 deletions(-) diff --git a/source/net/filebot/cli/ArgumentBean.java b/source/net/filebot/cli/ArgumentBean.java index 8e5077bc..e25f6c73 100644 --- a/source/net/filebot/cli/ArgumentBean.java +++ b/source/net/filebot/cli/ArgumentBean.java @@ -203,6 +203,16 @@ public class ArgumentBean { } public RenameAction getRenameAction() { + // support custom executables (via absolute path) + if (action.startsWith("/")) { + return new ProcessRenameAction(action); + } + + // support custom groovy scripts (via closures) + if (action.startsWith("{")) { + return new GroovyRenameAction(action); + } + return StandardRenameAction.forName(action); } diff --git a/source/net/filebot/cli/GroovyRenameAction.java b/source/net/filebot/cli/GroovyRenameAction.java index 63229755..127aacea 100644 --- a/source/net/filebot/cli/GroovyRenameAction.java +++ b/source/net/filebot/cli/GroovyRenameAction.java @@ -2,6 +2,10 @@ package net.filebot.cli; import java.io.File; +import javax.script.ScriptException; + +import org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation; + import groovy.lang.Closure; import net.filebot.RenameAction; @@ -9,6 +13,14 @@ public class GroovyRenameAction implements RenameAction { private final Closure closure; + public GroovyRenameAction(String script) { + try { + this.closure = compile(script); + } catch (ScriptException e) { + throw new IllegalArgumentException(e); + } + } + public GroovyRenameAction(Closure closure) { this.closure = closure; } @@ -31,4 +43,8 @@ public class GroovyRenameAction implements RenameAction { return "CLOSURE"; } + public static Closure compile(String script) throws ScriptException { + return (Closure) DefaultTypeTransformation.castToType(ScriptShell.createScriptEngine().eval(script), Closure.class); + } + } diff --git a/source/net/filebot/cli/ScriptShell.java b/source/net/filebot/cli/ScriptShell.java index ac5fadc5..1ffa0486 100644 --- a/source/net/filebot/cli/ScriptShell.java +++ b/source/net/filebot/cli/ScriptShell.java @@ -19,6 +19,22 @@ import groovy.lang.GroovyClassLoader; public class ScriptShell { + public static ScriptEngine createScriptEngine() { + ResourceBundle bundle = ResourceBundle.getBundle(ScriptShell.class.getName()); + + CompilerConfiguration config = new CompilerConfiguration(); + config.setScriptBaseClass(bundle.getString("scriptBaseClass")); + + // default imports + ImportCustomizer imports = new ImportCustomizer(); + imports.addStarImports(COMMA.split(bundle.getString("starImport"))); + imports.addStaticStars(COMMA.split(bundle.getString("starStaticImport"))); + config.addCompilationCustomizers(imports); + + GroovyClassLoader classLoader = new GroovyClassLoader(Thread.currentThread().getContextClassLoader(), config); + return new GroovyScriptEngineImpl(classLoader); + } + public static final String ARGV_BINDING_NAME = "args"; public static final String SHELL_BINDING_NAME = "__shell"; public static final String SHELL_CLI_BINDING_NAME = "__cli"; @@ -43,22 +59,6 @@ public class ScriptShell { engine.getContext().setBindings(bindings, ScriptContext.GLOBAL_SCOPE); } - public ScriptEngine createScriptEngine() { - ResourceBundle bundle = ResourceBundle.getBundle(ScriptShell.class.getName()); - - CompilerConfiguration config = new CompilerConfiguration(); - config.setScriptBaseClass(bundle.getString("scriptBaseClass")); - - // default imports - ImportCustomizer imports = new ImportCustomizer(); - imports.addStarImports(COMMA.split(bundle.getString("starImport"))); - imports.addStaticStars(COMMA.split(bundle.getString("starStaticImport"))); - config.addCompilationCustomizers(imports); - - GroovyClassLoader classLoader = new GroovyClassLoader(Thread.currentThread().getContextClassLoader(), config); - return new GroovyScriptEngineImpl(classLoader); - } - public Object evaluate(String script, Bindings bindings) throws Throwable { try { return engine.eval(script, bindings);