org.crsh.lang.impl.script.ScriptRepl Maven / Gradle / Ivy
The newest version!
/*
* Copyright (C) 2012 eXo Platform SAS.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.crsh.lang.impl.script;
import org.crsh.cli.impl.Delimiter;
import org.crsh.cli.impl.completion.CompletionMatch;
import org.crsh.cli.spi.Completion;
import org.crsh.lang.spi.*;
import org.crsh.shell.impl.command.RuntimeContextImpl;
import org.crsh.shell.impl.command.ShellSession;
import org.crsh.shell.impl.command.spi.CommandException;
import org.crsh.shell.impl.command.spi.CommandInvoker;
import org.crsh.shell.impl.command.spi.Command;
import org.crsh.shell.ShellResponse;
import org.crsh.util.Utils;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
/** @author Julien Viet */
public class ScriptRepl implements Repl {
/** . */
private static final ScriptRepl instance = new ScriptRepl();
/** . */
static final Logger log = Logger.getLogger(ScriptRepl.class.getName());
public static ScriptRepl getInstance() {
return instance;
}
/** . */
private final Language lang = new Language() {
@Override public String getName() { return "script"; }
@Override public String getDisplayName() { return "Script 1.0"; }
@Override public boolean isActive() { return true; }
@Override public Repl getRepl() { return ScriptRepl.this; }
@Override public org.crsh.lang.spi.Compiler getCompiler() { return ScriptCompiler.instance; }
@Override public void init(ShellSession session) { }
@Override public void destroy(ShellSession session) { }
};
private ScriptRepl() {
}
@Override
public Language getLanguage() {
return lang;
}
public String getName() {
return "script";
}
@Override
public String getDescription() {
return "The Script repl provides command line interpreter with a bash like syntax";
}
public ReplResponse eval(ShellSession session, String request) {
PipeLineFactory factory;
try {
factory = Token.parse(request).createFactory();
}
catch (CommandException e) {
return new ReplResponse.Response(ShellResponse.error(e.getErrorKind(), e.getMessage(), e.getCause()));
}
if (factory != null) {
try {
CommandInvoker invoker = factory.create(session);
return new ReplResponse.Invoke(invoker);
}
catch (CommandNotFoundException e) {
log.log(Level.FINER, "Could not create command", e);
return new ReplResponse.Response(ShellResponse.unknownCommand(e.getName()));
}
catch (CommandException e) {
log.log(Level.FINER, "Could not create command", e);
return new ReplResponse.Response(ShellResponse.error(e.getErrorKind(), e.getMessage(), e));
}
} else {
return new ReplResponse.Response(ShellResponse.noCommand());
}
}
public CompletionMatch complete(ShellSession session, String prefix) {
Token ast = Token.parse(prefix);
String termPrefix;
if (ast != null) {
Token last = ast.getLast();
termPrefix = Utils.trimLeft(last.value);
} else {
termPrefix = "";
}
//
log.log(Level.FINE, "Retained term prefix is " + termPrefix);
CompletionMatch completion;
int pos = termPrefix.indexOf(' ');
if (pos == -1) {
Completion.Builder builder = Completion.builder(termPrefix);
for (Map.Entry command : session.getCommands()) {
String name = command.getKey();
if (name.startsWith(termPrefix)) {
builder.add(name.substring(termPrefix.length()), true);
}
}
completion = new CompletionMatch(Delimiter.EMPTY, builder.build());
} else {
String commandName = termPrefix.substring(0, pos);
termPrefix = termPrefix.substring(pos);
try {
Command> command = session.getCommand(commandName);
if (command != null) {
completion = command.complete(new RuntimeContextImpl(session, session.getContext().getAttributes()), termPrefix);
} else {
completion = new CompletionMatch(Delimiter.EMPTY, Completion.create());
}
}
catch (CommandException e) {
log.log(Level.FINE, "Could not create command for completion of " + prefix, e);
completion = new CompletionMatch(Delimiter.EMPTY, Completion.create());
}
}
//
return completion;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy