* start updating ScriptShell extensions as well (so things are broken until finished)

This commit is contained in:
Reinhard Pointner 2014-04-15 14:31:40 +00:00
parent 8cee5b9a2a
commit 34b2dd3b34
4 changed files with 78 additions and 19 deletions

View File

@ -84,7 +84,7 @@ public class ArgumentProcessor {
} else { } else {
// execute user script // execute user script
Bindings bindings = new SimpleBindings(); Bindings bindings = new SimpleBindings();
bindings.put("args", args.getFiles(false)); bindings.put(ScriptShell.ARGV_BINDING_NAME, args.getFiles(false));
DefaultScriptProvider scriptProvider = new DefaultScriptProvider(); DefaultScriptProvider scriptProvider = new DefaultScriptProvider();
URI script = scriptProvider.getScriptLocation(args.script); URI script = scriptProvider.getScriptLocation(args.script);

View File

@ -2,7 +2,6 @@ package net.sourceforge.filebot.cli;
import groovy.lang.GroovyClassLoader; import groovy.lang.GroovyClassLoader;
import java.io.InputStreamReader;
import java.net.URI; import java.net.URI;
import java.util.Map; import java.util.Map;
import java.util.ResourceBundle; import java.util.ResourceBundle;
@ -11,9 +10,6 @@ import javax.script.Bindings;
import javax.script.ScriptContext; import javax.script.ScriptContext;
import javax.script.ScriptEngine; import javax.script.ScriptEngine;
import javax.script.ScriptException; import javax.script.ScriptException;
import javax.script.SimpleScriptContext;
import net.sourceforge.filebot.format.ExpressionFormat;
import org.codehaus.groovy.control.CompilerConfiguration; import org.codehaus.groovy.control.CompilerConfiguration;
import org.codehaus.groovy.control.customizers.ImportCustomizer; import org.codehaus.groovy.control.customizers.ImportCustomizer;
@ -22,6 +18,9 @@ import org.codehaus.groovy.runtime.StackTraceUtils;
public class ScriptShell { public class ScriptShell {
public static final String ARGV_BINDING_NAME = "args";
public static final String SHELL_BINDING_NAME = "__shell";
private final ScriptEngine engine; private final ScriptEngine engine;
private final ScriptProvider scriptProvider; private final ScriptProvider scriptProvider;
@ -34,19 +33,10 @@ public class ScriptShell {
bindings.putAll(globals); bindings.putAll(globals);
// bind API objects // bind API objects
// TODO remove bindings.put(SHELL_BINDING_NAME, this);
bindings.put("_cli", new CmdlineOperations());
bindings.put("_shell", this);
// setup script context // setup script context
ScriptContext context = new SimpleScriptContext(); engine.getContext().setBindings(bindings, ScriptContext.GLOBAL_SCOPE);
context.setBindings(bindings, ScriptContext.GLOBAL_SCOPE);
engine.setContext(context);
// import additional functions into the shell environment
// TODO remove
engine.eval(new InputStreamReader(ExpressionFormat.class.getResourceAsStream("ExpressionFormat.lib.groovy")));
engine.eval(new InputStreamReader(ScriptShell.class.getResourceAsStream("ScriptShell.lib.groovy")));
} }
public ScriptEngine createScriptEngine() { public ScriptEngine createScriptEngine() {

View File

@ -1,3 +1,3 @@
scriptBaseClass: net.sourceforge.filebot.cli.ScriptShellBaseClass scriptBaseClass: net.sourceforge.filebot.cli.ScriptShellBaseClass
starImport: net.sourceforge.filebot, net.sourceforge.filebot.hash, net.sourceforge.filebot.media, net.sourceforge.filebot.mediainfo, net.sourceforge.filebot.similarity, net.sourceforge.filebot.subtitle, net.sourceforge.filebot.torrent, net.sourceforge.filebot.web, net.sourceforge.filebot.util, groovy.io, groovy.xml, groovy.json, org.jsoup, java.nio.file, java.nio.file.attribute, java.util.regex starImport: net.sourceforge.filebot, net.sourceforge.filebot.hash, net.sourceforge.filebot.media, net.sourceforge.filebot.mediainfo, net.sourceforge.filebot.similarity, net.sourceforge.filebot.subtitle, net.sourceforge.filebot.torrent, net.sourceforge.filebot.web, net.sourceforge.filebot.util, groovy.io, groovy.xml, groovy.json, org.jsoup, java.nio.file, java.nio.file.attribute, java.util.regex
starStaticImport: net.sourceforge.filebot.WebServices, java.nio.file.Files starStaticImport: net.sourceforge.filebot.format.ExpressionFormatFunctions, net.sourceforge.filebot.WebServices, java.nio.file.Files

View File

@ -1,14 +1,23 @@
package net.sourceforge.filebot.cli; package net.sourceforge.filebot.cli;
import static java.util.Collections.*;
import static net.sourceforge.filebot.Settings.*; import static net.sourceforge.filebot.Settings.*;
import static net.sourceforge.filebot.cli.CLILogging.*; import static net.sourceforge.filebot.cli.CLILogging.*;
import groovy.lang.Closure; import groovy.lang.Closure;
import groovy.lang.MissingPropertyException;
import groovy.lang.Script; import groovy.lang.Script;
import java.io.Console; import java.io.Console;
import java.io.File;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.logging.Logger; import java.util.logging.Logger;
import javax.script.Bindings;
import javax.script.SimpleBindings;
import net.sourceforge.filebot.MediaTypes; import net.sourceforge.filebot.MediaTypes;
import net.sourceforge.filebot.format.AssociativeScriptObject; import net.sourceforge.filebot.format.AssociativeScriptObject;
@ -18,10 +27,56 @@ public abstract class ScriptShellBaseClass extends Script {
System.out.println(this); System.out.println(this);
} }
public Object _guarded(Closure<?> c) { public Object executeScript(String input, Map<String, ?> bindings, Object... args) throws Throwable {
// apply parent script defines
Bindings parameters = new SimpleBindings();
// initialize default parameter
parameters.putAll(bindings);
parameters.put(ScriptShell.ARGV_BINDING_NAME, asFileList(args));
// run given script
ScriptShell shell = (ScriptShell) getBinding().getVariable(ScriptShell.SHELL_BINDING_NAME);
return shell.runScript(input, parameters);
}
private Map<String, ?> defaultValues;
public void setDefaultValues(Map<String, ?> values) {
this.defaultValues = values;
}
public Map<String, ?> getDefaultValues() {
return defaultValues == null ? null : unmodifiableMap(defaultValues);
}
@Override
public Object getProperty(String property) {
try {
return super.getProperty(property);
} catch (MissingPropertyException e) {
// try user-defined default values
if (defaultValues != null && defaultValues.containsKey(property)) {
return defaultValues.get(property);
}
// can't use default value, rethrow exception
throw e;
}
}
public Object tryQuietly(Closure<?> c) {
try { try {
return c.call(); return c.call();
} catch (Throwable e) { } catch (Exception e) {
return null;
}
}
public Object tryLoudly(Closure<?> c) {
try {
return c.call();
} catch (Exception e) {
CLILogger.severe(String.format("%s: %s", e.getClass().getSimpleName(), e.getMessage())); CLILogger.severe(String.format("%s: %s", e.getClass().getSimpleName(), e.getMessage()));
return null; return null;
} }
@ -67,4 +122,18 @@ public abstract class ScriptShellBaseClass extends Script {
return System.console(); return System.console();
} }
public static List<File> asFileList(Object... paths) {
List<File> files = new ArrayList<File>();
for (Object it : paths) {
if (it instanceof CharSequence) {
files.add(new File(it.toString()));
} else if (it instanceof File) {
files.add((File) it);
} else if (it instanceof Path) {
files.add(((Path) it).toFile());
}
}
return files;
}
} }