/**
* 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;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import org.eclipse.smarthome.automation.Rule;
/**
* This class provides common functionality of commands:
* <ul>
* <li>{@link AutomationCommands#REMOVE_MODULE_TYPES}
* <li>{@link AutomationCommands#REMOVE_TEMPLATES}
* <li>{@link AutomationCommands#REMOVE_RULES}
* <li>{@link AutomationCommands#REMOVE_RULE}
* </ul>
*
* @author Ana Dimova - Initial Contribution
* @author Kai Kreuzer - fixed feedback when deleting non-existent rule
* @author Marin Mitev - removed prefixes in the output
*
*/
public class AutomationCommandRemove extends AutomationCommand {
/**
* This field keeps the UID of the {@link Rule} if command is {@link AutomationCommands#REMOVE_RULE}
*/
private String id;
/**
* This field keeps URL of the source of automation objects that has to be removed.
*/
private URL url;
/**
* @see AutomationCommand#AutomationCommand(String, String[], int, AutomationCommandsPluggable)
*/
public AutomationCommandRemove(String command, String[] params, int providerType,
AutomationCommandsPluggable autoCommands) {
super(command, params, providerType, autoCommands);
}
/**
* This method is responsible for execution of commands:
* <ul>
* <li>{@link AutomationCommands#REMOVE_MODULE_TYPES}
* <li>{@link AutomationCommands#REMOVE_TEMPLATES}
* <li>{@link AutomationCommands#REMOVE_RULES}
* <li>{@link AutomationCommands#REMOVE_RULE}
* </ul>
*/
@Override
public String execute() {
if (parsingResult != SUCCESS) {
return parsingResult;
}
switch (providerType) {
case AutomationCommands.MODULE_TYPE_PROVIDER:
return autoCommands.remove(AutomationCommands.MODULE_TYPE_PROVIDER, url);
case AutomationCommands.TEMPLATE_PROVIDER:
return autoCommands.remove(AutomationCommands.TEMPLATE_PROVIDER, url);
case AutomationCommands.RULE_PROVIDER:
if (command == AutomationCommands.REMOVE_RULE) {
return autoCommands.removeRule(id);
} else if (command == AutomationCommands.REMOVE_RULES) {
return autoCommands.removeRules(id);
}
}
return FAIL;
}
/**
* This method serves to create an {@link URL} object or {@link File} object from a string that is passed as
* a parameter of the command. From the {@link File} object the URL is constructed.
*
* @param parameterValue is a string that is passed as parameter of the command and it supposed to be an URL
* representation.
* @return an {@link URL} object created from the string that is passed as parameter of the command or <b>null</b>
* if either no legal protocol could be found in the specified string or the string could not be parsed.
*/
private URL initURL(String parameterValue) {
try {
return new URL(parameterValue);
} catch (MalformedURLException mue) {
File f = new File(parameterValue);
if (f.isFile()) {
try {
return f.toURI().toURL();
} catch (MalformedURLException e) {
}
}
}
return null;
}
/**
* This method is invoked from the constructor to parse all parameters and options of the command <b>REMOVE</b>.
* If there are redundant parameters or options or the required are missing the result will be the failure of the
* command. This command has:
* <ul>
* <b>Options:</b>
* <ul>
* <li><b>PrintStackTrace</b> is common for all commands and its presence triggers printing of stack trace in case
* of exception.
* </ul>
* </ul>
* <ul>
* <b>Parameters:</b>
* <ul>
* <li><b>id</b> is required for {@link AutomationCommands#REMOVE_RULE} command. If it is present for all
* <b>REMOVE</b> commands, except {@link AutomationCommands#REMOVE_RULE}, it will be treated as redundant.
* <li><b>url</b> is required for all <b>REMOVE</b> commands, except {@link AutomationCommands#REMOVE_RULE}.
* If it is present for {@link AutomationCommands#REMOVE_RULE}, it will be treated as redundant.
* </ul>
* </ul>
*/
@Override
protected String parseOptionsAndParameters(String[] parameterValues) {
boolean getUrl = true;
boolean getId = true;
if (providerType == AutomationCommands.RULE_PROVIDER) {
getUrl = false;
} else {
getId = false;
}
for (int i = 0; i < parameterValues.length; i++) {
if (null == parameterValues[i]) {
continue;
}
if (parameterValues[i].equals(OPTION_ST)) {
st = true;
} else if (parameterValues[i].charAt(0) == '-') {
return String.format("Unsupported option: %s", parameterValues[i]);
} else if (getUrl) {
url = initURL(parameterValues[i]);
if (url != null) {
getUrl = false;
}
} else if (getId) {
id = parameterValues[i];
if (id != null) {
getId = false;
}
} else {
return String.format("Unsupported parameter: %s", parameterValues[i]);
}
}
if (getUrl) {
return "Missing source URL parameter!";
}
if (getId) {
return "Missing UID parameter!";
}
return SUCCESS;
}
}