• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2 **
3 ** Copyright 2013, The Android Open Source Project
4 **
5 ** Licensed under the Apache License, Version 2.0 (the "License");
6 ** you may not use this file except in compliance with the License.
7 ** You may obtain a copy of the License at
8 **
9 **     http://www.apache.org/licenses/LICENSE-2.0
10 **
11 ** Unless required by applicable law or agreed to in writing, software
12 ** distributed under the License is distributed on an "AS IS" BASIS,
13 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 ** See the License for the specific language governing permissions and
15 ** limitations under the License.
16 */
17 
18 package com.android.internal.os;
19 
20 import java.io.PrintStream;
21 
22 public abstract class BaseCommand {
23 
24     protected String[] mArgs;
25     private int mNextArg;
26     private String mCurArgData;
27 
28     // These are magic strings understood by the Eclipse plugin.
29     public static final String FATAL_ERROR_CODE = "Error type 1";
30     public static final String NO_SYSTEM_ERROR_CODE = "Error type 2";
31     public static final String NO_CLASS_ERROR_CODE = "Error type 3";
32 
33     /**
34      * Call to run the command.
35      */
run(String[] args)36     public void run(String[] args) {
37         if (args.length < 1) {
38             onShowUsage(System.out);
39             return;
40         }
41 
42         mArgs = args;
43         mNextArg = 0;
44         mCurArgData = null;
45 
46         try {
47             onRun();
48         } catch (IllegalArgumentException e) {
49             onShowUsage(System.err);
50             System.err.println();
51             System.err.println("Error: " + e.getMessage());
52         } catch (Exception e) {
53             e.printStackTrace(System.err);
54             System.exit(1);
55         }
56     }
57 
58     /**
59      * Convenience to show usage information to error output.
60      */
showUsage()61     public void showUsage() {
62         onShowUsage(System.err);
63     }
64 
65     /**
66      * Convenience to show usage information to error output along
67      * with an error message.
68      */
showError(String message)69     public void showError(String message) {
70         onShowUsage(System.err);
71         System.err.println();
72         System.err.println(message);
73     }
74 
75     /**
76      * Implement the command.
77      */
onRun()78     public abstract void onRun() throws Exception;
79 
80     /**
81      * Print help text for the command.
82      */
onShowUsage(PrintStream out)83     public abstract void onShowUsage(PrintStream out);
84 
85     /**
86      * Return the next option on the command line -- that is an argument that
87      * starts with '-'.  If the next argument is not an option, null is returned.
88      */
nextOption()89     public String nextOption() {
90         if (mCurArgData != null) {
91             String prev = mArgs[mNextArg - 1];
92             throw new IllegalArgumentException("No argument expected after \"" + prev + "\"");
93         }
94         if (mNextArg >= mArgs.length) {
95             return null;
96         }
97         String arg = mArgs[mNextArg];
98         if (!arg.startsWith("-")) {
99             return null;
100         }
101         mNextArg++;
102         if (arg.equals("--")) {
103             return null;
104         }
105         if (arg.length() > 1 && arg.charAt(1) != '-') {
106             if (arg.length() > 2) {
107                 mCurArgData = arg.substring(2);
108                 return arg.substring(0, 2);
109             } else {
110                 mCurArgData = null;
111                 return arg;
112             }
113         }
114         mCurArgData = null;
115         return arg;
116     }
117 
118     /**
119      * Return the next argument on the command line, whatever it is; if there are
120      * no arguments left, return null.
121      */
nextArg()122     public String nextArg() {
123         if (mCurArgData != null) {
124             String arg = mCurArgData;
125             mCurArgData = null;
126             return arg;
127         } else if (mNextArg < mArgs.length) {
128             return mArgs[mNextArg++];
129         } else {
130             return null;
131         }
132     }
133 
134     /**
135      * Return the next argument on the command line, whatever it is; if there are
136      * no arguments left, throws an IllegalArgumentException to report this to the user.
137      */
nextArgRequired()138     public String nextArgRequired() {
139         String arg = nextArg();
140         if (arg == null) {
141             String prev = mArgs[mNextArg - 1];
142             throw new IllegalArgumentException("Argument expected after \"" + prev + "\"");
143         }
144         return arg;
145     }
146 }
147