Skip to content

Commit fc00c05

Browse files
committed
ScriptService: add getScript(String,String) signature
This makes it easier to retrieve a ScriptInfo object from a script string (without going via File). Closes #389.
1 parent afe795a commit fc00c05

File tree

3 files changed

+56
-22
lines changed

3 files changed

+56
-22
lines changed

src/main/java/org/scijava/script/DefaultScriptService.java

+6
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
package org.scijava.script;
3131

3232
import java.io.File;
33+
import java.io.StringReader;
3334
import java.math.BigDecimal;
3435
import java.math.BigInteger;
3536
import java.util.ArrayList;
@@ -159,6 +160,11 @@ public ScriptInfo getScript(final File scriptFile) {
159160
return getOrCreate(scriptFile);
160161
}
161162

163+
@Override
164+
public ScriptInfo getScript(final String path, final String script) {
165+
return new ScriptInfo(getContext(), path, new StringReader(script));
166+
}
167+
162168
@Override
163169
public Future<ScriptModule> run(final File file, final boolean process,
164170
final Object... inputs)

src/main/java/org/scijava/script/ScriptService.java

+12
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,18 @@ default ScriptLanguage getLanguageByName(final String name) {
127127
*/
128128
ScriptInfo getScript(File scriptFile);
129129

130+
/**
131+
* Creates the {@link ScriptInfo} metadata for the provided script.
132+
*
133+
* @param path
134+
* Pseudo-path to the script file. This file does not actually need
135+
* to exist, but rather provides a name for the script with file
136+
* extension.
137+
* @param script
138+
* The script contents.
139+
*/
140+
ScriptInfo getScript(String path, String script);
141+
130142
/**
131143
* Executes the script in the given file.
132144
*

src/test/java/org/scijava/script/ScriptServiceTest.java

+38-22
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,11 @@
4040

4141
import javax.script.ScriptException;
4242

43+
import org.junit.After;
44+
import org.junit.Before;
4345
import org.junit.Test;
4446
import org.scijava.Context;
47+
import org.scijava.script.ScriptInfoTest.BindingSizes;
4548
import org.scijava.util.AppUtils;
4649
import org.scijava.util.ColorRGB;
4750
import org.scijava.util.ColorRGBA;
@@ -53,6 +56,20 @@
5356
*/
5457
public class ScriptServiceTest {
5558

59+
private Context context;
60+
private ScriptService scriptService;
61+
62+
@Before
63+
public void setUp() {
64+
context = new Context(ScriptService.class);
65+
scriptService = context.service(ScriptService.class);
66+
}
67+
68+
@After
69+
public void tearDown() {
70+
context.dispose();
71+
}
72+
5673
/**
5774
* Tests that the "scijava.scripts.path" system property is handled correctly.
5875
*/
@@ -65,9 +82,6 @@ public void testSystemProperty() {
6582
final String dir2 = root + "to" + slash + "the" + slash + "moon";
6683
System.setProperty("scijava.scripts.path", dir1 + sep + dir2);
6784

68-
final Context context = new Context(ScriptService.class);
69-
final ScriptService scriptService = context.service(ScriptService.class);
70-
7185
final List<File> scriptDirs = scriptService.getScriptDirectories();
7286
assertEquals(3, scriptDirs.size());
7387

@@ -80,9 +94,6 @@ public void testSystemProperty() {
8094

8195
@Test
8296
public void testBuiltInAliases() throws ScriptException {
83-
final Context ctx = new Context(ScriptService.class);
84-
final ScriptService ss = ctx.service(ScriptService.class);
85-
8697
final Class<?>[] builtIns = { boolean.class, byte.class, char.class,
8798
double.class, float.class, int.class, long.class, short.class,
8899
Boolean.class, Byte.class, Character.class, Double.class, Float.class,
@@ -91,39 +102,44 @@ public void testBuiltInAliases() throws ScriptException {
91102
String.class };
92103

93104
for (final Class<?> builtIn : builtIns) {
94-
final Class<?> c = ss.lookupClass(builtIn.getSimpleName());
105+
final Class<?> c = scriptService.lookupClass(builtIn.getSimpleName());
95106
assertSame(builtIn, c);
96107
}
97-
98-
ctx.dispose();
99108
}
100109

101110
@Test
102111
public void testArrayAliases() throws ScriptException {
103-
final Context ctx = new Context(ScriptService.class);
104-
final ScriptService ss = ctx.service(ScriptService.class);
105-
106-
final Class<?> pInt2D = ss.lookupClass("int[][]");
112+
final Class<?> pInt2D = scriptService.lookupClass("int[][]");
107113
assertSame(int[][].class, pInt2D);
108-
final Class<?> pInt1D = ss.lookupClass("int[]");
114+
final Class<?> pInt1D = scriptService.lookupClass("int[]");
109115
assertSame(int[].class, pInt1D);
110-
final Class<?> pInt = ss.lookupClass("int");
116+
final Class<?> pInt = scriptService.lookupClass("int");
111117
assertSame(int.class, pInt);
112118

113-
final Class<?> oInt2D = ss.lookupClass("Integer[][]");
119+
final Class<?> oInt2D = scriptService.lookupClass("Integer[][]");
114120
assertSame(Integer[][].class, oInt2D);
115-
final Class<?> oInt1D = ss.lookupClass("Integer[]");
121+
final Class<?> oInt1D = scriptService.lookupClass("Integer[]");
116122
assertSame(Integer[].class, oInt1D);
117-
final Class<?> oInt = ss.lookupClass("Integer");
123+
final Class<?> oInt = scriptService.lookupClass("Integer");
118124
assertSame(Integer.class, oInt);
119125

120-
final Class<?> str2D = ss.lookupClass("String[][]");
126+
final Class<?> str2D = scriptService.lookupClass("String[][]");
121127
assertSame(String[][].class, str2D);
122-
final Class<?> str1D = ss.lookupClass("String[]");
128+
final Class<?> str1D = scriptService.lookupClass("String[]");
123129
assertSame(String[].class, str1D);
124-
final Class<?> str = ss.lookupClass("String");
130+
final Class<?> str = scriptService.lookupClass("String");
125131
assertSame(String.class, str);
132+
}
126133

127-
ctx.dispose();
134+
@Test
135+
public void testGetScript() {
136+
String script = "#@ String name\n" +
137+
"#@output String greeting\n" +
138+
"greeting = \"Hello, \" + name + \"!\"";
139+
// see ScriptInfoTest for the .bsizes ScriptLanguage used here
140+
ScriptInfo scriptInfo = scriptService.getScript(".bsizes", script);
141+
assertEquals(BindingSizes.class, scriptInfo.getLanguage().getClass());
142+
assertEquals("name", scriptInfo.inputs().iterator().next().getName());
143+
assertEquals("greeting", scriptInfo.outputs().iterator().next().getName());
128144
}
129145
}

0 commit comments

Comments
 (0)