package org.ibex.xt.shell;
-import java.util.*;
-
+import java.io.StringReader;
import java.io.Writer;
import java.io.IOException;
+import java.util.*;
+
+import org.ibex.js.*;
+
public abstract class Command {
/** Returns the command name. */
public abstract String name();
public String help() { return "Print the path to the current object."; }
public void execute(Writer w, String[] c, Env env) throws IOException {
if (c.length != 1) { w.write(usage()); return; }
- w.write(env.path.equals("") ? "/" : env.path.replace('.', '/'));
+ w.write(env.path.equals("") ? "." : env.path);
w.write("\n");
}
}
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" +
+ "(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, Env env) throws IOException {
if (c.length > 2) w.write(usage());
- else if (c.length == 1 || c[1].equals("") || c[1].equals("/")) env.path = "";
+ else if (c.length == 1 || c[1].equals("") || c[1].equals(".")) env.path = "";
else if (c[1].equals("..")) {
String n = env.path;
n = n.substring(0, n.lastIndexOf('.'));
} else {
List l = ((Request.Key.Res)ret).keys();
if (l.size() == 0) {
- w.write("cd ");
+ w.write("error: ");
w.write(c[1]);
w.write(": no such path\n");
} else {
public void execute(Writer w, String[] c, Env env) 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] = env.path(c[i + 1]);
- // Object ret = send(new KeyRequest( FIXME: CompositeRequest
+ Request.Key[] r = new Request.Key[c.length - 1];
+ for (int i=0; i < r.length; i++) r[i] = new Request.RemoveKey(env.path(c[i + 1]));
+
+ Request.Response ret = env.send(new Request.Composite(r, false));
+ if (!(ret instanceof Request.Composite.Res)) {
+ w.write("error: ");
+ w.write(ret.error().getMessage());
+ w.write("\n");
+ } else {
+ Request.Response[] res = ((Request.Composite.Res)ret).responses();
+ for (int i=0; i < res.length; i++) {
+ if (res[i] instanceof Request.RemoveKey.Res) {
+ boolean rm = ((Request.RemoveKey.Res)res[i]).removed();
+ if (!rm) {
+ w.write("error: cannot remove '");
+ w.write(c[i + 1]);
+ w.write("': no such key\n");
+ }
+ } else {
+ w.write("error: cannot remove '");
+ w.write(c[i + 1]);
+ w.write("': ");
+ w.write(res[i].error().getMessage());
+ w.write("\n");
+ }
+ }
+ }
}
}
+ public static class Set extends Command {
+ public String name() { return "set"; }
+ public String usage() { return "[name] [object]"; }
+ public String summary() { return "Sets ."; }
+ public String help() { return "Removes objects."; } // FIXME
+
+ public void execute(Writer w, String[] c, Env env) throws IOException {
+ if (c.length < 3) { w.write(usage()); }
+
+ String m = c[1];
+ String s = "return (";
+ for (int i=2; i < c.length; i++) s += c[i];
+ s += ");";
+
+ JS js;
+ try { js = JS.fromReader("input", 0, new StringReader(s)); }
+ catch (IOException e) {
+ w.write("error: ");
+ w.write(e.getMessage());
+ w.write("\n");
+ return;
+ }
+
+ Request.Response ret = env.send(new Request.SetKey(env.path, m, js));
+ }
+ }
}