Untitled
unknown
java
4 years ago
7.9 kB
7
Indexable
import java.io.*;
import java.util.ArrayList;
public class ABasicShell {
public static void main(String[] args) {
// the commandline string
String commandLine;
// reader for the console
BufferedReader console = new BufferedReader(new InputStreamReader((System.in)));
// the directory for the ProcessBuilder
String dir = System.getProperty("user.dir");
// the process builder instance
// we must declare it here so that we can maintain the state of the
// ProcessBuilder
// especially for tracking the current directory
ProcessBuilder pb = new ProcessBuilder();
// the history arraylist
ArrayList<String> history = new ArrayList<String>();
while (true) {
try {
// read what the user entered
System.out.print("jsh> ");
commandLine = console.readLine();
if (commandLine.equals(""))
continue;
// add the command to the history arraylist
history.add(commandLine);
// split the command into an array of strings
// to be used as parameter for the ProcessBuilder command()
String[] commands = commandLine.split(" ");
// check if the command is a cd command
if (commands[0].equals("cd")) {
// check if there is directory specified for the cd command
if (commands.length == 1) {
// no directory was specified
// change directory to the user's home directory
dir = System.getProperty("user.home");
} else {
// a directory is specified
// load it into a variable
String tmpDir = commands[1];
// create a file instance from the directory
File f = new File(tmpDir);
// check if the directory exists
if (f.exists()) {
// directory exists
// assign it to the current directory variable
dir = tmpDir;
} else {
// the directory does not exist
// check if the specified directory is a relative path
// (it does not begin with a slash "/")
if (!f.isAbsolute()) {
// set an absolute path using the current directory as the parent directory
String absDir = dir + "/" + tmpDir;
// create a file instance based on the absolute path
File f2 = new File(absDir);
// check if the absolute path exists
if (f2.exists()) {
// the path exist
// assign it to the current directory variable
dir = absDir;
} else {
// the path does not exist
// show an error to the user
System.out.println("Directory does not exist.");
}
} else {
// the directory does not exist
// show an error to the user
System.out.println("Directory does not exist.");
}
}
}
// change the directory of the ProcessBuilder
// using the dir variable assigned earlier
pb.directory(new File(dir));
// check if the command is the history command
} else if (commandLine.equals("history")) {
// the command is the history command
// print all the element of the history arraylist
// with its respective index
// the index can be used to rerun the command
for (int i = 0; i < history.size(); i++) {
System.out.printf("%d %s\n", i, history.get(i));
}
// other commands
} else {
// check if the command is an index in the history arraylist
try {
// parse the command if it's numeric
int histnum = Integer.parseInt(commands[0]);
// the command is numeric
// check if it's a valid index in the history arraylist
if (histnum < history.size()) {
// index is valid
// fetch the command from the history arraylist
String fromHistory = history.get(histnum);
// check if the command is the history command
// we need to perform this again
// because we have passed the if condition that checks for the history command
if (fromHistory.equals("history")) {
// print all the element of the history arraylist
// with its respective index
// the index can be used to rerun the command
for (int i = 0; i < history.size(); i++) {
System.out.printf("%d %s\n", i, history.get(i));
}
// jump out of the loop
continue;
} else {
// split the command into an array of strings
String[] arr = fromHistory.split(" ");
// set the command in the ProcessBuilder
pb.command(arr);
}
} else {
// the index is invalid
// display an error
System.out.println("Invalid history index");
}
} catch (NumberFormatException e) {
// the command is not numeric
// set the command to the ProcessBuilder
pb.command(commands);
}
// start the process
Process process = pb.start();
// obtain the output stream
InputStream inputStream = process.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
BufferedReader br = new BufferedReader(inputStreamReader);
String line;
// output the contents returned by the command
while ((line = br.readLine()) != null) {
System.out.println(line);
}
br.close();
}
} catch (IOException ex) {
System.out.println(ex.getMessage());
}
}
}
}Editor is loading...