protected Command[] commands = new Command[] {
new LsCommand(),
new PwdCommand(),
+ new CdCommand(),
+ new RmCommand(),
new HelpCommand()
};
String[] c = buffer.split(" ");
int i=0; while (i < commands.length) {
if (commands[i].name().equals(c[0])) {
- commands[i].execute(out, c);
- out.write('\n'); break;
+ commands[i].execute(out, c); break;
}
i++;
}
}
}
+ /** Returns a path, based on console input. */
+ private String path(String c) {
+ if (c.equals("") || c.equals(".") || c.equals("/")) {
+ c = ".";
+ } else if (c.equals("..")) {
+ c = c.substring(0, c.lastIndexOf('.'));
+ if (c.equals("")) c = ".";
+ } else {
+ if (c.charAt(0) != '/') c = pwd + c;
+ c = c.replaceAll("/+", ".");
+ if (c.length() > 1 && c.charAt(c.length() - 1) == '.')
+ c = c.substring(0, c.length() - 1);
+ }
+
+ return c;
+ }
+
private String cookie = null;
public Object send(Request request) throws IOException {
URLConnection c = server.openConnection();
if (c == null) {
w.write("help: ");
w.write(c[1]);
- w.write(": command not found");
+ w.write(": command not found\n");
} else {
w.write("usage: ");
w.write(cmd.name());
w.write(cmd.summary());
w.write("\n");
}
- w.write("\nFor usage details, type help [command name].");
+ w.write("\nFor usage details, type help [command name].\n");
}
}
}
public String usage() { return "[path]"; }
public String summary() { return "List object entries."; }
public String help() { return
- "The ls command, modelled after the UNIX ls command lists the " +
- "keys in an object. ";
+ "Lists the keys in an object. Modelled after the UNIX ls command.";
}
public void execute(Writer w, String[] c) throws IOException {
if (c.length > 2) { w.write(usage()); return; }
- String path = pwd;
- String matcher = ".*";
- if (c.length == 2) {
- int pos = c[1].lastIndexOf('/') + 1;
- path += c[1].substring(0, pos);
- path = path.replaceAll("/", "\\.");
- if (pos < c[1].length()) {
- matcher = c[1].substring(pos);
- matcher = matcher.replaceAll("\\.", "\\.");
- matcher = matcher.replaceAll("\\*", ".*");
- }
- }
-
- Object ret = send(new KeyRequest(path, matcher));
+ Object ret = send(new KeyRequest(path(c[1])));
if (ret == null) {
- w.write("error: (unexpected) returned object is null");
+ w.write("error: (unexpected) returned object is null\n");
} else if (ret instanceof JSExn) {
- w.write("error: ");
- w.write(((JSExn)ret).getMessage());
+ String e = ((JSExn)ret).getMessage();
+ // FIXME: messy way to get info from server
+ if (e.endsWith("does not exist")) {
+ w.write("ls ");
+ w.write(c[1]);
+ w.write(": no such path\n");
+ } else {
+ w.write("error: ");
+ w.write(e);
+ w.write("\n");
+ }
} else if (ret instanceof List) {
List l = (List)ret; Collections.sort(l);
- w.write("total items: ");
- w.write(l.size()+"");
Iterator i = l.iterator(); while (i.hasNext()) {
- w.write("\n ");
w.write(i.next().toString());
+ w.write("\n");
}
} else {
w.write("error: (unexpected) returned object is of unknown type: ");
w.write(ret.getClass().getName());
+ w.write("\n");
}
}
}
public String help() { return "Print the path to the current object."; }
public void execute(Writer w, String[] c) throws IOException {
w.write(c.length == 1 ? pwd.replace('.', '/') : usage());
+ w.write("\n");
+ }
+ }
+
+ public class CdCommand extends Command {
+ public String name() { return "cd"; }
+ public String usage() { return "[path]"; }
+ public String summary() { return "Change current object."; }
+ public String help() { return
+ "Chnages the current object that all other commands use "+
+ "as the base for running.\n Pass either a relative path "+
+ "(e.g. in /prevalent, type cd myob, now in /prevalent/myob) "+
+ "or an absolute path (e.g. cd /prevalent/myob).\n\n" +
+ "To go up one level, cd .. can be used.";
+ }
+ public void execute(Writer w, String[] c) throws IOException {
+ if (c.length > 2) w.write(usage());
+ else if (c.length == 1 || c[1].equals("") || c[1].equals("/")) pwd = ".";
+ else if (c[1].equals("..")) {
+ String n = pwd.substring(0, pwd.lastIndexOf('.'));
+ pwd = n.equals("") ? "." : n;
+ } else {
+ String n = path(c[1]);
+ Object ret = send(new KeyRequest(n));
+
+ if (ret == null) {
+ w.write("error: (unexpected) server returned null\n");
+ } else if (ret instanceof List && ((List)ret).size() == 1) {
+ pwd = n;
+ } else if (ret instanceof JSExn ||
+ (ret instanceof List && ((List)ret).size() == 0)) {
+ w.write("cd ");
+ w.write(c[1]);
+ w.write(": no such path\n");
+ } else {
+ w.write("error: (unexpected) server returned ");
+ w.write(ret.toString());
+ w.write("\n");
+ }
+ }
+ }
+ }
+
+ public class RmCommand extends Command {
+ public String name() { return "rm"; }
+ public String usage() { return "[options] [path]"; }
+ public String summary() { return "Removes objects."; }
+ public String help() { return "Removes objects."; } // FIXME
+ public void execute(Writer w, String[] c) throws IOException {
+ if (c.length == 1) { w.write(usage()); }
+
+ String[] r = new String[c.length - 1];
+ for (int i=0; i < r.length; i++) r[i] = path(c[i + 1]);
+ // Object ret = send(new KeyRequest( FIXME: CompositeRequest
}
}
public static class KeyRequest extends Request {
private String path, matcher;
public KeyRequest() {}
+ public KeyRequest(String c) {
+ int pos = c.lastIndexOf('.');
+ path = c.substring(0, pos);
+ matcher = c.substring(pos + 1).replaceAll("\\*+", ".*");
+ }
public KeyRequest(String path, String matcher) {
this.path = path; this.matcher = matcher;
}