/*
* RHQ Management Platform
* Copyright (C) 2005-2011 Red Hat, Inc.
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation version 2 of the License.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
package org.rhq.core.pc.standaloneContainer;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.ArrayList;
import java.util.List;
/**
* Handle command line history
* @author Heiko W. Rupp
*/
public class History {
private static final String HISTORY_HELP = "!! : repeat the last action\n" + //
"!? : show the history of commands issued\n" + //
"!h : show this help\n" + //
"!nn : repeat history item with number nn\n" + //
"!w fileName : write history to file with name fileName\n" + //
"!dnn : delete history item with number nn";
/** Holder for the command history */
List<String> history = new ArrayList<String>(10);
/**
* Handle processing of the command history. This gives some csh like commands
* and records the commands given. Nice side effect is the possibility to write the
* history to disk and to use this later as input so that testing can be scripted.
* Commands are:
* <ul>
* <li>!! : repeat the last action</li>
* <li>!? : show the history</li>
* <li>!h : show history help</li>
* <li>!<i>nnn</i> : repeat history item with number <i>nnn</i></li>
* <li>!w <i>file</i> : write the history to the file <i>file</i></li>
* <li>!d<i>nnn</i> : delete the history item with number <i>nnn</i>
* </ul>
* @param answer the input given on the command line
* @return a command or '!' if no command substitution from the history was possible.
*/
public String handleHistory(String answer) {
// Normal command - just return it
if (!answer.startsWith("!")) {
history.add(answer);
return answer;
}
// History commands
if (answer.startsWith("!?")) {
for (int i = 0; i < history.size(); i++)
System.out.println("[" + i + "]: " + history.get(i));
} else if (answer.startsWith("!h")) {
System.out.println(HISTORY_HELP);
return "!";
} else if (answer.startsWith("!!")) {
String text = history.get(history.size() - 1);
System.out.println(text);
history.add(text);
return text;
} else if (answer.matches("![0-9]+")) {
String id = answer.substring(1);
Integer i;
try {
i = Integer.valueOf(id);
} catch (NumberFormatException nfe) {
System.err.println(id + " is no valid history position");
return "!";
}
if (i > history.size()) {
System.err.println(i + " is no valid history position");
return "!";
} else {
String text = history.get(i);
System.out.println(text);
history.add(text);
return text;
}
} else if (answer.startsWith("!w")) {
String[] tokens = answer.split(" ");
if (tokens.length < 2) {
System.err.println("Not enough parameters. You need to give a file name");
}
File file = new File(tokens[1]);
try {
if (file.createNewFile()) {
if (file.canWrite()) {
Writer writer = new FileWriter(file);
try {
for (String item : history) {
writer.write(item);
writer.write("\n");
}
} finally {
writer.close();
}
} else {
System.err.println("Can not write to file " + file);
}
}
} catch (IOException ioe) {
System.err.println("Saving the history to file " + file + " failed: " + ioe.getMessage());
}
return "!";
} else if (answer.matches("!d[0-9]+")) {
String id = answer.substring(2);
Integer i;
try {
i = Integer.valueOf(id);
} catch (NumberFormatException nfe) {
System.err.println(id + " is no valid history position");
return "!";
}
if (i > history.size()) {
System.err.println(i + " is no valid history position");
return "!";
}
history.remove(i.intValue());
return "!";
} else {
System.err.println(answer + " is no valid history command");
return "!";
}
return "!";
}
public int size() {
return history.size();
}
}