package org.orienteer.standalone; import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.InputStreamReader; import java.net.URL; import java.security.ProtectionDomain; import java.util.HashMap; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.orienteer.core.OrienteerWebApplication; /** * Class with main method to start Orienteer in standalone mode */ public class StartStandalone { private static final Pattern ARG_PATTERN=Pattern.compile("^--([^=]*)=?(.*)$"); private static final String ARG_CONFIG="config"; private static final String ARG_EMBEDDED="embedded"; private static final String ARG_HOST="host"; private static final String ARG_PORT="port"; private static final String ARG_HELP="help"; private static final String ARG_WAIT="wait"; private StartStandalone() { } public static void main(String[] args) throws Exception { Map<String, String> parsedArgs = parseArgs(args); if(parsedArgs==null || parsedArgs.containsKey(ARG_HELP)) { printHelp(); return; } if(parsedArgs.containsKey(ARG_CONFIG)) { System.setProperty(PROPERTIES_FILE_NAME, parsedArgs.get(ARG_CONFIG)); } else if(parsedArgs.containsKey(ARG_EMBEDDED)) { System.setProperty(PROPERTIES_FILE_NAME, StartStandalone.class.getResource("standalone.properties").toString()); } else { URL url = lookupPropertiesURL(); if(url!=null) { System.out.println("Automatic lookup found following config file: "+url); System.setProperty(PROPERTIES_FILE_NAME, url.toString()); } else { System.out.println("Using embedded mode"); System.setProperty(PROPERTIES_FILE_NAME, StartStandalone.class.getResource("standalone.properties").toString()); } } try { int port = ServerRunner.DEFAULT_PORT; String portStr = parsedArgs.get(ARG_PORT); try { if(portStr!=null) port = Integer.parseInt(portStr); } catch (NumberFormatException e) { System.out.println("Port '"+portStr+"' is incorrect. Using default port "+port); } String host = parsedArgs.get(ARG_HOST); ServerRunner runner = new ServerRunner(host, port); System.out.println("Starting Orienteer on "+(host!=null?host:"0.0.0.0")+":"+port); runner.start(); String wait = parsedArgs.get(ARG_WAIT); if(wait==null || wait.trim().length()==0) { System.out.println("PRESS ANY KEY TO STOP"); System.in.read(); } else { System.out.println("ENTER '"+wait+"' TO STOP"); BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); String line=reader.readLine(); while(!wait.equals(line)) { if(line!=null) System.out.printf("Input is '%s'. You should enter '%s' to exit", line, wait); else Thread.sleep(60000); } } System.out.println("Stopping Orienteer"); runner.stop(); runner.join(); } catch (Exception e) { e.printStackTrace(); System.exit(1); } } private static Map<String, String> parseArgs(String... args) { Map<String, String> ret = new HashMap<String, String>(); Matcher matcher; for(String arg: args) { matcher = ARG_PATTERN.matcher(arg); if(matcher.find()) { ret.put(matcher.group(1), matcher.group(2)); } else { System.out.printf("Unknown option provided '%s'", arg); return null; } } return ret; } private static void printHelp() { ProtectionDomain protectionDomain = StartStandalone.class.getProtectionDomain(); URL location = protectionDomain.getCodeSource().getLocation(); System.out.printf("Usage: java -jar %s [--config=<path> | --embedded] [--host=<host>] [--port=<port>] [--wait=<wait for>][--help]", location.getFile()); } //TODO: There is code duplication! Remove public static final String PROPERTIES_FILE_NAME = "orienteer.properties"; public static URL lookupPropertiesURL() throws IOException { String configFile = System.getProperty(PROPERTIES_FILE_NAME); if(configFile!=null) { File file = new File(configFile); if(file.exists()) { return file.toURI().toURL(); } else { URL url = OrienteerWebApplication.class.getClassLoader().getResource(configFile); if(url!=null) return url; else return new URL(configFile); } } else { File file = new File(PROPERTIES_FILE_NAME); File dir = new File("").getAbsoluteFile(); while(!file.exists() && dir!=null) { dir = dir.getParentFile(); file = new File(dir, PROPERTIES_FILE_NAME); } return file!=null && file.exists() ?file.toURI().toURL():null; } } }