X-Git-Url: http://git.megacz.com/?p=org.ibex.xt-crawshaw.git;a=blobdiff_plain;f=src%2Fjava%2Forg%2Fibex%2Fxt%2Fshell%2FCommand.java;fp=src%2Fjava%2Forg%2Fibex%2Fxt%2Fshell%2FCommand.java;h=c7f302523f1c23427f3e612d9420b480281c3363;hp=04ca7b1d4512fbcca2e39bdb919d01111a0bc33e;hb=8dcd09248633282c9ec641b56c00ea3d95d790e7;hpb=7959860be8bb0ac8aa172e1de8bb140b65afdae6 diff --git a/src/java/org/ibex/xt/shell/Command.java b/src/java/org/ibex/xt/shell/Command.java index 04ca7b1..c7f3025 100644 --- a/src/java/org/ibex/xt/shell/Command.java +++ b/src/java/org/ibex/xt/shell/Command.java @@ -160,12 +160,118 @@ public abstract class Command { } } + public static class Replace extends Command { + public Replace(Shell s) { super(s); } + public String name() { return "replace"; } + public String params() { return "[key] [value]"; } + public String summary() { return "Sets a key to a specific value."; } + public String help() { return + "Sets a key to a specific value. This function accepts " + + "an xt shell path for the key name (eg. /foo/bar), and a " + + "script object for the value (eg. {}, [], \"foo\").\n\n" + + + "If the key does not already exist, it is created, but an " + + "error is thrown if the parent object of the key does not " + + "exist.\n\n" + + + "WARNING: This function is dangerous. It gives you a " + + "quick and easy way to replace your entire data set with "+ + "an empty object."; + } + public void execute(Writer w, String[] c) throws IOException { + if (c.length < 3) { usage(w); return; } + try { + List path = fromShellPath(c[1]); + Object key = path.remove(path.size() - 1); + Object po = shell.getFromPath(path.toArray()); + + if (po == null || !(po instanceof JS)) + throw new Shell.BadPathException(); + JS parent = (JS)po; + + String func = "prevalent."; + for (int i=0; i < path.size(); i++) + func += path.get(i) + "."; + func += key + " = "; + for (int i=2; i < c.length; i++) + func += c[i]; + func += ";\n"; + + shell.transaction(JS.fromReader( + "replace-transaction", 0, new StringReader(func))); + + } catch (JSExn e) { + w.write("error: cannot replace '"); + w.write(c[1]); + w.write("': "); + w.write(e.getMessage()); + w.write("\n"); + } catch (Shell.BadPathException e) { + w.write("error: cannot replace '"); + w.write(c[1]); + w.write("': "); + w.write(e.getMessage() == null ? "no such path" : e.getMessage()); + w.write("\n"); + } + } + } + + public static class Mkdir extends Command { + public Mkdir(Shell s) { super(s); } + public String name() { return "mkdir"; } + public String params() { return "[path]"; } + public String summary() { return "Creates a new object ready to handle keys."; } + public String help() { return + "Creates a new object ready to handle keys. This function " + + "is similar to calling replace [path] {}, only it will not " + + "overwrite an existing key."; + } + public void execute(Writer w, String[] c) throws IOException { + if (c.length != 2) { usage(w); return; } + try { + List path = fromShellPath(c[1]); + Object key = path.remove(path.size() - 1); + Object po = shell.getFromPath(path.toArray()); + + if (po == null || !(po instanceof JS)) + throw new Shell.BadPathException(); + + JS parent = (JS)po; + if (parent.containsKey(key)) + throw new Shell.BadPathException("already exists"); + + String func = "prevalent."; + for (int i=0; i < path.size(); i++) + func += path.get(i) + "."; + func += key + " = {};\n"; + + shell.transaction(JS.fromReader( + "mkdir-transaction", 0, new StringReader(func))); + + } catch (JSExn e) { + w.write("error: cannot create '"); + w.write(c[1]); + w.write("': "); + w.write(e.getMessage()); + w.write("\n"); + } catch (Shell.BadPathException e) { + w.write("error: cannot create '"); + w.write(c[1]); + w.write("': "); + w.write(e.getMessage() == null ? "no such path" : e.getMessage()); + w.write("\n"); + } + } + } + public static class Rm extends Command { public Rm(Shell s) { super(s); } public String name() { return "rm"; } public String params() { return "[options] [path]"; } public String summary() { return "Removes objects."; } - public String help() { return "Removes objects."; } // FIXME info + public String help() { return + "Removes objects. If any one of the specified paths does " + + "not exist, the entire remove process is cancelled."; } public void execute(Writer w, String[] c) throws IOException { if (c.length == 1) { usage(w); return; }