Java tutorial
/* * This file is part of AceQL. * AceQL: Remote JDBC access over HTTP. * Copyright (C) 2015, KawanSoft SAS * (http://www.kawansoft.com). All rights reserved. * * AceQL is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * AceQL 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA * * Any modifications to this file must keep this entire header * intact. */ package org.kawanfw.sql; import java.io.File; import java.io.IOException; import java.net.ConnectException; import java.net.UnknownHostException; 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.commons.cli.UnrecognizedOptionException; import org.apache.commons.lang3.StringUtils; import org.kawanfw.commons.util.FrameworkDebug; import org.kawanfw.sql.api.server.SqlConfigurationException; import org.kawanfw.sql.api.server.web.WebServerApi; import org.kawanfw.sql.util.SqlTag; import org.kawanfw.sql.version.Version; /** * * AceQL Web Server start & stop with command line. * * @author Nicolas de Pomereu * */ @SuppressWarnings("deprecation") public class WebServer { private static boolean DEBUG = FrameworkDebug.isSet(WebServer.class); /** Universal and clean line separator */ private static String CR_LF = System.getProperty("line.separator"); /** * Constructor */ protected WebServer() { } /** * Prints usage * * @param options * the CLI Options */ private static void printUsage(Options options) { // automatically generate the help statement HelpFormatter formatter = new HelpFormatter(); formatter.setWidth(400); String fromAceqlServerScript = System.getProperty("from.aceql-server.script"); String help = null; if (fromAceqlServerScript != null && fromAceqlServerScript.equals("true")) { help = "aceql-server -start -host <hostname> -port <port> -properties <file>" + CR_LF + "or " + CR_LF + "-stop -port <port> "; } else { help = "java org.kawanfw.sql.WebServer -start -host <hostname> -port <port> -properties <file>" + CR_LF + "or " + CR_LF + "-stop -port <port> "; } formatter.printHelp(help, options); System.out.println(); } /** * Create the CLI Options * * @return the CLI Options * @throws IllegalArgumentException */ private static Options createOptions() throws IllegalArgumentException { Options options = new Options(); // add an option options.addOption("help", false, "print this message"); options.addOption("start", false, "start the SQL Web server"); options.addOption("stop", false, "stop the SQL Web server"); options.addOption("version", false, "print version"); String propertiesOptionMesssage = "properties file to use for this SQL Web server session. " + "Defaults to ACEQL_HOME" + File.separator + "conf" + File.separator + "aceql-server.properties"; @SuppressWarnings("static-access") Option propertiesOption = OptionBuilder.withArgName("file").hasArg() .withDescription(propertiesOptionMesssage).create("properties"); @SuppressWarnings("static-access") Option hostOption = OptionBuilder.withArgName("hostname").hasArg() .withDescription("hostname of the Web server").create("host"); @SuppressWarnings("static-access") Option portOption = OptionBuilder.withArgName("port number").hasArg() .withDescription("port number of the Web server. Defaults to " + WebServerApi.DEFAULT_PORT) .create("port"); options.addOption(propertiesOption); options.addOption(hostOption); options.addOption(portOption); return options; } /** * Starts or stops the AceQL Web Server. * * @param args the arguments of Web Server start/stop. * * @throws ParseException if any Exception when parsing command line * @throws IOException if any I/O Exception * @throws ConnectException if server is unable to connect to specified or default 9090 port * @throws SqlConfigurationException if any error in configuration properties file */ public static void main(String[] args) throws ParseException, IOException, ConnectException, SqlConfigurationException { if (args.length > 0) { debug("args[0]: " + args[0] + ":"); } if (args.length > 1) { debug("args[1]: " + args[1] + ":"); } Options options = createOptions(); CommandLineParser parser = new GnuParser(); CommandLine cmd = null; try { cmd = parser.parse(options, args); } catch (UnrecognizedOptionException e) { System.out.println(e.getMessage()); System.out.println(); printUsage(options); System.exit(-1); } if (cmd.hasOption("help")) { printUsage(options); System.exit(-1); } if (cmd.hasOption("version")) { System.out.println(Version.getServerVersion()); System.out.println(); System.exit(-1); } if (!cmd.hasOption("start") && !cmd.hasOption("stop")) { System.err.println("Missing start or stop option." + " " + SqlTag.PLEASE_CORRECT); System.out.println(); printUsage(options); System.exit(-1); } int port = WebServerApi.DEFAULT_PORT; if (cmd.hasOption("port")) { String portStr = cmd.getOptionValue("port"); try { port = Integer.parseInt(portStr); } catch (Exception e) { displayErrorAndExit("The port parameter is not numeric: " + portStr + ".", options); } } if (cmd.hasOption("start")) { if (!cmd.hasOption("host")) { displayErrorAndExit("Missing host option.", options); } String host = cmd.getOptionValue("host"); File propertiesFile = null; if (!cmd.hasOption("properties")) { String aceqlHome = System.getenv("ACEQL_HOME"); if (aceqlHome != null) { // Remove surrounding " if present aceqlHome = aceqlHome.replaceAll("\"", ""); if (aceqlHome.endsWith(File.separator)) { aceqlHome = StringUtils.substringBeforeLast(aceqlHome, File.separator); } propertiesFile = new File( aceqlHome + File.separator + "conf" + File.separator + "aceql-server.properties"); } else { displayErrorAndExit("Missing properties option.", options); } } else { propertiesFile = new File(cmd.getOptionValue("properties")); } WebServerApi webServerApi = new WebServerApi(); try { webServerApi.startServer(host, port, propertiesFile); } catch (SqlConfigurationException e) { System.err.println(SqlTag.SQL_PRODUCT_START_FAILURE + " " + SqlTag.USER_CONFIGURATION_FAILURE + " " + e.getMessage()); System.err.println(); System.exit((-1)); } catch (ConnectException e) { System.err.println(SqlTag.SQL_PRODUCT_START_FAILURE + " " + e.getMessage()); System.err.println(); System.exit((-1)); } catch (IOException e) { if (e instanceof UnknownHostException) { System.err.println(SqlTag.SQL_PRODUCT_START_FAILURE + " " + "Unknow host: " + e.getMessage()); } else { System.err.println(SqlTag.SQL_PRODUCT_START_FAILURE + " " + e.getMessage()); } if (e.getCause() != null) { e.printStackTrace(); } System.err.println(); System.exit(-1); } catch (Exception e) { System.err.println(SqlTag.SQL_PRODUCT_START_FAILURE); e.printStackTrace(); System.err.println(); System.exit(-1); } } else { WebServerApi webServerApi = new WebServerApi(); try { webServerApi.stopServer(port); System.out.println("SQL Web server running on port " + port + " successfully stopped!"); System.out.println(); System.exit(-1); } catch (IOException e) { if (e instanceof ConnectException) { System.err.println(e.getMessage()); } else { System.err.println("Impossible to stop the SQL Web server running on port " + port); System.err.println(e.getMessage()); if (e.getCause() != null) { System.err.println("Java Exception Stack Trace:"); e.printStackTrace(); } } System.err.println(); System.exit(-1); } } } /** * Displays the error message and exit Java * @param message The message to display before exit * @param options the options passed */ private static void displayErrorAndExit(String message, Options options) { System.err.println(message + " " + SqlTag.PLEASE_CORRECT); System.err.println(); System.exit(-1); } /** * debug */ private static void debug(String s) { if (DEBUG) { System.out.println(s); } } }