/* * This software is distributed under the terms of the FSF * Gnu Lesser General Public License (see lgpl.txt). * * This program is distributed WITHOUT ANY WARRANTY. See the * GNU General Public License for more details. */ package com.scooterframework.tools.signon; import java.io.File; import java.util.HashMap; import java.util.Map; import com.scooterframework.admin.ApplicationConfig; import com.scooterframework.tools.common.AbstractGenerator; import com.scooterframework.tools.common.AmbiguousAppNameException; import com.scooterframework.tools.common.Generator; import com.scooterframework.tools.common.ToolsUtil; /** * This is the main class of signon generator. * * <p> * Usage examples: * <pre> Usage: java -jar tools/generate-signon.jar [app_path] [custom signon controller name] Examples: This page: java -jar tools/generate-signon.jar -help Generate scaffold controller and views of signon for blog app: java -jar tools/generate-signon.jar blog Generate scaffold controller and views of signon for blog app in user home directory: java -jar tools/generate-signon.jar /home/john/projects/blog Generate scaffold controller and views of signon for blog app, and blog is the only app under webapps: java -jar tools/generate-signon.jar Generate scaffold controller and views of signon with admin as controller name: java -jar tools/generate-signon.jar blog admin * </pre> * </p> * * @author (Fei) John Chen */ public class SignonGenerator { /** * @param args */ public static void main(String[] args) { if (args.length > 2 || args.length == 1 && args[0].equalsIgnoreCase("-help")) { usage(); return; } try { doTheWork(args); } catch(AmbiguousAppNameException ax) { log("ERROR ERROR ERROR: " + ax.getMessage()); return; } catch(Throwable ex) { ex.printStackTrace(); log("ERROR ERROR ERROR: " + ex.getMessage()); } if (AbstractGenerator.frameworkInitiated) ApplicationConfig.configInstanceForApp().endApplication(); } private static void doTheWork(String[] args) throws Throwable { String signonControllerName = "signon"; String scooterHome = ToolsUtil.setSystemProperty("scooter.home", ToolsUtil.detectRootPath()); String defaultWebappsName = ToolsUtil.setSystemProperty("webapps.name", "webapps"); String appName = ""; String webappsPath = ""; String webappPath = ""; if (args.length == 0) {//use implicit app name webappsPath = scooterHome + File.separator + defaultWebappsName; appName = ToolsUtil.detectImplicitAppName(webappsPath); webappPath = webappsPath + File.separator + appName; } else if (args.length > 0) { String firstArg = args[0]; if (ToolsUtil.containsPath(firstArg)) { String[] ss = ToolsUtil.getPathAndName(firstArg); webappsPath = ss[0]; webappPath = ss[1]; appName = ss[2]; } else { appName = firstArg; webappsPath = scooterHome + File.separator + defaultWebappsName; webappPath = webappsPath + File.separator + appName; } if (args.length == 2) { signonControllerName = args[1].toLowerCase(); } } appName = appName.toLowerCase(); System.setProperty("app.name", appName); webappsPath = ToolsUtil.setSystemProperty("webapps.path", webappsPath); ToolsUtil.validatePathExistence(webappsPath); webappPath = ToolsUtil.setSystemProperty("app.path", webappPath); ToolsUtil.validatePathExistence(webappPath); String appLogs = ToolsUtil.setSystemProperty("app.logs", (scooterHome + File.separator + "logs")); ToolsUtil.validatePathExistence(appLogs); String classFiles = webappPath + File.separator + "WEB-INF" + File.separator + "classes"; System.setProperty(ApplicationConfig.SYSTEM_KEY_CLASSFILE, classFiles); ToolsUtil.validatePathExistence(classFiles); String propertyFiles = webappPath + File.separator + "WEB-INF" + File.separator + "config"; System.setProperty(ApplicationConfig.SYSTEM_KEY_PROPERTYFILE, propertyFiles); ToolsUtil.validatePathExistence(propertyFiles); String sourceFiles = webappPath + File.separator + "WEB-INF" + File.separator + "src"; System.setProperty(ApplicationConfig.SYSTEM_KEY_SOURCEFILE, sourceFiles); ToolsUtil.validatePathExistence(sourceFiles); String referenceFiles = scooterHome + File.separator + "lib"; System.setProperty(ApplicationConfig.SYSTEM_KEY_REFERENCEFILE, referenceFiles); ToolsUtil.validatePathExistence(referenceFiles); String pluginFiles = scooterHome + File.separator + "plugins"; System.setProperty(ApplicationConfig.SYSTEM_KEY_PLUGINFILE, pluginFiles); ToolsUtil.validatePathExistence(pluginFiles); String targetDir = webappPath; log("Generating code for app named " + appName + ":"); log("scooter.home: " + scooterHome); log("Target dir: " + targetDir); //create all properties Map<String, String> allProps = new HashMap<String, String>(); allProps.put("scooter.home", scooterHome); allProps.put("webapps.path", webappsPath); allProps.put("app.path", webappPath); allProps.put("app.name", appName); String templateRoot = scooterHome + File.separator + "source" + File.separator + "templates"; String vliPath = templateRoot + File.separator + "view" + File.separator + "security" + File.separator + "login.tmpl"; Generator vli = new ViewLoginGenerator(vliPath, allProps, signonControllerName, "login"); vli.generate(); String vloPath = templateRoot + File.separator + "view" + File.separator + "security" + File.separator + "logout.tmpl"; Generator vlo = new ViewLogoutGenerator(vloPath, allProps, signonControllerName, "logout"); vlo.generate(); String vmaPath = templateRoot + File.separator + "view" + File.separator + "security" + File.separator + "signon_main.tmpl"; Generator vma = new ViewMainGenerator(vmaPath, allProps, signonControllerName, "main"); vma.generate(); String scPath = templateRoot + File.separator + "controller" + File.separator + "SignonController.tmpl"; Generator sc = new ControllerSignonGenerator(scPath, allProps, signonControllerName); sc.generate(); String shdPath = templateRoot + File.separator + "view" + File.separator + "security" + File.separator + "header.tmpl"; Generator shd = new SecureHeaderGenerator(shdPath, allProps); shd.generate(); String sdePath = templateRoot + File.separator + "view" + File.separator + "security" + File.separator + "decorators.xml.tmpl"; Generator sde = new SecureXMLDecoratorGenerator(sdePath, allProps); sde.generate(); } private static void log(Object o) { System.out.println(o); } private static void usage() { log("Summary:"); log(" This is a utility that generates signon codes."); log(""); log("Usage:"); log(" java -jar tools/generate-signon.jar [app_path] [custom signon controller name]"); log(""); log("Examples:"); log(" This page:"); log(" java -jar tools/generate-signon.jar -help"); log(""); log(" Generate scaffold controller and views of signon for blog app:"); log(" java -jar tools/generate-signon.jar blog"); log(""); log(" Generate scaffold controller and views of signon for blog app in user home directory:"); log(" java -jar tools/generate-signon.jar /home/john/projects/blog"); log(""); log(" Generate scaffold controller and views of signon for blog app, and blog is the only app under webapps:"); log(" java -jar tools/generate-signon.jar"); log(""); log(" Generate scaffold controller and views of signon with admin as controller name:"); log(" java -jar tools/generate-signon.jar blog admin"); log(""); } }