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
18package com.android.internal.os;
19
20import android.os.ShellCommand;
21
22import java.io.PrintStream;
23
24public abstract class BaseCommand {
25
26    final protected ShellCommand mArgs = new ShellCommand() {
27        @Override public int onCommand(String cmd) {
28            return 0;
29        }
30        @Override public void onHelp() {
31        }
32    };
33
34    // These are magic strings understood by the Eclipse plugin.
35    public static final String FATAL_ERROR_CODE = "Error type 1";
36    public static final String NO_SYSTEM_ERROR_CODE = "Error type 2";
37    public static final String NO_CLASS_ERROR_CODE = "Error type 3";
38
39    /**
40     * Call to run the command.
41     */
42    public void run(String[] args) {
43        if (args.length < 1) {
44            onShowUsage(System.out);
45            return;
46        }
47
48        mArgs.init(null, null, null, null, args, 0);
49
50        try {
51            onRun();
52        } catch (IllegalArgumentException e) {
53            onShowUsage(System.err);
54            System.err.println();
55            System.err.println("Error: " + e.getMessage());
56        } catch (Exception e) {
57            e.printStackTrace(System.err);
58            System.exit(1);
59        }
60    }
61
62    /**
63     * Convenience to show usage information to error output.
64     */
65    public void showUsage() {
66        onShowUsage(System.err);
67    }
68
69    /**
70     * Convenience to show usage information to error output along
71     * with an error message.
72     */
73    public void showError(String message) {
74        onShowUsage(System.err);
75        System.err.println();
76        System.err.println(message);
77    }
78
79    /**
80     * Implement the command.
81     */
82    public abstract void onRun() throws Exception;
83
84    /**
85     * Print help text for the command.
86     */
87    public abstract void onShowUsage(PrintStream out);
88
89    /**
90     * Return the next option on the command line -- that is an argument that
91     * starts with '-'.  If the next argument is not an option, null is returned.
92     */
93    public String nextOption() {
94        return mArgs.getNextOption();
95    }
96
97    /**
98     * Return the next argument on the command line, whatever it is; if there are
99     * no arguments left, return null.
100     */
101    public String nextArg() {
102        return mArgs.getNextArg();
103    }
104
105    /**
106     * Return the next argument on the command line, whatever it is; if there are
107     * no arguments left, throws an IllegalArgumentException to report this to the user.
108     */
109    public String nextArgRequired() {
110        return mArgs.getNextArgRequired();
111    }
112}
113