blob: 4be8908daf1f0a1b7a55844b51736ceea339101d [file] [log] [blame]
/*
* Copyright (C) 2012 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.motorolamobility.preflighting.internal.commandinput;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.osgi.util.NLS;
import com.motorolamobility.preflighting.core.checker.CheckerDescription;
import com.motorolamobility.preflighting.core.checker.CheckerExtension;
import com.motorolamobility.preflighting.core.exception.PreflightingToolException;
import com.motorolamobility.preflighting.core.validation.GlobalInputParamsValidator;
import com.motorolamobility.preflighting.core.validation.Parameter;
import com.motorolamobility.preflighting.core.validation.ParameterDescription;
import com.motorolamobility.preflighting.core.validation.ParameterType;
import com.motorolamobility.preflighting.core.validation.ValidationManager;
import com.motorolamobility.preflighting.core.validation.ValidationManager.InputParameter;
import com.motorolamobility.preflighting.core.validation.ValidationResultData;
import com.motorolamobility.preflighting.core.validation.ValidationResultData.SEVERITY;
import com.motorolamobility.preflighting.core.validation.Value;
import com.motorolamobility.preflighting.core.verbose.DebugVerboseOutputter;
import com.motorolamobility.preflighting.core.verbose.DebugVerboseOutputter.VerboseLevel;
import com.motorolamobility.preflighting.core.verbose.WarningLevelFilter;
import com.motorolamobility.preflighting.core.verbose.WarningLevelFilter.WarningLevel;
import com.motorolamobility.preflighting.i18n.PreflightingNLS;
import com.motorolamobility.preflighting.internal.commandinput.exception.ParameterParseException;
import com.motorolamobility.preflighting.internal.commandoutput.OutputterFactory;
import com.motorolamobility.preflighting.internal.daemon.Daemon;
import com.motorolamobility.preflighting.internal.help.printer.HelpPrinter;
public class ApplicationParameterInterpreter
{
public static final String PARAMETER_WARNING = "wN"; //$NON-NLS-1$
public static final String WARNING_FLAG = PARAMETER_WARNING.substring(0, 1);
public static final String PARAM_VERBOSITY = "vN"; //$NON-NLS-1$
public static final String VERBOSITY_FLAG = PARAM_VERBOSITY.substring(0, 1);
/**
* Theses parameters are defined by Application. Application interprets
* these parameters.
*/
public static final String PARAM_HELP = "help"; //$NON-NLS-1$
public static final String PARAM_LIST_CHECKERS = "list-checkers"; //$NON-NLS-1$
public static final String PARAM_LIST_DEVICES = "list-devices"; //$NON-NLS-1$
// Hidden parameter. For internal use only.
public static final String KEEP_TEMP_FILES = "keepTempFiles"; //$NON-NLS-1$
public static final String PARAM_DESC_DEVICE = "describe-device"; //$NON-NLS-1$
public static final String PARAM_DAEMON = "daemon"; //$NON-NLS-1$
private static final String PARAM_DEBUG = "showDebugMessages";
/**
* Check if there are application parameters within the parameter list.
* Also, retrieve verbosity and warning levels from command line, if any,
* and set the appropriate values.
*
* @param parameters
* all parameters passed to application
* @return true if there are application parameters, false otherwise
* @throws ParameterParseException
*/
public static boolean checkApplicationParameters(List<Parameter> parameters,
ValidationManager validationManager, PrintStream printStream)
throws ParameterParseException, PreflightingToolException
{
// retrieve warning level and verbosity level so that everything is
// set before the application actually runs
List<Parameter> parametersCopy = new ArrayList<Parameter>(parameters);
// Reset the boolean just to make sure that files are not deleted only
// when the user passes the appropriate argument
validationManager.setDeleteApkTempFolder(true);
for (Parameter param : parametersCopy)
{
String parameterType = param.getParameterType();
// Check for the hidden keepTempFiles parameter
if (parameterType.equals(KEEP_TEMP_FILES))
{
validationManager.setDeleteApkTempFolder(false);
parameters.remove(param);
}
// ignore "-wx", check only for "-wN" parameters (and "-vN")
else if (!InputParameter.WARNING_TO_ERROR.getAlias().equals(parameterType)
&& (parameterType.startsWith(VERBOSITY_FLAG) || parameterType
.startsWith(WARNING_FLAG)))
{
if (param.getValue() != null)
{
throw new ParameterParseException(NLS.bind(
PreflightingNLS.ApplicationParameterInterpreter_V_W_PARAMETER_ERROR,
parameterType));
}
if (parameterType.startsWith(VERBOSITY_FLAG))
{
VerboseLevel verboseLevel = DebugVerboseOutputter.DEFAULT_VERBOSE_LEVEL;
try
{
// if the value passed is not a valid enum value, an
// IllegalArgumentException
// will be thrown
verboseLevel =
VerboseLevel.valueOf(VerboseLevel.class, parameterType.trim());
DebugVerboseOutputter.setCurrentVerboseLevel(verboseLevel);
}
catch (Exception e)
{
throw new ParameterParseException(
PreflightingNLS.ApplicationParameterInterpreter_InvalidVerbosityLevel);
}
}
else if (parameterType.startsWith(WARNING_FLAG))
{
WarningLevel warningLevel = WarningLevelFilter.DEFAULT_WARNING_LEVEL;
try
{
// if the value passed is not a valid enum value, an
// IllegalArgumentException
// will be thrown
warningLevel =
WarningLevel.valueOf(WarningLevel.class, parameterType.trim());
}
catch (Exception e)
{
throw new ParameterParseException(
PreflightingNLS.ApplicationParameterInterpreter_InvalidWarningLevel);
}
WarningLevelFilter.setCurrentWarningLevel(warningLevel);
}
// remove from original list so it is not passed along
parameters.remove(param);
}
}
return checkHelpParameter(parameters, validationManager, printStream)
|| checkListParameters(parameters, validationManager, printStream)
|| checkDaemonParameter(parameters);
}
public static void validateOutputParam(String paramValue) throws ParameterParseException
{
if (paramValue != null)
{
if (!OutputterFactory.getInstance().isOutputterAvailable(paramValue).isOK())
{
throw new ParameterParseException(PreflightingNLS.bind(
PreflightingNLS.ApplicationParameterInterpreter_OutputParam, paramValue));
}
}
else
{
throw new ParameterParseException(PreflightingNLS.bind(
PreflightingNLS.ApplicationParameterInterpreter_OutputParam, ""));
}
}
private static boolean checkDaemonParameter(List<Parameter> parameters)
throws ParameterParseException, PreflightingToolException
{
boolean hasDaemonParameter = false;
Parameter pDaemon = getParameter(parameters, PARAM_DAEMON);
Parameter pSDK = getParameter(parameters, InputParameter.SDK_PATH.getAlias());
Parameter pDebug = getParameter(parameters, PARAM_DEBUG);
String sdkPath = (pSDK == null ? null : pSDK.getValue());
if (pDaemon != null)
{
hasDaemonParameter = true;
int serverPort = Daemon.DEFAULT_PORT;
if (pDaemon.getValue() != null)
{
try
{
serverPort = Integer.parseInt(pDaemon.getValue());
}
catch (NumberFormatException nfe)
{
throw new ParameterParseException(NLS.bind(
PreflightingNLS.ApplicationParameterInterpreter_InvalidPort,
pDaemon.getValue()));
}
}
else
{
DebugVerboseOutputter.printVerboseMessage(NLS.bind(
PreflightingNLS.ApplicationParameterInterpreter_UsingDefaultPort,
Daemon.DEFAULT_PORT), VerboseLevel.v0);
}
if (sdkPath != null)
{
ValidationResultData resultData = new ValidationResultData();
GlobalInputParamsValidator.validateSdkParam(resultData, sdkPath);
if (resultData.getSeverity() != SEVERITY.OK)
{
throw new ParameterParseException(resultData.getIssueDescription());
}
}
try
{
Daemon daemon = new Daemon(serverPort, sdkPath);
//The first connection test goes to console instead of nullStream
daemon.setDebugOn(true);
daemon.startDaemon();
//wait for daemon to bound port
Thread.sleep(Daemon.BOUND_TIMEOUT);
daemon.testDaemon();
// set debug true if the -debugDaemon is passed
daemon.setDebugOn(pDebug != null);
//never exits
daemon.join();
}
catch (Exception e)
{
throw new PreflightingToolException(e.getMessage(), e);
}
}
return hasDaemonParameter;
}
private static boolean checkListParameters(List<Parameter> parameters,
ValidationManager validationManager, PrintStream printStream)
throws ParameterParseException
{
boolean hasListParameter = false;
Parameter p = getParameter(parameters, PARAM_LIST_CHECKERS);
if (p != null)
{
hasListParameter = true;
List<CheckerDescription> checkers = validationManager.getCheckersDescription();
HelpPrinter.printCheckersList(checkers, printStream);
}
p = getParameter(parameters, PARAM_LIST_DEVICES);
if (p != null)
{
hasListParameter = true;
List<Value> devices = validationManager.getDevicesInfoList();
HelpPrinter.printDevicesList(devices, printStream);
}
p = getParameter(parameters, PARAM_DESC_DEVICE);
if (p != null)
{
hasListParameter = true;
String deviceId = p.getValue();
if (deviceId == null)
{
throw new ParameterParseException(PreflightingNLS.bind(
PreflightingNLS.CommandLineInputProcessor_IncorrectSyntax,
p.getParameterType()));
}
String deviceDescription = validationManager.getDeviceDescription(deviceId);
HelpPrinter.printDevicesDescription(deviceDescription, deviceId, printStream);
}
return hasListParameter;
}
private static boolean checkHelpParameter(List<Parameter> parameters,
ValidationManager validationManager, PrintStream printStream)
{
boolean hasHelpParam = false;
Parameter p = getParameter(parameters, PARAM_HELP);
if (p != null)
{
hasHelpParam = true;
List<ParameterDescription> paramsDescr = null;
if (p.getValue() != null)
{
CheckerExtension checkerExt = ValidationManager.getCheckerExtension(p.getValue());
if (checkerExt == null)
{
printStream
.print(PreflightingNLS.ApplicationParameterInterpreter_CheckerNotFound
+ p.getValue() + "\n\n"); //$NON-NLS-1$
paramsDescr = getAllParams(validationManager);
HelpPrinter.printHelp(printStream, paramsDescr, true);
}
else
{
// informed CHECKERID, print the description from the
// extension point declaration and print the parameters
// returned by the checker itself.
paramsDescr = validationManager.getParametersDescription(p.getValue());
// HelpPrinter.printHelp(paramsDescr, false);
HelpPrinter.printHelpChecker(printStream, checkerExt);
}
}
else
{
paramsDescr = getAllParams(validationManager);
HelpPrinter.printHelp(printStream, paramsDescr, true);
}
}
return hasHelpParam;
}
private static List<ParameterDescription> getAllParams(ValidationManager validationManager)
{
List<ParameterDescription> paramsDescr = new ArrayList<ParameterDescription>();
if (validationManager.getParametersDescription(null) != null)
{
paramsDescr.addAll(validationManager.getParametersDescription(null));
}
if (OutputterFactory.getInstance().getParameterDescriptions() != null)
{
paramsDescr.addAll(OutputterFactory.getInstance().getParameterDescriptions());
}
// TODO Confirm if it can be removed and also remove ununsed methods
/*
* paramsDescr.add(createHelpDescription());
* paramsDescr.add(createListDescription());
*/
ParameterDescription listCheckersDesc = new ParameterDescription();
listCheckersDesc.setDefaultValue(null);
listCheckersDesc.setName(PARAM_LIST_CHECKERS);
listCheckersDesc
.setDescription(PreflightingNLS.ApplicationParameterInterpreter_ListAvailableCheckersMessage);
paramsDescr.add(listCheckersDesc);
ParameterDescription listDevDesc = new ParameterDescription();
listDevDesc.setDefaultValue(null);
listDevDesc.setName(PARAM_LIST_DEVICES);
listDevDesc
.setDescription(PreflightingNLS.ApplicationParameterInterpreter_ListAvailableDevicesMessage);
paramsDescr.add(listDevDesc);
ParameterDescription describeDevice = new ParameterDescription();
describeDevice.setDefaultValue(null);
describeDevice.setName(PARAM_DESC_DEVICE);
describeDevice.setValueDescription("[DEV]");//$NON-NLS-1$
describeDevice
.setDescription(PreflightingNLS.ApplicationParameterInterpreter_DescribeDeviceMessage);
paramsDescr.add(describeDevice);
ParameterDescription helpDesc = new ParameterDescription();
helpDesc.setName(PARAM_HELP);
helpDesc.setDescription(PreflightingNLS.ApplicationParameterInterpreter_HelpMessage);
helpDesc.setValueDescription("[CHK]");//$NON-NLS-1$
helpDesc.setType(ParameterType.STRING);
paramsDescr.add(helpDesc);
ParameterDescription verbosityDesc = new ParameterDescription();
verbosityDesc.setName(PARAM_VERBOSITY);
verbosityDesc
.setDescription(PreflightingNLS.ApplicationParameterInterpreter_ParameterVerbosityDescription);
paramsDescr.add(verbosityDesc);
ParameterDescription warningDesc = new ParameterDescription();
warningDesc.setName(PARAMETER_WARNING);
warningDesc
.setDescription(PreflightingNLS.ApplicationParameterInterpreter_ParameterWarningDescription);
paramsDescr.add(warningDesc);
return paramsDescr;
}
public static Parameter getParameter(List<Parameter> parameters, String parameter)
{
Parameter param = null;
Iterator<Parameter> it = parameters.iterator();
while (it.hasNext() && (param == null))
{
Parameter p = it.next();
if (p.getParameterType().compareTo(parameter) == 0)
{
param = p;
}
}
return param;
}
}