/**
*
* 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.client.samples;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import org.apache.airavata.api.Airavata;
import org.apache.airavata.api.client.AiravataClientFactory;
import org.apache.airavata.client.tools.RegisterSampleApplications;
import org.apache.airavata.client.tools.RegisterSampleApplicationsUtils;
import org.apache.airavata.model.appcatalog.computeresource.ComputeResourceDescription;
import org.apache.airavata.model.appcatalog.computeresource.JobSubmissionInterface;
import org.apache.airavata.model.appcatalog.computeresource.JobSubmissionProtocol;
import org.apache.airavata.model.appcatalog.computeresource.UnicoreJobSubmission;
import org.apache.airavata.model.application.io.DataType;
import org.apache.airavata.model.application.io.InputDataObjectType;
import org.apache.airavata.model.application.io.OutputDataObjectType;
import org.apache.airavata.model.commons.ErrorModel;
import org.apache.airavata.model.data.movement.SecurityProtocol;
import org.apache.airavata.model.error.*;
import org.apache.airavata.model.experiment.ExperimentModel;
import org.apache.airavata.model.experiment.UserConfigurationDataModel;
import org.apache.airavata.model.scheduling.ComputationalResourceSchedulingModel;
import org.apache.airavata.model.security.AuthzToken;
import org.apache.airavata.model.status.ExperimentState;
import org.apache.airavata.model.status.JobStatus;
import org.apache.airavata.model.util.ExperimentModelUtil;
import org.apache.airavata.model.util.ProjectModelUtil;
import org.apache.airavata.model.workspace.Gateway;
import org.apache.airavata.model.workspace.Project;
import org.apache.thrift.TException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class CreateLaunchExperiment {

    // FIXME: Read from a config file
    public static final String THRIFT_SERVER_HOST = "gw77.iu.xsede.org";
    public static final int THRIFT_SERVER_PORT = 8930;
    //	public static final String THRIFT_SERVER_HOST = "gw111.iu.xsede.org";
    //	public static final int THRIFT_SERVER_PORT = 9930;

    private static final Logger logger = LoggerFactory.getLogger(CreateLaunchExperiment.class);
    public static final String DEFAULT_USER = "default.registry.user";
    public static final String DEFAULT_GATEWAY = "default";
    private static Airavata.Client airavataClient;

    private static String echoAppId = "Python_Echo_069ea651-4937-4b89-9684-fb0682ac52f5";
    private static String mpiAppId = "HelloMPI_71b6f45e-40c2-46e9-a417-160b2640fcb9";
    private static String wrfAppId = "WRF_7ad5da38-c08b-417c-a9ea-da9298839762";
    private static String amberAppId = "Amber_74ad818e-7633-476a-b861-952de9b0a529";
    private static String gromacsAppId = "GROMACS_05622038-9edd-4cb1-824e-0b7cb993364b";
    private static String espressoAppId = "ESPRESSO_10cc2820-5d0b-4c63-9546-8a8b595593c1";
    private static String lammpsAppId = "LAMMPS_2472685b-8acf-497e-aafe-cc66fe5f4cb6";
    private static String nwchemAppId = "NWChem_2c8fee64-acf9-4a89-b6d3-91eb53c7640c";
    private static String trinityAppId = "Trinity_e894acf5-9bca-46e8-a1bd-7e2d5155191a";
    private static String autodockAppId = "AutoDock_43d9fdd0-c404-49f4-b913-3abf9080a8c9";

    private static String localHost = "localhost";
    private static String trestlesHostName = "trestles.sdsc.xsede.org";
    private static String unicoreHostName = "fsd-cloud15.zam.kfa-juelich.de";
    private static String stampedeHostName = "stampede.tacc.xsede.org";
    private static String br2HostName = "bigred2.uits.iu.edu";
    private static String umassrcHostName = "ghpcc06.umassrc.org";

    private static String gatewayId;

    // unicore service endpoint url
    private static final String unicoreEndPointURL =
            "https://fsd-cloud15.zam.kfa-juelich.de:7000/INTEROP1/services/BESFactory?res=default_bes_factory";

    public static void main(String[] args) throws Exception {
        airavataClient = AiravataClientFactory.createAiravataClient(THRIFT_SERVER_HOST, THRIFT_SERVER_PORT);
        AuthzToken token = new AuthzToken("empty_token");
        System.out.println("API version is " + airavataClient.getAPIVersion());
        //        registerApplications(); // run this only the first time
        //        Map<String, String> master = airavataClient.getAllUserSSHPubKeys(token, "master");
        //        System.out.println(master.size());
        Map<String, JobStatus> jobStatuses =
                airavataClient.getJobStatuses(token, "SLM3-QEspresso-Stampede_dc2af008-a832-4fba-ab0a-4b61fa79f5b9");
        for (String jobId : jobStatuses.keySet()) {
            JobStatus jobStatus = jobStatuses.get(jobId);
            System.out.println(jobId);
            System.out.println(jobStatus.getJobState().toString());
        }
        //        createAndLaunchExp();
    }

    private static String fsdResourceId;

    public static void getAvailableAppInterfaceComputeResources(String appInterfaceId) {
        try {
            Map<String, String> availableAppInterfaceComputeResources =
                    airavataClient.getAvailableAppInterfaceComputeResources(new AuthzToken(""), appInterfaceId);
            for (String key : availableAppInterfaceComputeResources.keySet()) {
                System.out.println("id : " + key);
                System.out.println("name : " + availableAppInterfaceComputeResources.get(key));
            }
        } catch (AiravataSystemException e) {
            e.printStackTrace();
        } catch (InvalidRequestException e) {
            e.printStackTrace();
        } catch (AiravataClientException e) {
            e.printStackTrace();
        } catch (TException e) {
            e.printStackTrace();
        }
    }

    public static void createGateway() {
        try {
            Gateway gateway = new Gateway();
            gateway.setGatewayId("testGatewayId2");
            gateway.setGatewayName("testGateway2");
            gatewayId = airavataClient.addGateway(new AuthzToken(""), gateway);
            System.out.println(gatewayId);
        } catch (AiravataSystemException e) {
            e.printStackTrace();
        } catch (InvalidRequestException e) {
            e.printStackTrace();
        } catch (AiravataClientException e) {
            e.printStackTrace();
        } catch (TException e) {
            e.printStackTrace();
        }
    }

    public static void getGateway(String gatewayId) {
        try {
            Gateway gateway = airavataClient.getGateway(new AuthzToken(""), gatewayId);
            gateway.setDomain("testDomain");
            airavataClient.updateGateway(new AuthzToken(""), gatewayId, gateway);
            List<Gateway> allGateways = airavataClient.getAllGateways(new AuthzToken(""));
            System.out.println(allGateways.size());
            if (airavataClient.isGatewayExist(new AuthzToken(""), gatewayId)) {
                Gateway gateway1 = airavataClient.getGateway(new AuthzToken(""), gatewayId);
                System.out.println(gateway1.getGatewayName());
            }
            boolean b = airavataClient.deleteGateway(new AuthzToken(""), "testGatewayId2");
            System.out.println(b);
        } catch (AiravataSystemException e) {
            e.printStackTrace();
        } catch (InvalidRequestException e) {
            e.printStackTrace();
        } catch (AiravataClientException e) {
            e.printStackTrace();
        } catch (TException e) {
            e.printStackTrace();
        }
    }

    public static void createAndLaunchExp() throws TException {
        List<String> experimentIds = new ArrayList<String>();
        try {
            for (int i = 0; i < 1; i++) {
                //                final String expId = createExperimentForSSHHost(airavata);
                //                final String expId = createEchoExperimentForFSD(airavataClient);
                //                final String expId = createMPIExperimentForFSD(airavataClient);
                //               final String expId = createEchoExperimentForStampede(airavataClient);
                //                final String expId = createEchoExperimentForTrestles(airavataClient);
                //                final String expId = createExperimentEchoForLocalHost(airavataClient);
                //                final String expId = createExperimentWRFTrestles(airavataClient);
                //                final String expId = createExperimentForBR2(airavataClient);
                //                final String expId = createExperimentForBR2Amber(airavataClient);
                //                final String expId = createExperimentWRFStampede(airavataClient);
                final String expId = createExperimentForStampedeAmber(airavataClient);
                //                String expId = createExperimentForTrestlesAmber(airavataClient);
                //                final String expId = createExperimentGROMACSStampede(airavataClient);
                //                final String expId = createExperimentESPRESSOStampede(airavataClient);
                //                final String expId = createExperimentLAMMPSStampede(airavataClient);
                //                final String expId = createExperimentNWCHEMStampede(airavataClient);
                //                final String expId = createExperimentTRINITYStampede(airavataClient);
                //                final String expId = createExperimentAUTODOCKStampede(airavataClient); // this is not
                // working , we need to register AutoDock app on stampede
                //                final String expId = createExperimentForLSF(airavataClient);
                //                final String expId = createExperimentLAMMPSForLSF(airavataClient);
                //            	  final String expId = "Ultrascan_ln_eb029947-391a-4ccf-8ace-9bafebe07cc0";
                experimentIds.add(expId);
                System.out.println("Experiment ID : " + expId);
                //                updateExperiment(airavata, expId);

                launchExperiment(airavataClient, expId);
            }

            boolean allNotFinished = true;
            while (allNotFinished) {
                allNotFinished = false;
                for (String exId : experimentIds) {
                    ExperimentModel experiment = airavataClient.getExperiment(new AuthzToken(""), exId);
                    if (!experiment.getExperimentStatus().get(0).getState().equals(ExperimentState.COMPLETED)
                            && !experiment
                                    .getExperimentStatus()
                                    .get(0)
                                    .getState()
                                    .equals(ExperimentState.FAILED)
                            && !experiment
                                    .getExperimentStatus()
                                    .get(0)
                                    .getState()
                                    .equals(ExperimentState.CANCELED)) {
                        allNotFinished = true;
                    }
                    System.out.println(experiment.getExperimentId() + " "
                            + experiment.getExperimentStatus().get(0).getState().name());
                }
                System.out.println("----------------------------------------------------");
                Thread.sleep(10000);
            }

        } catch (Exception e) {
            logger.error("Error while connecting with server", e.getMessage());
            e.printStackTrace();
        }
    }

    public static void registerApplications() {
        RegisterSampleApplications registerSampleApplications = new RegisterSampleApplications(airavataClient);

        // register localhost compute host
        registerSampleApplications.registerLocalHost();

        // Register all compute hosts
        registerSampleApplications.registerXSEDEHosts();

        registerSampleApplications.registerNonXSEDEHosts();

        // Register Gateway Resource Preferences
        registerSampleApplications.registerGatewayResourceProfile();

        // Register all application modules
        registerSampleApplications.registerAppModules();

        // Register all application deployments
        registerSampleApplications.registerAppDeployments();

        // Register all application interfaces
        registerSampleApplications.registerAppInterfaces();
    }

    public static String registerUnicoreEndpoint(
            String hostName, String hostDesc, JobSubmissionProtocol protocol, SecurityProtocol securityProtocol)
            throws TException {

        ComputeResourceDescription computeResourceDescription =
                RegisterSampleApplicationsUtils.createComputeResourceDescription(hostName, hostDesc, null, null);

        fsdResourceId = airavataClient.registerComputeResource(new AuthzToken(""), computeResourceDescription);

        if (fsdResourceId.isEmpty()) throw new AiravataClientException();

        System.out.println("FSD Compute ResourceID: " + fsdResourceId);

        JobSubmissionInterface jobSubmission =
                RegisterSampleApplicationsUtils.createJobSubmissionInterface(fsdResourceId, protocol, 2);
        UnicoreJobSubmission ucrJobSubmission = new UnicoreJobSubmission();
        ucrJobSubmission.setSecurityProtocol(securityProtocol);
        ucrJobSubmission.setUnicoreEndPointURL(unicoreEndPointURL);

        return jobSubmission.getJobSubmissionInterfaceId();
    }

    public static String createEchoExperimentForTrestles(Airavata.Client client) throws TException {
        try {
            List<InputDataObjectType> exInputs = client.getApplicationInputs(new AuthzToken(""), echoAppId);
            for (InputDataObjectType inputDataObjectType : exInputs) {
                if (inputDataObjectType.getName().equalsIgnoreCase("Input_to_Echo")) {
                    inputDataObjectType.setValue("Hello World");
                }
            }
            List<OutputDataObjectType> exOut = client.getApplicationOutputs(new AuthzToken(""), echoAppId);

            Project project = ProjectModelUtil.createProject("default", "admin", "test project");
            String projectId = client.createProject(new AuthzToken(""), DEFAULT_GATEWAY, project);

            ExperimentModel simpleExperiment = ExperimentModelUtil.createSimpleExperiment(
                    DEFAULT_GATEWAY, projectId, "admin", "echoExperiment", "SimpleEcho3", echoAppId, exInputs);
            simpleExperiment.setExperimentOutputs(exOut);

            Map<String, String> computeResources =
                    airavataClient.getAvailableAppInterfaceComputeResources(new AuthzToken(""), echoAppId);
            if (computeResources != null && computeResources.size() != 0) {
                for (String id : computeResources.keySet()) {
                    String resourceName = computeResources.get(id);
                    if (resourceName.equals(trestlesHostName)) {
                        ComputationalResourceSchedulingModel scheduling =
                                ExperimentModelUtil.createComputationResourceScheduling(id, 1, 1, 1, "normal", 30, 1);
                        UserConfigurationDataModel userConfigurationData = new UserConfigurationDataModel();
                        userConfigurationData.setAiravataAutoSchedule(false);
                        userConfigurationData.setOverrideManualScheduledParams(false);
                        userConfigurationData.setComputationalResourceScheduling(scheduling);
                        simpleExperiment.setUserConfigurationData(userConfigurationData);
                        return client.createExperiment(new AuthzToken(""), DEFAULT_GATEWAY, simpleExperiment);
                    }
                }
            }
        } catch (AiravataSystemException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new AiravataSystemException(e);
        } catch (InvalidRequestException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new InvalidRequestException(e);
        } catch (AiravataClientException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new AiravataClientException(e);
        } catch (TException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new TException(e);
        }
        return null;
    }

    public static String createEchoExperimentForFSD(Airavata.Client client) throws TException {
        try {
            List<InputDataObjectType> exInputs = client.getApplicationInputs(new AuthzToken(""), echoAppId);
            for (InputDataObjectType inputDataObjectType : exInputs) {
                if (inputDataObjectType.getName().equalsIgnoreCase("Input_to_Echo")) {
                    inputDataObjectType.setValue("Hello World");
                } else if (inputDataObjectType.getName().equalsIgnoreCase("Input_to_Echo2")) {
                    inputDataObjectType.setValue("http://www.textfiles.com/100/ad.txt");
                } else if (inputDataObjectType.getName().equalsIgnoreCase("Input_to_Echo3")) {
                    inputDataObjectType.setValue("file:///tmp/test.txt");
                }
            }
            List<OutputDataObjectType> exOut = client.getApplicationOutputs(new AuthzToken(""), echoAppId);

            ExperimentModel simpleExperiment = ExperimentModelUtil.createSimpleExperiment(
                    DEFAULT_GATEWAY, "default", "admin", "echoExperiment", "SimpleEcho2", echoAppId, exInputs);
            simpleExperiment.setExperimentOutputs(exOut);

            Map<String, String> computeResources =
                    airavataClient.getAvailableAppInterfaceComputeResources(new AuthzToken(""), echoAppId);
            if (computeResources != null && computeResources.size() != 0) {
                for (String id : computeResources.keySet()) {
                    String resourceName = computeResources.get(id);
                    if (resourceName.equals(unicoreHostName)) {
                        ComputationalResourceSchedulingModel scheduling =
                                ExperimentModelUtil.createComputationResourceScheduling(
                                        id, 1, 1, 1, "normal", 30, 1048576);
                        UserConfigurationDataModel userConfigurationData = new UserConfigurationDataModel();
                        userConfigurationData.setAiravataAutoSchedule(false);
                        userConfigurationData.setOverrideManualScheduledParams(false);
                        userConfigurationData.setComputationalResourceScheduling(scheduling);
                        userConfigurationData.setGenerateCert(false);
                        userConfigurationData.setUserDN("");
                        simpleExperiment.setUserConfigurationData(userConfigurationData);

                        return client.createExperiment(new AuthzToken(""), DEFAULT_GATEWAY, simpleExperiment);
                    }
                }
            }
        } catch (AiravataSystemException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new AiravataSystemException(e);
        } catch (InvalidRequestException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new InvalidRequestException(e);
        } catch (AiravataClientException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new AiravataClientException(e);
        } catch (TException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new TException(e);
        }
        return null;
    }

    public static String createMPIExperimentForFSD(Airavata.Client client) throws TException {
        try {
            List<InputDataObjectType> exInputs = client.getApplicationInputs(new AuthzToken(""), mpiAppId);
            for (InputDataObjectType inputDataObjectType : exInputs) {
                if (inputDataObjectType.getName().equalsIgnoreCase("Sample_Input")) {
                    inputDataObjectType.setValue("");
                }
            }
            List<OutputDataObjectType> exOut = client.getApplicationOutputs(new AuthzToken(""), mpiAppId);

            ExperimentModel simpleExperiment = ExperimentModelUtil.createSimpleExperiment(
                    DEFAULT_GATEWAY, "default", "admin", "mpiExperiment", "HelloMPI", mpiAppId, null);
            simpleExperiment.setExperimentOutputs(exOut);

            Map<String, String> computeResources =
                    airavataClient.getAvailableAppInterfaceComputeResources(new AuthzToken(""), mpiAppId);
            if (computeResources != null && computeResources.size() != 0) {
                for (String id : computeResources.keySet()) {
                    String resourceName = computeResources.get(id);
                    if (resourceName.equals(unicoreHostName)) {
                        ComputationalResourceSchedulingModel scheduling =
                                ExperimentModelUtil.createComputationResourceScheduling(
                                        id, 2, 1, 2, "normal", 30, 1048576);
                        UserConfigurationDataModel userConfigurationData = new UserConfigurationDataModel();
                        userConfigurationData.setAiravataAutoSchedule(false);
                        userConfigurationData.setOverrideManualScheduledParams(false);
                        userConfigurationData.setComputationalResourceScheduling(scheduling);

                        userConfigurationData.setGenerateCert(false);
                        userConfigurationData.setUserDN("");

                        simpleExperiment.setUserConfigurationData(userConfigurationData);

                        return client.createExperiment(new AuthzToken(""), DEFAULT_GATEWAY, simpleExperiment);
                    }
                }
            }
        } catch (AiravataSystemException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new AiravataSystemException(e);
        } catch (InvalidRequestException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new InvalidRequestException(e);
        } catch (AiravataClientException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new AiravataClientException(e);
        } catch (TException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new TException(e);
        }
        return null;
    }

    public static String createExperimentWRFStampede(Airavata.Client client) throws TException {
        try {
            List<InputDataObjectType> exInputs = client.getApplicationInputs(new AuthzToken(""), wrfAppId);
            setWRFInputs(exInputs);
            List<OutputDataObjectType> exOut = client.getApplicationOutputs(new AuthzToken(""), wrfAppId);

            ExperimentModel simpleExperiment = ExperimentModelUtil.createSimpleExperiment(
                    DEFAULT_GATEWAY, "default", "admin", "WRFExperiment", "Testing", wrfAppId, exInputs);
            simpleExperiment.setExperimentOutputs(exOut);

            Map<String, String> computeResources =
                    airavataClient.getAvailableAppInterfaceComputeResources(new AuthzToken(""), wrfAppId);
            if (computeResources != null && computeResources.size() != 0) {
                for (String id : computeResources.keySet()) {
                    String resourceName = computeResources.get(id);
                    if (resourceName.equals(stampedeHostName)) {
                        ComputationalResourceSchedulingModel scheduling =
                                ExperimentModelUtil.createComputationResourceScheduling(
                                        id, 2, 32, 1, "development", 90, 1);
                        UserConfigurationDataModel userConfigurationData = new UserConfigurationDataModel();
                        userConfigurationData.setAiravataAutoSchedule(false);
                        userConfigurationData.setOverrideManualScheduledParams(false);
                        userConfigurationData.setComputationalResourceScheduling(scheduling);
                        simpleExperiment.setUserConfigurationData(userConfigurationData);
                        return client.createExperiment(new AuthzToken(""), DEFAULT_GATEWAY, simpleExperiment);
                    }
                }
            }
        } catch (AiravataSystemException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new AiravataSystemException(e);
        } catch (InvalidRequestException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new InvalidRequestException(e);
        } catch (AiravataClientException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new AiravataClientException(e);
        } catch (TException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new TException(e);
        }
        return null;
    }

    private static void setWRFInputs(List<InputDataObjectType> exInputs) {
        for (InputDataObjectType inputDataObjectType : exInputs) {
            if (inputDataObjectType.getName().equalsIgnoreCase("Config_Namelist_File")) {
                inputDataObjectType.setValue(
                        "/Users/shameera/Downloads/PHP-Gateway-Scripts/appScripts/WRF_FILES/namelist.input");
            } else if (inputDataObjectType.getName().equalsIgnoreCase("WRF_Initial_Conditions")) {
                inputDataObjectType.setValue(
                        "/Users/shameera/Downloads/PHP-Gateway-Scripts/appScripts/WRF_FILES/wrfinput_d01");
            } else if (inputDataObjectType.getName().equalsIgnoreCase("WRF_Boundary_File")) {
                inputDataObjectType.setValue(
                        "/Users/shameera/Downloads/PHP-Gateway-Scripts/appScripts/WRF_FILES/wrfbdy_d01");
            }
        }
    }

    public static String createExperimentGROMACSStampede(Airavata.Client client) throws TException {
        try {

            List<InputDataObjectType> exInputs = client.getApplicationInputs(new AuthzToken(""), gromacsAppId);
            setGROMACSInputs(exInputs);
            List<OutputDataObjectType> exOut = client.getApplicationOutputs(new AuthzToken(""), gromacsAppId);

            ExperimentModel simpleExperiment = ExperimentModelUtil.createSimpleExperiment(
                    DEFAULT_GATEWAY, "default", "admin", "GromacsExperiment", "Testing", gromacsAppId, exInputs);
            simpleExperiment.setExperimentOutputs(exOut);

            Map<String, String> computeResources =
                    airavataClient.getAvailableAppInterfaceComputeResources(new AuthzToken(""), gromacsAppId);
            if (computeResources != null && computeResources.size() != 0) {
                for (String id : computeResources.keySet()) {
                    String resourceName = computeResources.get(id);
                    if (resourceName.equals(stampedeHostName)) {
                        ComputationalResourceSchedulingModel scheduling =
                                ExperimentModelUtil.createComputationResourceScheduling(
                                        id, 1, 16, 1, "development", 30, 1);
                        UserConfigurationDataModel userConfigurationData = new UserConfigurationDataModel();
                        userConfigurationData.setAiravataAutoSchedule(false);
                        userConfigurationData.setOverrideManualScheduledParams(false);
                        userConfigurationData.setComputationalResourceScheduling(scheduling);
                        simpleExperiment.setUserConfigurationData(userConfigurationData);
                        return client.createExperiment(new AuthzToken(""), DEFAULT_GATEWAY, simpleExperiment);
                    }
                }
            }
        } catch (AiravataSystemException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new AiravataSystemException(e);
        } catch (InvalidRequestException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new InvalidRequestException(e);
        } catch (AiravataClientException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new AiravataClientException(e);
        } catch (TException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new TException(e);
        }
        return null;
    }

    private static void setGROMACSInputs(List<InputDataObjectType> exInputs) {
        for (InputDataObjectType inputDataObjectType : exInputs) {
            if (inputDataObjectType.getName().equalsIgnoreCase("GROMOS_Coordinate_File")) {
                inputDataObjectType.setValue(
                        "/Users/shameera/Downloads/PHP-Gateway-Scripts/appScripts/GROMMACS_FILES/pdb1y6l-EM-vacuum.gro");
            } else if (inputDataObjectType.getName().equalsIgnoreCase("Portable_Input_Binary_File")) {
                inputDataObjectType.setValue(
                        "/Users/shameera/Downloads/PHP-Gateway-Scripts/appScripts/GROMMACS_FILES/pdb1y6l-EM-vacuum.tpr");
            }
        }
    }

    public static String createExperimentESPRESSOStampede(Airavata.Client client) throws TException {
        try {
            List<InputDataObjectType> exInputs = client.getApplicationInputs(new AuthzToken(""), espressoAppId);
            setESPRESSOInputs(exInputs);
            List<OutputDataObjectType> exOut = client.getApplicationOutputs(new AuthzToken(""), espressoAppId);

            ExperimentModel simpleExperiment = ExperimentModelUtil.createSimpleExperiment(
                    DEFAULT_GATEWAY, "default", "admin", "EspressoExperiment", "Testing", espressoAppId, exInputs);
            simpleExperiment.setExperimentOutputs(exOut);

            Map<String, String> computeResources =
                    airavataClient.getAvailableAppInterfaceComputeResources(new AuthzToken(""), espressoAppId);
            if (computeResources != null && computeResources.size() != 0) {
                for (String id : computeResources.keySet()) {
                    String resourceName = computeResources.get(id);
                    if (resourceName.equals(stampedeHostName)) {
                        ComputationalResourceSchedulingModel scheduling =
                                ExperimentModelUtil.createComputationResourceScheduling(
                                        id, 1, 16, 1, "development", 30, 1);
                        UserConfigurationDataModel userConfigurationData = new UserConfigurationDataModel();
                        userConfigurationData.setAiravataAutoSchedule(false);
                        userConfigurationData.setOverrideManualScheduledParams(false);
                        userConfigurationData.setComputationalResourceScheduling(scheduling);
                        simpleExperiment.setUserConfigurationData(userConfigurationData);
                        return client.createExperiment(new AuthzToken(""), DEFAULT_GATEWAY, simpleExperiment);
                    }
                }
            }
        } catch (AiravataSystemException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new AiravataSystemException(e);
        } catch (InvalidRequestException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new InvalidRequestException(e);
        } catch (AiravataClientException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new AiravataClientException(e);
        } catch (TException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new TException(e);
        }
        return null;
    }

    private static void setESPRESSOInputs(List<InputDataObjectType> exInputs) {
        for (InputDataObjectType inputDataObjectType : exInputs) {
            if (inputDataObjectType.getName().equalsIgnoreCase("AI_Pseudopotential_File")) {
                inputDataObjectType.setValue(
                        "/Users/shameera/Downloads/PHP-Gateway-Scripts/appScripts/ESPRESSO_FILES/Al.sample.in");
            } else if (inputDataObjectType.getName().equalsIgnoreCase("AI_Primitive_Cell")) {
                inputDataObjectType.setValue(
                        "/Users/shameera/Downloads/PHP-Gateway-Scripts/appScripts/ESPRESSO_FILES/Al.pz-vbc.UPF");
            }
        }
    }

    public static String createExperimentTRINITYStampede(Airavata.Client client) throws TException {
        try {
            List<InputDataObjectType> exInputs = client.getApplicationInputs(new AuthzToken(""), trinityAppId);
            setTRINITYInputs(exInputs);
            List<OutputDataObjectType> exOut = client.getApplicationOutputs(new AuthzToken(""), trinityAppId);

            ExperimentModel simpleExperiment = ExperimentModelUtil.createSimpleExperiment(
                    DEFAULT_GATEWAY, "default", "admin", "TrinityExperiment", "Testing", trinityAppId, exInputs);
            simpleExperiment.setExperimentOutputs(exOut);

            Map<String, String> computeResources =
                    airavataClient.getAvailableAppInterfaceComputeResources(new AuthzToken(""), trinityAppId);
            if (computeResources != null && computeResources.size() != 0) {
                for (String id : computeResources.keySet()) {
                    String resourceName = computeResources.get(id);
                    if (resourceName.equals(stampedeHostName)) {
                        ComputationalResourceSchedulingModel scheduling =
                                ExperimentModelUtil.createComputationResourceScheduling(
                                        id, 1, 16, 1, "development", 30, 1);
                        UserConfigurationDataModel userConfigurationData = new UserConfigurationDataModel();
                        userConfigurationData.setAiravataAutoSchedule(false);
                        userConfigurationData.setOverrideManualScheduledParams(false);
                        userConfigurationData.setComputationalResourceScheduling(scheduling);
                        simpleExperiment.setUserConfigurationData(userConfigurationData);
                        return client.createExperiment(new AuthzToken(""), DEFAULT_GATEWAY, simpleExperiment);
                    }
                }
            }
        } catch (AiravataSystemException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new AiravataSystemException(e);
        } catch (InvalidRequestException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new InvalidRequestException(e);
        } catch (AiravataClientException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new AiravataClientException(e);
        } catch (TException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new TException(e);
        }
        return null;
    }

    private static void setTRINITYInputs(List<InputDataObjectType> exInputs) {
        for (InputDataObjectType inputDataObjectType : exInputs) {
            if (inputDataObjectType.getName().equalsIgnoreCase("RNA_Seq_Left_Input")) {
                inputDataObjectType.setValue(
                        "/Users/shameera/Downloads/PHP-Gateway-Scripts/appScripts/TRINITY_FILES/reads.left.fq");
            } else if (inputDataObjectType.getName().equalsIgnoreCase("RNA_Seq_Right_Input")) {
                inputDataObjectType.setValue(
                        "/Users/shameera/Downloads/PHP-Gateway-Scripts/appScripts/TRINITY_FILES/reads.right.fq");
            }
        }
    }

    public static String createExperimentLAMMPSStampede(Airavata.Client client) throws TException {
        try {
            List<InputDataObjectType> exInputs = client.getApplicationInputs(new AuthzToken(""), lammpsAppId);
            setLAMMPSInputs(exInputs);
            List<OutputDataObjectType> exOut = client.getApplicationOutputs(new AuthzToken(""), lammpsAppId);

            ExperimentModel simpleExperiment = ExperimentModelUtil.createSimpleExperiment(
                    DEFAULT_GATEWAY, "default", "admin", "LAMMPSExperiment", "Testing", lammpsAppId, exInputs);
            simpleExperiment.setExperimentOutputs(exOut);

            Map<String, String> computeResources =
                    airavataClient.getAvailableAppInterfaceComputeResources(new AuthzToken(""), lammpsAppId);
            if (computeResources != null && computeResources.size() != 0) {
                for (String id : computeResources.keySet()) {
                    String resourceName = computeResources.get(id);
                    if (resourceName.equals(stampedeHostName)) {
                        ComputationalResourceSchedulingModel scheduling =
                                ExperimentModelUtil.createComputationResourceScheduling(
                                        id, 1, 16, 1, "development", 30, 1);
                        UserConfigurationDataModel userConfigurationData = new UserConfigurationDataModel();
                        userConfigurationData.setAiravataAutoSchedule(false);
                        userConfigurationData.setOverrideManualScheduledParams(false);
                        userConfigurationData.setComputationalResourceScheduling(scheduling);
                        simpleExperiment.setUserConfigurationData(userConfigurationData);
                        return client.createExperiment(new AuthzToken(""), DEFAULT_GATEWAY, simpleExperiment);
                    }
                }
            }
        } catch (AiravataSystemException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new AiravataSystemException(e);
        } catch (InvalidRequestException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new InvalidRequestException(e);
        } catch (AiravataClientException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new AiravataClientException(e);
        } catch (TException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new TException(e);
        }
        return null;
    }

    private static void setLAMMPSInputs(List<InputDataObjectType> exInputs) {
        for (InputDataObjectType inputDataObjectType : exInputs) {
            if (inputDataObjectType.getName().equalsIgnoreCase("Friction_Simulation_Input")) {
                inputDataObjectType.setValue(
                        "/Users/shameera/Downloads/PHP-Gateway-Scripts/appScripts/LAMMPS_FILES/in.friction");
            }
        }
    }

    public static String createExperimentNWCHEMStampede(Airavata.Client client) throws TException {
        try {
            List<InputDataObjectType> exInputs = client.getApplicationInputs(new AuthzToken(""), nwchemAppId);
            setNWCHEMInputs(exInputs);
            List<OutputDataObjectType> exOut = client.getApplicationOutputs(new AuthzToken(""), nwchemAppId);

            ExperimentModel simpleExperiment = ExperimentModelUtil.createSimpleExperiment(
                    DEFAULT_GATEWAY, "default", "admin", "NWchemExperiment", "Testing", nwchemAppId, exInputs);
            simpleExperiment.setExperimentOutputs(exOut);

            Map<String, String> computeResources =
                    airavataClient.getAvailableAppInterfaceComputeResources(new AuthzToken(""), nwchemAppId);
            if (computeResources != null && computeResources.size() != 0) {
                for (String id : computeResources.keySet()) {
                    String resourceName = computeResources.get(id);
                    if (resourceName.equals(stampedeHostName)) {
                        ComputationalResourceSchedulingModel scheduling =
                                ExperimentModelUtil.createComputationResourceScheduling(
                                        id, 1, 16, 1, "development", 30, 1);
                        UserConfigurationDataModel userConfigurationData = new UserConfigurationDataModel();
                        userConfigurationData.setAiravataAutoSchedule(false);
                        userConfigurationData.setOverrideManualScheduledParams(false);
                        userConfigurationData.setComputationalResourceScheduling(scheduling);
                        simpleExperiment.setUserConfigurationData(userConfigurationData);
                        return client.createExperiment(new AuthzToken(""), DEFAULT_GATEWAY, simpleExperiment);
                    }
                }
            }
        } catch (AiravataSystemException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new AiravataSystemException(e);
        } catch (InvalidRequestException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new InvalidRequestException(e);
        } catch (AiravataClientException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new AiravataClientException(e);
        } catch (TException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new TException(e);
        }
        return null;
    }

    private static void setNWCHEMInputs(List<InputDataObjectType> exInputs) {
        for (InputDataObjectType inputDataObjectType : exInputs) {
            if (inputDataObjectType.getName().equalsIgnoreCase("Water_Molecule_Input")) {
                inputDataObjectType.setValue(
                        "/Users/shameera/Downloads/PHP-Gateway-Scripts/appScripts/NWCHEM_FILES/water.nw");
            }
        }
    }

    public static String createExperimentAUTODOCKStampede(Airavata.Client client) throws TException {
        try {
            List<InputDataObjectType> exInputs = client.getApplicationInputs(new AuthzToken(""), nwchemAppId);
            setAUTODOCKInputs(exInputs);
            List<OutputDataObjectType> exOut = client.getApplicationOutputs(new AuthzToken(""), nwchemAppId);

            ExperimentModel simpleExperiment = ExperimentModelUtil.createSimpleExperiment(
                    DEFAULT_GATEWAY, "default", "admin", "AutoDockExperiment", "Testing", autodockAppId, exInputs);
            simpleExperiment.setExperimentOutputs(exOut);

            Map<String, String> computeResources =
                    airavataClient.getAvailableAppInterfaceComputeResources(new AuthzToken(""), autodockAppId);
            if (computeResources != null && computeResources.size() != 0) {
                for (String id : computeResources.keySet()) {
                    String resourceName = computeResources.get(id);
                    if (resourceName.equals(stampedeHostName)) {
                        ComputationalResourceSchedulingModel scheduling =
                                ExperimentModelUtil.createComputationResourceScheduling(
                                        id, 1, 16, 1, "development", 30, 1);
                        UserConfigurationDataModel userConfigurationData = new UserConfigurationDataModel();
                        userConfigurationData.setAiravataAutoSchedule(false);
                        userConfigurationData.setOverrideManualScheduledParams(false);
                        userConfigurationData.setComputationalResourceScheduling(scheduling);
                        simpleExperiment.setUserConfigurationData(userConfigurationData);
                        return client.createExperiment(new AuthzToken(""), DEFAULT_GATEWAY, simpleExperiment);
                    }
                }
            }
        } catch (AiravataSystemException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new AiravataSystemException(e);
        } catch (InvalidRequestException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new InvalidRequestException(e);
        } catch (AiravataClientException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new AiravataClientException(e);
        } catch (TException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new TException(e);
        }
        return null;
    }

    private static void setAUTODOCKInputs(List<InputDataObjectType> exInputs) {

        for (InputDataObjectType inputDataObjectType : exInputs) {
            if (inputDataObjectType.getName().equalsIgnoreCase("AD4_parameters.dat")) {
                inputDataObjectType.setValue(
                        "/Users/shameera/Downloads/PHP-Gateway-Scripts/appScripts/AUTODOCK_FILES/AD4_parameters.dat");
            } else if (inputDataObjectType.getName().equalsIgnoreCase("hsg1.A.map")) {
                inputDataObjectType.setValue(
                        "/Users/shameera/Downloads/PHP-Gateway-Scripts/appScripts/AUTODOCK_FILES/hsg1.A.map");
            } else if (inputDataObjectType.getName().equalsIgnoreCase("hsg1.C.map")) {
                inputDataObjectType.setValue(
                        "/Users/shameera/Downloads/PHP-Gateway-Scripts/appScripts/AUTODOCK_FILES/hsg1.C.map");
            } else if (inputDataObjectType.getName().equalsIgnoreCase("hsg1.d.map")) {
                inputDataObjectType.setValue(
                        "/Users/shameera/Downloads/PHP-Gateway-Scripts/appScripts/AUTODOCK_FILES/hsg1.d.map");
            } else if (inputDataObjectType.getName().equalsIgnoreCase("hsg1.e.map")) {
                inputDataObjectType.setValue(
                        "/Users/shameera/Downloads/PHP-Gateway-Scripts/appScripts/AUTODOCK_FILES/hsg1.e.map");
            } else if (inputDataObjectType.getName().equalsIgnoreCase("hsg1.HD.map")) {
                inputDataObjectType.setValue(
                        "/Users/shameera/Downloads/PHP-Gateway-Scripts/appScripts/AUTODOCK_FILES/hsg1.HD.map");
            } else if (inputDataObjectType.getName().equalsIgnoreCase("hsg1.maps.fld")) {
                inputDataObjectType.setValue(
                        "/Users/shameera/Downloads/PHP-Gateway-Scripts/appScripts/AUTODOCK_FILES/hsg1.maps.fld");
            } else if (inputDataObjectType.getName().equalsIgnoreCase("hsg1.NA.map")) {
                inputDataObjectType.setValue(
                        "/Users/shameera/Downloads/PHP-Gateway-Scripts/appScripts/AUTODOCK_FILES/hsg1.NA.map");
            } else if (inputDataObjectType.getName().equalsIgnoreCase("hsg1.N.map")) {
                inputDataObjectType.setValue(
                        "/Users/shameera/Downloads/PHP-Gateway-Scripts/appScripts/AUTODOCK_FILES/hsg1.N.map");
            } else if (inputDataObjectType.getName().equalsIgnoreCase("hsg1.OA.map")) {
                inputDataObjectType.setValue(
                        "/Users/shameera/Downloads/PHP-Gateway-Scripts/appScripts/AUTODOCK_FILES/hsg1.OA.map");
            } else if (inputDataObjectType.getName().equalsIgnoreCase("ind.dpf")) {
                inputDataObjectType.setValue(
                        "/Users/shameera/Downloads/PHP-Gateway-Scripts/appScripts/AUTODOCK_FILES/ind.dpf");
            } else if (inputDataObjectType.getName().equalsIgnoreCase("ind.pdbqt")) {
                inputDataObjectType.setValue(
                        "/Users/shameera/Downloads/PHP-Gateway-Scripts/appScripts/AUTODOCK_FILES/ind.pdbqt");
            }
        }
    }

    public static String createExperimentWRFTrestles(Airavata.Client client) throws TException {
        try {
            List<InputDataObjectType> exInputs = client.getApplicationInputs(new AuthzToken(""), wrfAppId);
            setWRFInputs(exInputs);
            List<OutputDataObjectType> exOut = client.getApplicationOutputs(new AuthzToken(""), wrfAppId);

            ExperimentModel simpleExperiment = ExperimentModelUtil.createSimpleExperiment(
                    DEFAULT_GATEWAY, "default", "admin", "WRFExperiment", "Testing", wrfAppId, exInputs);
            simpleExperiment.setExperimentOutputs(exOut);

            Map<String, String> computeResources =
                    airavataClient.getAvailableAppInterfaceComputeResources(new AuthzToken(""), wrfAppId);
            if (computeResources != null && computeResources.size() != 0) {
                for (String id : computeResources.keySet()) {
                    String resourceName = computeResources.get(id);
                    if (resourceName.equals(trestlesHostName)) {
                        ComputationalResourceSchedulingModel scheduling =
                                ExperimentModelUtil.createComputationResourceScheduling(id, 1, 1, 1, "normal", 30, 1);
                        UserConfigurationDataModel userConfigurationData = new UserConfigurationDataModel();
                        userConfigurationData.setAiravataAutoSchedule(false);
                        userConfigurationData.setOverrideManualScheduledParams(false);
                        userConfigurationData.setComputationalResourceScheduling(scheduling);
                        simpleExperiment.setUserConfigurationData(userConfigurationData);
                        return client.createExperiment(new AuthzToken(""), DEFAULT_GATEWAY, simpleExperiment);
                    }
                }
            }
        } catch (AiravataSystemException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new AiravataSystemException(e);
        } catch (InvalidRequestException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new InvalidRequestException(e);
        } catch (AiravataClientException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new AiravataClientException(e);
        } catch (TException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new TException(e);
        }
        return null;
    }

    public static String cloneExperiment(Airavata.Client client, String expId) throws TException {
        try {
            return client.cloneExperiment(new AuthzToken(""), expId, "cloneExperiment1", null);
        } catch (TException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new TException(e);
        }
    }

    public static void updateExperiment(Airavata.Client client, String expId) throws TException {
        try {
            ExperimentModel experiment = client.getExperiment(new AuthzToken(""), expId);
            experiment.setDescription("updatedDescription");
            client.updateExperiment(new AuthzToken(""), expId, experiment);
        } catch (TException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new TException(e);
        }
    }

    public static String createExperimentEchoForLocalHost(Airavata.Client client) throws TException {
        try {
            List<InputDataObjectType> exInputs = client.getApplicationInputs(new AuthzToken(""), echoAppId);
            for (InputDataObjectType inputDataObjectType : exInputs) {
                if (inputDataObjectType.getName().equalsIgnoreCase("Input_to_Echo")) {
                    inputDataObjectType.setValue("Hello World");
                }
            }
            List<OutputDataObjectType> exOut = client.getApplicationOutputs(new AuthzToken(""), echoAppId);

            Project project = ProjectModelUtil.createProject("project1", "admin", "test project");
            String projectId = client.createProject(new AuthzToken(""), DEFAULT_GATEWAY, project);

            ExperimentModel simpleExperiment = ExperimentModelUtil.createSimpleExperiment(
                    DEFAULT_GATEWAY, projectId, "admin", "echoExperiment", "Echo Test", echoAppId, exInputs);
            simpleExperiment.setExperimentOutputs(exOut);

            Map<String, String> computeResources =
                    airavataClient.getAvailableAppInterfaceComputeResources(new AuthzToken(""), echoAppId);
            if (computeResources != null && computeResources.size() != 0) {
                for (String id : computeResources.keySet()) {
                    String resourceName = computeResources.get(id);
                    if (resourceName.equals(localHost)) {
                        ComputationalResourceSchedulingModel scheduling =
                                ExperimentModelUtil.createComputationResourceScheduling(id, 1, 1, 1, "normal", 30, 1);
                        UserConfigurationDataModel userConfigurationData = new UserConfigurationDataModel();
                        userConfigurationData.setAiravataAutoSchedule(false);
                        userConfigurationData.setOverrideManualScheduledParams(false);
                        userConfigurationData.setComputationalResourceScheduling(scheduling);
                        simpleExperiment.setUserConfigurationData(userConfigurationData);
                        return client.createExperiment(new AuthzToken(""), DEFAULT_GATEWAY, simpleExperiment);
                    }
                }
            }
        } catch (AiravataSystemException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new AiravataSystemException(e);
        } catch (InvalidRequestException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new InvalidRequestException(e);
        } catch (AiravataClientException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new AiravataClientException(e);
        } catch (TException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new TException(e);
        }
        return null;
    }

    //    public static String createExperimentForSSHHost(Airavata.Client client) throws TException {
    //        try {
    //            List<OutputDataObjectType> exInputs = new ArrayList<OutputDataObjectType>();
    //            OutputDataObjectType input = new OutputDataObjectType();
    //            input.setName("echo_input");
    //            input.setType(DataType.STRING);
    //            input.setValue("Echoed_Output=Hello World");
    //            exInputs.add(input);
    //
    //            List<OutputDataObjectType> exOut = new ArrayList<OutputDataObjectType>();
    //            OutputDataObjectType output = new OutputDataObjectType();
    //            output.setName("Echoed_Output");
    //            output.setType(DataType.STRING);
    //            output.setValue("");
    //            exOut.add(output);
    //
    //            Project project = ProjectModelUtil.createProject("default", "admin", "test project");
    //            String projectId = client.createProject(project);
    //
    //            ExperimentModel simpleExperiment =
    //                    ExperimentModelUtil.createSimpleExperiment(projectId, "admin", "sshEchoExperiment",
    // "SSHEcho1", sshHostAppId.split(",")[1], exInputs);
    //            simpleExperiment.setExperimentOutputs(exOut);
    //
    //            ComputationalResourceSchedulingModel scheduling =
    // ExperimentModelUtil.createComputationResourceScheduling(sshHostAppId.split(",")[0], 1, 1, 1, "normal", 1, 0, 1,
    // "sds128");
    //            scheduling.setResourceHostId("gw111.iu.xsede.org");
    //            UserConfigurationDataModel userConfigurationData = new UserConfigurationDataModel();
    //            userConfigurationData.setAiravataAutoSchedule(false);
    //            userConfigurationData.setOverrideManualScheduledParams(false);
    //            userConfigurationData.setComputationalResourceScheduling(scheduling);
    //            simpleExperiment.setUserConfigurationData(userConfigurationData);
    //            return client.createExperiment(simpleExperiment);
    //        } catch (AiravataSystemException e) {
    //            logger.error("Error occured while creating the experiment...", e.getMessage());
    //            throw new AiravataSystemException(e);
    //        } catch (InvalidRequestException e) {
    //            logger.error("Error occured while creating the experiment...", e.getMessage());
    //            throw new InvalidRequestException(e);
    //        } catch (AiravataClientException e) {
    //            logger.error("Error occured while creating the experiment...", e.getMessage());
    //            throw new AiravataClientException(e);
    //        } catch (TException e) {
    //            logger.error("Error occured while creating the experiment...", e.getMessage());
    //            throw new TException(e);
    //        }
    //    }

    public static String createEchoExperimentForStampede(Airavata.Client client) throws TException {
        try {
            List<InputDataObjectType> exInputs = client.getApplicationInputs(new AuthzToken(""), echoAppId);
            //            for (InputDataObjectType inputDataObjectType : exInputs) {
            //                if (inputDataObjectType.getName().equalsIgnoreCase("Input_to_Echo")) {
            //                    inputDataObjectType.setValue("Hello World");
            //                }
            //            }
            //            List<OutputDataObjectType> exOut = client.getApplicationOutputs(new AuthzToken(""),
            // echoAppId);

            Project project = ProjectModelUtil.createProject("default", "admin", "test project");
            String projectId = client.createProject(new AuthzToken(""), DEFAULT_GATEWAY, project);

            ExperimentModel simpleExperiment = ExperimentModelUtil.createSimpleExperiment(
                    DEFAULT_GATEWAY, projectId, "admin", "echoExperiment", "SimpleEcho3", echoAppId, exInputs);
            //            simpleExperiment.setExperimentOutputs(exOut);

            Map<String, String> computeResources =
                    airavataClient.getAvailableAppInterfaceComputeResources(new AuthzToken(""), echoAppId);
            if (computeResources != null && computeResources.size() != 0) {
                for (String id : computeResources.keySet()) {
                    String resourceName = computeResources.get(id);
                    if (resourceName.equals(stampedeHostName)) {
                        ComputationalResourceSchedulingModel scheduling =
                                ExperimentModelUtil.createComputationResourceScheduling(id, 1, 1, 1, "normal", 30, 1);
                        UserConfigurationDataModel userConfigurationData = new UserConfigurationDataModel();
                        userConfigurationData.setAiravataAutoSchedule(false);
                        userConfigurationData.setOverrideManualScheduledParams(false);
                        userConfigurationData.setComputationalResourceScheduling(scheduling);
                        simpleExperiment.setUserConfigurationData(userConfigurationData);
                        return client.createExperiment(new AuthzToken(""), DEFAULT_GATEWAY, simpleExperiment);
                    }
                }
            }
        } catch (AiravataSystemException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new AiravataSystemException(e);
        } catch (InvalidRequestException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new InvalidRequestException(e);
        } catch (AiravataClientException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new AiravataClientException(e);
        } catch (TException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new TException(e);
        }
        return null;
    }

    //    public static String createEchoExperimentForLonestar(Airavata.Client client) throws TException {
    //        try {
    //            List<OutputDataObjectType> exInputs = new ArrayList<OutputDataObjectType>();
    //            OutputDataObjectType input = new OutputDataObjectType();
    //            input.setName("echo_input");
    //            input.setType(DataType.STRING);
    //            input.setValue("Echoed_Output=Hello World");
    //            exInputs.add(input);
    //
    //            List<OutputDataObjectType> exOut = new ArrayList<OutputDataObjectType>();
    //            OutputDataObjectType output = new OutputDataObjectType();
    //            output.setName("Echoed_Output");
    //            output.setType(DataType.STRING);
    //            output.setValue("");
    //            exOut.add(output);
    //
    //            Project project = ProjectModelUtil.createProject("default", "admin", "test project");
    //            String projectId = client.createProject(project);
    //
    //            ExperimentModel simpleExperiment =
    //                    ExperimentModelUtil.createSimpleExperiment(projectId, "admin", "echoExperiment",
    // "SimpleEcho4", echoAppId, exInputs);
    //            simpleExperiment.setExperimentOutputs(exOut);
    //
    //            Map<String, String> computeResources =
    // airavataClient.getAvailableAppInterfaceComputeResources(echoAppId);
    //            if (computeResources != null && computeResources.size() != 0){
    //                for (String id : computeResources.keySet()){
    //                    String resourceName = computeResources.get(id);
    //                    if (resourceName.equals(stampedeHostName)){
    //                        ComputationalResourceSchedulingModel scheduling =
    // ExperimentModelUtil.createComputationResourceScheduling(id, 1, 1, 1, "normal", 1, 0, 1, "TG-STA110014S");
    //                        UserConfigurationDataModel userConfigurationData = new UserConfigurationDataModel();
    //                        userConfigurationData.setAiravataAutoSchedule(false);
    //                        userConfigurationData.setOverrideManualScheduledParams(false);
    //                        userConfigurationData.setComputationalResourceScheduling(scheduling);
    //                        simpleExperiment.setUserConfigurationData(userConfigurationData);
    //                        return client.createExperiment(simpleExperiment);
    //                    }
    //                }
    //            }
    //            ComputationalResourceSchedulingModel scheduling =
    //                    ExperimentModelUtil.createComputationResourceScheduling(sgeAppId.split(",")[0], 1, 1, 1,
    // "normal", 1, 0, 1, "TG-STA110014S");
    //            UserConfigurationDataModel userConfigurationData = new UserConfigurationDataModel();
    //            userConfigurationData.setAiravataAutoSchedule(false);
    //            userConfigurationData.setOverrideManualScheduledParams(false);
    //            userConfigurationData.setComputationalResourceScheduling(scheduling);
    //            simpleExperiment.setUserConfigurationData(userConfigurationData);
    //            return client.createExperiment(simpleExperiment);
    //        } catch (AiravataSystemException e) {
    //            logger.error("Error occured while creating the experiment...", e.getMessage());
    //            throw new AiravataSystemException(e);
    //        } catch (InvalidRequestException e) {
    //            logger.error("Error occured while creating the experiment...", e.getMessage());
    //            throw new InvalidRequestException(e);
    //        } catch (AiravataClientException e) {
    //            logger.error("Error occured while creating the experiment...", e.getMessage());
    //            throw new AiravataClientException(e);
    //        } catch (LaunchValidationException e) {
    //            logger.error("Validation failed" + e.getErrorMessage());
    //            org.apache.airavata.model.error.ValidationResults validationResult = e.getValidationResult();
    //            for (org.apache.airavata.model.error.ValidatorResult vResult :
    // validationResult.getValidationResultList()) {
    //                if (!vResult.isSetResult()) {
    //                    System.out.println("Error:" + vResult.getErrorDetails());
    //                }
    //            }
    //            throw e;
    //        } catch (TException e) {
    //            logger.error("Error occured while creating the experiment...", e.getMessage());
    //            throw new TException(e);
    //        }
    //    }

    public static String createExperimentForBR2(Airavata.Client client) throws TException {
        try {
            List<InputDataObjectType> exInputs = client.getApplicationInputs(new AuthzToken(""), echoAppId);
            for (InputDataObjectType inputDataObjectType : exInputs) {
                if (inputDataObjectType.getName().equalsIgnoreCase("Input_to_Echo")) {
                    inputDataObjectType.setValue("Hello World");
                }
            }
            List<OutputDataObjectType> exOut = client.getApplicationOutputs(new AuthzToken(""), echoAppId);

            Project project = ProjectModelUtil.createProject("default", "lahiru", "test project");
            String projectId = client.createProject(new AuthzToken(""), DEFAULT_GATEWAY, project);

            ExperimentModel simpleExperiment = ExperimentModelUtil.createSimpleExperiment(
                    DEFAULT_GATEWAY, projectId, "lahiru", "sshEchoExperiment", "SimpleEchoBR", echoAppId, exInputs);
            simpleExperiment.setExperimentOutputs(exOut);

            Map<String, String> computeResources =
                    airavataClient.getAvailableAppInterfaceComputeResources(new AuthzToken(""), echoAppId);
            if (computeResources != null && computeResources.size() != 0) {
                for (String id : computeResources.keySet()) {
                    String resourceName = computeResources.get(id);
                    if (resourceName.equals(br2HostName)) {
                        ComputationalResourceSchedulingModel scheduling =
                                ExperimentModelUtil.createComputationResourceScheduling(id, 1, 1, 1, "normal", 30, 1);
                        UserConfigurationDataModel userConfigurationData = new UserConfigurationDataModel();
                        userConfigurationData.setAiravataAutoSchedule(false);
                        userConfigurationData.setOverrideManualScheduledParams(false);
                        userConfigurationData.setComputationalResourceScheduling(scheduling);
                        simpleExperiment.setUserConfigurationData(userConfigurationData);
                        return client.createExperiment(new AuthzToken(""), DEFAULT_GATEWAY, simpleExperiment);
                    }
                }
            }
        } catch (AiravataSystemException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new AiravataSystemException(e);
        } catch (InvalidRequestException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new InvalidRequestException(e);
        } catch (AiravataClientException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new AiravataClientException(e);
        } catch (TException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new TException(e);
        }
        return null;
    }

    public static String createExperimentForLSF(Airavata.Client client) throws TException {
        try {
            List<InputDataObjectType> exInputs = client.getApplicationInputs(new AuthzToken(""), echoAppId);

            for (InputDataObjectType inputDataObjectType : exInputs) {
                inputDataObjectType.setValue("Hello World");
            }
            List<OutputDataObjectType> exOut = client.getApplicationOutputs(new AuthzToken(""), echoAppId);
            Project project = ProjectModelUtil.createProject("default", "lg11w", "test project");
            String projectId = client.createProject(new AuthzToken(""), DEFAULT_GATEWAY, project);

            ExperimentModel simpleExperiment = ExperimentModelUtil.createSimpleExperiment(
                    DEFAULT_GATEWAY, projectId, "lg11w", "sshEchoExperiment", "StressMem", echoAppId, exInputs);
            simpleExperiment.setExperimentOutputs(exOut);
            simpleExperiment.setExperimentInputs(exInputs);

            Map<String, String> computeResources =
                    airavataClient.getAvailableAppInterfaceComputeResources(new AuthzToken(""), echoAppId);
            if (computeResources != null && computeResources.size() != 0) {
                for (String id : computeResources.keySet()) {
                    String resourceName = computeResources.get(id);
                    if (resourceName.equals(umassrcHostName)) {
                        ComputationalResourceSchedulingModel scheduling =
                                ExperimentModelUtil.createComputationResourceScheduling(id, 10, 1, 1, "long", 60, 1000);
                        UserConfigurationDataModel userConfigurationData = new UserConfigurationDataModel();
                        userConfigurationData.setAiravataAutoSchedule(false);
                        userConfigurationData.setOverrideManualScheduledParams(false);
                        userConfigurationData.setComputationalResourceScheduling(scheduling);
                        simpleExperiment.setUserConfigurationData(userConfigurationData);
                        simpleExperiment.setEmailAddresses(Arrays.asList(new String[] {"test@umassmed.edu"}));
                        return client.createExperiment(new AuthzToken(""), DEFAULT_GATEWAY, simpleExperiment);
                    }
                }
            }
        } catch (AiravataSystemException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new AiravataSystemException(e);
        } catch (InvalidRequestException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new InvalidRequestException(e);
        } catch (AiravataClientException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new AiravataClientException(e);
        } catch (TException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new TException(e);
        }
        return null;
    }

    public static String createExperimentLAMMPSForLSF(Airavata.Client client) throws TException {
        try {
            List<InputDataObjectType> exInputs = client.getApplicationInputs(new AuthzToken(""), lammpsAppId);

            for (InputDataObjectType inputDataObjectType : exInputs) {
                inputDataObjectType.setName("Friction_Simulation_Input");
                inputDataObjectType.setValue("/Users/lginnali/Downloads/data/in.friction");
                inputDataObjectType.setType(DataType.URI);
            }
            List<OutputDataObjectType> exOut = client.getApplicationOutputs(new AuthzToken(""), echoAppId);

            /*OutputDataObjectType outputDataObjectType = exOut.get(0);
            outputDataObjectType.setName("LAMMPS_Simulation_Log");
            outputDataObjectType.setType(DataType.URI);
            outputDataObjectType.setValue("");

            OutputDataObjectType output1 = exOut.get(1);
            output1.setName("LAMMPS.oJobID");
            output1.setType(DataType.URI);
            output1.setValue("");

            exOut.add(outputDataObjectType);
            exOut.add(output1);*/

            ExperimentModel simpleExperiment = ExperimentModelUtil.createSimpleExperiment(
                    DEFAULT_GATEWAY, "default", "lg11w", "LAMMPSExperiment", "Testing", lammpsAppId, exInputs);
            simpleExperiment.setExperimentOutputs(exOut);

            Map<String, String> computeResources =
                    airavataClient.getAvailableAppInterfaceComputeResources(new AuthzToken(""), lammpsAppId);
            if (computeResources != null && computeResources.size() != 0) {
                for (String id : computeResources.keySet()) {
                    String resourceName = computeResources.get(id);
                    if (resourceName.equals(umassrcHostName)) {
                        ComputationalResourceSchedulingModel scheduling =
                                ExperimentModelUtil.createComputationResourceScheduling(
                                        id, 10, 16, 1, "long", 60, 1000);
                        UserConfigurationDataModel userConfigurationData = new UserConfigurationDataModel();
                        userConfigurationData.setAiravataAutoSchedule(false);
                        userConfigurationData.setOverrideManualScheduledParams(false);
                        userConfigurationData.setComputationalResourceScheduling(scheduling);
                        simpleExperiment.setUserConfigurationData(userConfigurationData);
                        return client.createExperiment(new AuthzToken(""), DEFAULT_GATEWAY, simpleExperiment);
                    }
                }
            }
        } catch (AiravataSystemException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new AiravataSystemException(e);
        } catch (InvalidRequestException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new InvalidRequestException(e);
        } catch (AiravataClientException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new AiravataClientException(e);
        } catch (TException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new TException(e);
        }
        return null;
    }

    public static String createExperimentForBR2Amber(Airavata.Client client) throws TException {
        try {
            List<InputDataObjectType> exInputs = client.getApplicationInputs(new AuthzToken(""), amberAppId);
            //			for (InputDataObjectType inputDataObjectType : exInputs) {
            //				if (inputDataObjectType.getName().equalsIgnoreCase("Heat_Restart_File")) {
            //					inputDataObjectType.setValue("/Users/raminder/Documents/Sample/Amber/02_Heat.rst");
            //				} else if (inputDataObjectType.getName().equalsIgnoreCase("Production_Control_File")) {
            //					inputDataObjectType.setValue("/Users/raminder/Documents/Sample/Amber/03_Prod.in");
            //				} else if (inputDataObjectType.getName().equalsIgnoreCase("Parameter_Topology_File")) {
            //					inputDataObjectType.setValue("/Users/raminder/Documents/Sample/Amber/prmtop");
            //				}
            //
            //			}
            for (InputDataObjectType inputDataObjectType : exInputs) {
                if (inputDataObjectType.getName().equalsIgnoreCase("Heat_Restart_File")) {
                    inputDataObjectType.setValue(
                            "file://root@test-drive.airavata.org:/var/www/experimentData/admin101a290e6330f15a91349159553ae8b6bb1/02_Heat.rst");
                } else if (inputDataObjectType.getName().equalsIgnoreCase("Production_Control_File")) {
                    inputDataObjectType.setValue(
                            "file://root@test-drive.airavata.org:/var/www/experimentData/admin101a290e6330f15a91349159553ae8b6bb1/03_Prod.in");
                } else if (inputDataObjectType.getName().equalsIgnoreCase("Parameter_Topology_File")) {
                    inputDataObjectType.setValue(
                            "file://root@test-drive.airavata.org:/var/www/experimentData/admin101a290e6330f15a91349159553ae8b6bb1/prmtop");
                }
            }

            List<OutputDataObjectType> exOut = client.getApplicationOutputs(new AuthzToken(""), amberAppId);

            Project project = ProjectModelUtil.createProject("default", "admin", "test project");
            String projectId = client.createProject(new AuthzToken(""), DEFAULT_GATEWAY, project);

            ExperimentModel simpleExperiment = ExperimentModelUtil.createSimpleExperiment(
                    DEFAULT_GATEWAY, projectId, "admin", "sshEchoExperiment", "SimpleEchoBR", amberAppId, exInputs);
            simpleExperiment.setExperimentOutputs(exOut);

            Map<String, String> computeResources =
                    airavataClient.getAvailableAppInterfaceComputeResources(new AuthzToken(""), amberAppId);
            if (computeResources != null && computeResources.size() != 0) {
                for (String id : computeResources.keySet()) {
                    String resourceName = computeResources.get(id);
                    if (resourceName.equals(br2HostName)) {
                        ComputationalResourceSchedulingModel scheduling =
                                ExperimentModelUtil.createComputationResourceScheduling(id, 4, 1, 1, "cpu", 20, 1);
                        UserConfigurationDataModel userConfigurationData = new UserConfigurationDataModel();
                        userConfigurationData.setAiravataAutoSchedule(false);
                        userConfigurationData.setOverrideManualScheduledParams(false);
                        userConfigurationData.setComputationalResourceScheduling(scheduling);
                        simpleExperiment.setUserConfigurationData(userConfigurationData);
                        return client.createExperiment(new AuthzToken(""), DEFAULT_GATEWAY, simpleExperiment);
                    }
                }
            }
        } catch (AiravataSystemException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new AiravataSystemException(e);
        } catch (InvalidRequestException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new InvalidRequestException(e);
        } catch (AiravataClientException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new AiravataClientException(e);
        } catch (TException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new TException(e);
        }
        return null;
    }

    public static String createExperimentForStampedeAmber(Airavata.Client client) throws TException {
        try {
            List<InputDataObjectType> exInputs = client.getApplicationInputs(new AuthzToken(""), amberAppId);
            //			for (InputDataObjectType inputDataObjectType : exInputs) {
            //				if (inputDataObjectType.getName().equalsIgnoreCase("Heat_Restart_File")) {
            //					inputDataObjectType.setValue("/Users/raminder/Documents/Sample/Amber/02_Heat.rst");
            //				} else if (inputDataObjectType.getName().equalsIgnoreCase("Production_Control_File")) {
            //					inputDataObjectType.setValue("/Users/raminder/Documents/Sample/Amber/03_Prod.in");
            //				} else if (inputDataObjectType.getName().equalsIgnoreCase("Parameter_Topology_File")) {
            //					inputDataObjectType.setValue("/Users/raminder/Documents/Sample/Amber/prmtop");
            //				}
            //
            //			}
            for (InputDataObjectType inputDataObjectType : exInputs) {
                if (inputDataObjectType.getName().equalsIgnoreCase("Heat_Restart_File")) {
                    inputDataObjectType.setValue(
                            "file://ogce@stampede.xsede.org:/scratch/01437/ogce/gta-work-dirs/PROCESS_e0610a6c-5778-4a69-a004-f440e29194af/02_Heat.rst");
                } else if (inputDataObjectType.getName().equalsIgnoreCase("Production_Control_File")) {
                    inputDataObjectType.setValue(
                            "file://ogce@stampede.xsede.org:/scratch/01437/ogce/gta-work-dirs/PROCESS_e0610a6c-5778-4a69-a004-f440e29194af/03_Prod.in");
                } else if (inputDataObjectType.getName().equalsIgnoreCase("Parameter_Topology_File")) {
                    inputDataObjectType.setValue(
                            "file://ogce@stampede.xsede.org:/scratch/01437/ogce/gta-work-dirs/PROCESS_e0610a6c-5778-4a69-a004-f440e29194af/prmtop");
                }
            }

            List<OutputDataObjectType> exOut = client.getApplicationOutputs(new AuthzToken(""), amberAppId);

            Project project = ProjectModelUtil.createProject("default", "admin", "test project");
            String projectId = client.createProject(new AuthzToken(""), DEFAULT_GATEWAY, project);

            ExperimentModel simpleExperiment = ExperimentModelUtil.createSimpleExperiment(
                    DEFAULT_GATEWAY, projectId, "admin", "sshEchoExperiment", "SimpleEchoBR", amberAppId, exInputs);
            simpleExperiment.setExperimentOutputs(exOut);

            Map<String, String> computeResources =
                    airavataClient.getAvailableAppInterfaceComputeResources(new AuthzToken(""), amberAppId);
            if (computeResources != null && computeResources.size() != 0) {
                for (String id : computeResources.keySet()) {
                    String resourceName = computeResources.get(id);
                    if (resourceName.equals(stampedeHostName)) {
                        ComputationalResourceSchedulingModel scheduling =
                                ExperimentModelUtil.createComputationResourceScheduling(id, 4, 1, 1, "normal", 20, 1);
                        UserConfigurationDataModel userConfigurationData = new UserConfigurationDataModel();
                        userConfigurationData.setAiravataAutoSchedule(false);
                        userConfigurationData.setOverrideManualScheduledParams(false);
                        userConfigurationData.setComputationalResourceScheduling(scheduling);
                        simpleExperiment.setUserConfigurationData(userConfigurationData);
                        return client.createExperiment(new AuthzToken(""), DEFAULT_GATEWAY, simpleExperiment);
                    }
                }
            }
        } catch (AiravataSystemException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new AiravataSystemException(e);
        } catch (InvalidRequestException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new InvalidRequestException(e);
        } catch (AiravataClientException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new AiravataClientException(e);
        } catch (TException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new TException(e);
        }
        return null;
    }

    public static String createExperimentForTrestlesAmber(Airavata.Client client) throws TException {
        try {

            List<InputDataObjectType> exInputs = client.getApplicationInputs(new AuthzToken(""), amberAppId);
            //			for (InputDataObjectType inputDataObjectType : exInputs) {
            //				if (inputDataObjectType.getName().equalsIgnoreCase("Heat_Restart_File")) {
            //					inputDataObjectType.setValue("/Users/raminder/Documents/Sample/Amber/02_Heat.rst");
            //				} else if (inputDataObjectType.getName().equalsIgnoreCase("Production_Control_File")) {
            //					inputDataObjectType.setValue("/Users/raminder/Documents/Sample/Amber/03_Prod.in");
            //				} else if (inputDataObjectType.getName().equalsIgnoreCase("Parameter_Topology_File")) {
            //					inputDataObjectType.setValue("/Users/raminder/Documents/Sample/Amber/prmtop");
            //				}
            //
            //			}
            for (InputDataObjectType inputDataObjectType : exInputs) {
                if (inputDataObjectType.getName().equalsIgnoreCase("Heat_Restart_File")) {
                    inputDataObjectType.setValue(
                            "/Users/chathuri/dev/airavata/source/php/inputs/AMBER_FILES/02_Heat.rst");
                } else if (inputDataObjectType.getName().equalsIgnoreCase("Production_Control_File")) {
                    inputDataObjectType.setValue(
                            "/Users/chathuri/dev/airavata/source/php/inputs/AMBER_FILES/03_Prod.in");
                } else if (inputDataObjectType.getName().equalsIgnoreCase("Parameter_Topology_File")) {
                    inputDataObjectType.setValue("/Users/chathuri/dev/airavata/source/php/inputs/AMBER_FILES/prmtop");
                }
            }
            List<OutputDataObjectType> exOut = client.getApplicationOutputs(new AuthzToken(""), amberAppId);

            Project project = ProjectModelUtil.createProject("default", "admin", "test project");
            String projectId = client.createProject(new AuthzToken(""), DEFAULT_GATEWAY, project);

            ExperimentModel simpleExperiment = ExperimentModelUtil.createSimpleExperiment(
                    DEFAULT_GATEWAY, projectId, "admin", "sshEchoExperiment", "SimpleEchoBR", amberAppId, exInputs);
            simpleExperiment.setExperimentOutputs(exOut);
            simpleExperiment.setEnableEmailNotification(true);
            //            simpleExperiment.addToEmailAddresses("raman@ogce.org");
            Map<String, String> computeResources =
                    airavataClient.getAvailableAppInterfaceComputeResources(new AuthzToken(""), amberAppId);
            if (computeResources != null && computeResources.size() != 0) {
                for (String id : computeResources.keySet()) {
                    String resourceName = computeResources.get(id);
                    if (resourceName.equals(trestlesHostName)) {
                        ComputationalResourceSchedulingModel scheduling =
                                ExperimentModelUtil.createComputationResourceScheduling(id, 4, 1, 1, "normal", 20, 1);
                        UserConfigurationDataModel userConfigurationData = new UserConfigurationDataModel();
                        userConfigurationData.setAiravataAutoSchedule(false);
                        userConfigurationData.setOverrideManualScheduledParams(false);
                        userConfigurationData.setComputationalResourceScheduling(scheduling);
                        simpleExperiment.setUserConfigurationData(userConfigurationData);
                        return client.createExperiment(new AuthzToken(""), DEFAULT_GATEWAY, simpleExperiment);
                    }
                }
            }
        } catch (AiravataSystemException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new AiravataSystemException(e);
        } catch (InvalidRequestException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new InvalidRequestException(e);
        } catch (AiravataClientException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new AiravataClientException(e);
        } catch (TException e) {
            logger.error("Error occured while creating the experiment...", e.getMessage());
            throw new TException(e);
        }
        return null;
    }

    public static void launchExperiment(Airavata.Client client, String expId) throws TException {
        try {
            client.launchExperiment(new AuthzToken(""), expId, DEFAULT_GATEWAY);
        } catch (ExperimentNotFoundException e) {
            logger.error("Error occured while launching the experiment...", e.getMessage());
            throw new ExperimentNotFoundException(e);
        } catch (AiravataSystemException e) {
            logger.error("Error occured while launching the experiment...", e.getMessage());
            throw new AiravataSystemException(e);
        } catch (InvalidRequestException e) {
            logger.error("Error occured while launching the experiment...", e.getMessage());
            throw new InvalidRequestException(e);
        } catch (AiravataClientException e) {
            logger.error("Error occured while launching the experiment...", e.getMessage());
            throw new AiravataClientException(e);
        } catch (TException e) {
            logger.error("Error occured while launching the experiment...", e.getMessage());
            throw new TException(e);
        }
    }

    public static List<ExperimentModel> getExperimentsForUser(Airavata.Client client, String user) {
        try {
            return client.getUserExperiments(new AuthzToken(""), DEFAULT_GATEWAY, user, -1, 0);
        } catch (AiravataSystemException e) {
            e.printStackTrace();
        } catch (InvalidRequestException e) {
            e.printStackTrace();
        } catch (AiravataClientException e) {
            e.printStackTrace();
        } catch (TException e) {
            e.printStackTrace();
        }
        return null;
    }

    public static List<Project> getAllUserProject(Airavata.Client client, String user) {
        try {
            return client.getUserProjects(new AuthzToken(""), DEFAULT_GATEWAY, user, -1, 0);
        } catch (AiravataSystemException e) {
            e.printStackTrace();
        } catch (InvalidRequestException e) {
            e.printStackTrace();
        } catch (AiravataClientException e) {
            e.printStackTrace();
        } catch (TException e) {
            e.printStackTrace();
        }
        return null;
    }

    public static void getExperiment(Airavata.Client client, String expId) throws Exception {
        try {
            ExperimentModel experiment = client.getExperiment(new AuthzToken(""), expId);
            List<ErrorModel> errors = experiment.getErrors();
            if (errors != null && !errors.isEmpty()) {
                for (ErrorModel error : errors) {
                    System.out.println("ERROR MESSAGE : " + error.getActualErrorMessage());
                }
            }

        } catch (ExperimentNotFoundException e) {
            logger.error("Experiment does not exist", e);
            throw new ExperimentNotFoundException("Experiment does not exist");
        } catch (AiravataSystemException e) {
            logger.error("Error while retrieving experiment", e);
            throw new AiravataSystemException(AiravataErrorType.INTERNAL_ERROR);
        } catch (InvalidRequestException e) {
            logger.error("Error while retrieving experiment", e);
            throw new InvalidRequestException("Error while retrieving experiment");
        } catch (AiravataClientException e) {
            logger.error("Error while retrieving experiment", e);
            throw new AiravataClientException(AiravataErrorType.INTERNAL_ERROR);
        }
    }
}

/*
*  #### Registering Application Interfaces ####

#### Registering Echo Interface ####

Local Echo Application Interface Id Echo_57a8f843-4298-46a7-bdac-801adeb77e9f
#### Registering Echo Interface ####

Echo Application Interface Id Echo_b730bf47-6a22-44ac-91f3-91bd463bd627
#### Registering MPI Interface ####

MPI Application Interface Id HelloMPI_71b6f45e-40c2-46e9-a417-160b2640fcb9
#### Registering Amber Interface ####

Amber Application Interface Id Amber_74ad818e-7633-476a-b861-952de9b0a529
#### Registering AutoDock Interface ####

AutoDock Application Interface Id AutoDock_6e1032f4-389c-4e35-bdc8-2c3955f51721
#### Registering Espresso Interface ####

Espresso Application Interface Id ESPRESSO_af507be5-5ab8-499d-b1c6-51c543968bb6
#### Registering Gromacs Interface ####

Gromacs Application Interface Id GROMACS_9476b548-72ce-4550-bde6-959fd513ead8
#### Registering LAMMPS Interface ####

LAMMPS Application Interface Id LAMMPS_73d62891-a0d6-4407-9e89-6cd7d02e5a16
#### Registering Gamess Interface ####

GAMESS Application Interface Id Gamess_2de57c7d-f806-4bb2-956a-c42bfa7851cc
#### Registering NWChem Interface ####

NWChem Application Interface Id NWChem_57cdc71b-b47b-4b88-b949-b35d57c40e0c
#### Registering Trinity Interface ####

Trinity Application Interface Id Trinity_fe1e411a-39e1-497d-b988-3b4159ce3331
#### Registering WRF Interface ####

WRF Application Interface Id WRF_434f8543-91ac-4f59-bca1-bf40be8d6f5a
#### Registering Tinker Monte Application Interface ####
Monte Application Interface Id Tinker_Monte_f3949619-faf5-43d8-9c52-3ace4ca9f258
#### Registering Gaussian Application Interface ####
Gaussian Application Interface Id Gaussian_a212c1d7-75ca-46c1-b11a-c8d431b5f05f
#### Registering Ultrascan Application Interface ####
Ultrascan Application Interface Id Ultrascan_3749018d-2cee-407b-a7cd-fdf86d525ca5
*/
