diff --git a/builtins/pom.xml b/builtins/pom.xml index e8b619327..670e2da9f 100644 --- a/builtins/pom.xml +++ b/builtins/pom.xml @@ -33,7 +33,7 @@ org.jline - jline-script + jline-groovy diff --git a/builtins/src/main/java/org/jline/builtins/ScriptCommands.java b/builtins/src/main/java/org/jline/builtins/ConsoleCommands.java similarity index 67% rename from builtins/src/main/java/org/jline/builtins/ScriptCommands.java rename to builtins/src/main/java/org/jline/builtins/ConsoleCommands.java index 5b9b8e847..f5413da37 100644 --- a/builtins/src/main/java/org/jline/builtins/ScriptCommands.java +++ b/builtins/src/main/java/org/jline/builtins/ConsoleCommands.java @@ -1,42 +1,49 @@ package org.jline.builtins; +import java.io.File; import java.nio.file.Path; import java.util.*; +import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Supplier; import java.util.stream.Collectors; import org.jline.builtins.Builtins; import org.jline.builtins.Builtins.Command; +import org.jline.builtins.Builtins.CommandInput; import org.jline.builtins.Builtins.CommandMethods; +import org.jline.builtins.Completers.SystemCompleter; import org.jline.reader.Completer; import org.jline.reader.ConfigurationPath; import org.jline.reader.LineReader; import org.jline.reader.Widget; import org.jline.reader.impl.completer.NullCompleter; -import org.jline.script.JLineEngine; - -public class ScriptCommands implements CommandRegistry { - public enum Command {SET +import org.jline.reader.ScriptEngine; + +public class ConsoleCommands implements CommandRegistry { + public enum Command {SHOW , DEL , ENGINES}; - private final JLineEngine engine; + private final ScriptEngine engine; private Map commandName = new HashMap<>(); private Map nameCommand = new HashMap<>(); private Map aliasCommand = new HashMap<>(); private final Map commandExecute = new HashMap<>(); private Map> commandInfo = new HashMap<>(); private Exception exception; + private Consumer execute; - public ScriptCommands(JLineEngine engine) { + public ConsoleCommands(ScriptEngine engine) { this.engine = engine; +// this.commandExecute = execute; Set cmds = new HashSet<>(EnumSet.allOf(Command.class)); for (Command c: cmds) { commandName.put(c, c.name().toLowerCase()); } doNameCommand(); commandExecute.put(Command.ENGINES, new CommandMethods(this::engines, this::defaultCompleter)); - commandExecute.put(Command.SET, new CommandMethods(this::set, this::defaultCompleter)); + commandExecute.put(Command.DEL, new CommandMethods(this::del, this::defaultCompleter)); + commandExecute.put(Command.SHOW, new CommandMethods(this::show, this::defaultCompleter)); } public Set commandNames() { @@ -98,15 +105,35 @@ public List commandInfo(String command) { } public Completers.SystemCompleter compileCompleters() { - return null; + SystemCompleter out = new SystemCompleter(); + for (Map.Entry entry: commandName.entrySet()) { + out.add(entry.getValue(), commandExecute.get(entry.getKey()).compileCompleter().apply(entry.getValue())); + } + out.addAliases(aliasCommand); + return out; } public Widgets.CmdDesc commandDescription(String command) { return null; } - public Object execute(String statement) throws Exception { - return engine.execute(statement); + public Object execute(String cmd, String[] args, String statement) throws Exception { + Object out = null; + if (new File(cmd).exists()) { + File file = new File(cmd); + String name = file.getName(); + String ext = name.contains(".") ? name.substring(name.lastIndexOf(".") + 1) : ""; + if(engine.getExtensions().contains(ext)) { + out = engine.execute(file, args); + } else { + throw new IllegalArgumentException("Command not found: " + cmd); + } +// execute.accept(statement); + + } else { + out = engine.execute(statement); + } + return out; } public Object execute(String command, String[] args) throws Exception { @@ -119,15 +146,19 @@ public Object execute(String command, String[] args) throws Exception { } public Object engines(Builtins.CommandInput input) { - return JLineEngine.listEngines(); + return ScriptEngine.listEngines(); } - public Object set(Builtins.CommandInput input) { + public Object show(Builtins.CommandInput input) { return engine.get(); } + public Object del(Builtins.CommandInput input) { + engine.del(input.args()); + return null; + } + private List defaultCompleter(String command) { return Arrays.asList(NullCompleter.INSTANCE); } - -} +} \ No newline at end of file diff --git a/builtins/src/test/java/org/jline/example/Example.java b/builtins/src/test/java/org/jline/example/Example.java index 9bd7c8ae6..4fcbce3fc 100644 --- a/builtins/src/test/java/org/jline/example/Example.java +++ b/builtins/src/test/java/org/jline/example/Example.java @@ -30,8 +30,8 @@ import org.jline.builtins.Completers; import org.jline.builtins.Completers.SystemCompleter; import org.jline.builtins.Completers.TreeCompleter; -import org.jline.builtins.Options.HelpException; -import org.jline.builtins.ScriptCommands; +import org.jline.builtins.Options; +import org.jline.builtins.ConsoleCommands; import org.jline.builtins.Widgets.ArgDesc; import org.jline.builtins.Widgets.AutopairWidgets; import org.jline.builtins.Widgets.AutosuggestionWidgets; @@ -39,7 +39,7 @@ import org.jline.builtins.Widgets.CmdLine; import org.jline.builtins.Widgets.TailTipWidgets; import org.jline.builtins.Widgets.TailTipWidgets.TipType; -import org.jline.script.impl.Groovy; +import org.jline.groovy.Engine; import org.jline.keymap.KeyMap; import org.jline.reader.*; import org.jline.reader.LineReader.Option; @@ -643,12 +643,12 @@ public void complete(LineReader reader, ParsedLine line, List candida builtins.alias("zle", "widget"); builtins.alias("bindkey", "keymap"); ExampleCommands exampleCommands = new ExampleCommands(); - ScriptCommands scriptCommands = new ScriptCommands(new Groovy()); - MasterRegistry masterRegistry = new MasterRegistry(builtins, exampleCommands); + ConsoleCommands consoleCommands = new ConsoleCommands(new Engine()); + MasterRegistry masterRegistry = new MasterRegistry(builtins, consoleCommands, exampleCommands); // // Command completers // - AggregateCompleter finalCompleter = new AggregateCompleter(CommandRegistry.compileCompleters(builtins, exampleCommands) + AggregateCompleter finalCompleter = new AggregateCompleter(CommandRegistry.compileCompleters(builtins, consoleCommands, exampleCommands) , completer != null ? completer : NullCompleter.INSTANCE); // // Terminal & LineReader @@ -747,6 +747,7 @@ public void complete(LineReader reader, ParsedLine line, List candida if (line.equalsIgnoreCase("quit") || line.equalsIgnoreCase("exit")) { break; } + ParsedLine pl = reader.getParser().parse(line, 0); String[] argv = pl.words().subList(1, pl.words().size()).toArray(new String[0]); String cmd = Parser.getCommand(pl.word()); @@ -760,18 +761,20 @@ else if (builtins.hasCommand(cmd)) { else if (exampleCommands.hasCommand(cmd)) { exampleCommands.execute(cmd, argv); } - else if (scriptCommands.hasCommand(cmd)) { - result = scriptCommands.execute(cmd, argv); + else if (consoleCommands.hasCommand(cmd)) { + result = consoleCommands.execute(cmd, argv); } else { - result = scriptCommands.execute(line); + result = consoleCommands.execute(cmd, argv, line); } if (result != null) { System.out.println(result); } + + } - catch (HelpException e) { - HelpException.highlight(e.getMessage(), HelpException.defaultStyle()).print(terminal); + catch (Options.HelpException e) { + Options.HelpException.highlight(e.getMessage(), Options.HelpException.defaultStyle()).print(terminal); } catch (IllegalArgumentException|FileNotFoundException e) { System.out.println(e.getMessage()); diff --git a/script/pom.xml b/groovy/pom.xml similarity index 90% rename from script/pom.xml rename to groovy/pom.xml index d1084d20d..51b8da0ba 100644 --- a/script/pom.xml +++ b/groovy/pom.xml @@ -10,15 +10,19 @@ 3.13.3-SNAPSHOT org.jline - jline-script + jline-groovy 3.13.3-SNAPSHOT - jline-script + JLine Groovy http://maven.apache.org UTF-8 2.5.8 + + org.jline + jline-reader + org.codehaus.groovy groovy-all diff --git a/script/src/main/java/org/jline/script/impl/Groovy.java b/groovy/src/main/java/org/jline/groovy/Engine.java similarity index 82% rename from script/src/main/java/org/jline/script/impl/Groovy.java rename to groovy/src/main/java/org/jline/groovy/Engine.java index fae8302a9..395bb797a 100644 --- a/script/src/main/java/org/jline/script/impl/Groovy.java +++ b/groovy/src/main/java/org/jline/groovy/Engine.java @@ -1,22 +1,20 @@ -package org.jline.script.impl; +package org.jline.groovy; import java.io.File; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Map; +import java.util.*; -import org.jline.script.JLineEngine; +import org.jline.reader.ScriptEngine; import groovy.lang.Binding; import groovy.lang.GroovyShell; import groovy.lang.Script; -public class Groovy implements JLineEngine { +public class Engine implements ScriptEngine { private GroovyShell shell; private Binding sharedData; private Map imports = new HashMap(); - public Groovy() { + public Engine() { this.sharedData = new Binding(); shell = new GroovyShell(sharedData); } @@ -37,7 +35,8 @@ public Map get() { } @Override - public Object execute(File script) throws Exception { + public Object execute(File script, Object[] args) throws Exception { + sharedData.setProperty("args", args); Script s = shell.parse(script); return s.run(); } @@ -52,7 +51,7 @@ public Object execute(String statement) throws Exception { } else if (statement.equals("import")) { out = new ArrayList<>(imports.keySet()); } else { - String e=""; + String e = ""; for (Map.Entry entry : imports.entrySet()) { e += entry.getValue()+"\n"; } @@ -67,6 +66,11 @@ public String getEngineName() { return this.getClass().getSimpleName(); } + @Override + public List getExtensions() { + return Arrays.asList("groovy"); + } + private void del(String var){ if (var==null) { return; diff --git a/groovy/src/test/script/hello.groovy b/groovy/src/test/script/hello.groovy new file mode 100644 index 000000000..19b1de6ff --- /dev/null +++ b/groovy/src/test/script/hello.groovy @@ -0,0 +1,9 @@ +class HelloWorld { + static void hello(def who) { + println "hello $who!" + } +} + +def static main(args){ + HelloWorld.hello(!args || args.size() == 0 ? 'world' : args[0]) +} diff --git a/jline/pom.xml b/jline/pom.xml index c7638213e..08c70479a 100644 --- a/jline/pom.xml +++ b/jline/pom.xml @@ -78,6 +78,11 @@ jline-reader provided + + org.jline + jline-groovy + provided + org.jline jline-builtins @@ -145,6 +150,14 @@ false ${project.build.directory}/generated-sources + + org.jline + jline-groovy + sources + jar + false + ${project.build.directory}/generated-sources + org.jline jline-builtins @@ -211,6 +224,14 @@ ${project.build.directory}/generated-resources **/*.class + + org.jline + jline-groovy + jar + false + ${project.build.directory}/generated-resources + **/*.class + org.jline jline-builtins @@ -294,6 +315,7 @@ **/TTop.java + **/groovy/Engine.java -Xlint:all,-options @@ -303,6 +325,19 @@ + + compile-accept-warn + + + **/groovy/Engine.java + + + -Xlint:all,-options + -profile + compact1 + + + noncompact diff --git a/pom.xml b/pom.xml index 189e99c9a..452f9ecda 100644 --- a/pom.xml +++ b/pom.xml @@ -168,7 +168,7 @@ org.jline - jline-script + jline-groovy ${project.version} @@ -505,7 +505,7 @@ terminal-jna terminal-jansi reader - script + groovy builtins remote-ssh remote-telnet diff --git a/script/src/main/java/org/jline/script/JLineEngine.java b/reader/src/main/java/org/jline/reader/ScriptEngine.java similarity index 58% rename from script/src/main/java/org/jline/script/JLineEngine.java rename to reader/src/main/java/org/jline/reader/ScriptEngine.java index d5d3c054d..330d155c8 100644 --- a/script/src/main/java/org/jline/script/JLineEngine.java +++ b/reader/src/main/java/org/jline/reader/ScriptEngine.java @@ -1,4 +1,4 @@ -package org.jline.script; +package org.jline.reader; import java.io.File; import java.util.*; @@ -6,23 +6,29 @@ import javax.script.ScriptEngineFactory; import javax.script.ScriptEngineManager; -public interface JLineEngine { +public interface ScriptEngine { - public String getEngineName(); + String getEngineName(); - public void put(String name, Object value); + Collection getExtensions(); - public Object get(String name); + void put(String name, Object value); - public Map get(); + Object get(String name); - public void del(String... vars); + Map get(); - public Object execute(String statement) throws Exception; + void del(String... vars); - public Object execute(File script) throws Exception; + Object execute(String statement) throws Exception; - public static List> listEngines() { + default Object execute(File script) throws Exception { + return execute(script, null); + } + + Object execute(File script, Object[] args) throws Exception; + + static List> listEngines() { List> out = new ArrayList<>(); ScriptEngineManager f = new ScriptEngineManager(); List engines = f.getEngineFactories();