org.crsh.shell.impl.command.CRaSHCommandProcess Maven / Gradle / Ivy
The newest version!
package org.crsh.shell.impl.command;
import org.crsh.keyboard.KeyHandler;
import org.crsh.shell.ErrorKind;
import org.crsh.shell.ShellProcessContext;
import org.crsh.shell.ShellResponse;
import org.crsh.shell.impl.command.spi.CommandException;
import org.crsh.shell.impl.command.spi.CommandInvoker;
import org.crsh.util.Utils;
/**
* @author Julien Viet
*/
class CRaSHCommandProcess extends CRaSHProcess {
/** . */
private final CRaSHSession session;
/** . */
private final CommandInvoker command;
public CRaSHCommandProcess(CRaSHSession session, String request, CommandInvoker command) {
super(session, request);
//
this.session = session;
this.command = command;
}
@Override
public KeyHandler getKeyHandler() {
return command.getKeyHandler();
}
@Override
ShellResponse doInvoke(final ShellProcessContext context) throws InterruptedException {
CRaSHProcessContext invocationContext = new CRaSHProcessContext(session, context);
try {
command.invoke(invocationContext);
return ShellResponse.ok();
}
catch (CommandException e) {
return build(e);
} catch (Throwable t) {
return build(t);
} finally {
Utils.close(invocationContext);
}
}
private ShellResponse.Error build(Throwable throwable) {
ErrorKind errorType;
if (throwable instanceof CommandException) {
CommandException ce = (CommandException)throwable;
errorType = ce.getErrorKind();
Throwable cause = throwable.getCause();
if (cause != null) {
throwable = cause;
}
} else {
errorType = ErrorKind.INTERNAL;
}
String result;
String msg = throwable.getMessage();
if (throwable instanceof CommandException) {
if (msg == null) {
result = request + ": failed";
} else {
result = request + ": " + msg;
}
return ShellResponse.error(errorType, result, throwable);
} else {
if (msg == null) {
msg = throwable.getClass().getSimpleName();
}
if (throwable instanceof RuntimeException) {
result = request + ": exception: " + msg;
} else if (throwable instanceof Exception) {
result = request + ": exception: " + msg;
} else if (throwable instanceof Error) {
result = request + ": error: " + msg;
} else {
result = request + ": unexpected throwable: " + msg;
}
return ShellResponse.error(errorType, result, throwable);
}
}
}
© 2015 - 2024 Weber Informatics LLC | Privacy Policy