/** * Copyright (c) 1997, 2015 by ProSyst Software GmbH and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html */ package org.eclipse.smarthome.automation.internal.commands; /** * This class is base for all automation commands. It defines common functionality for an automation command. Each class * of commands is responsible for a group of commands, that are equivalent but each of them is related to a different * provider. * * @author Ana Dimova - Initial Contribution * */ public abstract class AutomationCommand { /** * This constant is used as a part of the string representing understandable for the user message containing * information for the success of the command. */ protected static final String SUCCESS = "SUCCESS"; /** * This constant is used as a part of the string representing understandable for the user message containing * information for the failure of the command. */ protected static final String FAIL = "FAIL"; /** * This constant is used for detection of <tt>PrintStackTrace</tt> option. If some of the parameters of the command * is equal to this constant, then the option is present. */ protected static final String OPTION_ST = "-st"; /** * This field is an indicator of presence of <tt>PrintStackTrace</tt> option. Its value is <b>true</b> if the * option is present and <b>false</b> in the opposite case. */ protected boolean st = false; /** * This field keeps the result of parsing the parameters and options of the command. */ protected String parsingResult; /** * This field keeps the identifier of the command because each class of commands is responsible for a group * of commands. */ protected String command; /** * This field keeps information about which provider is responsible for execution of the command. */ protected int providerType; /** * This field keeps a reference to the particular implementation of the <tt>AutomationCommandsPluggable</tt>. */ protected AutomationCommandsPluggable autoCommands; /** * This constructor is responsible for initializing the common properties for each automation command. * * @param command is the identifier of the command. * @param parameterValues is an array of strings which are basis for initializing the options and parameters of the * command. The order for their description is a random. * @param providerType is which provider is responsible for execution of the command. * @param autoCommands a reference to the particular implementation of the <tt>AutomationCommandsPluggable</tt>. */ public AutomationCommand(String command, String[] parameterValues, int providerType, AutomationCommandsPluggable autoCommands) { this.command = command; this.providerType = providerType; this.autoCommands = autoCommands; parsingResult = parseOptionsAndParameters(parameterValues); } /** * This method is common for all automation commands and it is responsible for execution of every particular * command. * * @return a string representing understandable for the user message containing information on the outcome of the * command. */ public abstract String execute(); /** * This method is responsible for processing the <tt>st</tt> option of the command. * * @param e is the exception appeared during the command's execution. * @return a string representing the exception, corresponding to availability of the <tt>st</tt> option. */ protected String getStackTrace(Exception e) { StringBuilder writer = new StringBuilder(); if (st) { StackTraceElement[] ste = e.getStackTrace(); for (int i = 0; i < ste.length; i++) { if (i == 0) { writer.append(String.format("FAIL : %s", ste[i].toString() + "\n")); } else { writer.append(String.format("%s", ste[i].toString() + "\n")); } } } else { writer.append(String.format("FAIL : %s", e.getMessage() + "\n")); } return writer.toString(); } /** * This method is used to determine the options and parameters for every particular command. If there are redundant * options and parameters or the required are missing the execution of the command will be ended and the parsing * result will be returned as a result of the command. * * @param parameterValues is an array of strings which are basis for initializing the options and parameters of the * command. The order for their description is a random. * @return a string representing understandable for the user message containing information on the outcome of the * parsing the parameters and options. */ protected abstract String parseOptionsAndParameters(String[] parameterValues); }