package com.adaptrex.tools.command;
import static com.adaptrex.tools.Tools.CR;
import java.io.File;
import java.io.IOException;
import java.util.List;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.GnuParser;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
import org.apache.commons.cli.UnrecognizedOptionException;
import org.apache.commons.lang3.StringUtils;
import com.adaptrex.tools.Tools;
import com.adaptrex.tools.environment.IEnvironmentService;
import com.adaptrex.tools.framework.javascript.IDownloadService;
import com.adaptrex.tools.log.ILogService;
import com.adaptrex.tools.log.Log;
import com.adaptrex.tools.webapp.IWebappService;
import com.adaptrex.tools.webapp.Webapp;
import com.google.common.base.Strings;
import com.google.inject.Inject;
import com.google.inject.Singleton;
@Singleton
public class CommandService implements ICommandService {
private IEnvironmentService environmentService;
private ILogService logService;
private String target;
private String[] args;
private Options options;
private CommandLineParser parser;
private CommandLine cl;
@Inject
public CommandService(IEnvironmentService environmentService, IDownloadService downloadService,
IWebappService webappService, ILogService logService) {
this.environmentService = environmentService;
this.logService = logService;
}
public boolean initialize(String verb, String target, String[] args) throws IOException {
this.target = target;
this.args = args;
this.options = new Options();
this.parser = new GnuParser();
boolean suppressInitError =
verb.equals("install") ||
(verb.equals("configure") && target.equals("environment"));
boolean goodEnv = environmentService.initializeEnvironment(suppressInitError);
printLog();
return goodEnv;
}
@Override
public String getTarget() {
return this.target;
}
@Override
public String[] getArgs() {
return this.args;
}
@Override
public CommandLineParser getParser() {
return this.parser;
}
@Override
public Options getOptions() {
return this.options;
}
/*
* Parse commands
*/
public CommandLine parseCommands(String usage) throws ParseException {
try {
this.cl = parser.parse(options, args);
return this.cl;
} catch (UnrecognizedOptionException e) {
throw new AdaptrexInvalidOptionException(usage, options, e.getOption());
}
}
/*
* Add webapp options
*/
public void addWebappOptions() {
Option p = new Option("p", "path", true, "The full system path to the webapp");
p.setArgName("path");
options.addOption(p);
}
/*
* Add framework options
*/
public void addFrameworkOptions() {
Option a = new Option("a", "adaptrex-js", true,
"Set the AdaptrexJS folder for this webapp, if the environment contains only one " +
"AdaptrexJS folder, it will be automatically selected");
a.setArgName("adaptrex-js");
a.setOptionalArg(true);
options.addOption(a);
Option e = new Option("e", "extjs", true,
"Set the ExtJS folder for this webapp, if the environment contains only one " +
"ExtJS folder, it will be automatically selected");
e.setArgName("extjs");
e.setOptionalArg(true);
options.addOption(e);
Option s = new Option("s", "sencha-touch", true,
"Set the Sencha Touch folder for this webapp, if the environment contains only one " +
"Sencha Touch folder, it will be automatically selected");
s.setArgName("sencha-touch");
s.setOptionalArg(true);
options.addOption(s);
}
public Webapp getWebapp() {
Webapp webapp = null;
if (cl.hasOption("p")) {
String path = cl.getOptionValue("p");
if (!path.contains(Tools.SLASH)){
File curDirectory = new File (".");
String curPath = curDirectory.getAbsolutePath();
if (curPath.endsWith(".")) curPath = curPath.substring(0, curPath.length()-1);
if (!curPath.endsWith(Tools.SLASH)) curPath += "/";
path = curPath + path;
}
if (path.endsWith(Tools.SLASH)) path = path.substring(0, path.length()-1);
webapp = environmentService.getWebapp(path, true);
} else {
File directory = new File (".");
String path = directory.getAbsolutePath().replace(".", "");
if (path.endsWith(Tools.SLASH)) path = path.substring(0, path.length()-1);
webapp = environmentService.getWebapp(path, true);
if (webapp == null) {
path = path.replace(Tools.SLASH + "src" + Tools.SLASH + "main" + Tools.SLASH + "webapp", "");
webapp = environmentService.getWebapp(path, true);
}
}
printLog();
return webapp;
}
public void requireOptions(String usage, String... requiredOptions)
throws AdaptrexCommandMissingOptionException {
for (String o : requiredOptions) {
if (!cl.hasOption(o))
throw new AdaptrexCommandMissingOptionException(usage, options);
}
}
public void requireOneOption(String usage, String... requiredOptions)
throws AdaptrexCommandMissingOptionException {
for (String o : requiredOptions) {
if (cl.hasOption(o)) return;
}
throw new AdaptrexCommandMissingOptionException(usage, options);
}
/*
* Print environment log and clear items
*/
public void printLog() {
List<Log> logList = logService.getLog();
for (Log log : logList) printLog(log);
logList.clear();
}
/*
* Print single log entry
*/
public void printLog(Log log) {
String msg = "[" + Strings.padEnd(log.getLogType(), 7, ' ') + "] " + log.getTitle();
if (log.getMessage() != null) {
System.out.println("");
String shortHR = StringUtils.repeat("-", log.getTitle().length() + 15);
msg += CR + shortHR + CR +
log.getMessage() + CR + shortHR + CR;
}
System.out.println(msg);
}
/*
* Simple logging method
*/
public void log(String logType, String title, String message) {
printLog(new Log(logType, title, message));
}
}