diff --git a/src/main/java/org/scijava/script/DefaultScriptService.java b/src/main/java/org/scijava/script/DefaultScriptService.java index 974b4e517..148b5bad4 100644 --- a/src/main/java/org/scijava/script/DefaultScriptService.java +++ b/src/main/java/org/scijava/script/DefaultScriptService.java @@ -30,6 +30,7 @@ package org.scijava.script; import java.io.File; +import java.io.StringReader; import java.math.BigDecimal; import java.math.BigInteger; import java.util.ArrayList; @@ -159,6 +160,11 @@ public ScriptInfo getScript(final File scriptFile) { return getOrCreate(scriptFile); } + @Override + public ScriptInfo getScript(final String path, final String script) { + return new ScriptInfo(getContext(), path, new StringReader(script)); + } + @Override public Future run(final File file, final boolean process, final Object... inputs) diff --git a/src/main/java/org/scijava/script/ScriptService.java b/src/main/java/org/scijava/script/ScriptService.java index b295fdadd..b9160d1d7 100644 --- a/src/main/java/org/scijava/script/ScriptService.java +++ b/src/main/java/org/scijava/script/ScriptService.java @@ -127,6 +127,18 @@ default ScriptLanguage getLanguageByName(final String name) { */ ScriptInfo getScript(File scriptFile); + /** + * Creates the {@link ScriptInfo} metadata for the provided script. + * + * @param path + * Pseudo-path to the script file. This file does not actually need + * to exist, but rather provides a name for the script with file + * extension. + * @param script + * The script contents. + */ + ScriptInfo getScript(String path, String script); + /** * Executes the script in the given file. * diff --git a/src/test/java/org/scijava/script/ScriptServiceTest.java b/src/test/java/org/scijava/script/ScriptServiceTest.java index b9c5d14da..45e087ea1 100644 --- a/src/test/java/org/scijava/script/ScriptServiceTest.java +++ b/src/test/java/org/scijava/script/ScriptServiceTest.java @@ -40,8 +40,11 @@ import javax.script.ScriptException; +import org.junit.After; +import org.junit.Before; import org.junit.Test; import org.scijava.Context; +import org.scijava.script.ScriptInfoTest.BindingSizes; import org.scijava.util.AppUtils; import org.scijava.util.ColorRGB; import org.scijava.util.ColorRGBA; @@ -53,6 +56,20 @@ */ public class ScriptServiceTest { + private Context context; + private ScriptService scriptService; + + @Before + public void setUp() { + context = new Context(ScriptService.class); + scriptService = context.service(ScriptService.class); + } + + @After + public void tearDown() { + context.dispose(); + } + /** * Tests that the "scijava.scripts.path" system property is handled correctly. */ @@ -65,9 +82,6 @@ public void testSystemProperty() { final String dir2 = root + "to" + slash + "the" + slash + "moon"; System.setProperty("scijava.scripts.path", dir1 + sep + dir2); - final Context context = new Context(ScriptService.class); - final ScriptService scriptService = context.service(ScriptService.class); - final List scriptDirs = scriptService.getScriptDirectories(); assertEquals(3, scriptDirs.size()); @@ -80,9 +94,6 @@ public void testSystemProperty() { @Test public void testBuiltInAliases() throws ScriptException { - final Context ctx = new Context(ScriptService.class); - final ScriptService ss = ctx.service(ScriptService.class); - final Class[] builtIns = { boolean.class, byte.class, char.class, double.class, float.class, int.class, long.class, short.class, Boolean.class, Byte.class, Character.class, Double.class, Float.class, @@ -91,39 +102,44 @@ public void testBuiltInAliases() throws ScriptException { String.class }; for (final Class builtIn : builtIns) { - final Class c = ss.lookupClass(builtIn.getSimpleName()); + final Class c = scriptService.lookupClass(builtIn.getSimpleName()); assertSame(builtIn, c); } - - ctx.dispose(); } @Test public void testArrayAliases() throws ScriptException { - final Context ctx = new Context(ScriptService.class); - final ScriptService ss = ctx.service(ScriptService.class); - - final Class pInt2D = ss.lookupClass("int[][]"); + final Class pInt2D = scriptService.lookupClass("int[][]"); assertSame(int[][].class, pInt2D); - final Class pInt1D = ss.lookupClass("int[]"); + final Class pInt1D = scriptService.lookupClass("int[]"); assertSame(int[].class, pInt1D); - final Class pInt = ss.lookupClass("int"); + final Class pInt = scriptService.lookupClass("int"); assertSame(int.class, pInt); - final Class oInt2D = ss.lookupClass("Integer[][]"); + final Class oInt2D = scriptService.lookupClass("Integer[][]"); assertSame(Integer[][].class, oInt2D); - final Class oInt1D = ss.lookupClass("Integer[]"); + final Class oInt1D = scriptService.lookupClass("Integer[]"); assertSame(Integer[].class, oInt1D); - final Class oInt = ss.lookupClass("Integer"); + final Class oInt = scriptService.lookupClass("Integer"); assertSame(Integer.class, oInt); - final Class str2D = ss.lookupClass("String[][]"); + final Class str2D = scriptService.lookupClass("String[][]"); assertSame(String[][].class, str2D); - final Class str1D = ss.lookupClass("String[]"); + final Class str1D = scriptService.lookupClass("String[]"); assertSame(String[].class, str1D); - final Class str = ss.lookupClass("String"); + final Class str = scriptService.lookupClass("String"); assertSame(String.class, str); + } - ctx.dispose(); + @Test + public void testGetScript() { + String script = "#@ String name\n" + + "#@output String greeting\n" + + "greeting = \"Hello, \" + name + \"!\""; + // see ScriptInfoTest for the .bsizes ScriptLanguage used here + ScriptInfo scriptInfo = scriptService.getScript(".bsizes", script); + assertEquals(BindingSizes.class, scriptInfo.getLanguage().getClass()); + assertEquals("name", scriptInfo.inputs().iterator().next().getName()); + assertEquals("greeting", scriptInfo.outputs().iterator().next().getName()); } }