package com.adaptrex.tools.command;
import java.io.File;
import java.io.IOException;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.ParseException;
import com.adaptrex.tools.Tools;
import com.adaptrex.tools.environment.IEnvironmentService;
import com.adaptrex.tools.framework.javascript.JavaScriptFramework;
import com.adaptrex.tools.log.ILogService;
import com.adaptrex.tools.webapp.IGenerateService;
import com.adaptrex.tools.webapp.IWebappService;
import com.adaptrex.tools.webapp.Webapp;
import com.google.inject.Inject;
import freemarker.template.TemplateException;
public class Generate extends Command {
private static final String WEBAPP_USAGE = "adaptrex generate webapp -p <path> -n <name> " +
"[-g <global-folder>] [-G <global-namespace>] " +
"-b <base-package> -a <adaptrex-js> [-e <extjs> -s <sencha-touch>] " +
"-v <presentation> -o <orm> -d <dependency-injection>" +
"[-t <ext-theme>] [-T <sencha-touch-theme>]";
private static final String PAGE_USAGE = "adaptrex generate page [-p <path>] " +
"[-n <name>] [-a <adaptrex-js>] [-e <extjs>] [-s <sencha-touch>]";
private IGenerateService generateService;
@Inject
public Generate(ICommandService commandService, ILogService logService, IGenerateService generateService,
IEnvironmentService environmentService, IWebappService webappService) throws ParseException,
IOException {
super(commandService, logService, environmentService, webappService);
this.generateService = generateService;
}
public void run() throws ParseException, IOException, TemplateException {
String target = commandService.getTarget();
if (target.equals("webapp")) generateWebapp();
else if (target.equals("page")) generatePage();
}
/*
* adaptrex generate page
*/
private void generatePage() throws ParseException, IOException, TemplateException {
setGeneratePageOptions();
cl = commandService.parseCommands(PAGE_USAGE);
commandService.requireOptions(PAGE_USAGE, "P", "N", "f");
Webapp webapp = commandService.getWebapp();
String pagePath = cl.getOptionValue("P");
String namespace = cl.getOptionValue("N");
String framework = cl.getOptionValue("f");
generateService.generatePage(webapp, pagePath, namespace, framework);
commandService.printLog();
}
/*
* adaptrex generate webapp
*/
private void generateWebapp() throws ParseException, IOException, TemplateException {
setGenerateWebappOptions();
cl = commandService.parseCommands(WEBAPP_USAGE);
commandService.requireOptions(WEBAPP_USAGE, "p", "n", "a", "b");
if (!cl.hasOption("e") && !cl.hasOption("s")) {
commandService.log("Error", "Missing Option",
"You must specify at least one of the required ExtJS or Sencha Touch frameworks");
commandService.printLog();
return;
}
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);
String name = cl.getOptionValue("n");
String pkg = cl.getOptionValue("b");
String adaptrexFolder = cl.getOptionValue("a");
String extFolder = cl.getOptionValue("e");
String stFolder = cl.getOptionValue("s");
String orm = cl.getOptionValue("o", "jpa");
String pres = cl.getOptionValue("v", "jsp");
String di = cl.getOptionValue("d");
String globalNamespace = cl.getOptionValue("G");
String globalFolder = cl.getOptionValue("g");
String extTheme = cl.getOptionValue("t");
String senchaTouchTheme = cl.getOptionValue("T");
String reserved = Tools.hasReservedWord(pkg);
if (reserved != null) {
commandService.log("Error", "Package contains reserved word (" + reserved + ")",
"Your base-package cannot contain a java reserved word.");
commandService.printLog();
return;
}
/*
* Get default frameworks
*/
if (adaptrexFolder == null) adaptrexFolder = JavaScriptFramework.DEFAULT;
if (cl.hasOption("e") && extFolder == null) extFolder = JavaScriptFramework.DEFAULT;
if (cl.hasOption("s") && stFolder == null) stFolder = JavaScriptFramework.DEFAULT;
generateService.generateWebapp(
name, path, pkg, globalNamespace, globalFolder,
adaptrexFolder, extFolder, stFolder, orm, pres, di,
extTheme, senchaTouchTheme);
commandService.printLog();
}
/*
* "adaptrex generate page" options
*/
private void setGeneratePageOptions() {
Option p = new Option("p", "webapp-path", true, "Path of the webapp to generate a new page for");
p.setArgName("webapp-path");
p.setOptionalArg(true);
options.addOption(p);
Option pg = new Option("P", "page-path", true, "Path of the page to generate");
pg.setArgName("page-path");
options.addOption(pg);
Option ns = new Option("N", "namespace", true, "The namespace of the page to generate");
ns.setArgName("namespace");
options.addOption(ns);
Option f = new Option("f", "framework", true, "The framework to use for this page (ext-js or sencha-touch)");
f.setArgName("namespace");
f.setOptionalArg(true);
options.addOption(f);
}
/*
* "adaptrex generate webapp" options
*/
private void setGenerateWebappOptions() {
Option p = new Option("p", "webapp-path", true, "Path of the new webapp to generate");
p.setArgName("webapp-path");
options.addOption(p);
Option n = new Option("n", "name", true, "The name of the webapp to create");
n.setArgName("name");
options.addOption(n);
Option t = new Option("t", "ext-theme", true, "Copy an ExtJS theme to the webapp");
t.setArgName("ext-theme");
options.addOption(t);
Option st = new Option("T", "sencha-touch-theme", true, "Copy a Sencha Touch theme to the webapp");
st.setArgName("sencha-touch-theme");
options.addOption(st);
Option b = new Option("b", "base-package", true, "The base java package for the webapp");
b.setArgName("base-package");
options.addOption(b);
Option a = new Option("a", "adaptrex-js", true, "The adaptrex-js folder for the webapp");
a.setArgName("adaptrex-js");
options.addOption(a);
Option e = new Option("e", "extjs", true, "The extjs folder for the webapp");
e.setArgName("extjs");
e.setOptionalArg(true);
options.addOption(e);
Option s = new Option("s", "sencha-touch", true, "The sencha-touch folder for the webapp");
s.setArgName("sencha-touch");
s.setOptionalArg(true);
options.addOption(s);
Option o = new Option("o", "orm", true, "The ORM framework to use for the webapp");
o.setArgName("orm");
o.setOptionalArg(true);
options.addOption(o);
Option v = new Option("v", "presentation", true, "The presentation framework to use for the webapp");
v.setArgName("presentation");
v.setOptionalArg(true);
options.addOption(v);
Option d = new Option("d", "di", true, "The dependency injection framework to use for the webapp");
d.setArgName("di");
options.addOption(d);
Option g = new Option("g", "common-folder", true, "The path to the folder containing common classes");
g.setArgName("common-folder");
options.addOption(g);
Option gn = new Option("G", "common-namespace", true, "The namespace to use for common classes");
gn.setArgName("common-namespace");
options.addOption(gn);
}
}