/* Wenity v1.5 - a Zenity clone written in Java Copyright (c) 2012, 2013 Karoly Kalman http://kksw.zzl.org/ This file is part of Wenity v1.5. Wenity v1.5 is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Wenity v1.5 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Wenity v1.5. If not, see <http://www.gnu.org/licenses/>. */ package wenity; import wenity.modules.common.IWenityModule; import wenity.modules.common.ModuleRequest; import wenity.modules.common.ModuleResponse; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.io.Writer; import java.util.Arrays; public class Wenity { // main method: returns exitCode and optionally creates answer file public int doIt (String[] args) { try { final ModuleRequest moduleRequest = parseArgs (args); final IWenityModule module = findModule (moduleRequest.getModuleName ()); if (module == null) { Logger.error ("Can't find module " + moduleRequest.getModuleName ()); return Constants.EXIT_STATUS_APP_ERROR; } final ModuleResponse moduleResponse = executeModule (module, moduleRequest); if (moduleResponse.isValid () && moduleResponse.createsResponseFile ()) { // write response file only if user selected something writeResponseFile (moduleResponse.getResultAsString ()); return Constants.EXIT_STATUS_OK; } return moduleResponse.getResultAsInt (); } catch (Exception ex) { Logger.exception ("Wenity - An error occurred! ", ex); return Constants.EXIT_STATUS_APP_ERROR; } } private ModuleRequest parseArgs (final String[] args) { try { // Usage: [-d] module_name module_parameters final int argsLength = args.length; final int lastArgIdx = argsLength - 1; final boolean hasOptionalParam = Constants.PARAM_VERBOSE.equals (args[0]) || Constants.PARAM_INFO.equals (args[0]); // optional final int moduleNameIdx = hasOptionalParam ? 1 : 0; final String moduleName = args[moduleNameIdx]; final int firstModuleParamIdx = moduleNameIdx + 1; String[] moduleParams = new String[0]; // assume module with no parameters if (firstModuleParamIdx <= lastArgIdx) { // copy module params, if any moduleParams = Arrays.copyOfRange (args, firstModuleParamIdx, argsLength); } Logger.debug ("Processed arguments - module: '%s' parameters: '%s'", moduleName, Arrays.toString (moduleParams)); return new ModuleRequest (moduleName, moduleParams); } catch (final Exception ex) { throw new IllegalArgumentException ("Can't parse program arguments! Reason: " + ex, ex); } } private IWenityModule findModule (String moduleName) { for (final IWenityModule module : ModuleConfig.getInstalledModules ()) { if (module.canProcess (moduleName)) { return module; } } return null; } private ModuleResponse executeModule (IWenityModule module, ModuleRequest moduleRequest) throws Exception { try { Logger.debug ("Executing '%s' with request '%s'", module.getModuleName (), moduleRequest); final ModuleResponse moduleResponse = module.process (moduleRequest); Logger.debug ("Executed '%s' with response '%s'", module.getModuleName (), moduleResponse); return moduleResponse; } catch (Exception ex) { Logger.error ("Failed to execute '%s' with params '%s'", module.getModuleName (), moduleRequest); throw ex; } } private void writeResponseFile (final String data) throws IOException { PrintWriter printWriter = null; BufferedWriter bufferedWriter = null; FileWriter fileWriter = null; try { fileWriter = new FileWriter (Constants.RESPONSE_FILE_NAME); bufferedWriter = new BufferedWriter (fileWriter); printWriter = new PrintWriter (bufferedWriter); printWriter.println (data); } finally { Utils.closeNoThrow (printWriter); Utils.closeNoThrow (bufferedWriter); Utils.closeNoThrow (fileWriter); } } }