Skip to content

Commit 366e000

Browse files
committed
Merge remote-tracking branch 'origin/overengineered-goodness'
The 'overengineered goodness' is the handler plugin type that will allow us to launch all kinds of classes using the Java "script" engine, even if the JavaEngine actually has no clue about those classes. Most notably, we will be able to launch ImageJ 1.x plugins by providing a handler implementation in imagej-legacy. Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> Conflicts: src/main/java/org/scijava/plugins/scripting/java/JavaEngine.java
2 parents 882d81a + 85c8c88 commit 366e000

File tree

7 files changed

+418
-21
lines changed

7 files changed

+418
-21
lines changed
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
/*
2+
* #%L
3+
* JSR-223-compliant Java scripting language plugin.
4+
* %%
5+
* Copyright (C) 2008 - 2014 Board of Regents of the University of
6+
* Wisconsin-Madison, Broad Institute of MIT and Harvard, and Max Planck
7+
* Institute of Molecular Cell Biology and Genetics.
8+
* %%
9+
* Redistribution and use in source and binary forms, with or without
10+
* modification, are permitted provided that the following conditions are met:
11+
*
12+
* 1. Redistributions of source code must retain the above copyright notice,
13+
* this list of conditions and the following disclaimer.
14+
* 2. Redistributions in binary form must reproduce the above copyright notice,
15+
* this list of conditions and the following disclaimer in the documentation
16+
* and/or other materials provided with the distribution.
17+
*
18+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19+
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20+
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21+
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
22+
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23+
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24+
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25+
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26+
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27+
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28+
* POSSIBILITY OF SUCH DAMAGE.
29+
* #L%
30+
*/
31+
32+
package org.scijava.plugins.scripting.java;
33+
34+
import org.scijava.plugin.AbstractHandlerPlugin;
35+
36+
/**
37+
* Abstract superclass of {@link JavaRunner} implementations.
38+
*
39+
* @author Curtis Rueden
40+
*/
41+
public abstract class AbstractJavaRunner extends
42+
AbstractHandlerPlugin<Class<?>> implements JavaRunner
43+
{
44+
45+
// -- Typed methods --
46+
47+
@Override
48+
@SuppressWarnings({ "rawtypes", "unchecked" })
49+
public Class<Class<?>> getType() {
50+
return (Class) Class.class;
51+
}
52+
53+
}
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
/*
2+
* #%L
3+
* JSR-223-compliant Java scripting language plugin.
4+
* %%
5+
* Copyright (C) 2008 - 2014 Board of Regents of the University of
6+
* Wisconsin-Madison, Broad Institute of MIT and Harvard, and Max Planck
7+
* Institute of Molecular Cell Biology and Genetics.
8+
* %%
9+
* Redistribution and use in source and binary forms, with or without
10+
* modification, are permitted provided that the following conditions are met:
11+
*
12+
* 1. Redistributions of source code must retain the above copyright notice,
13+
* this list of conditions and the following disclaimer.
14+
* 2. Redistributions in binary form must reproduce the above copyright notice,
15+
* this list of conditions and the following disclaimer in the documentation
16+
* and/or other materials provided with the distribution.
17+
*
18+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19+
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20+
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21+
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
22+
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23+
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24+
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25+
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26+
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27+
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28+
* POSSIBILITY OF SUCH DAMAGE.
29+
* #L%
30+
*/
31+
32+
package org.scijava.plugins.scripting.java;
33+
34+
import org.scijava.command.Command;
35+
import org.scijava.command.CommandInfo;
36+
import org.scijava.command.CommandService;
37+
import org.scijava.plugin.Parameter;
38+
import org.scijava.plugin.Plugin;
39+
import org.scijava.plugin.PluginService;
40+
41+
/**
42+
* Runs the given {@link Command} class.
43+
*
44+
* @author Curtis Rueden
45+
*/
46+
@Plugin(type = JavaRunner.class)
47+
public class CommandJavaRunner extends AbstractJavaRunner {
48+
49+
@Parameter
50+
private PluginService pluginService;
51+
52+
@Parameter
53+
private CommandService commandService;
54+
55+
// -- JavaRunner methods --
56+
57+
@Override
58+
public void run(final Class<?> c) {
59+
@SuppressWarnings("unchecked")
60+
final Class<? extends Command> commandClass = (Class<? extends Command>) c;
61+
final Plugin annotation = c.getAnnotation(Plugin.class);
62+
final CommandInfo info = new CommandInfo(commandClass, annotation);
63+
pluginService.addPlugin(info);
64+
commandService.run(info, true);
65+
}
66+
67+
// -- Typed methods --
68+
69+
@Override
70+
public boolean supports(final Class<?> c) {
71+
return Command.class.isAssignableFrom(c);
72+
}
73+
74+
}
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
/*
2+
* #%L
3+
* SciJava Common shared library for SciJava software.
4+
* %%
5+
* Copyright (C) 2009 - 2014 Board of Regents of the University of
6+
* Wisconsin-Madison, Broad Institute of MIT and Harvard, and Max Planck
7+
* Institute of Molecular Cell Biology and Genetics.
8+
* %%
9+
* Redistribution and use in source and binary forms, with or without
10+
* modification, are permitted provided that the following conditions are met:
11+
*
12+
* 1. Redistributions of source code must retain the above copyright notice,
13+
* this list of conditions and the following disclaimer.
14+
* 2. Redistributions in binary form must reproduce the above copyright notice,
15+
* this list of conditions and the following disclaimer in the documentation
16+
* and/or other materials provided with the distribution.
17+
*
18+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19+
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20+
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21+
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
22+
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23+
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24+
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25+
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26+
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27+
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28+
* POSSIBILITY OF SUCH DAMAGE.
29+
* #L%
30+
*/
31+
32+
package org.scijava.plugins.scripting.java;
33+
34+
import javax.script.ScriptException;
35+
36+
import org.scijava.log.LogService;
37+
import org.scijava.plugin.AbstractHandlerService;
38+
import org.scijava.plugin.Parameter;
39+
import org.scijava.plugin.Plugin;
40+
import org.scijava.service.Service;
41+
42+
/**
43+
* Default service for managing available {@link JavaRunner} plugins.
44+
*
45+
* @author Curtis Rueden
46+
*/
47+
@Plugin(type = Service.class)
48+
public class DefaultJavaService extends
49+
AbstractHandlerService<Class<?>, JavaRunner> implements JavaService
50+
{
51+
52+
@Parameter
53+
private LogService log;
54+
55+
// -- JavaService methods --
56+
57+
@Override
58+
public void run(final Class<?> c) throws ScriptException {
59+
for (final JavaRunner runner : getInstances()) {
60+
if (runner.supports(c)) {
61+
runner.run(c);
62+
return;
63+
}
64+
}
65+
log.error("Unknown class type: " + c.getName());
66+
}
67+
68+
// -- PTService methods --
69+
70+
@Override
71+
public Class<JavaRunner> getPluginType() {
72+
return JavaRunner.class;
73+
}
74+
75+
// -- Typed methods --
76+
77+
@Override
78+
@SuppressWarnings({ "rawtypes", "unchecked" })
79+
public Class<Class<?>> getType() {
80+
return (Class) Class.class;
81+
}
82+
83+
}

src/main/java/org/scijava/plugins/scripting/java/JavaEngine.java

Lines changed: 4 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@
4343
import java.io.Reader;
4444
import java.io.StringReader;
4545
import java.io.Writer;
46-
import java.lang.reflect.Method;
4746
import java.net.URL;
4847
import java.net.URLClassLoader;
4948
import java.util.ArrayList;
@@ -63,14 +62,11 @@
6362
import javax.xml.transform.dom.DOMSource;
6463
import javax.xml.transform.stream.StreamResult;
6564

66-
import org.scijava.command.Command;
67-
import org.scijava.command.CommandInfo;
6865
import org.scijava.command.CommandService;
6966
import org.scijava.minimaven.BuildEnvironment;
7067
import org.scijava.minimaven.Coordinate;
7168
import org.scijava.minimaven.MavenProject;
7269
import org.scijava.plugin.Parameter;
73-
import org.scijava.plugin.Plugin;
7470
import org.scijava.plugin.PluginService;
7571
import org.scijava.script.AbstractScriptEngine;
7672
import org.scijava.util.FileUtils;
@@ -100,6 +96,9 @@ public class JavaEngine extends AbstractScriptEngine {
10096
@Parameter
10197
private CommandService commandService;
10298

99+
@Parameter
100+
JavaService javaService;
101+
103102
@Override
104103
public Object eval(String script) throws ScriptException {
105104
return eval(new StringReader(script));
@@ -142,23 +141,7 @@ public Object eval(Reader reader) throws ScriptException {
142141

143142
// launch main class
144143
final Class<?> clazz = classLoader.loadClass(mainClass);
145-
if (Command.class.isAssignableFrom(clazz)) {
146-
final Plugin annotation = clazz.getAnnotation(Plugin.class);
147-
final CommandInfo info = new CommandInfo(mainClass,
148-
annotation) {
149-
150-
@Override
151-
public Class<? extends Command> loadClass() {
152-
return (Class<? extends Command>) clazz;
153-
}
154-
};
155-
pluginService.addPlugin(info);
156-
commandService.run(info, true);
157-
} else {
158-
Method main = clazz.getMethod("main",
159-
new Class[] { String[].class });
160-
main.invoke(null, new Object[] { new String[0] });
161-
}
144+
javaService.run(clazz);
162145
} finally {
163146
builder.cleanup();
164147
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
/*
2+
* #%L
3+
* JSR-223-compliant Java scripting language plugin.
4+
* %%
5+
* Copyright (C) 2008 - 2014 Board of Regents of the University of
6+
* Wisconsin-Madison, Broad Institute of MIT and Harvard, and Max Planck
7+
* Institute of Molecular Cell Biology and Genetics.
8+
* %%
9+
* Redistribution and use in source and binary forms, with or without
10+
* modification, are permitted provided that the following conditions are met:
11+
*
12+
* 1. Redistributions of source code must retain the above copyright notice,
13+
* this list of conditions and the following disclaimer.
14+
* 2. Redistributions in binary form must reproduce the above copyright notice,
15+
* this list of conditions and the following disclaimer in the documentation
16+
* and/or other materials provided with the distribution.
17+
*
18+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19+
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20+
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21+
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
22+
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23+
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24+
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25+
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26+
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27+
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28+
* POSSIBILITY OF SUCH DAMAGE.
29+
* #L%
30+
*/
31+
32+
package org.scijava.plugins.scripting.java;
33+
34+
import javax.script.ScriptException;
35+
36+
import org.scijava.plugin.HandlerPlugin;
37+
import org.scijava.plugin.Plugin;
38+
39+
/**
40+
* A plugin which extends an Java script language's execution handling. A
41+
* {@code JavaRunner} knows how to execute certain classes, beyond just Java's
42+
* usual {@code main} method.
43+
* <p>
44+
* Java runner plugins discoverable at runtime must implement this interface and
45+
* be annotated with @{@link Plugin} with attribute {@link Plugin#type()} =
46+
* {@link JavaRunner}.class. While it possible to create an console argument
47+
* plugin merely by implementing this interface, it is encouraged to instead
48+
* extend {@link AbstractJavaRunner}, for convenience.
49+
* </p>
50+
*
51+
* @author Curtis Rueden
52+
*/
53+
public interface JavaRunner extends HandlerPlugin<Class<?>> {
54+
55+
/** Executes the given class. */
56+
void run(Class<?> c) throws ScriptException;
57+
58+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
/*
2+
* #%L
3+
* SciJava Common shared library for SciJava software.
4+
* %%
5+
* Copyright (C) 2009 - 2014 Board of Regents of the University of
6+
* Wisconsin-Madison, Broad Institute of MIT and Harvard, and Max Planck
7+
* Institute of Molecular Cell Biology and Genetics.
8+
* %%
9+
* Redistribution and use in source and binary forms, with or without
10+
* modification, are permitted provided that the following conditions are met:
11+
*
12+
* 1. Redistributions of source code must retain the above copyright notice,
13+
* this list of conditions and the following disclaimer.
14+
* 2. Redistributions in binary form must reproduce the above copyright notice,
15+
* this list of conditions and the following disclaimer in the documentation
16+
* and/or other materials provided with the distribution.
17+
*
18+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19+
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20+
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21+
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
22+
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23+
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24+
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25+
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26+
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27+
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28+
* POSSIBILITY OF SUCH DAMAGE.
29+
* #L%
30+
*/
31+
32+
package org.scijava.plugins.scripting.java;
33+
34+
import javax.script.ScriptException;
35+
36+
import org.scijava.plugin.HandlerService;
37+
import org.scijava.service.SciJavaService;
38+
39+
/**
40+
* Interface for service that manages available {@link JavaRunner} plugins.
41+
*
42+
* @author Curtis Rueden
43+
*/
44+
public interface JavaService extends
45+
HandlerService<Class<?>, JavaRunner>, SciJavaService
46+
{
47+
48+
/** Executes the given class using the most appropriate handler. */
49+
void run(Class<?> c) throws ScriptException;
50+
51+
}

0 commit comments

Comments
 (0)