http://git-wip-us.apache.org/repos/asf/airavata/blob/82773c73/modules/orchestrator/orchestrator-client/src/main/java/org/apache/airavata/orchestrator/cpi/orchestrator_cpi_serviceConstants.java
----------------------------------------------------------------------
diff --git 
a/modules/orchestrator/orchestrator-client/src/main/java/org/apache/airavata/orchestrator/cpi/orchestrator_cpi_serviceConstants.java
 
b/modules/orchestrator/orchestrator-client/src/main/java/org/apache/airavata/orchestrator/cpi/orchestrator_cpi_serviceConstants.java
new file mode 100644
index 0000000..3fa2946
--- /dev/null
+++ 
b/modules/orchestrator/orchestrator-client/src/main/java/org/apache/airavata/orchestrator/cpi/orchestrator_cpi_serviceConstants.java
@@ -0,0 +1,55 @@
+    /*
+     * Licensed to the Apache Software Foundation (ASF) under one or more
+     * contributor license agreements.  See the NOTICE file distributed with
+     * this work for additional information regarding copyright ownership.
+     * The ASF 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.
+     */
+/**
+ * Autogenerated by Thrift Compiler (0.9.1)
+ *
+ * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
+ *  @generated
+ */
+package org.apache.airavata.orchestrator.cpi;
+
+import org.apache.thrift.scheme.IScheme;
+import org.apache.thrift.scheme.SchemeFactory;
+import org.apache.thrift.scheme.StandardScheme;
+
+import org.apache.thrift.scheme.TupleScheme;
+import org.apache.thrift.protocol.TTupleProtocol;
+import org.apache.thrift.protocol.TProtocolException;
+import org.apache.thrift.EncodingUtils;
+import org.apache.thrift.TException;
+import org.apache.thrift.async.AsyncMethodCallback;
+import org.apache.thrift.server.AbstractNonblockingServer.*;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Map;
+import java.util.HashMap;
+import java.util.EnumMap;
+import java.util.Set;
+import java.util.HashSet;
+import java.util.EnumSet;
+import java.util.Collections;
+import java.util.BitSet;
+import java.nio.ByteBuffer;
+import java.util.Arrays;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@SuppressWarnings("all") public class orchestrator_cpi_serviceConstants {
+
+  public static final String ORCHESTRATOR_CPI_VERSION = "0.13.0";
+
+}

http://git-wip-us.apache.org/repos/asf/airavata/blob/82773c73/modules/orchestrator/orchestrator-client/src/main/java/org/apache/airavata/orchestrator/sample/OrchestratorClientSample.java
----------------------------------------------------------------------
diff --git 
a/modules/orchestrator/orchestrator-client/src/main/java/org/apache/airavata/orchestrator/sample/OrchestratorClientSample.java
 
b/modules/orchestrator/orchestrator-client/src/main/java/org/apache/airavata/orchestrator/sample/OrchestratorClientSample.java
new file mode 100644
index 0000000..009d110
--- /dev/null
+++ 
b/modules/orchestrator/orchestrator-client/src/main/java/org/apache/airavata/orchestrator/sample/OrchestratorClientSample.java
@@ -0,0 +1,136 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF 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.orchestrator.sample;
+
+//import org.apache.airavata.client.AiravataAPIFactory;
+//import org.apache.airavata.client.api.AiravataAPI;
+//import 
org.apache.airavata.client.api.exception.AiravataAPIInvocationException;
+//import org.apache.airavata.client.tools.DocumentCreator;
+
+import org.apache.airavata.model.appcatalog.appinterface.DataType;
+import org.apache.airavata.model.appcatalog.appinterface.InputDataObjectType;
+import org.apache.airavata.model.appcatalog.appinterface.OutputDataObjectType;
+import org.apache.airavata.model.util.ExperimentModelUtil;
+import 
org.apache.airavata.model.workspace.experiment.ComputationalResourceScheduling;
+import org.apache.airavata.model.workspace.experiment.Experiment;
+import org.apache.airavata.model.workspace.experiment.UserConfigurationData;
+import org.apache.airavata.orchestrator.cpi.OrchestratorService;
+import org.apache.thrift.TException;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class OrchestratorClientSample {
+//    private static DocumentCreator documentCreator;
+    private static OrchestratorService.Client orchestratorClient;
+//    private static Registry registry;
+    private static int NUM_CONCURRENT_REQUESTS = 1;
+    private static final String DEFAULT_USER = "default.registry.user";
+    private static final String DEFAULT_USER_PASSWORD = 
"default.registry.password";
+    private static final String DEFAULT_GATEWAY = "default.registry.gateway";
+    private static String sysUser;
+    private static String sysUserPwd;
+    private static String gateway;
+/*
+
+    public static void main(String[] args) {
+        try {
+            AiravataUtils.setExecutionAsClient();
+            sysUser = ClientSettings.getSetting(DEFAULT_USER);
+            sysUserPwd = ClientSettings.getSetting(DEFAULT_USER_PASSWORD);
+            gateway = ClientSettings.getSetting(DEFAULT_GATEWAY);
+            orchestratorClient = 
OrchestratorClientFactory.createOrchestratorClient("localhost", 8940);
+            registry = RegistryFactory.getRegistry(gateway, sysUser, 
sysUserPwd);
+            documentCreator = new DocumentCreator(getAiravataAPI());
+            documentCreator.createLocalHostDocs();
+            documentCreator.createGramDocs();
+            documentCreator.createPBSDocsForOGCE();
+            storeExperimentDetail();
+        } catch (ApplicationSettingsException e) {
+            e.printStackTrace();
+        } catch (RegistryException e) {
+            e.printStackTrace();
+        }
+
+    }
+
+    private static AiravataAPI getAiravataAPI() {
+        AiravataAPI airavataAPI = null;
+            try {
+                airavataAPI = AiravataAPIFactory.getAPI(gateway, sysUser);
+            } catch (AiravataAPIInvocationException e) {
+                e.printStackTrace();
+            }
+        return airavataAPI;
+    }
+*/
+
+    public static void storeExperimentDetail() {
+        for (int i = 0; i < NUM_CONCURRENT_REQUESTS; i++) {
+            Thread thread = new Thread() {
+                public void run() {
+                    List<InputDataObjectType> exInputs = new 
ArrayList<InputDataObjectType>();
+                    InputDataObjectType input = new InputDataObjectType();
+                    input.setName("echo_input");
+                    input.setType(DataType.STRING);
+                    input.setValue("echo_output=Hello World");
+                    exInputs.add(input);
+
+
+                    List<OutputDataObjectType> exOut = new 
ArrayList<OutputDataObjectType>();
+                    OutputDataObjectType output = new OutputDataObjectType();
+                    output.setName("echo_output");
+                    output.setType(DataType.STRING);
+                    output.setValue("");
+                    exOut.add(output);
+
+                    Experiment simpleExperiment = 
ExperimentModelUtil.createSimpleExperiment("default", "admin", 
"echoExperiment", "SimpleEcho2", "SimpleEcho2", exInputs);
+                    simpleExperiment.setExperimentOutputs(exOut);
+
+                    ComputationalResourceScheduling scheduling = 
ExperimentModelUtil.createComputationResourceScheduling("trestles.sdsc.edu", 1, 
1, 1, "normal", 0, 0, 1, "sds128");
+                    scheduling.setResourceHostId("gsissh-trestles");
+                    UserConfigurationData userConfigurationData = new 
UserConfigurationData();
+                    
userConfigurationData.setComputationalResourceScheduling(scheduling);
+                    
simpleExperiment.setUserConfigurationData(userConfigurationData);
+                    String expId = null;
+                    try {
+//                        expId = (String) 
registry.add(ParentDataType.EXPERIMENT, simpleExperiment);
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                    }
+
+                    try {
+                        orchestratorClient.launchExperiment(expId, 
"airavataToken");
+                    } catch (TException e) {
+                        e.printStackTrace();
+                    }
+                }
+            };
+            thread.start();
+            try {
+                thread.join();
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/airavata/blob/82773c73/modules/orchestrator/orchestrator-core/pom.xml
----------------------------------------------------------------------
diff --git a/modules/orchestrator/orchestrator-core/pom.xml 
b/modules/orchestrator/orchestrator-core/pom.xml
index e7984b4..80543df 100644
--- a/modules/orchestrator/orchestrator-core/pom.xml
+++ b/modules/orchestrator/orchestrator-core/pom.xml
@@ -18,7 +18,7 @@ the License. -->
         <relativePath>../pom.xml</relativePath>
     </parent>
     <modelVersion>4.0.0</modelVersion>
-    <artifactId>airavata-orchestrator-core</artifactId>
+    <artifactId>orchestrator-core</artifactId>
     <packaging>jar</packaging>
     <name>Airavata Orchestrator Core</name>
     <url>http://airavata.apache.org/</url>

http://git-wip-us.apache.org/repos/asf/airavata/blob/82773c73/modules/orchestrator/orchestrator-service/pom.xml
----------------------------------------------------------------------
diff --git a/modules/orchestrator/orchestrator-service/pom.xml 
b/modules/orchestrator/orchestrator-service/pom.xml
new file mode 100644
index 0000000..a3f47c7
--- /dev/null
+++ b/modules/orchestrator/orchestrator-service/pom.xml
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--Licensed to the Apache Software Foundation (ASF) under one or more 
contributor license agreements. See the NOTICE file
+    distributed with this work for additional information regarding copyright 
ownership. The ASF 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. -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd";>
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <artifactId>orchestrator</artifactId>
+        <groupId>org.apache.airavata</groupId>
+        <version>0.16-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <name>Airavata Orchestrator Service</name>
+    <artifactId>orchestrator-service</artifactId>
+    <packaging>jar</packaging>
+    <url>http://airavata.apache.org/</url>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.airavata</groupId>
+            <artifactId>airavata-credential-store</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.thrift</groupId>
+            <artifactId>libthrift</artifactId>
+            <version>${thrift.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-log4j12</artifactId>
+            <version>${org.slf4j.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.airavata</groupId>
+            <artifactId>orchestrator-core</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.airavata</groupId>
+            <artifactId>orchestrator-client</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.airavata</groupId>
+            <artifactId>airavata-workflow-core</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.airavata</groupId>
+            <artifactId>app-catalog-data</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.airavata</groupId>
+            <artifactId>app-catalog-cpi</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.airavata</groupId>
+            <artifactId>airavata-model-utils</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.airavata</groupId>
+            <artifactId>airavata-server-configuration</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+    </properties>
+    
+</project>

http://git-wip-us.apache.org/repos/asf/airavata/blob/82773c73/modules/orchestrator/orchestrator-service/src/main/java/org/apache/airavata/orchestrator/server/OrchestratorServer.java
----------------------------------------------------------------------
diff --git 
a/modules/orchestrator/orchestrator-service/src/main/java/org/apache/airavata/orchestrator/server/OrchestratorServer.java
 
b/modules/orchestrator/orchestrator-service/src/main/java/org/apache/airavata/orchestrator/server/OrchestratorServer.java
new file mode 100644
index 0000000..78957ac
--- /dev/null
+++ 
b/modules/orchestrator/orchestrator-service/src/main/java/org/apache/airavata/orchestrator/server/OrchestratorServer.java
@@ -0,0 +1,160 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF 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.orchestrator.server;
+
+import java.net.InetSocketAddress;
+
+import org.apache.airavata.common.utils.IServer;
+import org.apache.airavata.common.utils.ServerSettings;
+import org.apache.airavata.orchestrator.cpi.OrchestratorService;
+import org.apache.airavata.orchestrator.util.Constants;
+import org.apache.thrift.server.TServer;
+import org.apache.thrift.server.TThreadPoolServer;
+import org.apache.thrift.transport.TServerSocket;
+import org.apache.thrift.transport.TServerTransport;
+import org.apache.thrift.transport.TTransportException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class OrchestratorServer implements IServer{
+
+    private final static Logger logger = 
LoggerFactory.getLogger(OrchestratorServer.class);
+       private static final String SERVER_NAME = "Orchestrator Server";
+       private static final String SERVER_VERSION = "1.0";
+
+    private ServerStatus status;
+
+       private TServer server;
+
+       public OrchestratorServer() {
+               setStatus(ServerStatus.STOPPED);
+       }
+
+    public void 
StartOrchestratorServer(OrchestratorService.Processor<OrchestratorServerHandler>
 orchestratorServerHandlerProcessor)
+            throws Exception {
+        try {
+            final int serverPort = 
Integer.parseInt(ServerSettings.getSetting(Constants.ORCHESTRATOT_SERVER_PORT,"8940"));
+
+            final String serverHost = 
ServerSettings.getSetting(Constants.ORCHESTRATOT_SERVER_HOST, null);
+            
+                       TServerTransport serverTransport;
+                       
+                       if(serverHost == null){
+                               serverTransport = new TServerSocket(serverPort);
+                       }else{
+                               InetSocketAddress inetSocketAddress = new 
InetSocketAddress(serverHost, serverPort);
+                               serverTransport = new 
TServerSocket(inetSocketAddress);
+                       }
+                       
+            //server = new TSimpleServer(
+              //      new 
TServer.Args(serverTransport).processor(orchestratorServerHandlerProcessor));
+            TThreadPoolServer.Args options = new 
TThreadPoolServer.Args(serverTransport);
+            options.minWorkerThreads = 
Integer.parseInt(ServerSettings.getSetting(Constants.ORCHESTRATOT_SERVER_MIN_THREADS,
 "30"));
+            server = new 
TThreadPoolServer(options.processor(orchestratorServerHandlerProcessor));
+
+            new Thread() {
+                               public void run() {
+                                       server.serve();
+                                       setStatus(ServerStatus.STOPPED);
+                                       logger.info("Orchestrator Server 
Stopped.");
+                               }
+                       }.start();
+                       new Thread() {
+                               public void run() {
+                                       while(!server.isServing()){
+                                               try {
+                                                       Thread.sleep(500);
+                                               } catch (InterruptedException 
e) {
+                                                       break;
+                                               }
+                                       }
+                                       if (server.isServing()){
+                                               setStatus(ServerStatus.STARTED);
+                                   logger.info("Starting Orchestrator Server 
on Port " + serverPort);
+                                   logger.info("Listening to Orchestrator 
Clients ....");
+                                       }
+                               }
+                       }.start();
+        } catch (TTransportException e) {
+            logger.error(e.getMessage());
+            setStatus(ServerStatus.FAILED);
+        }
+    }
+
+    public static void main(String[] args) {
+       try {
+                       new OrchestratorServer().start();
+               } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+               }
+    }
+
+       @Override
+       public void start() throws Exception {
+               setStatus(ServerStatus.STARTING);
+               OrchestratorService.Processor<OrchestratorServerHandler> 
orchestratorService =
+                new 
OrchestratorService.Processor<OrchestratorServerHandler>(new 
OrchestratorServerHandler());
+               StartOrchestratorServer(orchestratorService);
+       }
+
+       @Override
+       public void stop() throws Exception {
+        if (server!=null && server.isServing()){
+                       setStatus(ServerStatus.STOPING);
+                       server.stop();
+               }
+               
+       }
+
+       @Override
+       public void restart() throws Exception {
+               stop();
+               start();
+       }
+
+       @Override
+       public void configure() throws Exception {
+               // TODO Auto-generated method stub
+               
+       }
+
+       @Override
+       public ServerStatus getStatus() throws Exception {
+               return status;
+       }
+       
+       private void setStatus(ServerStatus stat){
+               status=stat;
+               status.updateTime();
+       }
+
+       @Override
+       public String getName() {
+               return SERVER_NAME;
+       }
+
+       @Override
+       public String getVersion() {
+               return SERVER_VERSION;
+       }
+
+}

http://git-wip-us.apache.org/repos/asf/airavata/blob/82773c73/modules/orchestrator/orchestrator-service/src/main/java/org/apache/airavata/orchestrator/server/OrchestratorServerHandler.java
----------------------------------------------------------------------
diff --git 
a/modules/orchestrator/orchestrator-service/src/main/java/org/apache/airavata/orchestrator/server/OrchestratorServerHandler.java
 
b/modules/orchestrator/orchestrator-service/src/main/java/org/apache/airavata/orchestrator/server/OrchestratorServerHandler.java
new file mode 100644
index 0000000..4ef9dbc
--- /dev/null
+++ 
b/modules/orchestrator/orchestrator-service/src/main/java/org/apache/airavata/orchestrator/server/OrchestratorServerHandler.java
@@ -0,0 +1,643 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF 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.orchestrator.server;
+
+import org.airavata.appcatalog.cpi.AppCatalog;
+import org.airavata.appcatalog.cpi.AppCatalogException;
+import org.airavata.appcatalog.cpi.ComputeResource;
+import org.apache.aiaravata.application.catalog.data.impl.AppCatalogFactory;
+import 
org.apache.aiaravata.application.catalog.data.resources.AbstractResource;
+import org.apache.airavata.common.exception.AiravataException;
+import org.apache.airavata.common.exception.ApplicationSettingsException;
+import org.apache.airavata.common.logger.AiravataLogger;
+import org.apache.airavata.common.logger.AiravataLoggerFactory;
+import org.apache.airavata.common.utils.AiravataUtils;
+import org.apache.airavata.common.utils.AiravataZKUtils;
+import org.apache.airavata.common.utils.Constants;
+import org.apache.airavata.common.utils.ServerSettings;
+import org.apache.airavata.credential.store.store.CredentialReader;
+import org.apache.airavata.gfac.core.scheduler.HostScheduler;
+import org.apache.airavata.gfac.core.utils.GFacUtils;
+import org.apache.airavata.messaging.core.MessageContext;
+import org.apache.airavata.messaging.core.MessageHandler;
+import org.apache.airavata.messaging.core.MessagingConstants;
+import org.apache.airavata.messaging.core.Publisher;
+import org.apache.airavata.messaging.core.PublisherFactory;
+import org.apache.airavata.messaging.core.impl.RabbitMQProcessConsumer;
+import org.apache.airavata.messaging.core.impl.RabbitMQProcessPublisher;
+import 
org.apache.airavata.model.appcatalog.appdeployment.ApplicationDeploymentDescription;
+import 
org.apache.airavata.model.appcatalog.appinterface.ApplicationInterfaceDescription;
+import 
org.apache.airavata.model.appcatalog.computeresource.ComputeResourceDescription;
+import org.apache.airavata.model.error.LaunchValidationException;
+import org.apache.airavata.model.messaging.event.ExperimentStatusChangeEvent;
+import org.apache.airavata.model.messaging.event.MessageType;
+import org.apache.airavata.model.messaging.event.ProcessSubmitEvent;
+import org.apache.airavata.model.util.ExecutionType;
+import org.apache.airavata.model.workspace.experiment.Experiment;
+import org.apache.airavata.model.workspace.experiment.ExperimentState;
+import org.apache.airavata.model.workspace.experiment.ExperimentStatus;
+import org.apache.airavata.model.workspace.experiment.TaskDetails;
+import org.apache.airavata.model.workspace.experiment.TaskState;
+import org.apache.airavata.model.workspace.experiment.TaskStatus;
+import org.apache.airavata.model.workspace.experiment.WorkflowNodeDetails;
+import org.apache.airavata.model.workspace.experiment.WorkflowNodeState;
+import org.apache.airavata.model.workspace.experiment.WorkflowNodeStatus;
+import org.apache.airavata.orchestrator.core.exception.OrchestratorException;
+import org.apache.airavata.orchestrator.cpi.OrchestratorService;
+import org.apache.airavata.orchestrator.cpi.impl.SimpleOrchestratorImpl;
+import org.apache.airavata.orchestrator.cpi.orchestrator_cpi_serviceConstants;
+import org.apache.airavata.orchestrator.util.DataModelUtils;
+import 
org.apache.airavata.orchestrator.util.OrchestratorServerThreadPoolExecutor;
+import org.apache.airavata.persistance.registry.jpa.impl.RegistryFactory;
+import org.apache.airavata.registry.cpi.Registry;
+import org.apache.airavata.registry.cpi.RegistryException;
+import org.apache.airavata.registry.cpi.RegistryModelType;
+import 
org.apache.airavata.registry.cpi.utils.Constants.FieldConstants.TaskDetailConstants;
+import 
org.apache.airavata.registry.cpi.utils.Constants.FieldConstants.WorkflowNodeConstants;
+import org.apache.airavata.workflow.core.WorkflowEnactmentService;
+import org.apache.thrift.TBase;
+import org.apache.thrift.TException;
+
+import java.util.Arrays;
+import java.util.Calendar;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class OrchestratorServerHandler implements OrchestratorService.Iface {
+       private static AiravataLogger log = AiravataLoggerFactory 
.getLogger(OrchestratorServerHandler.class);
+       private SimpleOrchestratorImpl orchestrator = null;
+       private Registry registry;
+       private static Integer mutex = new Integer(-1);
+       private String airavataUserName;
+       private String gatewayName;
+       private Publisher publisher;
+    private RabbitMQProcessConsumer rabbitMQProcessConsumer;
+    private RabbitMQProcessPublisher rabbitMQProcessPublisher;
+
+    /**
+        * Query orchestrator server to fetch the CPI version
+        */
+       public String getOrchestratorCPIVersion() throws TException {
+               return 
orchestrator_cpi_serviceConstants.ORCHESTRATOR_CPI_VERSION;
+       }
+
+       public OrchestratorServerHandler() throws OrchestratorException{
+               // registering with zk
+               try {
+               publisher = PublisherFactory.createActivityPublisher();
+                       String zkhostPort = AiravataZKUtils.getZKhostPort();
+                       String airavataServerHostPort = ServerSettings
+                                       
.getSetting(Constants.ORCHESTRATOR_SERVER_HOST)
+                                       + ":"
+                                       + ServerSettings
+                                                       
.getSetting(Constants.ORCHESTRATOR_SERVER_PORT);
+                       
+//            setGatewayName(ServerSettings.getDefaultUserGateway());
+            setAiravataUserName(ServerSettings.getDefaultUser());
+               } catch (AiravataException e) {
+            log.error(e.getMessage(), e);
+            throw new OrchestratorException("Error while initializing 
orchestrator service", e);
+               }
+               // orchestrator init
+               try {
+                       // first constructing the monitorManager and 
orchestrator, then fill
+                       // the required properties
+                       orchestrator = new SimpleOrchestratorImpl();
+                       registry = RegistryFactory.getDefaultRegistry();
+                       orchestrator.initialize();
+                       
orchestrator.getOrchestratorContext().setPublisher(this.publisher);
+            startProcessConsumer();
+        } catch (OrchestratorException e) {
+            log.error(e.getMessage(), e);
+            throw new OrchestratorException("Error while initializing 
orchestrator service", e);
+               } catch (RegistryException e) {
+            log.error(e.getMessage(), e);
+            throw new OrchestratorException("Error while initializing 
orchestrator service", e);
+               }
+       }
+
+    private void startProcessConsumer() throws OrchestratorException {
+        try {
+            rabbitMQProcessConsumer = new RabbitMQProcessConsumer();
+            ProcessConsumer processConsumer = new ProcessConsumer();
+            Thread thread = new Thread(processConsumer);
+            thread.start();
+
+        } catch (AiravataException e) {
+            throw new OrchestratorException("Error while starting process 
consumer", e);
+        }
+
+    }
+
+    /**
+        * * After creating the experiment Data user have the * experimentID as 
the
+        * handler to the experiment, during the launchExperiment * We just 
have to
+        * give the experimentID * * @param experimentID * @return 
sucess/failure *
+        * *
+        * 
+        * @param experimentId
+        */
+       public boolean launchExperiment(String experimentId, String token) 
throws TException {
+        Experiment experiment = null; // this will inside the bottom catch 
statement
+        try {
+            experiment = (Experiment) registry.get(
+                    RegistryModelType.EXPERIMENT, experimentId);
+            if (experiment == null) {
+                log.errorId(experimentId, "Error retrieving the Experiment by 
the given experimentID: {} ", experimentId);
+                return false;
+            }
+            CredentialReader credentialReader = 
GFacUtils.getCredentialReader();
+            String gatewayId = null;
+            if (credentialReader != null) {
+                try {
+                    gatewayId = credentialReader.getGatewayID(token);
+                } catch (Exception e) {
+                    log.error(e.getLocalizedMessage());
+                }
+            }
+            if (gatewayId == null) {
+                gatewayId = ServerSettings.getDefaultUserGateway();
+                log.info("Couldn't identify the gateway Id using the 
credential token, Use default gateway Id");
+//                throw new AiravataException("Couldn't identify the gateway 
Id using the credential token");
+            }
+            ExecutionType executionType = 
DataModelUtils.getExecutionType(gatewayId, experiment);
+            if (executionType == ExecutionType.SINGLE_APP) {
+                //its an single application execution experiment
+                log.debugId(experimentId, "Launching single application 
experiment {}.", experimentId);
+                
OrchestratorServerThreadPoolExecutor.getCachedThreadPool().execute(new 
SingleAppExperimentRunner(experimentId, token));
+            } else if (executionType == ExecutionType.WORKFLOW) {
+                //its a workflow execution experiment
+                log.debugId(experimentId, "Launching workflow experiment {}.", 
experimentId);
+                launchWorkflowExperiment(experimentId, token);
+            } else {
+                log.errorId(experimentId, "Couldn't identify experiment type, 
experiment {} is neither single application nor workflow.", experimentId);
+                throw new TException("Experiment '" + experimentId + "' launch 
failed. Unable to figureout execution type for application " + 
experiment.getApplicationId());
+            }
+        } catch (Exception e) {
+            throw new TException("Experiment '" + experimentId + "' launch 
failed. Unable to figureout execution type for application " + 
experiment.getApplicationId(), e);
+        }
+        return true;
+       }
+
+       /**
+        * This method will validate the experiment before launching, if is 
failed
+        * we do not run the launch in airavata thrift service (only if 
validation
+        * is enabled
+        * 
+        * @param experimentId
+        * @return
+        * @throws TException
+        */
+       public boolean validateExperiment(String experimentId) throws 
TException,
+                       LaunchValidationException {
+               // TODO: Write the Orchestrator implementaion
+               try {
+                       List<TaskDetails> tasks = 
orchestrator.createTasks(experimentId);
+                       if (tasks.size() > 1) {
+                               log.info("There are multiple tasks for this 
experiment, So Orchestrator will launch multiple Jobs");
+                       }
+                       List<String> ids = registry.getIds(
+                                       RegistryModelType.WORKFLOW_NODE_DETAIL,
+                                       WorkflowNodeConstants.EXPERIMENT_ID, 
experimentId);
+                       for (String workflowNodeId : ids) {
+                               WorkflowNodeDetails workflowNodeDetail = 
(WorkflowNodeDetails) registry
+                                               
.get(RegistryModelType.WORKFLOW_NODE_DETAIL,
+                                                               workflowNodeId);
+                               List<Object> taskDetailList = registry.get(
+                                               RegistryModelType.TASK_DETAIL,
+                                               TaskDetailConstants.NODE_ID, 
workflowNodeId);
+                               for (Object o : taskDetailList) {
+                                       TaskDetails taskID = (TaskDetails) o;
+                                       // iterate through all the generated 
tasks and performs the
+                                       // job submisssion+monitoring
+                                       Experiment experiment = (Experiment) 
registry.get(
+                                                       
RegistryModelType.EXPERIMENT, experimentId);
+                                       if (experiment == null) {
+                                               log.errorId(experimentId, 
"Error retrieving the Experiment by the given experimentID: {}.",
+                                experimentId);
+                                               return false;
+                                       }
+                                       return 
orchestrator.validateExperiment(experiment,
+                                                       workflowNodeDetail, 
taskID).isSetValidationState();
+                               }
+                       }
+
+               } catch (OrchestratorException e) {
+            log.errorId(experimentId, "Error while validating experiment", e);
+                       throw new TException(e);
+               } catch (RegistryException e) {
+            log.errorId(experimentId, "Error while validating experiment", e);
+                       throw new TException(e);
+               }
+               return false;
+       }
+
+       /**
+        * This can be used to cancel a running experiment and store the status 
to
+        * terminated in registry
+        * 
+        * @param experimentId
+        * @return
+        * @throws TException
+        */
+       public boolean terminateExperiment(String experimentId, String tokenId) 
throws TException {
+        log.infoId(experimentId, "Experiment: {} is cancelling  !!!!!", 
experimentId);
+        return validateStatesAndCancel(experimentId, tokenId);
+       }
+
+       private String getAiravataUserName() {
+               return airavataUserName;
+       }
+
+       private String getGatewayName() {
+               return gatewayName;
+       }
+
+       public void setAiravataUserName(String airavataUserName) {
+               this.airavataUserName = airavataUserName;
+       }
+
+       public void setGatewayName(String gatewayName) {
+               this.gatewayName = gatewayName;
+       }
+
+       @Override
+       public boolean launchTask(String taskId, String airavataCredStoreToken) 
throws TException {
+               try {
+                       TaskDetails taskData = (TaskDetails) registry.get(
+                                       RegistryModelType.TASK_DETAIL, taskId);
+                       String applicationId = taskData.getApplicationId();
+                       if (applicationId == null) {
+                log.errorId(taskId, "Application id shouldn't be null.");
+                               throw new OrchestratorException("Error 
executing the job, application id shouldn't be null.");
+                       }
+                       ApplicationDeploymentDescription 
applicationDeploymentDescription = getAppDeployment(taskData, applicationId);
+            
taskData.setApplicationDeploymentId(applicationDeploymentDescription.getAppDeploymentId());
+                       registry.update(RegistryModelType.TASK_DETAIL, 
taskData,taskData.getTaskID());
+                       List<Object> workflowNodeDetailList = 
registry.get(RegistryModelType.WORKFLOW_NODE_DETAIL,
+                                                       
org.apache.airavata.registry.cpi.utils.Constants.FieldConstants.WorkflowNodeConstants.TASK_LIST,
 taskData);
+                       if (workflowNodeDetailList != null
+                                       && workflowNodeDetailList.size() > 0) {
+                               List<Object> experimentList = 
registry.get(RegistryModelType.EXPERIMENT,
+                                                               
org.apache.airavata.registry.cpi.utils.Constants.FieldConstants.ExperimentConstants.WORKFLOW_NODE_LIST,
+                                                               
(WorkflowNodeDetails) workflowNodeDetailList.get(0));
+                               if (experimentList != null && 
experimentList.size() > 0) {
+                                       return orchestrator
+                                                       .launchExperiment(
+                                                                       
(Experiment) experimentList.get(0),
+                                                                       
(WorkflowNodeDetails) workflowNodeDetailList
+                                                                               
        .get(0), taskData,airavataCredStoreToken);
+                               }
+                       }
+               } catch (Exception e) {
+            log.errorId(taskId, "Error while launching task ", e);
+            throw new TException(e);
+        }
+        log.infoId(taskId, "No experiment found associated in task {}", 
taskId);
+        return false;
+       }
+
+       private ApplicationDeploymentDescription getAppDeployment(
+                       TaskDetails taskData, String applicationId)
+                       throws AppCatalogException, OrchestratorException,
+                       ClassNotFoundException, ApplicationSettingsException,
+                       InstantiationException, IllegalAccessException {
+               AppCatalog appCatalog = AppCatalogFactory.getAppCatalog();
+               String selectedModuleId = getModuleId(appCatalog, 
applicationId);
+               ApplicationDeploymentDescription 
applicationDeploymentDescription = getAppDeployment(
+                               appCatalog, taskData, selectedModuleId);
+               return applicationDeploymentDescription;
+       }
+
+       private ApplicationDeploymentDescription getAppDeployment(
+                       AppCatalog appCatalog, TaskDetails taskData, String 
selectedModuleId)
+                       throws AppCatalogException, ClassNotFoundException,
+                       ApplicationSettingsException, InstantiationException,
+                       IllegalAccessException {
+               Map<String, String> moduleIdFilter = new HashMap<String, 
String>();
+               
moduleIdFilter.put(AbstractResource.ApplicationDeploymentConstants.APP_MODULE_ID,
 selectedModuleId);
+               if (taskData.getTaskScheduling()!=null && 
taskData.getTaskScheduling().getResourceHostId() != null) {
+                   
moduleIdFilter.put(AbstractResource.ApplicationDeploymentConstants.COMPUTE_HOST_ID,
 taskData.getTaskScheduling().getResourceHostId());
+               }
+               List<ApplicationDeploymentDescription> applicationDeployements 
= 
appCatalog.getApplicationDeployment().getApplicationDeployements(moduleIdFilter);
+               Map<ComputeResourceDescription, 
ApplicationDeploymentDescription> deploymentMap = new 
HashMap<ComputeResourceDescription, ApplicationDeploymentDescription>();
+               ComputeResource computeResource = 
appCatalog.getComputeResource();
+               for (ApplicationDeploymentDescription deploymentDescription : 
applicationDeployements) {
+                       
deploymentMap.put(computeResource.getComputeResource(deploymentDescription.getComputeHostId()),deploymentDescription);
+               }
+               List<ComputeResourceDescription> computeHostList = 
Arrays.asList(deploymentMap.keySet().toArray(new 
ComputeResourceDescription[]{}));   
+               Class<? extends HostScheduler> aClass = Class.forName(
+                               ServerSettings.getHostScheduler()).asSubclass(
+                               HostScheduler.class);
+               HostScheduler hostScheduler = aClass.newInstance();
+               ComputeResourceDescription ComputeResourceDescription = 
hostScheduler.schedule(computeHostList);
+               ApplicationDeploymentDescription 
applicationDeploymentDescription = 
deploymentMap.get(ComputeResourceDescription);
+               return applicationDeploymentDescription;
+       }
+
+       private String getModuleId(AppCatalog appCatalog, String applicationId)
+                       throws AppCatalogException, OrchestratorException {
+               ApplicationInterfaceDescription applicationInterface = 
appCatalog.getApplicationInterface().getApplicationInterface(applicationId);
+               List<String> applicationModules = 
applicationInterface.getApplicationModules();
+               if (applicationModules.size()==0){
+                       throw new OrchestratorException(
+                                       "No modules defined for application "
+                                                       + applicationId);
+               }
+//                     AiravataAPI airavataAPI = getAiravataAPI();
+               String selectedModuleId=applicationModules.get(0);
+               return selectedModuleId;
+       }
+
+    private boolean validateStatesAndCancel(String experimentId, String 
tokenId)throws TException{
+        try {
+            Experiment experiment = (Experiment) registry.get(
+                    RegistryModelType.EXPERIMENT, experimentId);
+                       log.info("Waiting for zookeeper to connect to the 
server");
+                       synchronized (mutex){
+                               mutex.wait(5000);
+                       }
+            if (experiment == null) {
+                log.errorId(experimentId, "Error retrieving the Experiment by 
the given experimentID: {}.", experimentId);
+                throw new OrchestratorException("Error retrieving the 
Experiment by the given experimentID: " + experimentId);
+            }
+            ExperimentState experimentState = 
experiment.getExperimentStatus().getExperimentState();
+            if (isCancelValid(experimentState)){
+                ExperimentStatus status = new ExperimentStatus();
+                status.setExperimentState(ExperimentState.CANCELING);
+                status.setTimeOfStateChange(Calendar.getInstance()
+                        .getTimeInMillis());
+                experiment.setExperimentStatus(status);
+                registry.update(RegistryModelType.EXPERIMENT, experiment,
+                        experimentId);
+
+                List<String> ids = registry.getIds(
+                        RegistryModelType.WORKFLOW_NODE_DETAIL,
+                        WorkflowNodeConstants.EXPERIMENT_ID, experimentId);
+                for (String workflowNodeId : ids) {
+                    WorkflowNodeDetails workflowNodeDetail = 
(WorkflowNodeDetails) registry
+                            .get(RegistryModelType.WORKFLOW_NODE_DETAIL,
+                                    workflowNodeId);
+                    int value = 
workflowNodeDetail.getWorkflowNodeStatus().getWorkflowNodeState().getValue();
+                    if ( value> 1 && value < 7) { // we skip the unknown state
+                        log.error(workflowNodeDetail.getNodeName() + " 
Workflow Node status cannot mark as cancelled, because " +
+                                "current status is " + 
workflowNodeDetail.getWorkflowNodeStatus().getWorkflowNodeState().toString());
+                        continue; // this continue is very useful not to 
process deeper loops if the upper layers have non-cancel states
+                    } else {
+                        WorkflowNodeStatus workflowNodeStatus = new 
WorkflowNodeStatus();
+                        
workflowNodeStatus.setWorkflowNodeState(WorkflowNodeState.CANCELING);
+                        
workflowNodeStatus.setTimeOfStateChange(Calendar.getInstance()
+                                .getTimeInMillis());
+                        
workflowNodeDetail.setWorkflowNodeStatus(workflowNodeStatus);
+                        
registry.update(RegistryModelType.WORKFLOW_NODE_DETAIL, workflowNodeDetail,
+                                workflowNodeId);
+                    }
+                    List<Object> taskDetailList = registry.get(
+                            RegistryModelType.TASK_DETAIL,
+                            TaskDetailConstants.NODE_ID, workflowNodeId);
+                    for (Object o : taskDetailList) {
+                        TaskDetails taskDetails = (TaskDetails) o;
+                        TaskStatus taskStatus = ((TaskDetails) 
o).getTaskStatus();
+                        if (taskStatus.getExecutionState().getValue() > 7 && 
taskStatus.getExecutionState().getValue()<12) {
+                            log.error(((TaskDetails) o).getTaskID() + " Task 
status cannot mark as cancelled, because " +
+                                    "current task state is " + ((TaskDetails) 
o).getTaskStatus().getExecutionState().toString());
+                            continue;// this continue is very useful not to 
process deeper loops if the upper layers have non-cancel states
+                        } else {
+                            taskStatus.setExecutionState(TaskState.CANCELING);
+                            
taskStatus.setTimeOfStateChange(Calendar.getInstance()
+                                    .getTimeInMillis());
+                            taskDetails.setTaskStatus(taskStatus);
+                            registry.update(RegistryModelType.TASK_DETAIL, o,
+                                    taskDetails.getTaskID());
+                        }
+                        orchestrator.cancelExperiment(experiment,
+                                workflowNodeDetail, taskDetails, tokenId);
+                        // Status update should be done at the monitor
+                    }
+                }
+            }else {
+                if (isCancelAllowed(experimentState)){
+                    // when experiment status is < 3 no jobDetails object is 
created,
+                    // so we don't have to worry, we simply have to change the 
status and stop the execution
+                    ExperimentStatus status = new ExperimentStatus();
+                    status.setExperimentState(ExperimentState.CANCELED);
+                    status.setTimeOfStateChange(Calendar.getInstance()
+                            .getTimeInMillis());
+                    experiment.setExperimentStatus(status);
+                    registry.update(RegistryModelType.EXPERIMENT, experiment,
+                            experimentId);
+                    List<String> ids = registry.getIds(
+                            RegistryModelType.WORKFLOW_NODE_DETAIL,
+                            WorkflowNodeConstants.EXPERIMENT_ID, experimentId);
+                    for (String workflowNodeId : ids) {
+                        WorkflowNodeDetails workflowNodeDetail = 
(WorkflowNodeDetails) registry
+                                .get(RegistryModelType.WORKFLOW_NODE_DETAIL,
+                                        workflowNodeId);
+                        WorkflowNodeStatus workflowNodeStatus = new 
WorkflowNodeStatus();
+                        
workflowNodeStatus.setWorkflowNodeState(WorkflowNodeState.CANCELED);
+                        
workflowNodeStatus.setTimeOfStateChange(Calendar.getInstance()
+                                .getTimeInMillis());
+                        
workflowNodeDetail.setWorkflowNodeStatus(workflowNodeStatus);
+                        
registry.update(RegistryModelType.WORKFLOW_NODE_DETAIL, workflowNodeDetail,
+                                workflowNodeId);
+                        List<Object> taskDetailList = registry.get(
+                                RegistryModelType.TASK_DETAIL,
+                                TaskDetailConstants.NODE_ID, workflowNodeId);
+                        for (Object o : taskDetailList) {
+                            TaskDetails taskDetails = (TaskDetails) o;
+                            TaskStatus taskStatus = ((TaskDetails) 
o).getTaskStatus();
+                            taskStatus.setExecutionState(TaskState.CANCELED);
+                            
taskStatus.setTimeOfStateChange(Calendar.getInstance()
+                                    .getTimeInMillis());
+                            taskDetails.setTaskStatus(taskStatus);
+                            registry.update(RegistryModelType.TASK_DETAIL, o,
+                                    taskDetails);
+                        }
+                    }
+                }else {
+                    log.errorId(experimentId, "Unable to mark experiment as 
Cancelled, current state {} doesn't allow to cancel the experiment {}.",
+                            
experiment.getExperimentStatus().getExperimentState().toString(), experimentId);
+                    throw new OrchestratorException("Unable to mark experiment 
as Cancelled, because current state is: "
+                            + 
experiment.getExperimentStatus().getExperimentState().toString());
+                }
+            }
+            log.info("Experiment: " + experimentId + " is cancelled !!!!!");
+        } catch (Exception e) {
+            throw new TException(e);
+        }
+        return true;
+    }
+
+    private boolean isCancelValid(ExperimentState state){
+        switch (state) {
+            case LAUNCHED:
+            case EXECUTING:
+            case CANCELING:
+                return true;
+            default:
+                return false;
+        }
+    }
+
+    private boolean isCancelAllowed(ExperimentState state){
+        switch (state) {
+            case CREATED:
+            case VALIDATED:
+            case SCHEDULED:
+                return true;
+            default:
+                return false;
+        }
+    }
+
+    private void launchWorkflowExperiment(String experimentId, String 
airavataCredStoreToken) throws TException {
+        try {
+            WorkflowEnactmentService.getInstance().
+                    submitWorkflow(experimentId, airavataCredStoreToken, 
getGatewayName(), getRabbitMQProcessPublisher());
+        } catch (Exception e) {
+            log.error("Error while launching workflow", e);
+        }
+    }
+
+    public synchronized RabbitMQProcessPublisher getRabbitMQProcessPublisher() 
throws Exception {
+        if (rabbitMQProcessPublisher == null) {
+            rabbitMQProcessPublisher = new RabbitMQProcessPublisher();
+        }
+        return rabbitMQProcessPublisher;
+    }
+
+
+    private class SingleAppExperimentRunner implements Runnable {
+
+        String experimentId;
+        String airavataCredStoreToken;
+        public SingleAppExperimentRunner(String experimentId,String 
airavataCredStoreToken){
+            this.experimentId = experimentId;
+            this.airavataCredStoreToken = airavataCredStoreToken;
+        }
+        @Override
+        public void run() {
+            try {
+                launchSingleAppExperiment();
+            } catch (TException e) {
+                e.printStackTrace();
+            }
+        }
+
+        private boolean launchSingleAppExperiment() throws TException {
+            Experiment experiment = null;
+            try {
+                List<String> ids = 
registry.getIds(RegistryModelType.WORKFLOW_NODE_DETAIL, 
WorkflowNodeConstants.EXPERIMENT_ID, experimentId);
+                for (String workflowNodeId : ids) {
+//                WorkflowNodeDetails workflowNodeDetail = 
(WorkflowNodeDetails) registry.get(RegistryModelType.WORKFLOW_NODE_DETAIL, 
workflowNodeId);
+                    List<Object> taskDetailList = 
registry.get(RegistryModelType.TASK_DETAIL, TaskDetailConstants.NODE_ID, 
workflowNodeId);
+                    for (Object o : taskDetailList) {
+                        TaskDetails taskData = (TaskDetails) o;
+                        //iterate through all the generated tasks and performs 
the job submisssion+monitoring
+                        experiment = (Experiment) 
registry.get(RegistryModelType.EXPERIMENT, experimentId);
+                        if (experiment == null) {
+                            log.errorId(experimentId, "Error retrieving the 
Experiment by the given experimentID: {}", experimentId);
+                            return false;
+                        }
+                        String gatewayId = null;
+                        CredentialReader credentialReader = 
GFacUtils.getCredentialReader();
+                        if (credentialReader != null) {
+                            try {
+                                gatewayId = 
credentialReader.getGatewayID(airavataCredStoreToken);
+                            } catch (Exception e) {
+                                log.error(e.getLocalizedMessage());
+                            }
+                        }
+                        if (gatewayId == null || gatewayId.isEmpty()) {
+                            gatewayId = ServerSettings.getDefaultUserGateway();
+                        }
+                        ExperimentStatusChangeEvent event = new 
ExperimentStatusChangeEvent(ExperimentState.LAUNCHED,
+                                experimentId,
+                                gatewayId);
+                        String messageId = AiravataUtils.getId("EXPERIMENT");
+                        MessageContext messageContext = new 
MessageContext(event, MessageType.EXPERIMENT, messageId, gatewayId);
+                        
messageContext.setUpdatedTime(AiravataUtils.getCurrentTimestamp());
+                        publisher.publish(messageContext);
+                        registry.update(RegistryModelType.TASK_DETAIL, 
taskData, taskData.getTaskID());
+                        //launching the experiment
+                        launchTask(taskData.getTaskID(), 
airavataCredStoreToken);
+                    }
+                }
+
+            } catch (Exception e) {
+                // Here we really do not have to do much because only 
potential failure can happen
+                // is in gfac, if there are errors in gfac, it will handle the 
experiment/task/job statuses
+                // We might get failures in registry access before submitting 
the jobs to gfac, in that case we
+                // leave the status of these as created.
+                ExperimentStatus status = new ExperimentStatus();
+                status.setExperimentState(ExperimentState.FAILED);
+                
status.setTimeOfStateChange(Calendar.getInstance().getTimeInMillis());
+                experiment.setExperimentStatus(status);
+                try {
+                    registry.update(RegistryModelType.EXPERIMENT_STATUS, 
status, experimentId);
+                } catch (RegistryException e1) {
+                    log.errorId(experimentId, "Error while updating experiment 
status to " + status.toString(), e);
+                    throw new TException(e);
+                }
+                log.errorId(experimentId, "Error while updating task status, 
hence updated experiment status to " + status.toString(), e);
+                throw new TException(e);
+            }
+            return true;
+        }
+    }
+
+    private class ProcessConsumer implements Runnable, MessageHandler{
+
+
+        @Override
+        public void run() {
+            try {
+                rabbitMQProcessConsumer.listen(this);
+            } catch (AiravataException e) {
+                log.error("Error while listen to the RabbitMQProcessConsumer");
+            }
+        }
+
+        @Override
+        public Map<String, Object> getProperties() {
+            Map<String, Object> props = new HashMap<String, Object>();
+            props.put(MessagingConstants.RABBIT_QUEUE, 
RabbitMQProcessPublisher.PROCESS);
+            props.put(MessagingConstants.RABBIT_ROUTING_KEY, 
RabbitMQProcessPublisher.PROCESS);
+            return props;
+        }
+
+        @Override
+        public void onMessage(MessageContext msgCtx) {
+            TBase event = msgCtx.getEvent();
+            if (event instanceof ProcessSubmitEvent) {
+                ProcessSubmitEvent processSubmitEvent = (ProcessSubmitEvent) 
event;
+                try {
+                    launchTask(processSubmitEvent.getTaskId(), 
processSubmitEvent.getCredentialToken());
+                } catch (TException e) {
+                    log.error("Error while launching task : " + 
processSubmitEvent.getTaskId());
+                }
+            }
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/airavata/blob/82773c73/modules/orchestrator/orchestrator-service/src/main/java/org/apache/airavata/orchestrator/util/Constants.java
----------------------------------------------------------------------
diff --git 
a/modules/orchestrator/orchestrator-service/src/main/java/org/apache/airavata/orchestrator/util/Constants.java
 
b/modules/orchestrator/orchestrator-service/src/main/java/org/apache/airavata/orchestrator/util/Constants.java
new file mode 100644
index 0000000..f9833e9
--- /dev/null
+++ 
b/modules/orchestrator/orchestrator-service/src/main/java/org/apache/airavata/orchestrator/util/Constants.java
@@ -0,0 +1,29 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF 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.orchestrator.util;
+
+public class Constants {
+    public static final String ORCHESTRATOT_SERVER_PORT = 
"orchestrator.server.port";
+    public static final String ORCHESTRATOT_SERVER_HOST = 
"orchestrator.server.host";
+    public static final String ORCHESTRATOT_SERVER_MIN_THREADS = 
"orchestrator.server.min.threads";
+
+}

http://git-wip-us.apache.org/repos/asf/airavata/blob/82773c73/modules/orchestrator/orchestrator-service/src/main/java/org/apache/airavata/orchestrator/util/DataModelUtils.java
----------------------------------------------------------------------
diff --git 
a/modules/orchestrator/orchestrator-service/src/main/java/org/apache/airavata/orchestrator/util/DataModelUtils.java
 
b/modules/orchestrator/orchestrator-service/src/main/java/org/apache/airavata/orchestrator/util/DataModelUtils.java
new file mode 100644
index 0000000..da11a59
--- /dev/null
+++ 
b/modules/orchestrator/orchestrator-service/src/main/java/org/apache/airavata/orchestrator/util/DataModelUtils.java
@@ -0,0 +1,55 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF 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.orchestrator.util;
+
+import java.util.List;
+
+import org.airavata.appcatalog.cpi.AppCatalogException;
+import org.airavata.appcatalog.cpi.ApplicationInterface;
+import org.apache.aiaravata.application.catalog.data.impl.AppCatalogFactory;
+import org.apache.airavata.model.util.ExecutionType;
+import org.apache.airavata.model.workspace.experiment.Experiment;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class DataModelUtils {
+
+    private final static Logger logger = 
LoggerFactory.getLogger(DataModelUtils.class);
+       public static ExecutionType getExecutionType(String gatewayId, 
Experiment experiment){
+               try {
+                       ApplicationInterface applicationInterface = 
AppCatalogFactory.getAppCatalog().getApplicationInterface();
+                       List<String> allApplicationInterfaceIds = 
applicationInterface.getAllApplicationInterfaceIds();
+                       String applicationId = experiment.getApplicationId();
+                       if (allApplicationInterfaceIds.contains(applicationId)){
+                               return ExecutionType.SINGLE_APP;
+                       } else {
+                               List<String> allWorkflows = 
AppCatalogFactory.getAppCatalog().getWorkflowCatalog().getAllWorkflows(gatewayId);
+                               if (allWorkflows.contains(applicationId)){
+                                       return ExecutionType.WORKFLOW;
+                               }
+                       }
+               } catch (AppCatalogException e) {
+                       logger.error(e.getMessage(), e);
+               }
+        return ExecutionType.UNKNOWN;
+       }
+}

http://git-wip-us.apache.org/repos/asf/airavata/blob/82773c73/modules/orchestrator/orchestrator-service/src/main/java/org/apache/airavata/orchestrator/util/OrchestratorServerThreadPoolExecutor.java
----------------------------------------------------------------------
diff --git 
a/modules/orchestrator/orchestrator-service/src/main/java/org/apache/airavata/orchestrator/util/OrchestratorServerThreadPoolExecutor.java
 
b/modules/orchestrator/orchestrator-service/src/main/java/org/apache/airavata/orchestrator/util/OrchestratorServerThreadPoolExecutor.java
new file mode 100644
index 0000000..1730998
--- /dev/null
+++ 
b/modules/orchestrator/orchestrator-service/src/main/java/org/apache/airavata/orchestrator/util/OrchestratorServerThreadPoolExecutor.java
@@ -0,0 +1,56 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF 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.orchestrator.util;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+
+import org.apache.airavata.common.exception.ApplicationSettingsException;
+import org.apache.airavata.common.logger.AiravataLogger;
+import org.apache.airavata.common.logger.AiravataLoggerFactory;
+import org.apache.airavata.common.utils.ServerSettings;
+
+public class OrchestratorServerThreadPoolExecutor {
+           private final static AiravataLogger logger = 
AiravataLoggerFactory.getLogger(OrchestratorServerThreadPoolExecutor.class);
+           public static final String AIRAVATA_SERVER_THREAD_POOL_SIZE = 
"airavata.server.thread.pool.size";
+
+           private static ExecutorService threadPool;
+
+           public static ExecutorService getCachedThreadPool() {
+               if(threadPool ==null){
+                   threadPool = Executors.newCachedThreadPool();
+               }
+               return threadPool;
+           }
+
+           public static ExecutorService getFixedThreadPool() {
+               if(threadPool ==null){
+                   try {
+                       threadPool = 
Executors.newFixedThreadPool(Integer.parseInt(ServerSettings.getSetting(AIRAVATA_SERVER_THREAD_POOL_SIZE)));
+                   } catch (ApplicationSettingsException e) {
+                       logger.error("Error reading " + 
AIRAVATA_SERVER_THREAD_POOL_SIZE+ " property");
+                   }
+               }
+               return threadPool;
+           }
+}

http://git-wip-us.apache.org/repos/asf/airavata/blob/82773c73/modules/orchestrator/orchestrator-service/src/main/resources/gsissh.properties
----------------------------------------------------------------------
diff --git 
a/modules/orchestrator/orchestrator-service/src/main/resources/gsissh.properties
 
b/modules/orchestrator/orchestrator-service/src/main/resources/gsissh.properties
new file mode 100644
index 0000000..3fdf76d
--- /dev/null
+++ 
b/modules/orchestrator/orchestrator-service/src/main/resources/gsissh.properties
@@ -0,0 +1,26 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF 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.
+#
+
+###########################################################################
+# Specifies system level configurations as a key/value pairs.
+###########################################################################
+
+StrictHostKeyChecking=no
+ssh.session.timeout=360000

http://git-wip-us.apache.org/repos/asf/airavata/blob/82773c73/modules/orchestrator/orchestrator-service/src/test/java/org/apache/airavata/orchestrator/client/OrchestratorClientFactoryTest.java
----------------------------------------------------------------------
diff --git 
a/modules/orchestrator/orchestrator-service/src/test/java/org/apache/airavata/orchestrator/client/OrchestratorClientFactoryTest.java
 
b/modules/orchestrator/orchestrator-service/src/test/java/org/apache/airavata/orchestrator/client/OrchestratorClientFactoryTest.java
new file mode 100644
index 0000000..18168c7
--- /dev/null
+++ 
b/modules/orchestrator/orchestrator-service/src/test/java/org/apache/airavata/orchestrator/client/OrchestratorClientFactoryTest.java
@@ -0,0 +1,90 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF 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.orchestrator.client;
+
+//import org.apache.airavata.client.AiravataAPIFactory;
+//import 
org.apache.airavata.client.api.exception.AiravataAPIInvocationException;
+//import org.apache.airavata.client.tools.DocumentCreator;
+//import org.apache.airavata.client.tools.DocumentCreatorNew;
+import org.apache.airavata.common.exception.ApplicationSettingsException;
+import org.apache.airavata.common.utils.AiravataUtils;
+import org.apache.airavata.common.utils.AiravataZKUtils;
+import org.apache.airavata.common.utils.Constants;
+import org.apache.airavata.common.utils.ServerSettings;
+import org.apache.airavata.model.error.AiravataClientConnectException;
+import org.apache.airavata.orchestrator.client.util.Initialize;
+import org.apache.airavata.orchestrator.cpi.OrchestratorService;
+import org.apache.airavata.orchestrator.server.OrchestratorServer;
+import org.apache.airavata.persistance.registry.jpa.impl.RegistryFactory;
+import org.apache.airavata.registry.cpi.Registry;
+import org.apache.zookeeper.server.ServerCnxnFactory;
+import org.junit.Test;
+
+public class OrchestratorClientFactoryTest {
+/*    private DocumentCreatorNew documentCreator;
+    private OrchestratorService.Client orchestratorClient;
+    private Registry registry;
+    private int NUM_CONCURRENT_REQUESTS = 1;
+    Initialize initialize;
+    OrchestratorServer service;
+    private static ServerCnxnFactory cnxnFactory;
+
+    @Test
+    public void setUp() {
+       AiravataUtils.setExecutionAsServer();
+        initialize = new Initialize("registry-derby.sql");
+        initialize.initializeDB();
+        System.setProperty(Constants.ZOOKEEPER_SERVER_PORT,"2185");
+        AiravataZKUtils.startEmbeddedZK(cnxnFactory);
+
+        try {
+            service = (new OrchestratorServer());
+            service.start();
+            registry = RegistryFactory.getDefaultRegistry();
+            documentCreator = new DocumentCreatorNew(getAiravataClient());
+            documentCreator.createLocalHostDocs();
+        } catch (Exception e) {
+            e.printStackTrace();  //To change body of catch statement use File 
| Settings | File Templates.
+        }
+        AiravataUtils.setExecutionAsServer();
+        try {
+            service.stop();
+        } catch (Exception e) {
+            e.printStackTrace();  //To change body of catch statement use File 
| Settings | File Templates.
+        }
+
+    }
+
+    private Airavata.Client getAiravataClient() {
+        Airavata.Client client = null;
+            try {
+                client = 
AiravataClientFactory.createAiravataClient("localhost", 8930);
+            } catch (AiravataClientConnectException e) {
+                e.printStackTrace();
+            }
+        return client;
+    }
+
+    private void storeDescriptors() {
+
+    }*/
+}

http://git-wip-us.apache.org/repos/asf/airavata/blob/82773c73/modules/orchestrator/orchestrator-service/src/test/java/org/apache/airavata/orchestrator/client/util/Initialize.java
----------------------------------------------------------------------
diff --git 
a/modules/orchestrator/orchestrator-service/src/test/java/org/apache/airavata/orchestrator/client/util/Initialize.java
 
b/modules/orchestrator/orchestrator-service/src/test/java/org/apache/airavata/orchestrator/client/util/Initialize.java
new file mode 100644
index 0000000..c827fc4
--- /dev/null
+++ 
b/modules/orchestrator/orchestrator-service/src/test/java/org/apache/airavata/orchestrator/client/util/Initialize.java
@@ -0,0 +1,330 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF 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.orchestrator.client.util;
+
+import org.apache.airavata.common.exception.ApplicationSettingsException;
+import org.apache.airavata.common.utils.AiravataUtils;
+import org.apache.airavata.common.utils.ServerSettings;
+import org.apache.airavata.persistance.registry.jpa.ResourceType;
+import org.apache.airavata.persistance.registry.jpa.resources.*;
+import org.apache.airavata.registry.cpi.RegistryException;
+import org.apache.derby.drda.NetworkServerControl;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.net.InetAddress;
+import java.sql.*;
+import java.util.StringTokenizer;
+
+public class Initialize {
+    private static final Logger logger = 
LoggerFactory.getLogger(Initialize.class);
+    public static final String DERBY_SERVER_MODE_SYS_PROPERTY = 
"derby.drda.startNetworkServer";
+    public  String scriptName = "registry-derby.sql";
+    private NetworkServerControl server;
+    private static final String delimiter = ";";
+    public static final String PERSISTANT_DATA = "Configuration";
+
+    public Initialize(String scriptName) {
+        this.scriptName = scriptName;
+    }
+
+    public static boolean checkStringBufferEndsWith(StringBuffer buffer, 
String suffix) {
+        if (suffix.length() > buffer.length()) {
+            return false;
+        }
+        // this loop is done on purpose to avoid memory allocation performance
+        // problems on various JDKs
+        // StringBuffer.lastIndexOf() was introduced in jdk 1.4 and
+        // implementation is ok though does allocation/copying
+        // StringBuffer.toString().endsWith() does massive memory
+        // allocation/copying on JDK 1.5
+        // See http://issues.apache.org/bugzilla/show_bug.cgi?id=37169
+        int endIndex = suffix.length() - 1;
+        int bufferIndex = buffer.length() - 1;
+        while (endIndex >= 0) {
+            if (buffer.charAt(bufferIndex) != suffix.charAt(endIndex)) {
+                return false;
+            }
+            bufferIndex--;
+            endIndex--;
+        }
+        return true;
+    }
+
+    private static boolean isServerStarted(NetworkServerControl server, int 
ntries)
+    {
+        for (int i = 1; i <= ntries; i ++)
+        {
+            try {
+                Thread.sleep(500);
+                server.ping();
+                return true;
+            }
+            catch (Exception e) {
+                if (i == ntries)
+                    return false;
+            }
+        }
+        return false;
+    }
+
+    public void initializeDB() throws SQLException{
+        String jdbcUrl = null;
+        String jdbcUser = null;
+        String jdbcPassword = null;
+        try{
+            jdbcUrl = ServerSettings.getSetting("registry.jdbc.url");
+            jdbcUser = ServerSettings.getSetting("registry.jdbc.user");
+            jdbcPassword = ServerSettings.getSetting("registry.jdbc.password");
+            jdbcUrl = jdbcUrl + "?" + "user=" + jdbcUser + "&" + "password=" + 
jdbcPassword;
+        } catch (ApplicationSettingsException e) {
+            logger.error("Unable to read properties", e);
+        }
+        startDerbyInServerMode();
+        if(!isServerStarted(server, 20)){
+           throw new RuntimeException("Derby server cound not started within 
five seconds...");
+        }
+
+        Connection conn = null;
+        try {
+            Class.forName(Utils.getJDBCDriver()).newInstance();
+            conn = DriverManager.getConnection(jdbcUrl, jdbcUser, 
jdbcPassword);
+            if (!isDatabaseStructureCreated(PERSISTANT_DATA, conn)) {
+                executeSQLScript(conn);
+                logger.info("New Database created for Registry");
+            } else {
+                logger.debug("Database already created for Registry!");
+            }
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+            throw new RuntimeException("Database failure", e);
+        } finally {
+            try {
+                if (conn != null){
+                    if (!conn.getAutoCommit()) {
+                        conn.commit();
+                    }
+                    conn.close();
+                }
+            } catch (SQLException e) {
+                logger.error(e.getMessage(), e);
+            }
+        }
+
+        try{
+            GatewayResource gatewayResource = new GatewayResource();
+            
gatewayResource.setGatewayId(ServerSettings.getSetting("default.registry.gateway"));
+            
gatewayResource.setGatewayName(ServerSettings.getSetting("default.registry.gateway"));
+            gatewayResource.setDomain("test-domain");
+            gatewayResource.setEmailAddress("test-email");
+            gatewayResource.save();
+            
+            UserResource userResource = new UserResource();
+            
userResource.setUserName(ServerSettings.getSetting("default.registry.user"));
+            
userResource.setPassword(ServerSettings.getSetting("default.registry.password"));
+            userResource.save();
+
+            WorkerResource workerResource = (WorkerResource) 
gatewayResource.create(ResourceType.GATEWAY_WORKER);
+            workerResource.setUser(userResource.getUserName());
+            workerResource.save();
+            
+            ProjectResource projectResource = 
(ProjectResource)workerResource.create(ResourceType.PROJECT);
+            projectResource.setGatewayId(gatewayResource.getGatewayId());
+            projectResource.setId("default");
+            projectResource.setName("default");
+            projectResource.setWorker(workerResource);
+            projectResource.save();
+        
+          
+        } catch (ApplicationSettingsException e) {
+            logger.error("Unable to read properties", e);
+            throw new SQLException(e.getMessage(), e);
+        } catch (RegistryException e) {
+            logger.error("Unable to save data to registry", e);
+            throw new SQLException(e.getMessage(), e);
+        }
+    }
+
+    public static boolean isDatabaseStructureCreated(String tableName, 
Connection conn) {
+        try {
+            System.out.println("Running a query to test the database tables 
existence.");
+            // check whether the tables are already created with a query
+            Statement statement = null;
+            try {
+                statement = conn.createStatement();
+                ResultSet rs = statement.executeQuery("select * from " + 
tableName);
+                if (rs != null) {
+                    rs.close();
+                }
+            } finally {
+                try {
+                    if (statement != null) {
+                        statement.close();
+                    }
+                } catch (SQLException e) {
+                    return false;
+                }
+            }
+        } catch (SQLException e) {
+            return false;
+        }
+
+        return true;
+    }
+
+    private void executeSQLScript(Connection conn) throws Exception {
+        StringBuffer sql = new StringBuffer();
+        BufferedReader reader = null;
+        try{
+
+        InputStream inputStream = 
this.getClass().getClassLoader().getResourceAsStream(scriptName);
+        reader = new BufferedReader(new InputStreamReader(inputStream));
+        String line;
+        while ((line = reader.readLine()) != null) {
+            line = line.trim();
+            if (line.startsWith("//")) {
+                continue;
+            }
+            if (line.startsWith("--")) {
+                continue;
+            }
+            StringTokenizer st = new StringTokenizer(line);
+            if (st.hasMoreTokens()) {
+                String token = st.nextToken();
+                if ("REM".equalsIgnoreCase(token)) {
+                    continue;
+                }
+            }
+            sql.append(" ").append(line);
+
+            // SQL defines "--" as a comment to EOL
+            // and in Oracle it may contain a hint
+            // so we cannot just remove it, instead we must end it
+            if (line.indexOf("--") >= 0) {
+                sql.append("\n");
+            }
+            if ((checkStringBufferEndsWith(sql, delimiter))) {
+                executeSQL(sql.substring(0, sql.length() - 
delimiter.length()), conn);
+                sql.replace(0, sql.length(), "");
+            }
+        }
+        // Catch any statements not followed by ;
+        if (sql.length() > 0) {
+            executeSQL(sql.toString(), conn);
+        }
+        }catch (IOException e){
+            logger.error("Error occurred while executing SQL script for 
creating Airavata database", e);
+            throw new Exception("Error occurred while executing SQL script for 
creating Airavata database", e);
+        }finally {
+            if (reader != null) {
+                reader.close();
+            }
+
+        }
+
+    }
+
+    private static void executeSQL(String sql, Connection conn) throws 
Exception {
+        // Check and ignore empty statements
+        if ("".equals(sql.trim())) {
+            return;
+        }
+
+        Statement statement = null;
+        try {
+            logger.debug("SQL : " + sql);
+
+            boolean ret;
+            int updateCount = 0, updateCountTotal = 0;
+            statement = conn.createStatement();
+            ret = statement.execute(sql);
+            updateCount = statement.getUpdateCount();
+            do {
+                if (!ret) {
+                    if (updateCount != -1) {
+                        updateCountTotal += updateCount;
+                    }
+                }
+                ret = statement.getMoreResults();
+                if (ret) {
+                    updateCount = statement.getUpdateCount();
+                }
+            } while (ret);
+
+            logger.debug(sql + " : " + updateCountTotal + " rows affected");
+
+            SQLWarning warning = conn.getWarnings();
+            while (warning != null) {
+                logger.warn(warning + " sql warning");
+                warning = warning.getNextWarning();
+            }
+            conn.clearWarnings();
+        } catch (SQLException e) {
+            if (e.getSQLState().equals("X0Y32")) {
+                // eliminating the table already exception for the derby
+                // database
+                logger.info("Table Already Exists", e);
+            } else {
+                throw new Exception("Error occurred while executing : " + sql, 
e);
+            }
+        } finally {
+            if (statement != null) {
+                try {
+                    statement.close();
+                } catch (SQLException e) {
+                    logger.error("Error occurred while closing result set.", 
e);
+                }
+            }
+        }
+    }
+
+    private void startDerbyInServerMode() {
+        try {
+            System.setProperty(DERBY_SERVER_MODE_SYS_PROPERTY, "true");
+            server = new 
NetworkServerControl(InetAddress.getByName(Utils.getHost()),
+                    20000,
+                    Utils.getJDBCUser(), Utils.getJDBCPassword());
+            java.io.PrintWriter consoleWriter = new 
java.io.PrintWriter(System.out, true);
+            server.start(consoleWriter);
+        } catch (IOException e) {
+            logger.error("Unable to start Apache derby in the server mode! 
Check whether " +
+                    "specified port is available");
+        } catch (Exception e) {
+            logger.error("Unable to start Apache derby in the server mode! 
Check whether " +
+                    "specified port is available");
+        }
+
+    }
+
+    public void stopDerbyServer() throws SQLException{
+        try {
+            server.shutdown();
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+            throw new SQLException("Error while stopping derby server", e);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/airavata/blob/82773c73/modules/orchestrator/orchestrator-service/src/test/resources/gsissh.properties
----------------------------------------------------------------------
diff --git 
a/modules/orchestrator/orchestrator-service/src/test/resources/gsissh.properties
 
b/modules/orchestrator/orchestrator-service/src/test/resources/gsissh.properties
new file mode 100644
index 0000000..3fdf76d
--- /dev/null
+++ 
b/modules/orchestrator/orchestrator-service/src/test/resources/gsissh.properties
@@ -0,0 +1,26 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF 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.
+#
+
+###########################################################################
+# Specifies system level configurations as a key/value pairs.
+###########################################################################
+
+StrictHostKeyChecking=no
+ssh.session.timeout=360000

http://git-wip-us.apache.org/repos/asf/airavata/blob/82773c73/modules/orchestrator/orchestrator-service/src/test/resources/monitor.properties
----------------------------------------------------------------------
diff --git 
a/modules/orchestrator/orchestrator-service/src/test/resources/monitor.properties
 
b/modules/orchestrator/orchestrator-service/src/test/resources/monitor.properties
new file mode 100644
index 0000000..7f0299a
--- /dev/null
+++ 
b/modules/orchestrator/orchestrator-service/src/test/resources/monitor.properties
@@ -0,0 +1,30 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF 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.
+#
+
+primaryMonitor=org.apache.airavata.gfac.monitor.impl.push.amqp.AMQPMonitor
+secondaryMonitor=org.apache.airavata.gfac.monitor.impl.pull.qstat.QstatMonitor
+amqp.hosts=info1.dyn.teragrid.org,info2.dyn.teragrid.org
+connection.name=xsede_private
+trusted.certificate.location=/Users/chathuri/dev/airavata/cert/certificates
+certificate.path=/Users/chathuri/dev/airavata/cert/certificates
+myproxy.server=myproxy.teragrid.org
+myproxy.user=ogce
+myproxy.password=
+myproxy.life=3600
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/airavata/blob/82773c73/modules/orchestrator/orchestrator-service/src/test/resources/orchestrator.properties
----------------------------------------------------------------------
diff --git 
a/modules/orchestrator/orchestrator-service/src/test/resources/orchestrator.properties
 
b/modules/orchestrator/orchestrator-service/src/test/resources/orchestrator.properties
new file mode 100644
index 0000000..e84c429
--- /dev/null
+++ 
b/modules/orchestrator/orchestrator-service/src/test/resources/orchestrator.properties
@@ -0,0 +1,26 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF 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.
+#
+job.submitter=org.apache.airavata.orchestrator.core.impl.GFACEmbeddedJobSubmitter
+job.validators=org.apache.airavata.orchestrator.core.validator.impl.BatchQueueValidator
+submitter.interval=10000
+threadpool.size=0
+start.submitter=true
+embedded.mode=true
+enable.validation=false

Reply via email to