Repository: airavata Updated Branches: refs/heads/master 5b3c75f71 -> 0b6e1e5af
https://issues.apache.org/jira/browse/AIRAVATA-1046 Project: http://git-wip-us.apache.org/repos/asf/airavata/repo Commit: http://git-wip-us.apache.org/repos/asf/airavata/commit/0b6e1e5a Tree: http://git-wip-us.apache.org/repos/asf/airavata/tree/0b6e1e5a Diff: http://git-wip-us.apache.org/repos/asf/airavata/diff/0b6e1e5a Branch: refs/heads/master Commit: 0b6e1e5aff029450cfb554022ebc4889ad3e72ca Parents: 5b3c75f Author: Saminda Wijeratne <[email protected]> Authored: Sun Mar 9 15:27:15 2014 -0400 Committer: Saminda Wijeratne <[email protected]> Committed: Sun Mar 9 15:27:15 2014 -0400 ---------------------------------------------------------------------- .../common/utils/ApplicationSettings.java | 47 +------------ .../airavata/common/utils/StringUtil.java | 51 ++++++++++++++ .../apache/airavata/integration/BaseCaseIT.java | 8 ++- .../org/apache/airavata/server/ServerMain.java | 71 ++++++++++++++++++-- 4 files changed, 126 insertions(+), 51 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/airavata/blob/0b6e1e5a/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 54225fa..f6d0cd8 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 @@ -27,9 +27,7 @@ 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; @@ -39,12 +37,6 @@ 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; @@ -267,44 +259,7 @@ public abstract class ApplicationSettings { } public static void mergeSettingsCommandLineArgs(String[] args){ - properties.putAll(parseCommandLineOptions(args)); + properties.putAll(StringUtil.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/0b6e1e5a/modules/commons/utils/src/main/java/org/apache/airavata/common/utils/StringUtil.java ---------------------------------------------------------------------- diff --git a/modules/commons/utils/src/main/java/org/apache/airavata/common/utils/StringUtil.java b/modules/commons/utils/src/main/java/org/apache/airavata/common/utils/StringUtil.java index d4eda58..044401f 100644 --- a/modules/commons/utils/src/main/java/org/apache/airavata/common/utils/StringUtil.java +++ b/modules/commons/utils/src/main/java/org/apache/airavata/common/utils/StringUtil.java @@ -26,10 +26,18 @@ import java.io.PrintStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import java.util.ListIterator; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; +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; + public class StringUtil { public static final String DELIMETER=","; public static final String QUOTE="\""; @@ -365,5 +373,48 @@ public class StringUtil { printStream.flush(); return byteArrayOutputStream.toString(); } + + public 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; + } + + public static Map<String, String> parseCommandLineOptions(String[] args) { + Map<String,String> commandLineOptions=new HashMap<String,String>(); + try { + CommandLine cmdLine = getCommandLineParser(args); + for (Option s : cmdLine.getOptions()) { + commandLineOptions.put(s.getOpt(), s.getValue()); + } + } catch (ParseException e1) { + e1.printStackTrace(); + } + return commandLineOptions; + } + + public static CommandLine getCommandLineParser(String[] args) + throws ParseException { + CommandLineParser parser = new DynamicOptionPosixParser(); + CommandLine cmdLine = parser.parse(deriveCommandLineOptions(args), args); + return cmdLine; + } + + 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); + } + } + } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/airavata/blob/0b6e1e5a/modules/integration-tests/src/test/java/org/apache/airavata/integration/BaseCaseIT.java ---------------------------------------------------------------------- diff --git a/modules/integration-tests/src/test/java/org/apache/airavata/integration/BaseCaseIT.java b/modules/integration-tests/src/test/java/org/apache/airavata/integration/BaseCaseIT.java index dc0b5f2..e7bf3d2 100644 --- a/modules/integration-tests/src/test/java/org/apache/airavata/integration/BaseCaseIT.java +++ b/modules/integration-tests/src/test/java/org/apache/airavata/integration/BaseCaseIT.java @@ -22,6 +22,7 @@ package org.apache.airavata.integration; import junit.framework.Assert; + import org.apache.airavata.client.api.exception.AiravataAPIInvocationException; import org.apache.airavata.client.tools.DocumentCreator; import org.apache.airavata.model.util.ExperimentModelUtil; @@ -31,6 +32,7 @@ import org.apache.airavata.schemas.gfac.DataType; import org.apache.airavata.server.ServerMain; import org.apache.airavata.workflow.model.wf.Workflow; import org.apache.airavata.ws.monitor.*; +import org.apache.commons.cli.ParseException; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; @@ -53,7 +55,11 @@ public class BaseCaseIT extends WorkflowIntegrationTestBase { public void setUp() throws Exception { new Thread() { public void run() { - ServerMain.main(new String[]{}); + try { + ServerMain.main(new String[]{}); + } catch (Exception e) { + e.printStackTrace(); + } } }.start(); Thread.sleep(10000); http://git-wip-us.apache.org/repos/asf/airavata/blob/0b6e1e5a/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 bc9a5dd..eb9efb2 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 @@ -20,12 +20,19 @@ */ package org.apache.airavata.server; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.RandomAccessFile; import java.util.ArrayList; 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.apache.airavata.common.utils.StringUtil; +import org.apache.commons.cli.CommandLine; +import org.apache.commons.cli.ParseException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -34,7 +41,8 @@ public class ServerMain { private static final String SERVERS_KEY="servers"; private final static Logger logger = LoggerFactory.getLogger(ServerMain.class); private static boolean serversLoaded=false; - + private static final String stopFileNamePrefix = "airavata-server-stop"; + private static final String serverStartedFileNamePrefix = "airavata-server-start"; static{ servers = new ArrayList<IServer>(); } @@ -74,11 +82,66 @@ public class ServerMain { }); } - public static void main(String args[]) { - ServerSettings.mergeSettingsCommandLineArgs(args); - startAllServers(); + public static void main(String args[]) throws ParseException, IOException { + CommandLine commandLineParser = StringUtil.getCommandLineParser(args); + + if (commandLineParser.getArgList().contains("stop")){ + if (isServerRunning()) { + logger.info("Requesting airavata server to stop..."); + requestStop(); + }else{ + logger.error("Server is not running!!!"); + } + }else{ + setServerStarted(); + ServerSettings.mergeSettingsCommandLineArgs(args); + startAllServers(); + while(!hasStopRequested()){ + try { + Thread.sleep(2000); + } catch (InterruptedException e) { + stopAllServers(); + } + } + if (hasStopRequested()){ + stopAllServers(); + stopRequestServed(); + } + } + } + + private static void requestStop() throws IOException { + //FIXME currently stop requests all the servers to stop + new File(stopFileNamePrefix).createNewFile(); + } + + private static boolean hasStopRequested(){ + return new File(stopFileNamePrefix).exists(); + } + + private static void stopRequestServed(){ + new File(stopFileNamePrefix).delete(); } + private static boolean isServerRunning(){ + return new File(serverStartedFileNamePrefix).exists(); + } + + @SuppressWarnings({ "resource" }) + private static void setServerStarted(){ + try { + File serverStartedFile = new File(serverStartedFileNamePrefix); + serverStartedFile.createNewFile(); + serverStartedFile.deleteOnExit(); + new RandomAccessFile(serverStartedFile,"rw").getChannel().lock(); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public static void stopAllServers() { //stopping should be done in reverse order of starting the servers for(int i=servers.size()-1;i>=0;i--){
