public boolean execute(ShellContext<MessageCounter> context) {
    ShellServer<MessageCounter> shellServer = context.getShellServer();
    MessageCounter msgCounter = context.getOpaqueData();
    PrintStream out = context.getOutputStream();

    msgCounter.stop();

    if (shellServer != null) {
      // interrupt all shell threads
      shellServer.interruptAllInterruptible();

      // interrupt shell server thread
      shellServer.stopServSockThread();
    }

    out.print("halted." + Shell.CRLF);
    out.flush();

    return true;
  }
  public boolean execute(ShellContext<EmulatorContext> context) {
    EmulatorContext cxt = context.getOpaqueData();
    PrintStream out = context.getOutputStream();
    String[] args = context.getArguments();

    if (args.length < 2) {
      out.println("Usage: " + this.getHelp());

      if (context.isInteractive()) return false;
      else return true;
    }

    // parse arguments
    long startTime = 0L, interval = 0L;
    int times = 1;
    boolean timeIsDifferential = false;

    StringTokenizer st = new StringTokenizer(args[0], ",");

    String timeStr = st.nextToken();
    if (timeStr.startsWith("+")) { // +<start time>
      timeIsDifferential = true;
      timeStr = timeStr.substring(1);
    }
    startTime = parseLong(timeStr);

    try {
      interval = parseLong(st.nextToken());
      times = 0; // indicates endless repeat

      times = Integer.parseInt(st.nextToken());
    } catch (NoSuchElementException e) {
    }

    // parse the another command
    Map<String, Command<EmulatorContext>> commandTable = context.getShellServer().getCommandTable();

    Command<EmulatorContext> command = commandTable.get(args[1]);
    if (command == null) {
      out.println("No such command: " + args[1]);
      if (context.isInteractive()) return false;
      else return true;
    }

    SchedulableCommand<EmulatorContext> schedulableCommand = null;
    try {
      schedulableCommand = (SchedulableCommand<EmulatorContext>) command;
    } catch (ClassCastException e) {
      out.println("Command is not schedulable: " + args[1]);
      if (context.isInteractive()) return false;
      else return true;
    }

    // schedule
    String[] taskArgs = new String[args.length - 2];
    System.arraycopy(args, 2, taskArgs, 0, taskArgs.length);
    context.setArguments(taskArgs);

    EmulatorTask task = null;
    try {
      task = schedulableCommand.getEmulatorTask(context);
    } catch (Exception e) {
      out.println("An exception thrown during parsing command: " + args[1]);
      if (context.isInteractive()) return false;
      else return true;
    }

    this.schedule(cxt, startTime, interval, times, task, timeIsDifferential);

    if (cxt.getEmulatorMode() != EmulatorMode.WORKER && cxt.getVerboseInParsing()) {
      out.print("schedule: " + schedulableCommand.getNames()[0]);
      for (int i = 0; i < taskArgs.length; i++) {
        out.print(" " + taskArgs[i]);
      }
      out.println();
    }

    return false;
  }