/** * Copyright (C) 2013 Colorado School of Mines * * This file is part of the Interface Software Development Kit (SDK). * * The InterfaceSDK 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. * * The InterfaceSDK 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 the InterfaceSDK. If not, see <http://www.gnu.org/licenses/>. */ package edu.mines.acmX.exhibit.runner; import java.rmi.RemoteException; import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; import java.rmi.server.UnicastRemoteObject; import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.CommandLineParser; import org.apache.commons.cli.GnuParser; import org.apache.commons.cli.HelpFormatter; import org.apache.commons.cli.Option; import org.apache.commons.cli.OptionBuilder; import org.apache.commons.cli.Options; import org.apache.commons.cli.ParseException; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import edu.mines.acmX.exhibit.Common; import edu.mines.acmX.exhibit.input_services.hardware.BadDeviceFunctionalityRequestException; import edu.mines.acmX.exhibit.input_services.hardware.BadFunctionalityRequestException; import edu.mines.acmX.exhibit.input_services.hardware.HardwareManagerManifestException; import edu.mines.acmX.exhibit.input_services.hardware.drivers.InvalidConfigurationFileException; import edu.mines.acmX.exhibit.module_management.ModuleManager; import edu.mines.acmX.exhibit.module_management.ModuleManagerRemote; import edu.mines.acmX.exhibit.module_management.loaders.ManifestLoadException; import edu.mines.acmX.exhibit.module_management.loaders.ModuleLoadException; public class ModuleManagerRunner { static Logger logger = LogManager.getLogger(ModuleManager.class.getName()); public static final String RMI_SERVER_NAME = "ModuleManager"; public static final int RMI_REGISTRY_PORT = 10123; /** * Main function for the ModuleManager framework. Creates an instance of * ModuleManager and runs it. * * Arguments: The single argument that is needed is the path to a valid * module manager manifest file. This is specified using the --manifest arg. * For additional documentation on running the module manager please refer * to the wiki in Common.REPOSITORY */ public static void main(String[] args) { CommandLineParser cl = new GnuParser(); CommandLine cmd; Options opts = generateCLOptions(); try { cmd = cl.parse(opts, args); if (cmd.hasOption("help")) { printHelp(opts); } else { if (cmd.hasOption("manifest")) { ModuleManager.configure(cmd.getOptionValue("manifest")); } else { System.out .println("A Module Manager Manifest is required to run the module manager" + "Please specify with the --manifest switch"); System.exit(1); } ModuleManager m; m = ModuleManager.getInstance(); //publicizeRmiInterface(m, RMI_REGISTRY_PORT); m.run(); } } catch (ParseException e) { printHelp(opts); logger.error("Incorrect command line arguments"); e.printStackTrace(); } catch (ManifestLoadException e) { logger.fatal("Could not load the module manager manifest"); e.printStackTrace(); } catch (ModuleLoadException e) { logger.fatal("Could not load the default module"); e.printStackTrace(); } } private static void publicizeRmiInterface(ModuleManager m, int registry_port ) throws RemoteException { ModuleManagerRemote remote = (ModuleManagerRemote) UnicastRemoteObject.exportObject(m,0); Registry reg = LocateRegistry.createRegistry(registry_port); logger.info("java RMI registry created."); reg.rebind(RMI_SERVER_NAME, remote); } private static void printHelp(Options opts) { HelpFormatter formatter = new HelpFormatter(); formatter.setDescPadding(0); String header = "\n" + "Welcome to the Interface SDK!\n" + "The Interface SDK provides an intelligent environment in which to run modules. " + "To build a module visit the github wiki at " + Common.REPOSITORY + "/wiki " + "\n" + "Also please find the source code at " + Common.REPOSITORY + " " + "where you can find more detail on the open source project."; String footer = "\n"; formatter.printHelp("java -jar [JARNAME]", header, opts, footer, true); } private static Options generateCLOptions() { Options options = new Options(); // options = optionsUsingIndividualAgruments(options); options.addOption(optionsUsingManifest()); // options.addOption(openNiArguments()); options.addOption("h", "help", false, "\nPrint these helpful hints"); return options; } @SuppressWarnings("static-access") private static Option optionsUsingManifest() { return OptionBuilder .withLongOpt("manifest") .withDescription( "\nUse a custom module manager manifest file. " + "The manifest must specify the default module to load, " + "the location of the modules folder and any configuration files " + "that are needed for the drivers you would like to use.") .hasArg().withArgName("PATH").create(); } }