package fitnesseMain; import fitnesse.*; import fitnesse.authentication.Authenticator; import fitnesse.authentication.MultiUserAuthenticator; import fitnesse.authentication.OneUserAuthenticator; import fitnesse.authentication.PromiscuousAuthenticator; import fitnesse.components.Logger; import fitnesse.components.PluginsClassLoader; import fitnesse.responders.PageFactory; import fitnesse.responders.ResponderFactory; import fitnesse.responders.WikiImportTestEventListener; import fitnesse.responders.run.formatters.BaseFormatter; import fitnesse.responders.run.formatters.TestTextFormatter; import fitnesse.updates.UpdaterImplementation; import fitnesse.wiki.PageVersionPruner; import util.CommandLine; import java.io.File; public class FitNesseMain { private static String extraOutput; public static boolean dontExitAfterSingleCommand; public static void main(String[] args) throws Exception { Arguments arguments = parseCommandLine(args); if (arguments != null) { launchFitNesse(arguments); } else { printUsage(); System.exit(1); } } public static void launchFitNesse(Arguments arguments) throws Exception { loadPlugins(); FitNesseContext context = loadContext(arguments); Updater updater = null; if (!arguments.isOmittingUpdates()) updater = new UpdaterImplementation(context); PageVersionPruner.daysTillVersionsExpire = arguments .getDaysTillVersionsExpire(); FitNesse fitnesse = new FitNesse(context, updater); updateAndLaunch(arguments, context, fitnesse); } private static void loadPlugins() throws Exception { new PluginsClassLoader().addPluginsToClassLoader(); } static void updateAndLaunch(Arguments arguments, FitNesseContext context, FitNesse fitnesse) throws Exception { if (!arguments.isOmittingUpdates()) fitnesse.applyUpdates(); if (!arguments.isInstallOnly()) { runFitNesse(arguments, context, fitnesse); } } private static void runFitNesse(Arguments arguments, FitNesseContext context, FitNesse fitnesse) throws Exception { boolean started = fitnesse.start(); if (started) { printStartMessage(arguments, context); if (arguments.getCommand() != null) { executeSingleCommand(arguments, fitnesse, context); } } } private static void executeSingleCommand(Arguments arguments, FitNesse fitnesse, FitNesseContext context) throws Exception { context.doNotChunk = true; TestTextFormatter.finalErrorCount = 0; System.out.println("Executing command: " + arguments.getCommand()); System.out.println("-----Command Output-----"); fitnesse.executeSingleCommand(arguments.getCommand(), System.out); System.out.println("-----Command Complete-----"); fitnesse.stop(); if (shouldExitAfterSingleCommand()) { System.exit(TestTextFormatter.finalErrorCount); } } private static boolean shouldExitAfterSingleCommand() { return !dontExitAfterSingleCommand; } private static FitNesseContext loadContext(Arguments arguments) throws Exception { FitNesseContext context = new FitNesseContext(); context.port = arguments.getPort(); context.rootPath = arguments.getRootPath(); ComponentFactory componentFactory = new ComponentFactory(context.rootPath); context.rootDirectoryName = arguments.getRootDirectory(); context.setRootPagePath(); String defaultNewPageContent = componentFactory .getProperty(ComponentFactory.DEFAULT_NEWPAGE_CONTENT); if (defaultNewPageContent != null) context.defaultNewPageContent = defaultNewPageContent; WikiPageFactory wikiPageFactory = new WikiPageFactory(); context.responderFactory = new ResponderFactory(context.rootPagePath); context.logger = makeLogger(arguments); context.authenticator = makeAuthenticator(arguments.getUserpass(), componentFactory); String newPageTheme = componentFactory.getProperty(ComponentFactory.THEME); if (newPageTheme != null) { context.pageTheme = newPageTheme; } context.pageFactory = new PageFactory(context); extraOutput = componentFactory.loadPlugins(context.responderFactory, wikiPageFactory); extraOutput += componentFactory.loadWikiPage(wikiPageFactory); extraOutput += componentFactory.loadResponders(context.responderFactory); extraOutput += componentFactory.loadSymbolTypes(); extraOutput += componentFactory.loadContentFilter(); context.root = wikiPageFactory.makeRootPage(context.rootPath, context.rootDirectoryName, componentFactory); WikiImportTestEventListener.register(); return context; } public static Arguments parseCommandLine(String[] args) { CommandLine commandLine = new CommandLine( "[-p port][-d dir][-r root][-l logDir][-e days][-o][-i][-a userpass][-c command]"); Arguments arguments = null; if (commandLine.parse(args)) { arguments = new Arguments(); if (commandLine.hasOption("p")) arguments.setPort(commandLine.getOptionArgument("p", "port")); if (commandLine.hasOption("d")) arguments.setRootPath(commandLine.getOptionArgument("d", "dir")); if (commandLine.hasOption("r")) arguments.setRootDirectory(commandLine.getOptionArgument("r", "root")); if (commandLine.hasOption("l")) arguments.setLogDirectory(commandLine.getOptionArgument("l", "logDir")); if (commandLine.hasOption("e")) arguments.setDaysTillVersionsExpire(commandLine.getOptionArgument("e", "days")); if (commandLine.hasOption("a")) arguments.setUserpass(commandLine.getOptionArgument("a", "userpass")); if (commandLine.hasOption("c")) arguments.setCommand(commandLine.getOptionArgument("c", "command")); arguments.setOmitUpdates(commandLine.hasOption("o")); arguments.setInstallOnly(commandLine.hasOption("i")); } return arguments; } private static Logger makeLogger(Arguments arguments) { String logDirectory = arguments.getLogDirectory(); return logDirectory != null ? new Logger(logDirectory) : null; } public static Authenticator makeAuthenticator(String authenticationParameter, ComponentFactory componentFactory) throws Exception { Authenticator authenticator = new PromiscuousAuthenticator(); if (authenticationParameter != null) { if (new File(authenticationParameter).exists()) authenticator = new MultiUserAuthenticator(authenticationParameter); else { String[] values = authenticationParameter.split(":"); authenticator = new OneUserAuthenticator(values[0], values[1]); } } return componentFactory.getAuthenticator(authenticator); } private static void printUsage() { System.err.println("Usage: java -jar fitnesse.jar [-pdrleoa]"); System.err.println("\t-p <port number> {" + Arguments.DEFAULT_PORT + "}"); System.err.println("\t-d <working directory> {" + Arguments.DEFAULT_PATH + "}"); System.err.println("\t-r <page root directory> {" + Arguments.DEFAULT_ROOT + "}"); System.err.println("\t-l <log directory> {no logging}"); System.err.println("\t-e <days> {" + Arguments.DEFAULT_VERSION_DAYS + "} Number of days before page versions expire"); System.err.println("\t-o omit updates"); System.err .println("\t-a {user:pwd | user-file-name} enable authentication."); System.err.println("\t-i Install only, then quit."); System.err.println("\t-c <command> execute single command."); } private static void printStartMessage(Arguments args, FitNesseContext context) { System.out.println("FitNesse (" + FitNesse.VERSION + ") Started..."); System.out.print(context.toString()); System.out.println("\tpage version expiration set to " + args.getDaysTillVersionsExpire() + " days."); if (extraOutput != null) System.out.print(extraOutput); } }