blob: 1025085ae6a141a14e9d23c419cb62254ac8ae92 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2007 Boeing.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Boeing - initial API and implementation
*******************************************************************************/
package org.eclipse.osee.ote.core.environment.console;
import java.lang.ref.WeakReference;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public abstract class ConsoleShell {
private static final Pattern CMD_PATTERN = Pattern.compile("^(\\S+)\\s*((-[a-zA-Z]\\S*\\s*)*)\\s*((\\S+(\\s+|$))*)");
private final WeakReference<ICommandManager> manager;
private volatile ConsoleCommand lastCmd;
private volatile String lastSwitches;
private volatile String lastArgs;
private boolean saveLastCmdFlag = true;
public ConsoleShell(ICommandManager manager) {
this.manager = new WeakReference<>(manager);
}
public abstract void println(String string);
public abstract void print(String string);
public abstract void println();
public ICommandManager getCommandManager() {
return manager.get();
}
public void runLast() {
lastCmd.execute(this, lastSwitches, lastArgs);
}
public final void parseAndExecuteCmd(String line) throws Throwable {
final Matcher matcher = CMD_PATTERN.matcher(line);
if (matcher.matches()) {
String cmdName = matcher.group(1);
String switches = matcher.group(2);
String args = matcher.group(4);
final ConsoleCommand cmd = getCommandManager().getCommand(cmdName);
if (cmd != null) {
cmd.execute(this, switches, args);
if (saveLastCmdFlag) {
lastCmd = cmd;
lastSwitches = switches;
lastArgs = args;
} else {
// we do not save the last command as instructed but we reset the flag
saveLastCmdFlag = true;
}
} else {
println(cmdName + " is not recognized as a command");
}
} else {
println("invalid command format");
}
}
/**
* Prevents the currently running command from being saved as the last executed command. This is useful for commands
* that process the last executed command but do not want themselves to become the last command executed
*/
public void setSaveLastCmdFlag(boolean save) {
saveLastCmdFlag = save;
}
public void printStackTrace(Throwable t) {
println(t.toString() + ":");
StackTraceElement[] elements = t.getStackTrace();
for (int i = 0; i < elements.length; i++) {
println(" " + elements[i].toString());
}
t = t.getCause();
while (t != null) {
println("Caused by: " + t.toString());
elements = t.getStackTrace();
for (int i = 0; i < elements.length; i++) {
println(" " + elements[i].toString());
}
t = t.getCause();
}
}
}