aboutsummaryrefslogtreecommitdiffstats
path: root/sdkmanager/app/src
diff options
context:
space:
mode:
authorThe Android Open Source Project <initial-contribution@android.com>2009-03-03 18:28:16 -0800
committerThe Android Open Source Project <initial-contribution@android.com>2009-03-03 18:28:16 -0800
commit82ea7a177797b844b252effea5c7c7c5d63ea4ac (patch)
tree4b825dc642cb6eb9a060e54bf8d69288fbee4904 /sdkmanager/app/src
parentc9432be76d50a527da232d518f633add2f76242b (diff)
downloadsdk-82ea7a177797b844b252effea5c7c7c5d63ea4ac.zip
sdk-82ea7a177797b844b252effea5c7c7c5d63ea4ac.tar.gz
sdk-82ea7a177797b844b252effea5c7c7c5d63ea4ac.tar.bz2
auto import from //depot/cupcake/@135843
Diffstat (limited to 'sdkmanager/app/src')
-rw-r--r--sdkmanager/app/src/Android.mk16
-rw-r--r--sdkmanager/app/src/com/android/sdkmanager/CommandLineProcessor.java791
-rw-r--r--sdkmanager/app/src/com/android/sdkmanager/Main.java811
-rw-r--r--sdkmanager/app/src/com/android/sdkmanager/SdkCommandLine.java220
4 files changed, 0 insertions, 1838 deletions
diff --git a/sdkmanager/app/src/Android.mk b/sdkmanager/app/src/Android.mk
deleted file mode 100644
index b508076..0000000
--- a/sdkmanager/app/src/Android.mk
+++ /dev/null
@@ -1,16 +0,0 @@
-# Copyright 2007 The Android Open Source Project
-#
-LOCAL_PATH := $(call my-dir)
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := $(call all-subdir-java-files)
-
-LOCAL_JAR_MANIFEST := ../etc/manifest.txt
-LOCAL_JAVA_LIBRARIES := \
- androidprefs \
- sdklib \
- sdkuilib
-LOCAL_MODULE := sdkmanager
-
-include $(BUILD_HOST_JAVA_LIBRARY)
-
diff --git a/sdkmanager/app/src/com/android/sdkmanager/CommandLineProcessor.java b/sdkmanager/app/src/com/android/sdkmanager/CommandLineProcessor.java
deleted file mode 100644
index 9f3fb99..0000000
--- a/sdkmanager/app/src/com/android/sdkmanager/CommandLineProcessor.java
+++ /dev/null
@@ -1,791 +0,0 @@
-/*
- * Copyright (C) 2008 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.sdkmanager;
-
-import com.android.sdklib.ISdkLog;
-
-import java.util.HashMap;
-import java.util.Map.Entry;
-
-/**
- * Parses the command-line and stores flags needed or requested.
- * <p/>
- * This is a base class. To be useful you want to:
- * <ul>
- * <li>override it.
- * <li>pass an action array to the constructor.
- * <li>define flags for your actions.
- * </ul>
- * <p/>
- * To use, call {@link #parseArgs(String[])} and then
- * call {@link #getValue(String, String, String)}.
- */
-public class CommandLineProcessor {
-
- /** Internal verb name for internally hidden flags. */
- public final static String GLOBAL_FLAG_VERB = "@@internal@@";
-
- /** String to use when the verb doesn't need any object. */
- public final static String NO_VERB_OBJECT = "";
-
- /** The global help flag. */
- public static final String KEY_HELP = "help";
- /** The global verbose flag. */
- public static final String KEY_VERBOSE = "verbose";
- /** The global silent flag. */
- public static final String KEY_SILENT = "silent";
-
- /** Verb requested by the user. Null if none specified, which will be an error. */
- private String mVerbRequested;
- /** Direct object requested by the user. Can be null. */
- private String mDirectObjectRequested;
-
- /**
- * Action definitions.
- * <p/>
- * Each entry is a string array with:
- * <ul>
- * <li> the verb.
- * <li> a direct object (use #NO_VERB_OBJECT if there's no object).
- * <li> a description.
- * <li> an alternate form for the object (e.g. plural).
- * </ul>
- */
- private final String[][] mActions;
-
- private static final int ACTION_VERB_INDEX = 0;
- private static final int ACTION_OBJECT_INDEX = 1;
- private static final int ACTION_DESC_INDEX = 2;
- private static final int ACTION_ALT_OBJECT_INDEX = 3;
-
- /**
- * The map of all defined arguments.
- * <p/>
- * The key is a string "verb/directObject/longName".
- */
- private final HashMap<String, Arg> mArguments = new HashMap<String, Arg>();
- /** Logger */
- private final ISdkLog mLog;
-
- public CommandLineProcessor(ISdkLog logger, String[][] actions) {
- mLog = logger;
- mActions = actions;
-
- define(MODE.BOOLEAN, false, GLOBAL_FLAG_VERB, NO_VERB_OBJECT, "v", KEY_VERBOSE,
- "Verbose mode: errors, warnings and informational messages are printed.",
- false);
- define(MODE.BOOLEAN, false, GLOBAL_FLAG_VERB, NO_VERB_OBJECT, "s", KEY_SILENT,
- "Silent mode: only errors are printed out.",
- false);
- define(MODE.BOOLEAN, false, GLOBAL_FLAG_VERB, NO_VERB_OBJECT, "h", KEY_HELP,
- "This help.",
- false);
- }
-
- //------------------
- // Helpers to get flags values
-
- /** Helper that returns true if --verbose was requested. */
- public boolean isVerbose() {
- return ((Boolean) getValue(GLOBAL_FLAG_VERB, NO_VERB_OBJECT, KEY_VERBOSE)).booleanValue();
- }
-
- /** Helper that returns true if --silent was requested. */
- public boolean isSilent() {
- return ((Boolean) getValue(GLOBAL_FLAG_VERB, NO_VERB_OBJECT, KEY_SILENT)).booleanValue();
- }
-
- /** Helper that returns true if --help was requested. */
- public boolean isHelpRequested() {
- return ((Boolean) getValue(GLOBAL_FLAG_VERB, NO_VERB_OBJECT, KEY_HELP)).booleanValue();
- }
-
- /** Returns the verb name from the command-line. Can be null. */
- public String getVerb() {
- return mVerbRequested;
- }
-
- /** Returns the direct object name from the command-line. Can be null. */
- public String getDirectObject() {
- return mDirectObjectRequested;
- }
-
- //------------------
-
- /**
- * Raw access to parsed parameter values.
- * <p/>
- * The default is to scan all parameters. Parameters that have been explicitly set on the
- * command line are returned first. Otherwise one with a non-null value is returned.
- * <p/>
- * Both a verb and a direct object filter can be specified. When they are non-null they limit
- * the scope of the search.
- * <p/>
- * If nothing has been found, return the last default value seen matching the filter.
- *
- * @param verb The verb name, including {@link #GLOBAL_FLAG_VERB}. If null, all possible
- * verbs that match the direct object condition will be examined and the first
- * value set will be used.
- * @param directObject The direct object name, including {@link #NO_VERB_OBJECT}. If null,
- * all possible direct objects that match the verb condition will be examined and
- * the first value set will be used.
- * @param longFlagName The long flag name for the given action. Mandatory. Cannot be null.
- * @return The current value object stored in the parameter, which depends on the argument mode.
- */
- public Object getValue(String verb, String directObject, String longFlagName) {
-
- if (verb != null && directObject != null) {
- String key = verb + "/" + directObject + "/" + longFlagName;
- Arg arg = mArguments.get(key);
- return arg.getCurrentValue();
- }
-
- Object lastDefault = null;
- for (Arg arg : mArguments.values()) {
- if (arg.getLongArg().equals(longFlagName)) {
- if (verb == null || arg.getVerb().equals(verb)) {
- if (directObject == null || arg.getDirectObject().equals(directObject)) {
- if (arg.isInCommandLine()) {
- return arg.getCurrentValue();
- }
- if (arg.getCurrentValue() != null) {
- lastDefault = arg.getCurrentValue();
- }
- }
- }
- }
- }
-
- return lastDefault;
- }
-
- /**
- * Internal setter for raw parameter value.
- * @param verb The verb name, including {@link #GLOBAL_FLAG_VERB}.
- * @param directObject The direct object name, including {@link #NO_VERB_OBJECT}.
- * @param longFlagName The long flag name for the given action.
- * @param value The new current value object stored in the parameter, which depends on the
- * argument mode.
- */
- protected void setValue(String verb, String directObject, String longFlagName, Object value) {
- String key = verb + "/" + directObject + "/" + longFlagName;
- Arg arg = mArguments.get(key);
- arg.setCurrentValue(value);
- }
-
- /**
- * Parses the command-line arguments.
- * <p/>
- * This method will exit and not return if a parsing error arise.
- *
- * @param args The arguments typically received by a main method.
- */
- public void parseArgs(String[] args) {
- String needsHelp = null;
- String verb = null;
- String directObject = null;
-
- try {
- int n = args.length;
- for (int i = 0; i < n; i++) {
- Arg arg = null;
- String a = args[i];
- if (a.startsWith("--")) {
- arg = findLongArg(verb, directObject, a.substring(2));
- } else if (a.startsWith("-")) {
- arg = findShortArg(verb, directObject, a.substring(1));
- }
-
- // No matching argument name found
- if (arg == null) {
- // Does it looks like a dashed parameter?
- if (a.startsWith("-")) {
- if (verb == null || directObject == null) {
- // It looks like a dashed parameter and we don't have a a verb/object
- // set yet, the parameter was just given too early.
-
- needsHelp = String.format(
- "Flag '%1$s' is not a valid global flag. Did you mean to specify it after the verb/object name?",
- a);
- return;
- } else {
- // It looks like a dashed parameter and but it is unknown by this
- // verb-object combination
-
- needsHelp = String.format(
- "Flag '%1$s' is not valid for '%2$s %3$s'.",
- a, verb, directObject);
- return;
- }
- }
-
- if (verb == null) {
- // Fill verb first. Find it.
- for (String[] actionDesc : mActions) {
- if (actionDesc[ACTION_VERB_INDEX].equals(a)) {
- verb = a;
- break;
- }
- }
-
- // Error if it was not a valid verb
- if (verb == null) {
- needsHelp = String.format(
- "Expected verb after global parameters but found '%1$s' instead.",
- a);
- return;
- }
-
- } else if (directObject == null) {
- // Then fill the direct object. Find it.
- for (String[] actionDesc : mActions) {
- if (actionDesc[ACTION_VERB_INDEX].equals(verb)) {
- if (actionDesc[ACTION_OBJECT_INDEX].equals(a)) {
- directObject = a;
- break;
- } else if (actionDesc.length > ACTION_ALT_OBJECT_INDEX &&
- actionDesc[ACTION_ALT_OBJECT_INDEX].equals(a)) {
- // if the alternate form exist and is used, we internally
- // only memorize the default direct object form.
- directObject = actionDesc[ACTION_OBJECT_INDEX];
- break;
- }
- }
- }
-
- // Error if it was not a valid object for that verb
- if (directObject == null) {
- needsHelp = String.format(
- "Expected verb after global parameters but found '%1$s' instead.",
- a);
- return;
-
- }
- }
- } else if (arg != null) {
- // This argument was present on the command line
- arg.setInCommandLine(true);
-
- // Process keyword
- String error = null;
- if (arg.getMode().needsExtra()) {
- if (++i >= n) {
- needsHelp = String.format("Missing argument for flag %1$s.", a);
- return;
- }
-
- error = arg.getMode().process(arg, args[i]);
- } else {
- error = arg.getMode().process(arg, null);
-
- // If we just toggled help, we want to exit now without printing any error.
- // We do this test here only when a Boolean flag is toggled since booleans
- // are the only flags that don't take parameters and help is a boolean.
- if (isHelpRequested()) {
- printHelpAndExit(null);
- // The call above should terminate however in unit tests we override
- // it so we still need to return here.
- return;
- }
- }
-
- if (error != null) {
- needsHelp = String.format("Invalid usage for flag %1$s: %2$s.", a, error);
- return;
- }
- }
- }
-
- if (needsHelp == null) {
- if (verb == null) {
- needsHelp = "Missing verb name.";
- } else {
- if (directObject == null) {
- // Make sure this verb has an optional direct object
- for (String[] actionDesc : mActions) {
- if (actionDesc[ACTION_VERB_INDEX].equals(verb) &&
- actionDesc[ACTION_OBJECT_INDEX].equals(NO_VERB_OBJECT)) {
- directObject = NO_VERB_OBJECT;
- break;
- }
- }
-
- if (directObject == null) {
- needsHelp = String.format("Missing object name for verb '%1$s'.", verb);
- return;
- }
- }
-
- // Validate that all mandatory arguments are non-null for this action
- String missing = null;
- boolean plural = false;
- for (Entry<String, Arg> entry : mArguments.entrySet()) {
- Arg arg = entry.getValue();
- if (arg.getVerb().equals(verb) &&
- arg.getDirectObject().equals(directObject)) {
- if (arg.isMandatory() && arg.getCurrentValue() == null) {
- if (missing == null) {
- missing = "--" + arg.getLongArg();
- } else {
- missing += ", --" + arg.getLongArg();
- plural = true;
- }
- }
- }
- }
-
- if (missing != null) {
- needsHelp = String.format(
- "The %1$s %2$s must be defined for action '%3$s %4$s'",
- plural ? "parameters" : "parameter",
- missing,
- verb,
- directObject);
- }
-
- mVerbRequested = verb;
- mDirectObjectRequested = directObject;
- }
- }
- } finally {
- if (needsHelp != null) {
- printHelpAndExitForAction(verb, directObject, needsHelp);
- }
- }
- }
-
- /**
- * Finds an {@link Arg} given an action name and a long flag name.
- * @return The {@link Arg} found or null.
- */
- protected Arg findLongArg(String verb, String directObject, String longName) {
- if (verb == null) {
- verb = GLOBAL_FLAG_VERB;
- }
- if (directObject == null) {
- directObject = NO_VERB_OBJECT;
- }
- String key = verb + "/" + directObject + "/" + longName;
- return mArguments.get(key);
- }
-
- /**
- * Finds an {@link Arg} given an action name and a short flag name.
- * @return The {@link Arg} found or null.
- */
- protected Arg findShortArg(String verb, String directObject, String shortName) {
- if (verb == null) {
- verb = GLOBAL_FLAG_VERB;
- }
- if (directObject == null) {
- directObject = NO_VERB_OBJECT;
- }
-
- for (Entry<String, Arg> entry : mArguments.entrySet()) {
- Arg arg = entry.getValue();
- if (arg.getVerb().equals(verb) && arg.getDirectObject().equals(directObject)) {
- if (shortName.equals(arg.getShortArg())) {
- return arg;
- }
- }
- }
-
- return null;
- }
-
- /**
- * Prints the help/usage and exits.
- *
- * @param errorFormat Optional error message to print prior to usage using String.format
- * @param args Arguments for String.format
- */
- public void printHelpAndExit(String errorFormat, Object... args) {
- printHelpAndExitForAction(null /*verb*/, null /*directObject*/, errorFormat, args);
- }
-
- /**
- * Prints the help/usage and exits.
- *
- * @param verb If null, displays help for all verbs. If not null, display help only
- * for that specific verb. In all cases also displays general usage and action list.
- * @param directObject If null, displays help for all verb objects.
- * If not null, displays help only for that specific action
- * In all cases also display general usage and action list.
- * @param errorFormat Optional error message to print prior to usage using String.format
- * @param args Arguments for String.format
- */
- public void printHelpAndExitForAction(String verb, String directObject,
- String errorFormat, Object... args) {
- if (errorFormat != null) {
- stderr(errorFormat, args);
- }
-
- /*
- * usage should fit in 80 columns
- * 12345678901234567890123456789012345678901234567890123456789012345678901234567890
- */
- stdout("\n" +
- "Usage:\n" +
- " android [global options] action [action options]\n" +
- "\n" +
- "Global options:");
- listOptions(GLOBAL_FLAG_VERB, NO_VERB_OBJECT);
-
- if (verb == null || directObject == null) {
- stdout("\nValid actions are composed of a verb and an optional direct object:");
- for (String[] action : mActions) {
-
- stdout("- %1$6s %2$-7s: %3$s",
- action[ACTION_VERB_INDEX],
- action[ACTION_OBJECT_INDEX],
- action[ACTION_DESC_INDEX]);
- }
- }
-
- for (String[] action : mActions) {
- if (verb == null || verb.equals(action[ACTION_VERB_INDEX])) {
- if (directObject == null || directObject.equals(action[ACTION_OBJECT_INDEX])) {
- stdout("\nAction \"%1$s %2$s\":",
- action[ACTION_VERB_INDEX],
- action[ACTION_OBJECT_INDEX]);
- stdout(" %1$s", action[ACTION_DESC_INDEX]);
- stdout("Options:");
- listOptions(action[ACTION_VERB_INDEX], action[ACTION_OBJECT_INDEX]);
- }
- }
- }
-
- exit();
- }
-
- /**
- * Internal helper to print all the option flags for a given action name.
- */
- protected void listOptions(String verb, String directObject) {
- int numOptions = 0;
- for (Entry<String, Arg> entry : mArguments.entrySet()) {
- Arg arg = entry.getValue();
- if (arg.getVerb().equals(verb) && arg.getDirectObject().equals(directObject)) {
-
- String value = "";
- if (arg.getDefaultValue() instanceof String[]) {
- for (String v : (String[]) arg.getDefaultValue()) {
- if (value.length() > 0) {
- value += ", ";
- }
- value += v;
- }
- } else if (arg.getDefaultValue() != null) {
- value = arg.getDefaultValue().toString();
- }
- if (value.length() > 0) {
- value = " (" + value + ")";
- }
-
- String required = arg.isMandatory() ? " [required]" : "";
-
- stdout(" -%1$s %2$-10s %3$s%4$s%5$s",
- arg.getShortArg(),
- "--" + arg.getLongArg(),
- arg.getDescription(),
- value,
- required);
- numOptions++;
- }
- }
-
- if (numOptions == 0) {
- stdout(" No options");
- }
- }
-
- //----
-
- /**
- * The mode of an argument specifies the type of variable it represents,
- * whether an extra parameter is required after the flag and how to parse it.
- */
- static enum MODE {
- /** Argument value is a Boolean. Default value is a Boolean. */
- BOOLEAN {
- @Override
- public boolean needsExtra() {
- return false;
- }
- @Override
- public String process(Arg arg, String extra) {
- // Toggle the current value
- arg.setCurrentValue(! ((Boolean) arg.getCurrentValue()).booleanValue());
- return null;
- }
- },
-
- /** Argument value is an Integer. Default value is an Integer. */
- INTEGER {
- @Override
- public boolean needsExtra() {
- return true;
- }
- @Override
- public String process(Arg arg, String extra) {
- try {
- arg.setCurrentValue(Integer.parseInt(extra));
- return null;
- } catch (NumberFormatException e) {
- return String.format("Failed to parse '%1$s' as an integer: %2%s",
- extra, e.getMessage());
- }
- }
- },
-
- /** Argument value is a String. Default value is a String[]. */
- ENUM {
- @Override
- public boolean needsExtra() {
- return true;
- }
- @Override
- public String process(Arg arg, String extra) {
- StringBuilder desc = new StringBuilder();
- String[] values = (String[]) arg.getDefaultValue();
- for (String value : values) {
- if (value.equals(extra)) {
- arg.setCurrentValue(extra);
- return null;
- }
-
- if (desc.length() != 0) {
- desc.append(", ");
- }
- desc.append(value);
- }
-
- return String.format("'%1$s' is not one of %2$s", extra, desc.toString());
- }
- },
-
- /** Argument value is a String. Default value is a null. */
- STRING {
- @Override
- public boolean needsExtra() {
- return true;
- }
- @Override
- public String process(Arg arg, String extra) {
- arg.setCurrentValue(extra);
- return null;
- }
- };
-
- /**
- * Returns true if this mode requires an extra parameter.
- */
- public abstract boolean needsExtra();
-
- /**
- * Processes the flag for this argument.
- *
- * @param arg The argument being processed.
- * @param extra The extra parameter. Null if {@link #needsExtra()} returned false.
- * @return An error string or null if there's no error.
- */
- public abstract String process(Arg arg, String extra);
- }
-
- /**
- * An argument accepted by the command-line, also called "a flag".
- * Arguments must have a short version (one letter), a long version name and a description.
- * They can have a default value, or it can be null.
- * Depending on the {@link MODE}, the default value can be a Boolean, an Integer, a String
- * or a String array (in which case the first item is the current by default.)
- */
- static class Arg {
- /** Verb for that argument. Never null. */
- private final String mVerb;
- /** Direct Object for that argument. Never null, but can be empty string. */
- private final String mDirectObject;
- /** The 1-letter short name of the argument, e.g. -v. */
- private final String mShortName;
- /** The long name of the argument, e.g. --verbose. */
- private final String mLongName;
- /** A description. Never null. */
- private final String mDescription;
- /** A default value. Can be null. */
- private final Object mDefaultValue;
- /** The argument mode (type + process method). Never null. */
- private final MODE mMode;
- /** True if this argument is mandatory for this verb/directobject. */
- private final boolean mMandatory;
- /** Current value. Initially set to the default value. */
- private Object mCurrentValue;
- /** True if the argument has been used on the command line. */
- private boolean mInCommandLine;
-
- /**
- * Creates a new argument flag description.
- *
- * @param mode The {@link MODE} for the argument.
- * @param mandatory True if this argument is mandatory for this action.
- * @param directObject The action name. Can be #NO_VERB_OBJECT or #INTERNAL_FLAG.
- * @param shortName The one-letter short argument name. Cannot be empty nor null.
- * @param longName The long argument name. Cannot be empty nor null.
- * @param description The description. Cannot be null.
- * @param defaultValue The default value (or values), which depends on the selected {@link MODE}.
- */
- public Arg(MODE mode,
- boolean mandatory,
- String verb,
- String directObject,
- String shortName,
- String longName,
- String description,
- Object defaultValue) {
- mMode = mode;
- mMandatory = mandatory;
- mVerb = verb;
- mDirectObject = directObject;
- mShortName = shortName;
- mLongName = longName;
- mDescription = description;
- mDefaultValue = defaultValue;
- mInCommandLine = false;
- if (defaultValue instanceof String[]) {
- mCurrentValue = ((String[])defaultValue)[0];
- } else {
- mCurrentValue = mDefaultValue;
- }
- }
-
- /** Return true if this argument is mandatory for this verb/directobject. */
- public boolean isMandatory() {
- return mMandatory;
- }
-
- /** Returns the 1-letter short name of the argument, e.g. -v. */
- public String getShortArg() {
- return mShortName;
- }
-
- /** Returns the long name of the argument, e.g. --verbose. */
- public String getLongArg() {
- return mLongName;
- }
-
- /** Returns the description. Never null. */
- public String getDescription() {
- return mDescription;
- }
-
- /** Returns the verb for that argument. Never null. */
- public String getVerb() {
- return mVerb;
- }
-
- /** Returns the direct Object for that argument. Never null, but can be empty string. */
- public String getDirectObject() {
- return mDirectObject;
- }
-
- /** Returns the default value. Can be null. */
- public Object getDefaultValue() {
- return mDefaultValue;
- }
-
- /** Returns the current value. Initially set to the default value. Can be null. */
- public Object getCurrentValue() {
- return mCurrentValue;
- }
-
- /** Sets the current value. Can be null. */
- public void setCurrentValue(Object currentValue) {
- mCurrentValue = currentValue;
- }
-
- /** Returns the argument mode (type + process method). Never null. */
- public MODE getMode() {
- return mMode;
- }
-
- /** Returns true if the argument has been used on the command line. */
- public boolean isInCommandLine() {
- return mInCommandLine;
- }
-
- /** Sets if the argument has been used on the command line. */
- public void setInCommandLine(boolean inCommandLine) {
- mInCommandLine = inCommandLine;
- }
- }
-
- /**
- * Internal helper to define a new argument for a give action.
- *
- * @param mode The {@link MODE} for the argument.
- * @param verb The verb name. Can be #INTERNAL_VERB.
- * @param directObject The action name. Can be #NO_VERB_OBJECT or #INTERNAL_FLAG.
- * @param shortName The one-letter short argument name. Cannot be empty nor null.
- * @param longName The long argument name. Cannot be empty nor null.
- * @param description The description. Cannot be null.
- * @param defaultValue The default value (or values), which depends on the selected {@link MODE}.
- */
- protected void define(MODE mode,
- boolean mandatory,
- String verb,
- String directObject,
- String shortName, String longName,
- String description, Object defaultValue) {
- assert(mandatory || mode == MODE.BOOLEAN); // a boolean mode cannot be mandatory
-
- if (directObject == null) {
- directObject = NO_VERB_OBJECT;
- }
-
- String key = verb + "/" + directObject + "/" + longName;
- mArguments.put(key, new Arg(mode, mandatory,
- verb, directObject, shortName, longName, description, defaultValue));
- }
-
- /**
- * Exits in case of error.
- * This is protected so that it can be overridden in unit tests.
- */
- protected void exit() {
- System.exit(1);
- }
-
- /**
- * Prints a line to stdout.
- * This is protected so that it can be overridden in unit tests.
- *
- * @param format The string to be formatted. Cannot be null.
- * @param args Format arguments.
- */
- protected void stdout(String format, Object...args) {
- mLog.printf(format + "\n", args);
- }
-
- /**
- * Prints a line to stderr.
- * This is protected so that it can be overridden in unit tests.
- *
- * @param format The string to be formatted. Cannot be null.
- * @param args Format arguments.
- */
- protected void stderr(String format, Object...args) {
- mLog.error(null, format, args);
- }
-}
diff --git a/sdkmanager/app/src/com/android/sdkmanager/Main.java b/sdkmanager/app/src/com/android/sdkmanager/Main.java
deleted file mode 100644
index 1a15fce..0000000
--- a/sdkmanager/app/src/com/android/sdkmanager/Main.java
+++ /dev/null
@@ -1,811 +0,0 @@
-/*
- * Copyright (C) 2008 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.sdkmanager;
-
-import com.android.prefs.AndroidLocation;
-import com.android.prefs.AndroidLocation.AndroidLocationException;
-import com.android.sdklib.IAndroidTarget;
-import com.android.sdklib.ISdkLog;
-import com.android.sdklib.SdkConstants;
-import com.android.sdklib.SdkManager;
-import com.android.sdklib.IAndroidTarget.IOptionalLibrary;
-import com.android.sdklib.avd.AvdManager;
-import com.android.sdklib.avd.HardwareProperties;
-import com.android.sdklib.avd.AvdManager.AvdInfo;
-import com.android.sdklib.avd.HardwareProperties.HardwareProperty;
-import com.android.sdklib.project.ProjectCreator;
-import com.android.sdklib.project.ProjectCreator.OutputLevel;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Main class for the 'android' application.
- */
-class Main {
-
- /** Java property that defines the location of the sdk/tools directory. */
- private final static String TOOLSDIR = "com.android.sdkmanager.toolsdir";
- /** Java property that defines the working directory. On Windows the current working directory
- * is actually the tools dir, in which case this is used to get the original CWD. */
- private final static String WORKDIR = "com.android.sdkmanager.workdir";
-
- private final static String[] BOOLEAN_YES_REPLIES = new String[] { "yes", "y" };
- private final static String[] BOOLEAN_NO_REPLIES = new String[] { "no", "n" };
-
- /** Path to the SDK folder. This is the parent of {@link #TOOLSDIR}. */
- private String mSdkFolder;
- /** Logger object. Use this to print normal output, warnings or errors. */
- private ISdkLog mSdkLog;
- /** The SDK manager parses the SDK folder and gives access to the content. */
- private SdkManager mSdkManager;
- /** Command-line processor with options specific to SdkManager. */
- private SdkCommandLine mSdkCommandLine;
- /** The working directory, either null or set to an existing absolute canonical directory. */
- private File mWorkDir;
-
- public static void main(String[] args) {
- new Main().run(args);
- }
-
- /**
- * Runs the sdk manager app
- */
- private void run(String[] args) {
- createLogger();
- init();
- mSdkCommandLine.parseArgs(args);
- parseSdk();
- doAction();
- }
-
- /**
- * Creates the {@link #mSdkLog} object.
- * <p/>
- * This must be done before {@link #init()} as it will be used to report errors.
- */
- private void createLogger() {
- mSdkLog = new ISdkLog() {
- public void error(Throwable t, String errorFormat, Object... args) {
- if (errorFormat != null) {
- System.err.printf("Error: " + errorFormat, args);
- if (!errorFormat.endsWith("\n")) {
- System.err.printf("\n");
- }
- }
- if (t != null) {
- System.err.printf("Error: %s\n", t.getMessage());
- }
- }
-
- public void warning(String warningFormat, Object... args) {
- if (mSdkCommandLine.isVerbose()) {
- System.out.printf("Warning: " + warningFormat, args);
- if (!warningFormat.endsWith("\n")) {
- System.out.printf("\n");
- }
- }
- }
-
- public void printf(String msgFormat, Object... args) {
- System.out.printf(msgFormat, args);
- }
- };
- }
-
- /**
- * Init the application by making sure the SDK path is available and
- * doing basic parsing of the SDK.
- */
- private void init() {
- mSdkCommandLine = new SdkCommandLine(mSdkLog);
-
- // We get passed a property for the tools dir
- String toolsDirProp = System.getProperty(TOOLSDIR);
- if (toolsDirProp == null) {
- // for debugging, it's easier to override using the process environment
- toolsDirProp = System.getenv(TOOLSDIR);
- }
-
- if (toolsDirProp != null) {
- // got back a level for the SDK folder
- File tools;
- if (toolsDirProp.length() > 0) {
- tools = new File(toolsDirProp);
- mSdkFolder = tools.getParent();
- } else {
- try {
- tools = new File(".").getCanonicalFile();
- mSdkFolder = tools.getParent();
- } catch (IOException e) {
- // Will print an error below since mSdkFolder is not defined
- }
- }
- }
-
- if (mSdkFolder == null) {
- errorAndExit("The tools directory property is not set, please make sure you are executing %1$s",
- SdkConstants.androidCmdName());
- }
-
- // We might get passed a property for the working directory
- // Either it is a valid directory and mWorkDir is set to it's absolute canonical value
- // or mWorkDir remains null.
- String workDirProp = System.getProperty(WORKDIR);
- if (workDirProp == null) {
- workDirProp = System.getenv(WORKDIR);
- }
- if (workDirProp != null) {
- // This should be a valid directory
- mWorkDir = new File(workDirProp);
- try {
- mWorkDir = mWorkDir.getCanonicalFile().getAbsoluteFile();
- } catch (IOException e) {
- mWorkDir = null;
- }
- if (mWorkDir == null || !mWorkDir.isDirectory()) {
- errorAndExit("The working directory does not seem to be valid: '%1$s", workDirProp);
- }
- }
- }
-
- /**
- * Does the basic SDK parsing required for all actions
- */
- private void parseSdk() {
- mSdkManager = SdkManager.createManager(mSdkFolder, mSdkLog);
-
- if (mSdkManager == null) {
- errorAndExit("Unable to parse SDK content.");
- }
- }
-
- /**
- * Actually do an action...
- */
- private void doAction() {
- String verb = mSdkCommandLine.getVerb();
- String directObject = mSdkCommandLine.getDirectObject();
-
- if (SdkCommandLine.VERB_LIST.equals(verb)) {
- // list action.
- if (SdkCommandLine.OBJECT_TARGET.equals(directObject)) {
- displayTargetList();
- } else if (SdkCommandLine.OBJECT_AVD.equals(directObject)) {
- displayAvdList();
- } else {
- displayTargetList();
- displayAvdList();
- }
-
- } else if (SdkCommandLine.VERB_CREATE.equals(verb) &&
- SdkCommandLine.OBJECT_AVD.equals(directObject)) {
- createAvd();
-
- } else if (SdkCommandLine.VERB_DELETE.equals(verb) &&
- SdkCommandLine.OBJECT_AVD.equals(directObject)) {
- deleteAvd();
-
- } else if (SdkCommandLine.VERB_MOVE.equals(verb) &&
- SdkCommandLine.OBJECT_AVD.equals(directObject)) {
- moveAvd();
-
- } else if (SdkCommandLine.VERB_CREATE.equals(verb) &&
- SdkCommandLine.OBJECT_PROJECT.equals(directObject)) {
- createProject();
-
- } else if (SdkCommandLine.VERB_UPDATE.equals(verb) &&
- SdkCommandLine.OBJECT_PROJECT.equals(directObject)) {
- updateProject();
- } else {
- mSdkCommandLine.printHelpAndExit(null);
- }
- }
-
- /**
- * Creates a new Android project based on command-line parameters
- */
- private void createProject() {
- // get the target and try to resolve it.
- int targetId = mSdkCommandLine.getParamTargetId();
- IAndroidTarget[] targets = mSdkManager.getTargets();
- if (targetId < 1 || targetId > targets.length) {
- errorAndExit("Target id is not valid. Use '%s list targets' to get the target ids.",
- SdkConstants.androidCmdName());
- }
- IAndroidTarget target = targets[targetId - 1];
-
- ProjectCreator creator = new ProjectCreator(mSdkFolder,
- mSdkCommandLine.isVerbose() ? OutputLevel.VERBOSE :
- mSdkCommandLine.isSilent() ? OutputLevel.SILENT :
- OutputLevel.NORMAL,
- mSdkLog);
-
- String projectDir = getProjectLocation(mSdkCommandLine.getParamLocationPath());
-
- creator.createProject(projectDir,
- mSdkCommandLine.getParamName(),
- mSdkCommandLine.getParamProjectPackage(),
- mSdkCommandLine.getParamProjectActivity(),
- target,
- false /* isTestProject*/);
- }
-
- /**
- * Updates an existing Android project based on command-line parameters
- */
- private void updateProject() {
- // get the target and try to resolve it.
- IAndroidTarget target = null;
- int targetId = mSdkCommandLine.getParamTargetId();
- if (targetId >= 0) {
- IAndroidTarget[] targets = mSdkManager.getTargets();
- if (targetId < 1 || targetId > targets.length) {
- errorAndExit("Target id is not valid. Use '%s list targets' to get the target ids.",
- SdkConstants.androidCmdName());
- }
- target = targets[targetId - 1];
- }
-
- ProjectCreator creator = new ProjectCreator(mSdkFolder,
- mSdkCommandLine.isVerbose() ? OutputLevel.VERBOSE :
- mSdkCommandLine.isSilent() ? OutputLevel.SILENT :
- OutputLevel.NORMAL,
- mSdkLog);
-
- String projectDir = getProjectLocation(mSdkCommandLine.getParamLocationPath());
-
- creator.updateProject(projectDir,
- target,
- mSdkCommandLine.getParamName());
- }
-
- /**
- * Adjusts the project location to make it absolute & canonical relative to the
- * working directory, if any.
- *
- * @return The project absolute path relative to {@link #mWorkDir} or the original
- * newProjectLocation otherwise.
- */
- private String getProjectLocation(String newProjectLocation) {
-
- // If the new project location is absolute, use it as-is
- File projectDir = new File(newProjectLocation);
- if (projectDir.isAbsolute()) {
- return newProjectLocation;
- }
-
- // if there's no working directory, just use the project location as-is.
- if (mWorkDir == null) {
- return newProjectLocation;
- }
-
- // Combine then and get an absolute canonical directory
- try {
- projectDir = new File(mWorkDir, newProjectLocation).getCanonicalFile();
-
- return projectDir.getPath();
- } catch (IOException e) {
- errorAndExit("Failed to combine working directory '%1$s' with project location '%2$s': %3$s",
- mWorkDir.getPath(),
- newProjectLocation,
- e.getMessage());
- return null;
- }
- }
-
- /**
- * Displays the list of available Targets (Platforms and Add-ons)
- */
- private void displayTargetList() {
- mSdkLog.printf("Available Android targets:\n");
-
- int index = 1;
- for (IAndroidTarget target : mSdkManager.getTargets()) {
- if (target.isPlatform()) {
- mSdkLog.printf("[%d] %s\n", index, target.getName());
- mSdkLog.printf(" API level: %d\n", target.getApiVersionNumber());
- } else {
- mSdkLog.printf("[%d] Add-on: %s\n", index, target.getName());
- mSdkLog.printf(" Vendor: %s\n", target.getVendor());
- if (target.getDescription() != null) {
- mSdkLog.printf(" Description: %s\n", target.getDescription());
- }
- mSdkLog.printf(" Based on Android %s (API level %d)\n",
- target.getApiVersionName(), target.getApiVersionNumber());
-
- // display the optional libraries.
- IOptionalLibrary[] libraries = target.getOptionalLibraries();
- if (libraries != null) {
- mSdkLog.printf(" Libraries:\n");
- for (IOptionalLibrary library : libraries) {
- mSdkLog.printf(" * %1$s (%2$s)\n",
- library.getName(), library.getJarName());
- mSdkLog.printf(String.format(
- " %1$s\n", library.getDescription()));
- }
- }
- }
-
- // get the target skins
- displaySkinList(target, " Skins: ");
-
- index++;
- }
- }
-
- /**
- * Displays the skins valid for the given target.
- */
- private void displaySkinList(IAndroidTarget target, String message) {
- String[] skins = target.getSkins();
- String defaultSkin = target.getDefaultSkin();
- mSdkLog.printf(message);
- if (skins != null) {
- boolean first = true;
- for (String skin : skins) {
- if (first == false) {
- mSdkLog.printf(", ");
- } else {
- first = false;
- }
- mSdkLog.printf(skin);
-
- if (skin.equals(defaultSkin)) {
- mSdkLog.printf(" (default)");
- }
- }
- mSdkLog.printf("\n");
- } else {
- mSdkLog.printf("no skins.\n");
- }
- }
-
- /**
- * Displays the list of available AVDs.
- */
- private void displayAvdList() {
- try {
- AvdManager avdManager = new AvdManager(mSdkManager, null /* sdklog */);
-
- mSdkLog.printf("Available Android Virtual Devices:\n");
-
- int index = 1;
- for (AvdInfo info : avdManager.getAvds()) {
- mSdkLog.printf("[%d] %s\n", index, info.getName());
- mSdkLog.printf(" Path: %s\n", info.getPath());
-
- // get the target of the AVD
- IAndroidTarget target = info.getTarget();
- if (target.isPlatform()) {
- mSdkLog.printf(" Target: %s (API level %d)\n", target.getName(),
- target.getApiVersionNumber());
- } else {
- mSdkLog.printf(" Target: %s (%s)\n", target.getName(), target
- .getVendor());
- mSdkLog.printf(" Based on Android %s (API level %d)\n", target
- .getApiVersionName(), target.getApiVersionNumber());
- }
-
- // display some extra values.
- Map<String, String> properties = info.getProperties();
- String skin = properties.get(AvdManager.AVD_INI_SKIN_NAME);
- if (skin != null) {
- mSdkLog.printf(" Skin: %s\n", skin);
- }
- String sdcard = properties.get(AvdManager.AVD_INI_SDCARD_SIZE);
- if (sdcard == null) {
- sdcard = properties.get(AvdManager.AVD_INI_SDCARD_PATH);
- }
- if (sdcard != null) {
- mSdkLog.printf(" Sdcard: %s\n", sdcard);
- }
-
- index++;
- }
- } catch (AndroidLocationException e) {
- errorAndExit(e.getMessage());
- }
- }
-
- /**
- * Creates a new AVD. This is a text based creation with command line prompt.
- */
- private void createAvd() {
- // find a matching target
- int targetId = mSdkCommandLine.getParamTargetId();
- IAndroidTarget target = null;
-
- if (targetId >= 1 && targetId <= mSdkManager.getTargets().length) {
- target = mSdkManager.getTargets()[targetId-1]; // target it is 1-based
- } else {
- errorAndExit("Target id is not valid. Use '%s list targets' to get the target ids.",
- SdkConstants.androidCmdName());
- }
-
- try {
- boolean removePrevious = false;
- AvdManager avdManager = new AvdManager(mSdkManager, mSdkLog);
-
- String avdName = mSdkCommandLine.getParamName();
- AvdInfo info = avdManager.getAvd(avdName);
- if (info != null) {
- if (mSdkCommandLine.getFlagForce()) {
- removePrevious = true;
- mSdkLog.warning(
- "Android Virtual Device '%s' already exists and will be replaced.",
- avdName);
- } else {
- errorAndExit("Android Virtual Device '%s' already exists.", avdName);
- return;
- }
- }
-
- String paramFolderPath = mSdkCommandLine.getParamLocationPath();
- File avdFolder = null;
- if (paramFolderPath != null) {
- avdFolder = new File(paramFolderPath);
- } else {
- avdFolder = new File(AndroidLocation.getFolder() + AndroidLocation.FOLDER_AVD,
- avdName + AvdManager.AVD_FOLDER_EXTENSION);
- }
-
- Map<String, String> hardwareConfig = null;
- if (target.isPlatform()) {
- try {
- hardwareConfig = promptForHardware(target);
- } catch (IOException e) {
- errorAndExit(e.getMessage());
- }
- }
-
- AvdInfo oldAvdInfo = null;
- if (removePrevious) {
- oldAvdInfo = avdManager.getAvd(avdName);
- }
-
- // Validate skin is either default (empty) or NNNxMMM or a valid skin name.
- String skin = mSdkCommandLine.getParamSkin();
- if (skin != null && skin.length() == 0) {
- skin = null;
- }
- if (skin != null) {
- boolean valid = false;
- // Is it a know skin name for this target?
- for (String s : target.getSkins()) {
- if (skin.equalsIgnoreCase(s)) {
- skin = s; // Make skin names case-insensitive.
- valid = true;
- break;
- }
- }
-
- // Is it NNNxMMM?
- if (!valid) {
- valid = skin.matches("[0-9]{2,}x[0-9]{2,}");
- }
-
- if (!valid) {
- displaySkinList(target, "Valid skins: ");
- errorAndExit("'%s' is not a valid skin name or size (NNNxMMM)", skin);
- return;
- }
- }
-
- AvdInfo newAvdInfo = avdManager.createAvd(avdFolder,
- avdName,
- target,
- skin,
- mSdkCommandLine.getParamSdCard(),
- hardwareConfig,
- removePrevious,
- mSdkLog);
-
- if (newAvdInfo != null &&
- oldAvdInfo != null &&
- !oldAvdInfo.getPath().equals(newAvdInfo.getPath())) {
- mSdkLog.warning("Removing previous AVD directory at %s", oldAvdInfo.getPath());
- // Remove the old data directory
- File dir = new File(oldAvdInfo.getPath());
- avdManager.recursiveDelete(dir);
- dir.delete();
- // Remove old avd info from manager
- avdManager.removeAvd(oldAvdInfo);
- }
-
- } catch (AndroidLocationException e) {
- errorAndExit(e.getMessage());
- }
- }
-
- /**
- * Delete an AVD.
- */
- private void deleteAvd() {
- try {
- String avdName = mSdkCommandLine.getParamName();
- AvdManager avdManager = new AvdManager(mSdkManager, mSdkLog);
- AvdInfo info = avdManager.getAvd(avdName);
-
- if (info == null) {
- errorAndExit("There is no Android Virtual Device named '%s'.", avdName);
- return;
- }
-
- avdManager.deleteAvd(info, mSdkLog);
- } catch (AndroidLocationException e) {
- errorAndExit(e.getMessage());
- }
- }
-
- /**
- * Move an AVD.
- */
- private void moveAvd() {
- try {
- String avdName = mSdkCommandLine.getParamName();
- AvdManager avdManager = new AvdManager(mSdkManager, mSdkLog);
- AvdInfo info = avdManager.getAvd(avdName);
-
- if (info == null) {
- errorAndExit("There is no Android Virtual Device named '%s'.", avdName);
- return;
- }
-
- // This is a rename if there's a new name for the AVD
- String newName = mSdkCommandLine.getParamMoveNewName();
- if (newName != null && newName.equals(info.getName())) {
- // same name, not actually a rename operation
- newName = null;
- }
-
- // This is a move (of the data files) if there's a new location path
- String paramFolderPath = mSdkCommandLine.getParamLocationPath();
- if (paramFolderPath != null) {
- // check if paths are the same. Use File methods to account for OS idiosyncrasies.
- try {
- File f1 = new File(paramFolderPath).getCanonicalFile();
- File f2 = new File(info.getPath()).getCanonicalFile();
- if (f1.equals(f2)) {
- // same canonical path, so not actually a move
- paramFolderPath = null;
- }
- } catch (IOException e) {
- // Fail to resolve canonical path. Fail now since a move operation might fail
- // later and be harder to recover from.
- errorAndExit(e.getMessage());
- return;
- }
- }
-
- if (newName == null && paramFolderPath == null) {
- mSdkLog.warning("Move operation aborted: same AVD name, same canonical data path");
- return;
- }
-
- // If a rename was requested and no data move was requested, check if the original
- // data path is our default constructed from the AVD name. In this case we still want
- // to rename that folder too.
- if (newName != null && paramFolderPath == null) {
- // Compute the original data path
- File originalFolder = new File(
- AndroidLocation.getFolder() + AndroidLocation.FOLDER_AVD,
- info.getName() + AvdManager.AVD_FOLDER_EXTENSION);
- if (originalFolder.equals(info.getPath())) {
- try {
- // The AVD is using the default data folder path based on the AVD name.
- // That folder needs to be adjusted to use the new name.
- File f = new File(AndroidLocation.getFolder() + AndroidLocation.FOLDER_AVD,
- newName + AvdManager.AVD_FOLDER_EXTENSION);
- paramFolderPath = f.getCanonicalPath();
- } catch (IOException e) {
- // Fail to resolve canonical path. Fail now rather than later.
- errorAndExit(e.getMessage());
- }
- }
- }
-
- // Check for conflicts
-
- if (newName != null && avdManager.getAvd(newName) != null) {
- errorAndExit("There is already an AVD named '%s'.", newName);
- return;
- }
- if (newName != null) {
- if (avdManager.getAvd(newName) != null) {
- errorAndExit("There is already an AVD named '%s'.", newName);
- return;
- }
-
- File ini = info.getIniFile();
- if (ini.equals(AvdInfo.getIniFile(newName))) {
- errorAndExit("The AVD file '%s' is in the way.", ini.getCanonicalPath());
- return;
- }
- }
-
- if (paramFolderPath != null && new File(paramFolderPath).exists()) {
- errorAndExit(
- "There is already a file or directory at '%s'.\nUse --path to specify a different data folder.",
- paramFolderPath);
- }
-
- avdManager.moveAvd(info, newName, paramFolderPath, mSdkLog);
- } catch (AndroidLocationException e) {
- errorAndExit(e.getMessage());
- } catch (IOException e) {
- errorAndExit(e.getMessage());
- }
- }
-
- /**
- * Prompts the user to setup a hardware config for a Platform-based AVD.
- * @throws IOException
- */
- private Map<String, String> promptForHardware(IAndroidTarget createTarget) throws IOException {
- byte[] readLineBuffer = new byte[256];
- String result;
- String defaultAnswer = "no";
-
- mSdkLog.printf("%s is a basic Android platform.\n", createTarget.getName());
- mSdkLog.printf("Do you wish to create a custom hardware profile [%s]",
- defaultAnswer);
-
- result = readLine(readLineBuffer).trim();
- // handle default:
- if (result.length() == 0) {
- result = defaultAnswer;
- }
-
- if (getBooleanReply(result) == false) {
- // no custom config.
- return null;
- }
-
- mSdkLog.printf("\n"); // empty line
-
- // get the list of possible hardware properties
- File hardwareDefs = new File (mSdkFolder + File.separator +
- SdkConstants.OS_SDK_TOOLS_LIB_FOLDER, SdkConstants.FN_HARDWARE_INI);
- List<HardwareProperty> list = HardwareProperties.parseHardwareDefinitions(hardwareDefs,
- null /*sdkLog*/);
-
- HashMap<String, String> map = new HashMap<String, String>();
-
- for (int i = 0 ; i < list.size() ;) {
- HardwareProperty property = list.get(i);
-
- String description = property.getDescription();
- if (description != null) {
- mSdkLog.printf("%s: %s\n", property.getAbstract(), description);
- } else {
- mSdkLog.printf("%s\n", property.getAbstract());
- }
-
- String defaultValue = property.getDefault();
-
- if (defaultValue != null) {
- mSdkLog.printf("%s [%s]:", property.getName(), defaultValue);
- } else {
- mSdkLog.printf("%s (%s):", property.getName(), property.getType());
- }
-
- result = readLine(readLineBuffer);
- if (result.length() == 0) {
- if (defaultValue != null) {
- mSdkLog.printf("\n"); // empty line
- i++; // go to the next property if we have a valid default value.
- // if there's no default, we'll redo this property
- }
- continue;
- }
-
- switch (property.getType()) {
- case BOOLEAN:
- try {
- if (getBooleanReply(result)) {
- map.put(property.getName(), "yes");
- i++; // valid reply, move to next property
- } else {
- map.put(property.getName(), "no");
- i++; // valid reply, move to next property
- }
- } catch (IOException e) {
- // display error, and do not increment i to redo this property
- mSdkLog.printf("\n%s\n", e.getMessage());
- }
- break;
- case INTEGER:
- try {
- Integer.parseInt(result);
- map.put(property.getName(), result);
- i++; // valid reply, move to next property
- } catch (NumberFormatException e) {
- // display error, and do not increment i to redo this property
- mSdkLog.printf("\n%s\n", e.getMessage());
- }
- break;
- case DISKSIZE:
- // TODO check validity
- map.put(property.getName(), result);
- i++; // valid reply, move to next property
- break;
- }
-
- mSdkLog.printf("\n"); // empty line
- }
-
- return map;
- }
-
- /**
- * Reads the line from the input stream.
- * @param buffer
- * @throws IOException
- */
- private String readLine(byte[] buffer) throws IOException {
- int count = System.in.read(buffer);
-
- // is the input longer than the buffer?
- if (count == buffer.length && buffer[count-1] != 10) {
- // create a new temp buffer
- byte[] tempBuffer = new byte[256];
-
- // and read the rest
- String secondHalf = readLine(tempBuffer);
-
- // return a concat of both
- return new String(buffer, 0, count) + secondHalf;
- }
-
- // ignore end whitespace
- while (count > 0 && (buffer[count-1] == '\r' || buffer[count-1] == '\n')) {
- count--;
- }
-
- return new String(buffer, 0, count);
- }
-
- /**
- * Returns the boolean value represented by the string.
- * @throws IOException If the value is not a boolean string.
- */
- private boolean getBooleanReply(String reply) throws IOException {
-
- for (String valid : BOOLEAN_YES_REPLIES) {
- if (valid.equalsIgnoreCase(reply)) {
- return true;
- }
- }
-
- for (String valid : BOOLEAN_NO_REPLIES) {
- if (valid.equalsIgnoreCase(reply)) {
- return false;
- }
- }
-
- throw new IOException(String.format("%s is not a valid reply", reply));
- }
-
- private void errorAndExit(String format, Object...args) {
- mSdkLog.error(null, format, args);
- System.exit(1);
- }
-} \ No newline at end of file
diff --git a/sdkmanager/app/src/com/android/sdkmanager/SdkCommandLine.java b/sdkmanager/app/src/com/android/sdkmanager/SdkCommandLine.java
deleted file mode 100644
index 34a69bd..0000000
--- a/sdkmanager/app/src/com/android/sdkmanager/SdkCommandLine.java
+++ /dev/null
@@ -1,220 +0,0 @@
-/*
- * Copyright (C) 2008 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.sdkmanager;
-
-import com.android.sdklib.ISdkLog;
-import com.android.sdklib.SdkManager;
-
-
-/**
- * Specific command-line flags for the {@link SdkManager}.
- */
-public class SdkCommandLine extends CommandLineProcessor {
-
- public final static String VERB_LIST = "list";
- public final static String VERB_CREATE = "create";
- public final static String VERB_MOVE = "move";
- public final static String VERB_DELETE = "delete";
- public final static String VERB_UPDATE = "update";
-
- public static final String OBJECT_AVD = "avd";
- public static final String OBJECT_AVDS = "avds";
- public static final String OBJECT_TARGET = "target";
- public static final String OBJECT_TARGETS = "targets";
- public static final String OBJECT_PROJECT = "project";
-
- public static final String ARG_ALIAS = "alias";
- public static final String ARG_ACTIVITY = "activity";
-
- public static final String KEY_ACTIVITY = ARG_ACTIVITY;
- public static final String KEY_PACKAGE = "package";
- public static final String KEY_MODE = "mode";
- public static final String KEY_TARGET_ID = OBJECT_TARGET;
- public static final String KEY_NAME = "name";
- public static final String KEY_PATH = "path";
- public static final String KEY_FILTER = "filter";
- public static final String KEY_SKIN = "skin";
- public static final String KEY_SDCARD = "sdcard";
- public static final String KEY_FORCE = "force";
- public static final String KEY_RENAME = "rename";
-
- /**
- * Action definitions for SdkManager command line.
- * <p/>
- * Each entry is a string array with:
- * <ul>
- * <li> the verb.
- * <li> an object (use #NO_VERB_OBJECT if there's no object).
- * <li> a description.
- * <li> an alternate form for the object (e.g. plural).
- * </ul>
- */
- private final static String[][] ACTIONS = {
- { VERB_LIST, NO_VERB_OBJECT,
- "Lists existing targets or virtual devices." },
- { VERB_LIST, OBJECT_AVD,
- "Lists existing Android Virtual Devices.",
- OBJECT_AVDS },
- { VERB_LIST, OBJECT_TARGET,
- "Lists existing targets.",
- OBJECT_TARGETS },
-
- { VERB_CREATE, OBJECT_AVD,
- "Creates a new Android Virtual Device." },
- { VERB_MOVE, OBJECT_AVD,
- "Moves or renames an Android Virtual Device." },
- { VERB_DELETE, OBJECT_AVD,
- "Deletes an Android Virtual Device." },
-
- { VERB_CREATE, OBJECT_PROJECT,
- "Creates a new Android Project." },
- { VERB_UPDATE, OBJECT_PROJECT,
- "Updates an Android Project (must have an AndroidManifest.xml)." },
- };
-
- public SdkCommandLine(ISdkLog logger) {
- super(logger, ACTIONS);
-
- // --- create avd ---
-
- define(MODE.STRING, false,
- VERB_CREATE, OBJECT_AVD, "p", KEY_PATH,
- "Location path of the directory where the new AVD will be created", null);
- define(MODE.STRING, true,
- VERB_CREATE, OBJECT_AVD, "n", KEY_NAME,
- "Name of the new AVD", null);
- define(MODE.INTEGER, true,
- VERB_CREATE, OBJECT_AVD, "t", KEY_TARGET_ID,
- "Target id of the new AVD", null);
- define(MODE.STRING, false,
- VERB_CREATE, OBJECT_AVD, "s", KEY_SKIN,
- "Skin of the new AVD", null);
- define(MODE.STRING, false,
- VERB_CREATE, OBJECT_AVD, "c", KEY_SDCARD,
- "Path to a shared SD card image, or size of a new sdcard for the new AVD", null);
- define(MODE.BOOLEAN, false,
- VERB_CREATE, OBJECT_AVD, "f", KEY_FORCE,
- "Force creation (override an existing AVD)", false);
-
- // --- delete avd ---
-
- define(MODE.STRING, true,
- VERB_DELETE, OBJECT_AVD, "n", KEY_NAME,
- "Name of the AVD to delete", null);
-
- // --- move avd ---
-
- define(MODE.STRING, true,
- VERB_MOVE, OBJECT_AVD, "n", KEY_NAME,
- "Name of the AVD to move or rename", null);
- define(MODE.STRING, false,
- VERB_MOVE, OBJECT_AVD, "r", KEY_RENAME,
- "New name of the AVD to rename", null);
- define(MODE.STRING, false,
- VERB_MOVE, OBJECT_AVD, "p", KEY_PATH,
- "New location path of the directory where to move the AVD", null);
-
- // --- create project ---
-
- define(MODE.ENUM, true,
- VERB_CREATE, OBJECT_PROJECT, "m", KEY_MODE,
- "Project mode", new String[] { ARG_ACTIVITY, ARG_ALIAS });
- define(MODE.STRING, true,
- VERB_CREATE, OBJECT_PROJECT,
- "p", KEY_PATH,
- "Location path of new project", null);
- define(MODE.INTEGER, true,
- VERB_CREATE, OBJECT_PROJECT, "t", KEY_TARGET_ID,
- "Target id of the new project", null);
- define(MODE.STRING, true,
- VERB_CREATE, OBJECT_PROJECT, "k", KEY_PACKAGE,
- "Package name", null);
- define(MODE.STRING, true,
- VERB_CREATE, OBJECT_PROJECT, "a", KEY_ACTIVITY,
- "Activity name", null);
- define(MODE.STRING, false,
- VERB_CREATE, OBJECT_PROJECT, "n", KEY_NAME,
- "Project name", null);
-
- // --- update project ---
-
- define(MODE.STRING, true,
- VERB_UPDATE, OBJECT_PROJECT,
- "p", KEY_PATH,
- "Location path of the project", null);
- define(MODE.INTEGER, true,
- VERB_UPDATE, OBJECT_PROJECT,
- "t", KEY_TARGET_ID,
- "Target id to set for the project", -1);
- define(MODE.STRING, false,
- VERB_UPDATE, OBJECT_PROJECT,
- "n", KEY_NAME,
- "Project name", null);
- }
-
- // -- some helpers for generic action flags
-
- /** Helper to retrieve the --path value. */
- public String getParamLocationPath() {
- return ((String) getValue(null, null, KEY_PATH));
- }
-
- /** Helper to retrieve the --target id value. */
- public int getParamTargetId() {
- return ((Integer) getValue(null, null, KEY_TARGET_ID)).intValue();
- }
-
- /** Helper to retrieve the --name value. */
- public String getParamName() {
- return ((String) getValue(null, null, KEY_NAME));
- }
-
- /** Helper to retrieve the --skin value. */
- public String getParamSkin() {
- return ((String) getValue(null, null, KEY_SKIN));
- }
-
- /** Helper to retrieve the --sdcard value. */
- public String getParamSdCard() {
- return ((String) getValue(null, null, KEY_SDCARD));
- }
-
- /** Helper to retrieve the --force flag. */
- public boolean getFlagForce() {
- return ((Boolean) getValue(null, null, KEY_FORCE)).booleanValue();
- }
-
- // -- some helpers for avd action flags
-
- /** Helper to retrieve the --rename value for a move verb. */
- public String getParamMoveNewName() {
- return ((String) getValue(VERB_MOVE, null, KEY_RENAME));
- }
-
-
- // -- some helpers for project action flags
-
- /** Helper to retrieve the --package value. */
- public String getParamProjectPackage() {
- return ((String) getValue(null, OBJECT_PROJECT, KEY_PACKAGE));
- }
-
- /** Helper to retrieve the --activity for the new project action. */
- public String getParamProjectActivity() {
- return ((String) getValue(null, OBJECT_PROJECT, KEY_ACTIVITY));
- }
-}