X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Fjava%2Forg%2Fibex%2Fxt%2FShell.java;h=4696869dcd0be89cd511a877ab1f48d39cbd6bd9;hb=001892c7393bfd314472dba1d87f804be4ed8936;hp=1596630c604ad0e418b3a4f62874530ef71b500a;hpb=3b3d88ff92477dabf6eef4dccf2bf388a3ff1388;p=org.ibex.xt-crawshaw.git diff --git a/src/java/org/ibex/xt/Shell.java b/src/java/org/ibex/xt/Shell.java index 1596630..4696869 100644 --- a/src/java/org/ibex/xt/Shell.java +++ b/src/java/org/ibex/xt/Shell.java @@ -31,6 +31,8 @@ public class Shell { protected Command[] commands = new Command[] { new LsCommand(), new PwdCommand(), + new CdCommand(), + new RmCommand(), new HelpCommand() }; @@ -69,8 +71,7 @@ public class Shell { 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++; } @@ -85,6 +86,23 @@ public class Shell { } } + /** 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(); @@ -145,7 +163,7 @@ public class Shell { 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()); @@ -170,7 +188,7 @@ public class Shell { 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"); } } } @@ -180,43 +198,37 @@ public class Shell { 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"); } } } @@ -228,6 +240,60 @@ public class Shell { 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 } } @@ -238,6 +304,11 @@ public class Shell { 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; }