    001    /* Copyright 2000, 2001, Compaq Computer Corporation */
    002
    003    package javafe;
    004
    005    /**
    006     * <code>Tool</code> is an abstract class for tools.
    007     *
    008     * <p> Tools are command-line applications invoked by calling their
    009     * static <code>main(String[])</code> method. <p>
    010     */
    011
    012    public abstract class Tool
    013    {
    014      /**************************************************
    015       *    Exit codes                                  *
    016       **************************************************/
    017
    018      static public final int okExitCode = 0;
    019      static public final int badUsageExitCode = 1;
    020      static public final int errorExitCode = 2;
    021      static public final int outOfMemoryExitCode = 3;
    022
    023      /***************************************************
    024       *                                                 *
    025       * Generating a usage message:                     *
    026       *                                                 *
    027       **************************************************/
    028
    029      /**
    030       * Return the non-null name of this tool.  E.g., "ls" or "cp".
    031       * Used in usage and error messages.
    032       */
    033      //@ ensures \result != null;
    034      public abstract String name();
    035
    036
    037      /**
    038       * Print our usage message to <code>System.err</code>.
    039       */
    040      public void usage() {
    041        options.usage(name());
    042      }
    043
    044      public void badOptionUsage(Exception e) {
    045        System.err.println(name() + ": " + e.getMessage());
    046        if (!options.quiet) usage();
    047      }
    048
    049      /***************************************************
    050       *                                                 *
    051       * Generic option processing:                      *
    052       *                                                 *
    053       **************************************************/
    054
    055      /**
    056       * A statically held Options object.  The object is static to
    057       * facilitate using the options in other classes throughout the
    058       * program.  All processing and reporting of options is managed by
    059       * this object.
    060       */
    061      static public Options options = null;
    062
    063      /***************************************************
    064       *                                                 *
    065       * Main processing code:                           *
    066       *                                                 *
    067       **************************************************/
    068
    069      /**
    070       * Start up an instance of this tool using command-line arguments
    071       * <code>args</code>.
    072       *
    073       * <p> <strong>Note</strong>: this code needs to be copied verbatim
    074       * to each subclass of <code>Tool</code> except with the name of the
    075       * actual subclass inserted after the new operator and the comment
    076       * characters (//) removed.
    077       *
    078       * <p> (This needs to be done because static methods cannot be
    079       * inherited.) <p>
    080       */
    081      //@ requires \nonnullelements(args);
    082      public static void main(String[] args) {
    083        // Tool t = new Tool();
    084        // int result = t.run(args);
    085        // if (result != 0) System.exit(result);
    086      }
    087
    088
    089      /**
    090       * A tool's main entry point; <code>args</code> are the
    091       * command-line arguments we have been invoked with.
    092       *
    093       * @return the exit code (0 = success, >0 is a failure)
    094       */
    095      //@ requires \nonnullelements(args);
    096      public abstract int run(String[] args);
    097
    098      /**
    099       * Compute the time used from a start time to now, then return it in
    100       * a user readable form.
    101       */
    102      //@ ensures \result != null;
    103      public static String timeUsed(long startTime) {
    104        if (options.testMode) return "TIME";
    105        long delta = java.lang.System.currentTimeMillis() - startTime;
    106
    107        return (delta/1000.0) + " s" + " " + spaceUsed();
    108      }
    109
    110      public static long currentTime() {
    111        return java.lang.System.currentTimeMillis();
    112      }
    113
    114      public static String spaceUsed() {
    115        long used = rt.totalMemory() - rt.freeMemory();
    116        return used + " bytes";
    117      }
    118
    119      private static Runtime rt = Runtime.getRuntime();
    120    }