Repository: airavata Updated Branches: refs/heads/master afcd6e381 -> 708f6a483
support overriding server settings via commandline args https://issues.apache.org/jira/browse/AIRAVATA-1047 Project: http://git-wip-us.apache.org/repos/asf/airavata/repo Commit: http://git-wip-us.apache.org/repos/asf/airavata/commit/e54c7d05 Tree: http://git-wip-us.apache.org/repos/asf/airavata/tree/e54c7d05 Diff: http://git-wip-us.apache.org/repos/asf/airavata/diff/e54c7d05 Branch: refs/heads/master Commit: e54c7d058150c86559c323f5248212570d6a3d45 Parents: 856da92 Author: Saminda Wijeratne <[email protected]> Authored: Sat Mar 8 11:08:23 2014 -0500 Committer: Saminda Wijeratne <[email protected]> Committed: Sat Mar 8 11:10:34 2014 -0500 ---------------------------------------------------------------------- .../airavata/api/server/AiravataAPIServer.java | 2 +- modules/commons/utils/pom.xml | 6 +- .../common/utils/ApplicationSettings.java | 62 +++- .../apache/airavata/server/BetterTomcat.java | 312 ------------------- .../airavata/server/BetterTomcatException.java | 40 --- .../org/apache/airavata/server/ServerMain.java | 40 ++- 6 files changed, 90 insertions(+), 372 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/airavata/blob/e54c7d05/airavata-api/airavata-api-server/src/main/java/org/apache/airavata/api/server/AiravataAPIServer.java ---------------------------------------------------------------------- diff --git a/airavata-api/airavata-api-server/src/main/java/org/apache/airavata/api/server/AiravataAPIServer.java b/airavata-api/airavata-api-server/src/main/java/org/apache/airavata/api/server/AiravataAPIServer.java index ff51c0b..f3f9388 100644 --- a/airavata-api/airavata-api-server/src/main/java/org/apache/airavata/api/server/AiravataAPIServer.java +++ b/airavata-api/airavata-api-server/src/main/java/org/apache/airavata/api/server/AiravataAPIServer.java @@ -59,7 +59,7 @@ public class AiravataAPIServer implements IServer{ TServerTransport serverTransport = new TServerSocket(serverPort); server = new TSimpleServer( new TServer.Args(serverTransport).processor(mockAiravataServer)); - logger.info("Starting Airavata Mock Airavata Server on Port " + serverPort); + logger.info("Starting Airavata API Server on Port " + serverPort); logger.info("Listening to Airavata Clients ...."); new Thread() { public void run() { http://git-wip-us.apache.org/repos/asf/airavata/blob/e54c7d05/modules/commons/utils/pom.xml ---------------------------------------------------------------------- diff --git a/modules/commons/utils/pom.xml b/modules/commons/utils/pom.xml index ac0706f..7add7eb 100644 --- a/modules/commons/utils/pom.xml +++ b/modules/commons/utils/pom.xml @@ -96,7 +96,11 @@ <artifactId>tomcat-embed-core</artifactId> <version>7.0.22</version> </dependency> - + <dependency> + <groupId>commons-cli</groupId> + <artifactId>commons-cli</artifactId> + <version>1.2</version> + </dependency> <!-- Testing --> <dependency> <groupId>junit</groupId> http://git-wip-us.apache.org/repos/asf/airavata/blob/e54c7d05/modules/commons/utils/src/main/java/org/apache/airavata/common/utils/ApplicationSettings.java ---------------------------------------------------------------------- diff --git a/modules/commons/utils/src/main/java/org/apache/airavata/common/utils/ApplicationSettings.java b/modules/commons/utils/src/main/java/org/apache/airavata/common/utils/ApplicationSettings.java index c20dc32..715c7d2 100644 --- a/modules/commons/utils/src/main/java/org/apache/airavata/common/utils/ApplicationSettings.java +++ b/modules/commons/utils/src/main/java/org/apache/airavata/common/utils/ApplicationSettings.java @@ -22,10 +22,15 @@ package org.apache.airavata.common.utils; import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; import java.net.URL; import java.util.ArrayList; import java.util.Calendar; +import java.util.HashMap; import java.util.List; +import java.util.ListIterator; +import java.util.Map; import java.util.Properties; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -34,6 +39,12 @@ import org.apache.airavata.common.exception.ApplicationSettingsException; import org.apache.airavata.common.exception.ApplicationSettingsLoadException; import org.apache.airavata.common.exception.ApplicationSettingsStoreException; import org.apache.airavata.common.exception.UnspecifiedApplicationSettingsException; +import org.apache.commons.cli.CommandLine; +import org.apache.commons.cli.CommandLineParser; +import org.apache.commons.cli.Option; +import org.apache.commons.cli.Options; +import org.apache.commons.cli.ParseException; +import org.apache.commons.cli.PosixParser; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -228,7 +239,54 @@ public abstract class ApplicationSettings { return properties; } - public static void mergeSettings(Properties properties){ - properties.putAll(properties); + public static void mergeSettings(Map<String,String> props){ + properties.putAll(props); } + + public static void mergeSettings(InputStream stream) throws IOException{ + Properties tmpProp = new Properties(); + tmpProp.load(stream); + properties.putAll(tmpProp); + } + + public static void mergeSettingsCommandLineArgs(String[] args){ + properties.putAll(parseCommandLineOptions(args)); + } + + private static Options deriveCommandLineOptions(String[] args){ + Options options = new Options(); + for (String arg : args) { + if (arg.startsWith("--")){ + arg=arg.substring(2); + int pos = arg.indexOf('='); + String opt = pos == -1 ? arg : arg.substring(0, pos); + options.addOption(opt, true, ""); + } + } + return options; + } + + private static Map<String, String> parseCommandLineOptions(String[] args) { + Map<String,String> commandLineOptions=new HashMap<String,String>(); + CommandLineParser parser = new DynamicOptionPosixParser(); + try { + CommandLine cmdLine = parser.parse(deriveCommandLineOptions(args), args); + for (Option s : cmdLine.getOptions()) { + commandLineOptions.put(s.getOpt(), s.getValue()); + } + } catch (ParseException e1) { + e1.printStackTrace(); + } + return commandLineOptions; + } + + private static class DynamicOptionPosixParser extends PosixParser{ + @Override + protected void processOption(String arg0, @SuppressWarnings("rawtypes") ListIterator arg1) + throws ParseException { + if (getOptions().hasOption(arg0)){ + super.processOption(arg0, arg1); + } + } + } } http://git-wip-us.apache.org/repos/asf/airavata/blob/e54c7d05/modules/server/src/main/java/org/apache/airavata/server/BetterTomcat.java ---------------------------------------------------------------------- diff --git a/modules/server/src/main/java/org/apache/airavata/server/BetterTomcat.java b/modules/server/src/main/java/org/apache/airavata/server/BetterTomcat.java deleted file mode 100644 index ca30172..0000000 --- a/modules/server/src/main/java/org/apache/airavata/server/BetterTomcat.java +++ /dev/null @@ -1,312 +0,0 @@ -/* - * Copyright 2004,2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.airavata.server; - - -import org.apache.catalina.*; -import org.apache.catalina.connector.Connector; -import org.apache.catalina.core.StandardHost; -import org.apache.catalina.startup.Embedded; -import org.apache.catalina.startup.Tomcat; -import org.apache.coyote.http11.AbstractHttp11JsseProtocol; -import org.apache.tomcat.util.IntrospectionUtils; - -import javax.servlet.Servlet; -import javax.servlet.ServletException; -import java.util.HashMap; -import java.util.Map; - -/** - * This is an improvement to Embedded Tomcat. The objective is to provide a cleaner API for - * embedders. - */ -@SuppressWarnings("unused") -public class BetterTomcat { - private Tomcat tomcat = new Tomcat(); - private static Map<String, Connector> connectors = new HashMap<String, Connector>(); - private boolean unpackWars = true; - - public BetterTomcat() { - // Override the default Tomcat connector. Otherwise a Connector on 8080 will be started - tomcat.setConnector(new Connector(Protocol.HTTP_11.getProtocolName())); -// setDefaultHost("defaultHost"); -// setBaseDir("."); - } - - public BetterTomcat(int port) { - this(); - addConnector(Protocol.HTTP_11, null, port); - } - - /** - * Indicates whether WAR files should be unpacked or not - * - * @param unpackWars true - unpackWars - */ - public void setUnpackWars(boolean unpackWars) { - this.unpackWars = unpackWars; - } - - /** - * Start the server. - * - * @throws LifecycleException If an irrecoverable error occurs while starting - */ - public void start() throws LifecycleException { - tomcat.start(); - } - - /** - * Stop the server. - * - * @throws LifecycleException If an irrecoverable error occurs while stopping - */ - public void stop() throws LifecycleException { - tomcat.stop(); - } - - public Host getHost() { - Host host = tomcat.getHost(); - ((StandardHost) host).setUnpackWARs(unpackWars); - return host; - } - - /** - * Add a webapp using normal WEB-INF/web.xml if found. - * - * @param contextPath The context of the webapp, e.g., /foo - * @param webappFilePath The file path of the webapp. Can be the path to a WAR file or a - * directory, - * e.g., - * 1. /home/azeez/bettertomcat/foo.war - * 2. /home/azeez/bettertomcat/foo - * @return new Context The Context of the deployed webapp - * @throws BetterTomcatException If webapp deployment fails - */ - public Context addWebapp(String contextPath, - String webappFilePath) throws BetterTomcatException { - - Context context; - try { - context = tomcat.addWebapp(contextPath, webappFilePath); - if (context.getState().equals(LifecycleState.STOPPED)) { - throw new BetterTomcatException("Webapp " + context + " failed to deploy"); - } - if (!unpackWars) { - context.addParameter("antiJARLocking", "false"); - context.addParameter("antiResourceLocking", "false"); - } - return context; - } catch (ServletException e) { - throw new BetterTomcatException("Webapp failed to deploy", e); - } - } - - /** - * Add a webapp to a particular Host - * - * @param host The Host to which this webapp is added to - * @param contextPath The context of the webapp, e.g., /foo - * @param webappFilePath The file path of the webapp. Can be the path to a WAR file or a - * directory, - * e.g., - * 1. /home/azeez/bettertomcat/foo.war - * 2. /home/azeez/bettertomcat/foo - * @return new Context The Context of the deployed webapp - */ - public Context addWebapp(Host host, String contextPath, String webappFilePath) { - return tomcat.addWebapp(host, contextPath, webappFilePath); - } - - /** - * Add a context - programmatic mode, no web.xml used. - * <p/> - * API calls equivalent with web.xml: - * <p/> - * context-param - * ctx.addParameter("name", "value"); - * <p/> - * <p/> - * error-page - * ErrorPage ep = new ErrorPage(); - * ep.setErrorCode(500); - * ep.setLocation("/error.html"); - * ctx.addErrorPage(ep); - * <p/> - * ctx.addMimeMapping("ext", "type"); - * <p/> - * Note: If you reload the Context, all your configuration will be lost. If - * you need reload support, consider using a LifecycleListener to provide - * your configuration. - * <p/> - * - * @param contextPath The context of the webapp. "" for root context. - * @param baseDir base dir for the context, for static files. Must exist, - * relative to the server home - * @return new Context The Context of the deployed webapp - */ - public Context addContext(String contextPath, String baseDir) { - return tomcat.addContext(contextPath, baseDir); - } - - public Context addContext(Host host, String contextPath, String dir) { - return tomcat.addContext(host, contextPath, dir); - } - - /** - * Equivalent with - * <servlet><servlet-name><servlet-class>. - * <p/> - * In general it is better/faster to use the method that takes a - * Servlet as param - this one can be used if the servlet is not - * commonly used, and want to avoid loading all deps. - * ( for example: jsp servlet ) - * <p/> - * You can customize the returned servlet, ex: - * <p/> - * wrapper.addInitParameter("name", "value"); - * - * @param contextPath Context to add Servlet to - * @param servletName Servlet name (used in mappings) - * @param servletClass The class to be used for the Servlet - * @return The wrapper for the servlet - */ - public Wrapper addServlet(String contextPath, - String servletName, - String servletClass) { - return tomcat.addServlet(contextPath, servletName, servletClass); - } - - /** - * Add an existing Servlet to the context with no class.forName or - * initialisation. - * - * @param contextPath Context to add Servlet to - * @param servletName Servlet name (used in mappings) - * @param servlet The Servlet to add - * @return The wrapper for the servlet - */ - public Wrapper addServlet(String contextPath, - String servletName, - Servlet servlet) { - return tomcat.addServlet(contextPath, servletName, servlet); - } - - /** - * Enables JNDI naming which is disabled by default. Server must implement - * {@link org.apache.catalina.Lifecycle} in order for the - * {@link org.apache.catalina.core.NamingContextListener} to be used. - */ - public void enableNaming() { - tomcat.enableNaming(); - } - - public Connector addConnector(int port) { - return addConnector(Protocol.HTTP_11, null, port); - } - - /** - * Get a Tomcat Connector. If a connector with the Tomcat connector does not exist, create a new - * one. - * - * @param protocol The protocol of the connector. - * @param address The IP address of the network interface to which this connector should bind - * to. Specify this as null if the connector should bind to all network interfaces. - * @param port The port on which this connector has to be run - * @return The Tomcat connector - */ - public Connector addConnector(Protocol protocol, String address, int port) { - Connector connector = connectors.get(protocol + "-" + address + "-" + port); - if (connector == null) { - connector = new Connector(protocol.getProtocolClass()); - if (address != null) { - IntrospectionUtils.setProperty(connector, "address", address); - } - connector.setPort(port); - connector.setEnableLookups(true); - connector.setProperty("bindOnInit", "false"); - if (protocol.equals(Protocol.HTTPS_11) || protocol.equals(Protocol.HTTPS_11_NIO)) { - connector.setSecure(true); - connector.setAttribute("SSLEnabled", "true"); - connector.setScheme("https"); - } - tomcat.getService().addConnector(connector); - } - return connector; - } - - public void setClientAuth(Connector connector, String clientAuth) { - ((AbstractHttp11JsseProtocol)connector.getProtocolHandler()).setClientAuth(clientAuth); - } - - public Connector getConnector(Protocol protocol, String address, int port) { - return addConnector(protocol, address, port); - } - - public void setBaseDir(String baseDir) { - tomcat.setBaseDir(baseDir); - } - - public void setDefaultHost(String defaultHostName) { - tomcat.setHostname(defaultHostName); - tomcat.getEngine().setDefaultHost(defaultHostName); - } - - public void setDefaultRealm(Realm realm) { - tomcat.setDefaultRealm(realm); - } - - /** - * The valid protocol types - */ - @SuppressWarnings("unused") - public static enum Protocol { - HTTP_11("HTTP/1.1", "HTTP/1.1"), - HTTPS_11("HTTPS/1.1", "HTTP/1.1"), - HTTP_11_NIO("HTTP/1.1/NIO", "org.apache.coyote.http11.Http11NioProtocol"), - HTTPS_11_NIO("HTTPS/1.1/NIO", "org.apache.coyote.http11.Http11NioProtocol"), - HTTP_11_APR("HTTP/1.1/APR","org.apache.coyote.http11.Http11AprProtocol"), - HTTPS_11_APR("HTTPS/1.1/APR", "org.apache.coyote.http11.Http11AprProtocol"), - MEMORY("memory", "org.apache.coyote.memory.MemoryProtocolHandler"), - AJP("ajp", "org.apache.coyote.ajp.AjpProtocol"); - - private String protocolName; - private String protocolClass; - - Protocol(String protocolName, String protocolClass) { - this.protocolName = protocolName; - this.protocolClass = protocolClass; - } - - public String getProtocolName() { - return protocolName; - } - - public String getProtocolClass() { - return protocolClass; - } - } - - /** - * Returns the wrapped Tomcat instance. This should be used only when advanced functionality - * is required - * - * @return The Tomcat instance which can be used by advanced users who wish to gain more control - */ - public Tomcat getTomcat() { - return tomcat; - } -} http://git-wip-us.apache.org/repos/asf/airavata/blob/e54c7d05/modules/server/src/main/java/org/apache/airavata/server/BetterTomcatException.java ---------------------------------------------------------------------- diff --git a/modules/server/src/main/java/org/apache/airavata/server/BetterTomcatException.java b/modules/server/src/main/java/org/apache/airavata/server/BetterTomcatException.java deleted file mode 100644 index 5c5439a..0000000 --- a/modules/server/src/main/java/org/apache/airavata/server/BetterTomcatException.java +++ /dev/null @@ -1,40 +0,0 @@ -/* -* Copyright (c) 2005-2011, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. -* -* WSO2 Inc. licenses this file to you under the Apache License, -* Version 2.0 (the "License"); you may not use this file except -* in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, -* software distributed under the License is distributed on an -* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -* KIND, either express or implied. See the License for the -* specific language governing permissions and limitations -* under the License. -*/ -package org.apache.airavata.server; - - -/** - * BetterTomcatException - */ -public class BetterTomcatException extends Exception { - public BetterTomcatException() { - super(); - } - - public BetterTomcatException(String message) { - super(message); - } - - public BetterTomcatException(String message, Throwable cause) { - super(message, cause); - } - - public BetterTomcatException(Throwable cause) { - super(cause); - } -} http://git-wip-us.apache.org/repos/asf/airavata/blob/e54c7d05/modules/server/src/main/java/org/apache/airavata/server/ServerMain.java ---------------------------------------------------------------------- diff --git a/modules/server/src/main/java/org/apache/airavata/server/ServerMain.java b/modules/server/src/main/java/org/apache/airavata/server/ServerMain.java index 69a0034..3e8d18b 100644 --- a/modules/server/src/main/java/org/apache/airavata/server/ServerMain.java +++ b/modules/server/src/main/java/org/apache/airavata/server/ServerMain.java @@ -26,11 +26,15 @@ import java.util.List; import org.apache.airavata.common.exception.ApplicationSettingsException; import org.apache.airavata.common.utils.IServer; import org.apache.airavata.common.utils.ServerSettings; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class ServerMain { private static List<IServer> servers; private static final String SERVERS_KEY="servers"; - static { + private final static Logger logger = LoggerFactory.getLogger(ServerMain.class); + + private static void loadServers() { servers = new ArrayList<IServer>(); try { String serversString = ServerSettings.getSetting(SERVERS_KEY); @@ -38,28 +42,31 @@ public class ServerMain { String[] serversList = serversString.split(","); for (String serverString : serversList) { String serverClassName = ServerSettings.getSetting(serverString); - Class<?> classInstance = ServerMain.class - .getClassLoader().loadClass( - serverClassName); - servers.add((IServer)classInstance.newInstance()); + Class<?> classInstance; + try { + classInstance = ServerMain.class + .getClassLoader().loadClass( + serverClassName); + servers.add((IServer)classInstance.newInstance()); + } catch (ClassNotFoundException e) { + logger.error("Error while initiating locating server implementation \""+serverString+"\"!!!",e); + } catch (InstantiationException e) { + logger.error("Error while initiating server instance \""+serverString+"\"!!!",e); + } catch (IllegalAccessException e) { + logger.error("Error while initiating server instance \""+serverString+"\"!!!",e); + } catch (ClassCastException e){ + logger.error("Invalid server \""+serverString+"\"!!!",e); + } } } } catch (ApplicationSettingsException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (ClassNotFoundException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (InstantiationException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (IllegalAccessException e) { - // TODO Auto-generated catch block - e.printStackTrace(); + logger.error("Error while retrieving server list!!!",e); } } public static void main(String args[]) { + ServerSettings.mergeSettingsCommandLineArgs(args); + loadServers(); new Thread() { public void run() { startAllServers(); @@ -99,4 +106,5 @@ public class ServerMain { } } } + } \ No newline at end of file
