/** * 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.util.Collection; import java.util.HashSet; import java.util.Locale; import java.util.Set; import org.eclipse.smarthome.automation.parser.Parser; /** * This class provides common functionality of commands: * <ul> * <li>{@link AutomationCommands#EXPORT_MODULE_TYPES} * <li>{@link AutomationCommands#EXPORT_TEMPLATES} * <li>{@link AutomationCommands#EXPORT_RULES} * </ul> * * @author Ana Dimova - Initial Contribution * */ public class AutomationCommandExport extends AutomationCommand { /** * This constant is used for detection of <tt>ParserType</tt> parameter. If some of the parameters of the command * is equal to this constant, then the <tt>ParserType</tt> parameter is present and its value is the next one. */ private static final String OPTION_P = "-p"; /** * This field keeps the value of the <tt>ParserType</tt> parameter and it is initialized as * {@link Parser#FORMAT_JSON} by default. */ private String parserType = Parser.FORMAT_JSON; /** * This field keeps the path of the output file where the automation objects to be exported. */ private File file; /** * This field stores the value of <b>locale</b> parameter of the command. */ private Locale locale = Locale.getDefault(); // For now is initialized with the default locale, but when the // localization is implemented, it will be initialized with a parameter // of the command. /** * @see AutomationCommand#AutomationCommand(String, String[], int, AutomationCommandsPluggable) */ public AutomationCommandExport(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#EXPORT_MODULE_TYPES} * <li>{@link AutomationCommands#EXPORT_TEMPLATES} * <li>{@link AutomationCommands#EXPORT_RULES} * </ul> */ @SuppressWarnings("unchecked") @Override public String execute() { if (parsingResult != SUCCESS) { return parsingResult; } @SuppressWarnings("rawtypes") Set set = new HashSet(); switch (providerType) { case AutomationCommands.MODULE_TYPE_PROVIDER: @SuppressWarnings("rawtypes") Collection collection = autoCommands.getTriggers(locale); if (collection != null) { set.addAll(collection); } collection = autoCommands.getConditions(locale); if (collection != null) { set.addAll(collection); } collection = autoCommands.getActions(locale); if (collection != null) { set.addAll(collection); } try { return autoCommands.exportModuleTypes(parserType, set, file); } catch (Exception e) { return getStackTrace(e); } case AutomationCommands.TEMPLATE_PROVIDER: collection = autoCommands.getTemplates(locale); if (collection != null) { set.addAll(collection); } try { return autoCommands.exportTemplates(parserType, set, file); } catch (Exception e) { return getStackTrace(e); } case AutomationCommands.RULE_PROVIDER: collection = autoCommands.getRules(); if (collection != null) { set.addAll(collection); } try { return autoCommands.exportRules(parserType, set, file); } catch (Exception e) { return getStackTrace(e); } } return String.format("%s : Unsupported provider type!", FAIL); } /** * This method serves to create a {@link File} object from a string that is passed as a parameter of the command. * * @param parameterValue is a string that is passed as parameter of the command and it supposed to be a file * representation. * @return a {@link File} object created from the string that is passed as a parameter of the command or <b>null</b> * if the parent directory could not be found or created or the string could not be parsed. */ private File initFile(String parameterValue) { File f = new File(parameterValue); File parent = f.getParentFile(); if (!parent.isDirectory() && !parent.mkdirs()) { return null; } return f; } /** * This method is invoked from the constructor to parse all parameters and options of the command <b>EXPORT</b>. * If there are redundant parameters or options, or the required parameter is missing the result will be the failure * of the command. This command has: * <ul> * <b>Options:</b> * <ul> * <li><b>PrintStackTrace</b> which is common for all commands * </ul> * </ul> * <ul> * <b>Parameters:</b> * <ul> * <li><b>parserType</b> is optional and by default its value is {@link Parser#FORMAT_JSON}. * <li><b>file</b> is required and specifies the path to the file for export. * </ul> * </ul> */ @Override protected String parseOptionsAndParameters(String[] parameterValues) { boolean getFile = true; 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].equalsIgnoreCase(OPTION_P)) { i++; if (i >= parameterValues.length) { return String.format("The option [%s] should be followed by value for the parser type.", OPTION_P); } parserType = parameterValues[i]; } else if (parameterValues[i].charAt(0) == '-') { return String.format("Unsupported option: {1}", parameterValues[i]); } else if (getFile) { file = initFile(parameterValues[i]); if (file != null) { getFile = false; } } else { return String.format("Unsupported parameter: %s", parameterValues[i]); } } if (getFile) { return "Missing destination file parameter!"; } return SUCCESS; } }