| /* |
| ** |
| ** Copyright 2013, The Android Open Source Project |
| ** |
| ** Licensed under the Apache License, Version 2.0 (the "License"); |
| ** you may not use this file except in compliance with the License. |
| ** You may obtain a copy of the License at |
| ** |
| ** http://www.apache.org/licenses/LICENSE-2.0 |
| ** |
| ** Unless required by applicable law or agreed to in writing, software |
| ** distributed under the License is distributed on an "AS IS" BASIS, |
| ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| ** See the License for the specific language governing permissions and |
| ** limitations under the License. |
| */ |
| |
| package com.android.internal.os; |
| |
| import java.io.PrintStream; |
| |
| public abstract class BaseCommand { |
| |
| protected String[] mArgs; |
| private int mNextArg; |
| private String mCurArgData; |
| |
| // These are magic strings understood by the Eclipse plugin. |
| public static final String FATAL_ERROR_CODE = "Error type 1"; |
| public static final String NO_SYSTEM_ERROR_CODE = "Error type 2"; |
| public static final String NO_CLASS_ERROR_CODE = "Error type 3"; |
| |
| /** |
| * Call to run the command. |
| */ |
| public void run(String[] args) { |
| if (args.length < 1) { |
| onShowUsage(System.out); |
| return; |
| } |
| |
| mArgs = args; |
| mNextArg = 0; |
| mCurArgData = null; |
| |
| try { |
| onRun(); |
| } catch (IllegalArgumentException e) { |
| onShowUsage(System.err); |
| System.err.println(); |
| System.err.println("Error: " + e.getMessage()); |
| } catch (Exception e) { |
| e.printStackTrace(System.err); |
| System.exit(1); |
| } |
| } |
| |
| /** |
| * Convenience to show usage information to error output. |
| */ |
| public void showUsage() { |
| onShowUsage(System.err); |
| } |
| |
| /** |
| * Convenience to show usage information to error output along |
| * with an error message. |
| */ |
| public void showError(String message) { |
| onShowUsage(System.err); |
| System.err.println(); |
| System.err.println(message); |
| } |
| |
| /** |
| * Implement the command. |
| */ |
| public abstract void onRun() throws Exception; |
| |
| /** |
| * Print help text for the command. |
| */ |
| public abstract void onShowUsage(PrintStream out); |
| |
| /** |
| * Return the next option on the command line -- that is an argument that |
| * starts with '-'. If the next argument is not an option, null is returned. |
| */ |
| public String nextOption() { |
| if (mCurArgData != null) { |
| String prev = mArgs[mNextArg - 1]; |
| throw new IllegalArgumentException("No argument expected after \"" + prev + "\""); |
| } |
| if (mNextArg >= mArgs.length) { |
| return null; |
| } |
| String arg = mArgs[mNextArg]; |
| if (!arg.startsWith("-")) { |
| return null; |
| } |
| mNextArg++; |
| if (arg.equals("--")) { |
| return null; |
| } |
| if (arg.length() > 1 && arg.charAt(1) != '-') { |
| if (arg.length() > 2) { |
| mCurArgData = arg.substring(2); |
| return arg.substring(0, 2); |
| } else { |
| mCurArgData = null; |
| return arg; |
| } |
| } |
| mCurArgData = null; |
| return arg; |
| } |
| |
| /** |
| * Return the next argument on the command line, whatever it is; if there are |
| * no arguments left, return null. |
| */ |
| public String nextArg() { |
| if (mCurArgData != null) { |
| String arg = mCurArgData; |
| mCurArgData = null; |
| return arg; |
| } else if (mNextArg < mArgs.length) { |
| return mArgs[mNextArg++]; |
| } else { |
| return null; |
| } |
| } |
| |
| /** |
| * Return the next argument on the command line, whatever it is; if there are |
| * no arguments left, throws an IllegalArgumentException to report this to the user. |
| */ |
| public String nextArgRequired() { |
| String arg = nextArg(); |
| if (arg == null) { |
| String prev = mArgs[mNextArg - 1]; |
| throw new IllegalArgumentException("Argument expected after \"" + prev + "\""); |
| } |
| return arg; |
| } |
| } |