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    }