You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airavata.apache.org by nd...@apache.org on 2015/05/01 23:33:25 UTC

[38/57] [partial] airavata-php-gateway git commit: AIRAVATA 1632 + Job Description for Admin Dashboard

http://git-wip-us.apache.org/repos/asf/airavata-php-gateway/blob/01413d65/app/libraries/utilities.php
----------------------------------------------------------------------
diff --git a/app/libraries/utilities.php b/app/libraries/utilities.php
new file mode 100644
index 0000000..a456673
--- /dev/null
+++ b/app/libraries/utilities.php
@@ -0,0 +1,2111 @@
+<?php
+
+//Thrift classes - loaded from Vendor/Thrift
+use Thrift\Transport\TTransport;
+use Thrift\Exception\TException;
+use Thrift\Exception\TTransportException;
+use Thrift\Factory\TStringFuncFactory;
+use Thrift\Protocol\TBinaryProtocol;
+use Thrift\Transport\TSocket;
+
+//Airavata classes - loaded from app/libraries/Airavata
+use Airavata\API\AiravataClient;
+use Airavata\API\Error\InvalidRequestException;
+use Airavata\API\Error\AiravataClientException;
+use Airavata\API\Error\AiravataSystemException;
+use Airavata\API\Error\ExperimentNotFoundException;
+use Airavata\Model\Workspace\Experiment\ComputationalResourceScheduling;
+use Airavata\Model\AppCatalog\AppInterface\InputDataObjectType;
+use Airavata\Model\Workspace\Experiment\UserConfigurationData;
+use Airavata\Model\Workspace\Experiment\AdvancedOutputDataHandling;
+use Airavata\Model\Workspace\Experiment\Experiment;
+use Airavata\Model\Workspace\Experiment\ExperimentState;
+use Airavata\Model\AppCatalog\AppInterface\DataType;
+use Airavata\Model\Workspace\Project;
+use Airavata\Model\Workspace\Experiment\JobState;
+use Airavata\Model\AppCatalog\ComputeResource\JobSubmissionInterface;
+use Airavata\Model\AppCatalog\ComputeResource\JobSubmissionProtocol;
+
+
+
+class Utilities{
+/**
+ * Basic utility functions
+ */
+
+/*
+
+************* IMPORTANT ************
+
+READ :: ALL CONSTANTS ARE NOW BEING CALLED FROM app/models/Constant.php. 
+
+************* IMPORTANT ************
+*/
+private $tokenFilePath = 'tokens.xml';
+private $tokenFile = null;
+
+private $sshUser;
+private $hostName;
+private static $pathConstant;
+private static $experimentPath;
+private static $experimentDataPathAbsolute;
+
+function __construct(){
+	$this->sshUser = "root";
+	$this->hostName = $_SERVER['SERVER_NAME'];
+
+    self::$experimentDataPathAbsolute = base_path() . Constant::EXPERIMENT_DATA_ROOT;
+	self::$pathConstant = 'file://'.$this->sshUser.'@'.$this->hostName.':' . self::$experimentDataPathAbsolute;
+	self::$experimentPath = null;
+}
+
+/**
+ * Print success message
+ * @param $message
+ */
+public static function print_success_message($message)
+{
+    echo '<div class="alert alert-success">' . $message . '</div>';
+}
+
+/**
+ * Print warning message
+ * @param $message
+ */
+public static function print_warning_message($message)
+{
+    echo '<div class="alert alert-warning">' . $message . '</div>';
+}
+
+/**
+ * Print error message
+ * @param $message
+ */
+public static function print_error_message($message)
+{
+    echo '<div class="alert alert-danger">' . $message . '</div>';
+}
+
+/**
+ * Print info message
+ * @param $message
+ */
+public static function print_info_message($message)
+{
+    echo '<div class="alert alert-info">' . $message . '</div>';
+}
+
+/**
+ * Redirect to the given url
+ * @param $url
+ */
+public static function redirect($url)
+{
+    echo '<meta http-equiv="Refresh" content="0; URL=' . $url . '">';
+}
+
+/**
+ * Return true if the form has been submitted
+ * @return bool
+ */
+public static function form_submitted()
+{
+    return isset($_POST['Submit']);
+}
+
+/**
+ * Compare the submitted credentials with those stored in the database
+ * @param $username
+ * @param $password
+ * @return bool
+ */
+public static function id_matches_db($username, $password)
+{
+    $idStore = new WSISUtilities();
+
+    try
+    {
+        $idStore->connect();
+    }
+    catch (Exception $e)
+    {
+        Utilities::print_error_message('<p>Error connecting to ID store.
+            Please try again later or report a bug using the link in the Help menu</p>' .
+            '<p>' . $e->getMessage() . '</p>');
+    }
+    //checking user roles.
+    //var_dump( $idStore->updateRoleListOfUser( $username, array( "new"=>array("admin"), "deleted"=>array() ) ) );
+    //var_dump($idStore->getRoleListOfUser( $username) ); exit;
+    //var_dump( $idStore->authenticate($username, $password)); exit;
+    if($idStore->authenticate($username, $password))
+    {
+        //checking if user is an Admin and saving in Session.
+       $app_config = Utilities::read_config();
+
+        if( in_array( $app_config["admin-role"], (array)$idStore->getRoleListOfUser( $username)))
+        {
+            Session::put("admin", true);
+        }
+        return true;
+    }else{
+        return false;
+    }
+}
+
+
+/**
+ * Store username in session variables
+ * @param $username
+ */
+public static function store_id_in_session($username)
+{
+    Session::put('username', $username );
+    Session::put('loggedin', true);
+}
+
+/**
+ * Return true if the username stored in the session
+ * @return bool
+ */
+public static function id_in_session()
+{
+    if( Session::has("username") && Session::has('loggedin') )
+        return true;
+    else
+        return false;
+}
+
+/**
+ * Verify if the user is already logged in. If not, redirect to the home page.
+ */
+public static function verify_login()
+{
+    if (Utilities::id_in_session())
+    {
+        return true;
+    }
+    else
+    {
+        Utilities::print_error_message('User is not logged in!');
+        return false;
+    }
+}
+
+/**
+ * Connect to the ID store
+ */
+public static function connect_to_id_store()
+{
+    global $idStore;
+    $app_config = Utilities::read_config();
+
+    switch ($app_config["user-store"])
+    {
+        case 'WSO2':
+            $idStore = new WSISUtilities(); // WS02 Identity Server
+            break;
+        case 'XML':
+            $idStore = new XmlIdUtilities(); // XML user database
+            break;
+        case 'USER_API':
+            $idStore = new UserAPIUtilities(); // Airavata UserAPI
+            break;
+    }
+
+    try
+    {
+        $idStore->connect();
+    }
+    catch (Exception $e)
+    {
+        Utilities::print_error_message('<p>Error connecting to ID store.
+            Please try again later or report a bug using the link in the Help menu</p>' .
+            '<p>' . $e->getMessage() . '</p>');
+    }
+}
+
+/**
+ * Return an Airavata client
+ * @return AiravataClient
+ */
+public static function get_airavata_client()
+{
+    try
+    {
+        $app_config = Utilities::read_config();
+        $transport = new TSocket( $app_config["airavata-server"], $app_config["airavata-port"]);
+        $transport->setRecvTimeout( $app_config["airavata-timeout"]);
+        $transport->setSendTimeout( $app_config["airavata-timeout"]);
+
+        $protocol = new TBinaryProtocol($transport);
+        $transport->open();
+
+        $client = new AiravataClient($protocol);
+
+        if( is_object( $client))
+            return $client;
+        else
+            return Redirect::to("airavata/down");
+    }
+    catch (Exception $e)
+    {
+        /*Utilities::print_error_message('<p>There was a problem connecting to Airavata.
+            Please try again later or submit a bug report using the link in the Help menu.</p>' .
+            '<p>' . $e->getMessage() . '</p>');
+        */
+        
+    }
+}
+
+
+
+/**
+ * Launch the experiment with the given ID
+ * @param $expId
+ */
+public static function launch_experiment($expId)
+{
+    $airavataclient = Session::get("airavataClient");
+    //global $tokenFilePath;
+    try
+    {
+        /* temporarily using hard-coded token
+        open_tokens_file($tokenFilePath);
+
+        $communityToken = $tokenFile->tokenId;
+
+
+        $token = isset($_SESSION['tokenId'])? $_SESSION['tokenId'] : $communityToken;
+
+        $airavataclient->launchExperiment($expId, $token);
+
+        $tokenString = isset($_SESSION['tokenId'])? 'personal' : 'community';
+
+        Utilities::print_success_message('Experiment launched using ' . $tokenString . ' allocation!');
+        */
+
+        $app_config = Utilities::read_config();
+        $hardCodedToken = $app_config['credential-store-token'];
+        $airavataclient->launchExperiment($expId, $hardCodedToken);
+
+        /*
+        Utilities::print_success_message('Experiment launched!');
+        Utilities::print_success_message("<p>Experiment launched!</p>" .
+            '<p>You will be redirected to the summary page shortly, or you can
+            <a href="experiment_summary.php?expId=' . $expId . '">go directly</a> to the experiment summary page.</p>');
+        redirect('experiment_summary.php?expId=' . $expId);
+        */
+    }
+    catch (InvalidRequestException $ire)
+    {
+        Utilities::print_error_message('<p>There was a problem launching the experiment.
+            Please try again later or submit a bug report using the link in the Help menu.</p>' .
+            '<p>InvalidRequestException: ' . $ire->getMessage() . '</p>');
+    }
+    catch (ExperimentNotFoundException $enf)
+    {
+        Utilities::print_error_message('<p>There was a problem launching the experiment.
+            Please try again later or submit a bug report using the link in the Help menu.</p>' .
+            '<p>ExperimentNotFoundException: ' . $enf->getMessage() . '</p>');
+    }
+    catch (AiravataClientException $ace)
+    {
+        Utilities::print_error_message('<p>There was a problem launching the experiment.
+            Please try again later or submit a bug report using the link in the Help menu.</p>' .
+            '<p>AiravataClientException: ' . $ace->getMessage() . '</p>');
+    }
+    catch (AiravataSystemException $ase)
+    {
+        Utilities::print_error_message('<p>There was a problem launching the experiment.
+            Please try again later or submit a bug report using the link in the Help menu.</p>' .
+            '<p>AiravataSystemException: ' . $ase->getMessage() . '</p>');
+    }
+    catch (Exception $e)
+    {
+        Utilities::print_error_message('<p>There was a problem launching the experiment.
+            Please try again later or submit a bug report using the link in the Help menu.</p>' .
+            '<p>Exception: ' . $e->getMessage() . '</p>');
+    }
+}
+
+/**
+ * Get all projects owned by the given user
+ * @param $username
+ * @return null
+ */
+public static function get_all_user_projects($gatewayId, $username)
+{
+    $airavataclient = Session::get("airavataClient");
+    $userProjects = null;
+
+    try
+    {
+        $userProjects = $airavataclient->getAllUserProjects($gatewayId, $username);
+        //var_dump( $userProjects); exit;
+    }
+    catch (InvalidRequestException $ire)
+    {
+        Utilities::print_error_message('<p>There was a problem getting the user\'s projects.
+            Please try again later or submit a bug report using the link in the Help menu.</p>' .
+            '<p>InvalidRequestException: ' . $ire->getMessage(). '</p>');
+    }
+    catch (AiravataClientException $ace)
+    {
+        Utilities::print_error_message('<p>There was a problem getting the user\'s projects.
+            Please try again later or submit a bug report using the link in the Help menu.</p>' .
+            '<p>Airavata Client Exception: ' . $ace->getMessage(). '</p>');
+    }
+    catch (AiravataSystemException $ase)
+    {
+        if ($ase->airavataErrorType == 2) // 2 = INTERNAL_ERROR
+        {
+            Utilities::print_warning_message('<p>You must create a project before you can create an experiment.
+                Click <a href="' . URL::to('/') . '/project/create">here</a> to create a project.</p>');
+        }
+        else
+        {
+            Utilities::print_error_message('<p>There was a problem getting the user\'s projects.
+            Please try again later or submit a bug report using the link in the Help menu.</p>' .
+            '<p>AiravataSystemException: ' . $ase->getMessage() . '</p>');
+        }
+    }
+
+    return $userProjects;
+}
+
+
+/**
+ * Get all available applications
+ * @return null
+ */
+public static function get_all_applications()
+{
+    $airavataclient = Session::get("airavataClient");
+    $applications = null;
+
+    try
+    {
+        $applications = $airavataclient->getAllApplicationInterfaceNames( Session::get("gateway_id"));
+    }
+    catch (InvalidRequestException $ire)
+    {
+        Utilities::print_error_message('<p>There was a problem getting all applications.
+            Please try again later or submit a bug report using the link in the Help menu.</p>' .
+            '<p>InvalidRequestException: ' . $ire->getMessage() . '</p>');
+    }
+    catch (AiravataClientException $ace)
+    {
+        Utilities::print_error_message('<p>There was a problem getting all applications.
+            Please try again later or submit a bug report using the link in the Help menu.</p>' .
+            '<p>Airavata Client Exception: ' . $ace->getMessage() . '</p>');
+    }
+    catch (AiravataSystemException $ase)
+    {
+        Utilities::print_warning_message('<p>You must create an application module, interface and deployment space before you can create an experiment.
+                Click <a href="' . URL::to('/') . '/app/module">here</a> to create an application.</p>');
+        /*
+        Utilities::print_error_message('<p>There was a problem getting all applications.
+            Please try again later or submit a bug report using the link in the Help menu.</p>' .
+            '<p>Airavata System Exception: ' . $ase->getMessage() . '</p>');
+            */
+    }
+
+    if( count( $applications) == 0)
+        Utilities::print_warning_message('<p>You must create an application module, interface and deployment space before you can create an experiment.
+                Click <a href="' . URL::to('/') . '/app/module">here</a> to create an application.</p>');
+        
+
+    return $applications;
+}
+
+
+/**
+ * Get the interface for the application with the given ID
+ * @param $id
+ * @return null
+ */
+public static function get_application_interface($id)
+{
+    $airavataclient = Session::get("airavataClient");
+    $applicationInterface = null;
+
+    try
+    {
+        $applicationInterface = $airavataclient->getApplicationInterface($id);
+    }
+    catch (InvalidRequestException $ire)
+    {
+        Utilities::print_error_message('<p>There was a problem getting the application interface.
+            Please try again later or submit a bug report using the link in the Help menu.</p>' .
+            '<p>InvalidRequestException: ' . $ire->getMessage(). '</p>');
+    }
+    catch (AiravataClientException $ace)
+    {
+        Utilities::print_error_message('<p>There was a problem getting the application interface.
+            Please try again later or submit a bug report using the link in the Help menu.</p>' .
+            '<p>Airavata Client Exception: ' . $ace->getMessage() . '</p>');
+    }
+    catch (AiravataSystemException $ase)
+    {
+        Utilities::print_error_message('<p>There was a problem getting the application interface.
+            Please try again later or submit a bug report using the link in the Help menu.</p>' .
+            '<p>Airavata System Exception: ' . $ase->getMessage() . '</p>');
+    }
+
+    return $applicationInterface;
+}
+
+
+/**
+ * Get a list of compute resources available for the given application ID
+ * @param $id
+ * @return null
+ */
+public static function get_available_app_interface_compute_resources($id)
+{
+    $airavataclient = Session::get("airavataClient");
+    $computeResources = null;
+
+    try
+    {
+        $computeResources = $airavataclient->getAvailableAppInterfaceComputeResources($id);
+    }
+    catch (InvalidRequestException $ire)
+    {
+        Utilities::print_error_message('<p>There was a problem getting compute resources.
+            Please try again later or submit a bug report using the link in the Help menu.</p>' .
+            '<p>InvalidRequestException: ' . $ire->getMessage() . '</p>');
+    }
+    catch (AiravataClientException $ace)
+    {
+        Utilities::print_error_message('<p>There was a problem getting compute resources.
+            Please try again later or submit a bug report using the link in the Help menu.</p>' .
+            '<p>Airavata Client Exception: ' . $ace->getMessage() . '</p>');
+    }
+    catch (AiravataSystemException $ase)
+    {
+        Utilities::print_error_message('<p>There was a problem getting compute resources.
+            Please try again later or submit a bug report using the link in the Help menu.</p>' .
+            '<p>Airavata System Exception: ' . $ase->getMessage() . '</p>');
+    }
+
+    return $computeResources;
+}
+
+
+/**
+ * Get the ComputeResourceDescription with the given ID
+ * @param $id
+ * @return null
+ */
+public static function get_compute_resource($id)
+{
+    $airavataclient = Session::get("airavataClient");
+    $computeResource = null;
+
+    try
+    {
+        $computeResource = $airavataclient->getComputeResource($id);
+    }
+    catch (InvalidRequestException $ire)
+    {
+        Utilities::print_error_message('<p>There was a problem getting the compute resource.
+            Please try again later or submit a bug report using the link in the Help menu.</p>' .
+            '<p>InvalidRequestException: ' . $ire->getMessage() . '</p>');
+    }
+    catch (AiravataClientException $ace)
+    {
+        Utilities::print_error_message('<p>There was a problem getting the compute resource.
+            Please try again later or submit a bug report using the link in the Help menu.</p>' .
+            '<p>Airavata Client Exception: ' . $ace->getMessage() . '</p>');
+    }
+    catch (AiravataSystemException $ase)
+    {
+        Utilities::print_error_message('<p>There was a problem getting the compute resource.
+            Please try again later or submit a bug report using the link in the Help menu.</p>' .
+            '<p>Airavata System Exception: ' . $ase->getMessage() . '</p>');
+    }
+
+    return $computeResource;
+}
+
+
+/**
+ * List the experiment's input files
+ * @param $experiment
+ */
+public static function list_input_files($experiment)
+{
+    $applicationInputs = Utilities::get_application_inputs($experiment->applicationId);
+
+    $experimentInputs = $experiment->experimentInputs;
+
+
+    //showing experiment inputs in the order defined by the admins.
+    $order = array();
+    foreach ($experimentInputs as $index => $input)
+    {
+        $order[$index] = $input->inputOrder;
+    }
+    array_multisort($order, SORT_ASC, $experimentInputs);
+    
+    foreach ($experimentInputs as $input)
+    {
+        $matchingAppInput = null;
+
+        foreach($applicationInputs as $applicationInput)
+        {
+            if ($input->name == $applicationInput->name)
+            {
+                $matchingAppInput = $applicationInput;
+            }
+        }
+        //var_dump($matchingAppInput);
+
+        if ($matchingAppInput->type == DataType::URI)
+        {
+            $explode = explode('/', $input->value);
+            echo '<p><a target="_blank"
+                        href="' . URL::to("/") . "/../../" . Constant::EXPERIMENT_DATA_ROOT . $explode[sizeof($explode)-2] . '/' . $explode[sizeof($explode)-1] . '">' .
+                $explode[sizeof($explode)-1] . '
+                <span class="glyphicon glyphicon-new-window"></span></a></p>';
+        }
+        elseif ($matchingAppInput->type == DataType::STRING)
+        {
+            echo '<p>' . $input->name . ': ' . $input->value . '</p>';
+        }
+    }
+}
+
+
+/**
+ * Get a list of the inputs for the application with the given ID
+ * @param $id
+ * @return null
+ */
+public static function get_application_inputs($id)
+{
+    $airavataclient = Session::get("airavataClient");
+    $inputs = null;
+
+    try
+    {
+        $inputs = $airavataclient->getApplicationInputs($id);
+    }
+    catch (InvalidRequestException $ire)
+    {
+        Utilities::print_error_message('<p>There was a problem getting application inputs.
+            Please try again later or submit a bug report using the link in the Help menu.</p>' .
+            '<p>InvalidRequestException: ' . $ire->getMessage() . '</p>');
+    }
+    catch (AiravataClientException $ace)
+    {
+        Utilities::print_error_message('<p>There was a problem getting application inputs.
+            Please try again later or submit a bug report using the link in the Help menu.</p>' .
+            '<p>Airavata Client Exception: ' . $ace->getMessage() . '</p>');
+    }
+    catch (AiravataSystemException $ase)
+    {
+        Utilities::print_error_message('<p>There was a problem getting application inputs.
+            Please try again later or submit a bug report using the link in the Help menu.</p>' .
+            '<p>Airavata System Exception: ' . $ase->getMessage() . '</p>');
+    }
+
+    return $inputs;
+}
+
+
+/**
+ * Get a list of the outputs for the application with the given ID
+ * @param $id
+ * @return null
+ */
+public static function get_application_outputs($id)
+{
+    $airavataclient = Session::get("airavataClient");
+    $outputs = null;
+
+    try
+    {
+        $outputs = $airavataclient->getApplicationOutputs($id);
+    }
+    catch (InvalidRequestException $ire)
+    {
+        Utilities::print_error_message('<p>There was a problem getting application outputs.
+            Please try again later or submit a bug report using the link in the Help menu.</p>' .
+            '<p>InvalidRequestException: ' . $ire->getMessage() . '</p>');
+    }
+    catch (AiravataClientException $ace)
+    {
+        Utilities::print_error_message('<p>There was a problem getting application outputs.
+            Please try again later or submit a bug report using the link in the Help menu.</p>' .
+            '<p>Airavata Client Exception: ' . $ace->getMessage() . '</p>');
+    }
+    catch (AiravataSystemException $ase)
+    {
+        Utilities::print_error_message('<p>There was a problem getting application outputs.
+            Please try again later or submit a bug report using the link in the Help menu.</p>' .
+            '<p>Airavata System Exception: ' . $ase->getMessage() . '</p>');
+    }
+
+    return $outputs;
+}
+
+
+/**
+ * Get the experiment with the given ID
+ * @param $expId
+ * @return null
+ */
+public static function get_experiment($expId)
+{
+    $airavataclient = Session::get("airavataClient");
+
+    try
+    {
+        return $airavataclient->getExperiment($expId);
+    }
+    catch (InvalidRequestException $ire)
+    {
+        Utilities::print_error_message('<p>There was a problem getting the experiment.
+            Please try again later or submit a bug report using the link in the Help menu.</p>' .
+            '<p>InvalidRequestException: ' . $ire->getMessage() . '</p>');
+    }
+    catch (ExperimentNotFoundException $enf)
+    {
+        Utilities::print_error_message('<p>There was a problem getting the experiment.
+            Please try again later or submit a bug report using the link in the Help menu.</p>' .
+            '<p>ExperimentNotFoundException: ' . $enf->getMessage() . '</p>');
+    }
+    catch (AiravataClientException $ace)
+    {
+        Utilities::print_error_message('<p>There was a problem getting the experiment.
+            Please try again later or submit a bug report using the link in the Help menu.</p>' .
+            '<p>AiravataClientException: ' . $ace->getMessage() . '</p>');
+    }
+    catch (AiravataSystemException $ase)
+    {
+        Utilities::print_error_message('<p>There was a problem getting the experiment.
+            Please try again later or submit a bug report using the link in the Help menu.</p>' .
+            '<p>AiravataSystemException: ' . $ase->getMessage() . '</p>');
+    }
+    catch (TTransportException $tte)
+    {
+        Utilities::print_error_message('<p>There was a problem getting the experiment.
+            Please try again later or submit a bug report using the link in the Help menu.</p>' .
+            '<p>TTransportException: ' . $tte->getMessage() . '</p>');
+    }
+    catch (Exception $e)
+    {
+        Utilities::print_error_message('<p>There was a problem getting the experiment.
+            Please try again later or submit a bug report using the link in the Help menu.</p>' .
+            '<p>Exception: ' . $e->getMessage() . '</p>');
+    }
+
+}
+
+/**
+ * Get the project with the given ID
+ * @param $projectId
+ * @return null
+ */
+public static function get_project($projectId)
+{
+    $airavataclient = Session::get("airavataClient");
+
+    try
+    {
+        return $airavataclient->getProject($projectId);
+    }
+    catch (InvalidRequestException $ire)
+    {
+        Utilities::print_error_message('<p>There was a problem getting the project.
+            Please try again later or submit a bug report using the link in the Help menu.</p>' .
+            '<p>InvalidRequestException: ' . $ire->getMessage() . '</p>');
+    }
+    catch (AiravataClientException $ace)
+    {
+        Utilities::print_error_message('<p>There was a problem getting the project.
+            Please try again later or submit a bug report using the link in the Help menu.</p>' .
+            '<p>AiravataClientException: ' . $ace->getMessage() . '</p>');
+    }
+    catch (AiravataSystemException $ase)
+    {
+        Utilities::print_error_message('<p>There was a problem getting the project.
+            Please try again later or submit a bug report using the link in the Help menu.</p>' .
+            '<p>AiravataSystemException!<br><br>' . $ase->getMessage() . '</p>');
+    }
+
+}
+
+
+/**
+ * Create and configure a new Experiment
+ * @return Experiment
+ */
+public static function assemble_experiment()
+{
+    $utility = new Utilities();
+    $experimentInputs = array();
+    $app_config = Utilities::read_config();
+
+    $scheduling = new ComputationalResourceScheduling();
+    $scheduling->totalCPUCount = $_POST['cpu-count'];
+    $scheduling->nodeCount = $_POST['node-count'];
+    $scheduling->queueName = $_POST['queue-name'];
+    $scheduling->wallTimeLimit = $_POST['wall-time'];    
+    $scheduling->totalPhysicalMemory = $_POST['total-physical-memory'];
+    $scheduling->resourceHostId = $_POST['compute-resource'];
+
+    $userConfigData = new UserConfigurationData();
+    $userConfigData->computationalResourceScheduling = $scheduling;
+    if( isset( $_POST["userDN"]) )
+        $userConfigData->userDN = $_POST["userDN"];
+
+    $applicationInputs = Utilities::get_application_inputs($_POST['application']);
+    $experimentInputs = Utilities::process_inputs($applicationInputs, $experimentInputs);
+
+    if( Utilities::$experimentPath == null){
+        Utilities::create_experiment_folder_path();
+    }
+
+    $advHandling = new AdvancedOutputDataHandling();
+
+    $advHandling->outputDataDir = str_replace( base_path() . Constant::EXPERIMENT_DATA_ROOT, Utilities::$pathConstant , Utilities::$experimentPath);
+    $userConfigData->advanceOutputDataHandling = $advHandling;
+
+    //TODO: replace constructor with a call to airvata to get a prepopulated experiment template
+    $experiment = new Experiment();
+
+    // required
+    $experiment->projectID = $_POST['project'];
+    $experiment->userName = Session::get( 'username');
+    $experiment->name = $_POST['experiment-name'];
+
+    // optional
+    $experiment->description = $_POST['experiment-description'];
+    $experiment->applicationId = $_POST['application'];
+    $experiment->userConfigurationData = $userConfigData;
+    $experiment->experimentInputs = $experimentInputs;
+    if( isset( $_POST["enableEmailNotification"]))
+    {
+        $experiment->enableEmailNotification = intval( $_POST["enableEmailNotification"] );
+        $experiment->emailAddresses = array_unique( array_filter( $_POST["emailAddresses"], "trim") );
+    }
+
+    // adding default experiment outputs for now till prepoulated experiment template is not implemented.
+    $experiment->experimentOutputs = Utilities::get_application_outputs( $_POST["application"]);
+
+    if ($experimentInputs)
+    {
+        return $experiment;
+    }
+}
+
+/**
+ * @param $applicationInputs
+ * @param $experimentInputs
+ * @internal param $environmentPath
+ * @return array
+ */
+public static function process_inputs($applicationInputs, $experimentInputs)
+{
+    $utility = new Utilities();
+    $experimentAssemblySuccessful = true;
+    $newExperimentInputs = array();
+
+    //var_dump($_FILES);
+
+    if (sizeof($_FILES) > 0)
+    {
+        if (Utilities::file_upload_successful())
+        {
+            // construct unique path
+            Utilities::create_experiment_folder_path();
+        }
+        else
+        {
+            $experimentAssemblySuccessful = false;
+        }
+    }
+
+    //sending application inputs in the order defined by the admins.
+    $order = array();
+    foreach ($applicationInputs as $index => $input)
+    {
+        $order[$index] = $input->inputOrder;
+    }
+    array_multisort($order, SORT_ASC, $applicationInputs);
+    
+    foreach ($applicationInputs as $applicationInput)
+    {
+        $experimentInput = new InputDataObjectType();
+        $experimentInput = $applicationInput;
+        //$experimentInput->name = $applicationInput->name;
+        //$experimentInput->metaData = $applicationInput->metaData;
+
+
+        //$experimentInput->type = $applicationInput->type;
+        //$experimentInput->type = DataType::STRING;
+
+
+        if(($applicationInput->type == DataType::STRING) ||
+            ($applicationInput->type == DataType::INTEGER) ||
+            ($applicationInput->type == DataType::FLOAT))
+        {
+            if (isset($_POST[$applicationInput->name]) && (trim($_POST[$applicationInput->name]) != ''))
+            {
+                $experimentInput->value = $_POST[$applicationInput->name];
+                $experimentInput->type = $applicationInput->type;
+
+            }
+            else // use previous value
+            {
+                $index = -1;
+                for ($i = 0; $i < sizeof($experimentInputs); $i++)
+                {
+                    if ($experimentInputs[$i]->name == $applicationInput->name)
+                    {
+                        $index = $i;
+                    }
+                }
+
+                if ($index >= 0)
+                {
+                    $experimentInput->value = $experimentInputs[$index]->value;
+                    $experimentInput->type = $applicationInput->type;
+                }
+            }
+        }
+        elseif ($applicationInput->type == DataType::URI)
+        {
+            //var_dump($_FILES[$applicationInput->name]->name);
+            if ($_FILES[$applicationInput->name]['name'])
+            {
+                $file = $_FILES[$applicationInput->name];
+
+
+                //
+                // move file to experiment data directory
+                //
+                $filePath = Utilities::$experimentPath . $file['name'];
+
+                // check if file already exists
+                if (is_file($filePath))
+                {
+                    unlink($filePath);
+
+                    Utilities::print_warning_message('Uploaded file already exists! Overwriting...');
+                }
+
+                $moveFile = move_uploaded_file($file['tmp_name'], $filePath);
+
+                if ($moveFile)
+                {
+                    Utilities::print_success_message('Upload: ' . $file['name'] . '<br>' .
+                        'Type: ' . $file['type'] . '<br>' .
+                        'Size: ' . ($file['size']/1024) . ' kB');//<br>' .
+                        //'Stored in: ' . $experimentPath . $file['name']);
+                }
+                else
+                {
+                    Utilities::print_error_message('<p>Error moving uploaded file ' . $file['name'] . '!
+                    Please try again later or report a bug using the link in the Help menu.</p>');
+                    $experimentAssemblySuccessful = false;
+                }
+
+                $experimentInput->value = str_replace(base_path() . Constant::EXPERIMENT_DATA_ROOT, Utilities::$pathConstant , $filePath);
+                $experimentInput->type = $applicationInput->type;
+                
+            }
+            else
+            {
+                $index = -1;
+                for ($i = 0; $i < sizeof($experimentInputs); $i++)
+                {
+                    if ($experimentInputs[$i]->name == $applicationInput->name)
+                    {
+                        $index = $i;
+                    }
+                }
+
+                if ($index >= 0)
+                {
+                    $experimentInput->value = $experimentInputs[$index]->value;
+                    $experimentInput->type = $applicationInput->type;
+                }
+            }
+
+        }
+        else
+        {
+            Utilities::print_error_message('I cannot accept this input type yet!');
+        }
+
+
+
+
+
+
+
+        //$experimentInputs[] = $experimentInput;
+        /*
+        $index = -1;
+        for ($i = 0; $i < sizeof($experimentInputs); $i++)
+        {
+            if ($experimentInputs[$i]->key == $experimentInput->key)
+            {
+                $index = $i;
+            }
+        }
+
+        if ($index >= 0)
+        {
+            unset($experimentInputs[$index]);
+        }
+        */
+        //$experimentInputs[] = $experimentInput;
+
+
+
+
+
+        $newExperimentInputs[] = $experimentInput;
+
+
+    }
+
+    if ($experimentAssemblySuccessful)
+    {
+        return $newExperimentInputs;
+    }
+    else
+    {
+        return false;
+    }
+
+}
+
+
+public static function create_experiment_folder_path()
+{
+    do
+    {
+        Utilities::$experimentPath = base_path() . Constant::EXPERIMENT_DATA_ROOT . str_replace(' ', '', Session::get('username') ) . md5(rand() * time()) . '/';
+    }
+    while (is_dir( Utilities::$experimentPath)); // if dir already exists, try again
+    // create upload directory
+    if (!mkdir( Utilities::$experimentPath))
+    {
+        Utilities::print_error_message('<p>Error creating upload directory!
+            Please try again later or report a bug using the link in the Help menu.</p>');
+        $experimentAssemblySuccessful = false;
+    }
+}
+
+/**
+ * Check the uploaded files for errors
+ */
+public static function file_upload_successful()
+{
+    $uploadSuccessful = true;
+
+    foreach ($_FILES as $file)
+    {
+        //var_dump($file);
+        if($file['name'])
+        {
+            if ($file['error'] > 0)
+            {
+                $uploadSuccessful = false;
+                Utilities::print_error_message('<p>Error uploading file ' . $file['name'] . ' !
+                    Please try again later or report a bug using the link in the Help menu.');
+            }/*
+            elseif ($file['type'] != 'text/plain')
+            {
+                $uploadSuccessful = false;
+                Utilities::print_error_message('Uploaded file ' . $file['name'] . ' type not supported!');
+            }
+            elseif (($file['size'] / 1024) > 20)
+            {
+                $uploadSuccessful = false;
+                Utilities::print_error_message('Uploaded file ' . $file['name'] . ' must be smaller than 10 MB!');
+            }*/
+        }
+
+
+    }
+
+    return $uploadSuccessful;
+}
+
+
+/**
+ * Update the experiment with the given ID
+ * @param $expId
+ * @param $updatedExperiment
+ */
+public static function update_experiment($expId, $updatedExperiment)
+{
+    $airavataclient = Session::get("airavataClient");
+
+    try
+    {
+        $airavataclient->updateExperiment($expId, $updatedExperiment);
+
+        /*
+        Utilities::print_success_message("<p>Experiment updated!</p>" .
+            '<p>Click
+            <a href="' . URL::to('/') . '/experiment/summary?expId=' . $expId . '">here</a> to visit the experiment summary page.</p>');
+        */
+    }
+    catch (InvalidRequestException $ire)
+    {
+        Utilities::print_error_message('<p>There was a problem updating the experiment.
+            Please try again later or submit a bug report using the link in the Help menu.</p>' .
+            '<p>InvalidRequestException: ' . $ire->getMessage() . '</p>');
+    }
+    catch (ExperimentNotFoundException $enf)
+    {
+        Utilities::print_error_message('<p>There was a problem updating the experiment.
+            Please try again later or submit a bug report using the link in the Help menu.</p>' .
+            '<p>ExperimentNotFoundException: ' . $enf->getMessage() . '</p>');
+    }
+    catch (AiravataClientException $ace)
+    {
+        Utilities::print_error_message('<p>There was a problem updating the experiment.
+            Please try again later or submit a bug report using the link in the Help menu.</p>' .
+            '<p>AiravataClientException: ' . $ace->getMessage() . '</p>');
+    }
+    catch (AiravataSystemException $ase)
+    {
+        Utilities::print_error_message('<p>There was a problem updating the experiment.
+            Please try again later or submit a bug report using the link in the Help menu.</p>' .
+            '<p>AiravataSystemException: ' . $ase->getMessage() . '</p>');
+    }
+
+}
+
+
+/**
+ * Clone the experiment with the given ID
+ * @param $expId
+ */
+public static function clone_experiment($expId)
+{
+    $airavataclient = Session::get("airavataClient");
+
+    try
+    {
+        //create new experiment to receive the clone
+        $experiment = $airavataclient->getExperiment($expId);
+
+        $cloneId = $airavataclient->cloneExperiment($expId, 'Clone of ' . $experiment->name);
+
+        Utilities::print_success_message("<p>Experiment cloned!</p>" .
+            '<p>You will be redirected to the edit page shortly, or you can
+            <a href="edit_experiment.php?expId=' . $cloneId . '">go directly</a> to the edit experiment page.</p>');
+        //redirect('edit_experiment.php?expId=' . $cloneId);
+        return $cloneId;
+    }
+    catch (InvalidRequestException $ire)
+    {
+        Utilities::print_error_message('<p>There was a problem cloning the experiment.
+            Please try again later or submit a bug report using the link in the Help menu.</p>' .
+            '<p>InvalidRequestException: ' . $ire->getMessage() . '</p>');
+    }
+    catch (ExperimentNotFoundException $enf)
+    {
+        Utilities::print_error_message('<p>There was a problem cloning the experiment.
+            Please try again later or submit a bug report using the link in the Help menu.</p>' .
+            '<p>ExperimentNotFoundException: ' . $enf->getMessage() . '</p>');
+    }
+    catch (AiravataClientException $ace)
+    {
+        Utilities::print_error_message('<p>There was a problem cloning the experiment.
+            Please try again later or submit a bug report using the link in the Help menu.</p>' .
+            '<p>AiravataClientException: ' . $ace->getMessage() . '</p>');
+    }
+    catch (AiravataSystemException $ase)
+    {
+        Utilities::print_error_message('<p>There was a problem cloning the experiment.
+            Please try again later or submit a bug report using the link in the Help menu.</p>' .
+            '<p>AiravataSystemException: ' . $ase->getMessage() . '</p>');
+    }
+    catch (TTransportException $tte)
+    {
+        Utilities::print_error_message('<p>There was a problem cloning the experiment.
+            Please try again later or submit a bug report using the link in the Help menu.</p>' .
+            '<p>TTransportException: ' . $tte->getMessage() . '</p>');
+    }
+}
+
+/**
+ * Cancel the experiment with the given ID
+ * @param $expId
+ */
+public static function cancel_experiment($expId)
+{
+    $airavataclient = Session::get("airavataClient");
+    $app_config = Utilities::read_config();
+
+
+
+    try
+    {
+        $airavataclient->terminateExperiment($expId, $app_config["credential-store-token"]);
+
+        Utilities::print_success_message("Experiment canceled!");
+    }
+    catch (InvalidRequestException $ire)
+    {
+        Utilities::print_error_message('<p>There was a problem canceling the experiment.
+            Please try again later or submit a bug report using the link in the Help menu.</p>' .
+            '<p>InvalidRequestException: ' . $ire->getMessage() . '</p>');
+    }
+    catch (ExperimentNotFoundException $enf)
+    {
+        Utilities::print_error_message('<p>There was a problem canceling the experiment.
+            Please try again later or submit a bug report using the link in the Help menu.</p>' .
+            '<p>ExperimentNotFoundException: ' . $enf->getMessage() . '</p>');
+    }
+    catch (AiravataClientException $ace)
+    {
+        Utilities::print_error_message('<p>There was a problem canceling the experiment.
+            Please try again later or submit a bug report using the link in the Help menu.</p>' .
+            '<p>AiravataClientException: ' . $ace->getMessage() . '</p>');
+    }
+    catch (AiravataSystemException $ase)
+    {
+        Utilities::print_error_message('<p>There was a problem canceling the experiment.
+            Please try again later or submit a bug report using the link in the Help menu.</p>' .
+            '<p>AiravataSystemException: ' . $ase->getMessage() . '</p>');
+    }
+    catch (TTransportException $tte)
+    {
+        Utilities::print_error_message('<p>There was a problem canceling the experiment.
+            Please try again later or submit a bug report using the link in the Help menu.</p>' .
+            '<p>TTransportException: ' . $tte->getMessage() . '</p>');
+    }
+    catch (Exception $e)
+    {
+        Utilities::print_error_message('<p>There was a problem canceling the experiment.
+            Please try again later or submit a bug report using the link in the Help menu.</p>' .
+            '<p>Exception: ' . $e->getMessage() . '</p>');
+    }
+}
+
+
+/**
+ * Create a select input and populate it with project options from the database
+ */
+public static function create_project_select($projectId = null, $editable = true)
+{
+    $editable? $disabled = '' : $disabled = 'disabled';
+    $userProjects = Utilities::get_all_user_projects( Session::get("gateway_id"), Session::get('username') );
+
+    echo '<select class="form-control" name="project" id="project" required ' . $disabled . '>';
+    if (sizeof($userProjects) > 0)
+    {
+        foreach ($userProjects as $project)
+        {
+            if ($project->projectID == $projectId)
+            {
+                $selected = 'selected';
+            }
+            else
+            {
+                $selected = '';
+            }
+
+            echo '<option value="' . $project->projectID . '" ' . $selected . '>' . $project->name . '</option>';
+        }
+    }
+    echo '</select>';
+    if( sizeof($userProjects) == 0 )
+    {
+        Utilities::print_warning_message('<p>You must create a project before you can create an experiment.
+                Click <a href="' . URL::to('/') . '/project/create">here</a> to create a project.</p>');
+    }
+}
+
+
+/**
+ * Create a select input and populate it with applications options
+ * @param null $id
+ * @param bool $editable
+ */
+public static function create_application_select($id = null, $editable = true)
+{
+    $disabled = $editable? '' : 'disabled';
+
+    $applicationIds = Utilities::get_all_applications();
+
+    echo '<select class="form-control" name="application" id="application" required ' . $disabled . '>';
+
+    if( count( $applicationIds))
+    {
+        foreach ( (array) $applicationIds as $applicationId => $applicationName)
+        {
+            $selected = ($applicationId == $id) ? 'selected' : '';
+    
+            echo '<option value="' . $applicationId . '" ' . $selected . '>' . $applicationName . '</option>';
+        }
+    }
+
+    echo '</select>';
+}
+
+
+/**
+ * Create a select input and populate it with compute resources
+ * available for the given application ID
+ * @param $applicationId
+ * @param $resourceHostId
+ */
+public static function create_compute_resources_select($applicationId, $resourceHostId)
+{
+    $computeResources = Utilities::get_available_app_interface_compute_resources($applicationId);
+    
+    if( count( $computeResources) > 0)
+    {
+    	echo '<select class="form-control" name="compute-resource" id="compute-resource">';
+	    foreach ($computeResources as $id => $name)
+	    {
+	        $selected = ($resourceHostId == $id)? ' selected' : '';
+
+	        echo '<option value="' . $id . '"' . $selected . '>' .
+	                $name . '</option>';
+
+	    }
+
+    	echo '</select>';
+    }
+    else
+    {
+    	echo "<h4>No Compute Resources exist at the moment.";
+    }
+
+}
+
+
+/**
+ * Create form inputs to accept the inputs to the given application
+ * @param $id
+ * @param $isRequired
+ * @internal param $required
+ */
+public static function create_inputs($id, $isRequired)
+{
+    $inputs = Utilities::get_application_inputs($id);
+
+    $required = $isRequired? ' required' : '';
+
+    //var_dump( $inputs);  echo "<br/>after sort<br/>";
+    //arranging inputs in ascending order.
+    foreach ($inputs as $index => $input)
+    {
+        $order[$index] = $input->inputOrder;
+    }
+    array_multisort($order, SORT_ASC, $inputs);
+    //var_dump( $inputs); exit;
+    foreach ($inputs as $input)
+    {
+        switch ($input->type)
+        {
+            case DataType::STRING:
+                echo '<div class="form-group">
+                    <label for="experiment-input">' . $input->name . '</label>
+                    <input value="' . $input->value . '" type="text" class="form-control" name="' . $input->name .
+                    '" id="' . $input->name .
+                    '" placeholder="' . $input->userFriendlyDescription . '"' . $required . '>
+                    </div>';
+                break;
+            case DataType::INTEGER:
+            echo '<div class="form-group">
+                    <label for="experiment-input">' . $input->name . '</label>
+                    <input value="' . $input->value . '" type="number" class="form-control" name="' . $input->name .
+                    '" id="' . $input->name .
+                    '" placeholder="' . $input->userFriendlyDescription . '"' . $required . '>
+                    </div>';
+                break;
+            case DataType::FLOAT:
+                echo '<div class="form-group">
+                    <label for="experiment-input">' . $input->name . '</label>
+                    <input value="' . $input->value . '" type="number" step="0.01" class="form-control" name="' . $input->name .
+                    '" id="' . $input->name .
+                    '" placeholder="' . $input->userFriendlyDescription . '"' . $required . '>
+                    </div>';
+                break;
+            case DataType::URI:
+                echo '<div class="form-group">
+                    <label for="experiment-input">' . $input->name . '</label>
+                    <input class="file-input" type="file" name="' . $input->name .
+                    '" id="' . $input->name . '" ' . $required . '>
+                    <p class="help-block">' . $input->userFriendlyDescription . '</p>
+                    </div>';
+                break;
+            default:
+                Utilities::print_error_message('Input data type not supported!
+                    Please file a bug report using the link in the Help menu.');
+                break;
+        }
+    }
+}
+
+
+/**
+ * Create navigation bar
+ * Used for all pages
+ */
+public static function create_nav_bar()
+{
+	$menus = array();
+/*
+	if( Session::has('loggedin'))
+	{
+	    $menus = array
+	    (
+	        'Project' => array
+	        (
+	            array('label' => 'Create Project', 'url' => URL::to('/') . '/project/create'),
+	            array('label' => 'Search Projects', 'url' => URL::to('/') . '/project/search')
+	        ),
+	        'Experiment' => array
+	        (
+	            array('label' => 'Create Experiment', 'url' => URL::to('/') . '/experiment/create'),
+	            array('label' => 'Search Experiments', 'url' => URL::to('/') . '/experiment/search')
+	        ),
+	        'Compute Resource' => array
+	        (
+	            array('label' => 'Register', 'url' => URL::to('/') . '/cr/create'),
+	            array('label' => 'Browse', 'url' => URL::to('/') . '/cr/browse')
+	        ),
+	        'App Catalog' => array
+	        (
+	            array('label' => 'Module', 'url' => URL::to('/') . '/app/module'),
+	            array('label' => 'Interface', 'url' => URL::to('/') . '/app/interface'),
+	            array('label' => 'Deployment', 'url' => URL::to('/') . '/app/deployment')
+	        ),
+	        'Help' => array
+	        (
+	            array('label' => 'Report Issue', 'url' => '#'),
+	            array('label' => 'Request Feature', 'url' => '#')
+	        )
+	    );
+	}
+*/
+	if( Session::has('loggedin'))
+	{
+	    $menus = array
+	    (
+	        'Project' => array
+	        (
+	            array('label' => 'Create', 'url' => URL::to('/') . '/project/create', "nav-active" => "project"),
+	            array('label' => 'Search', 'url' => URL::to('/') . '/project/search', "nav-active"=> "project")
+	        ),
+	        'Experiment' => array
+	        (
+	            array('label' => 'Create', 'url' => URL::to('/') . '/experiment/create', "nav-active" => "experiment"),
+	            array('label' => 'Search', 'url' => URL::to('/') . '/experiment/search', "nav-active" => "experiment")
+	        )
+	    );
+
+	    if( Session::has("admin"))
+	    {
+	    	$menus['Compute Resource'] = array
+	        (
+	            array('label' => 'Register', 'url' => URL::to('/') . '/cr/create', "nav-active" => "compute-resource"),
+	            array('label' => 'Browse', 'url' => URL::to('/') . '/cr/browse', "nav-active" => "compute-resource")
+	        );
+	        $menus['App Catalog'] = array
+	        (
+	            array('label' => 'Module', 'url' => URL::to('/') . '/app/module', "nav-active" => "app-catalog"),
+	            array('label' => 'Interface', 'url' => URL::to('/') . '/app/interface', "nav-active" => "app-catalog"),
+	            array('label' => 'Deployment', 'url' => URL::to('/') . '/app/deployment', "nav-active" => "app-catalog")
+	        );
+            /*
+            $menus['Gateway Profile'] = array
+            (
+
+                array('label' => 'Register', 'url' => URL::to('/') . '/gp/create', "nav-active" => "gateway-profile"),
+                array('label' => 'Browse', 'url' => URL::to('/') . '/gp/browse', "nav-active" => "gateway-profile")
+            );
+            */
+               
+	    }
+        
+        $menus['Help'] = array
+        (
+            array('label' => 'Report Issue', 'url' => '#', "nav-active", ""),
+            array('label' => 'Request Feature', 'url' => '#', "nav-active", "")
+        );
+	}
+
+    $selfExplode = explode('/', $_SERVER['PHP_SELF']);
+
+
+
+    // nav bar and left-aligned content
+
+    echo '<nav class="navbar navbar-inverse navbar-static-top" role="navigation">
+            <div class="container-fluid">
+                <!-- Brand and toggle get grouped for better mobile display -->
+                <div class="navbar-header">
+                    <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
+                       <span class="sr-only">Toggle navigation</span>
+                       <span class="icon-bar"></span>
+                       <span class="icon-bar"></span>
+                       <span class="icon-bar"></span>
+                    </button>
+                    <a class="navbar-brand" href="' . URL::to('home') . '" title="PHP Gateway with Airavata">PGA</a>
+                </div>
+
+                <!-- Collect the nav links, forms, and other content for toggling -->
+                <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
+                    <ul class="nav navbar-nav">';
+
+
+    foreach ($menus as $label => $options)
+    {
+        Session::has('loggedin') ? $disabled = '' : $disabled = ' class="disabled"';
+
+        $active = "";
+        if( Session::has("nav-active") && isset( $options[0]['nav-active'] ) )
+        {
+	        if( $options[0]['nav-active'] == Session::get("nav-active"))
+	        	$active = " active ";
+        }
+        echo '<li class="dropdown ' . $active . '">
+                <a href="#" class="dropdown-toggle" data-toggle="dropdown">' . $label . '<span class="caret"></span></a>
+                <ul class="dropdown-menu" role="menu">';
+
+        if( Session::has('loggedin'))
+        {
+	        foreach ($options as $option)
+	        {
+	            $id = strtolower(str_replace(' ', '-', $option['label']));
+
+	            echo '<li' . $disabled . '><a href="' . $option['url'] . '" id=' . $id . '>' . $option['label'] . '</a></li>';
+	        }
+	    }
+
+        echo '</ul>
+        </li>';
+    }
+
+
+    echo '</ul>
+
+        <ul class="nav navbar-nav navbar-right">';
+
+    // right-aligned content
+
+    if ( Session::has('loggedin') )
+    {
+        $active = "";
+        if( Session::has("nav-active") )
+        {
+            if( "user-console" == Session::get("nav-active"))
+                $active = " active ";
+        }
+        if( Session::has("admin"))
+            echo '<li><a href="' . URL::to("/") . '/admin/dashboard"><span class="glyphicon glyphicon-user"></span> Dashboard</a></li>';
+        else
+            echo '<li><a href="' . URL::to("/") . '/user/profile"><span class="glyphicon glyphicon-user"></span> Profile</a></li>';
+
+        echo '<li class="dropdown ' . $active . '">
+
+                <a href="#" class="dropdown-toggle" data-toggle="dropdown">' . Session::get("username") . ' <span class="caret"></span></a>';
+        echo '<ul class="dropdown-menu" role="menu">';
+
+        echo '<li><a href="' . URL::to('/') . '/logout"><span class="glyphicon glyphicon-log-out"></span> Log out</a></li>';
+        echo    '</ul></li></ul>';
+    }
+    else
+    {
+        echo '<li><a href="' . URL::to('/') . '/create"><span class="glyphicon glyphicon-user"></span> Create account</a></li>';
+        echo '<li><a href="' . URL::to('/') . '/login"><span class="glyphicon glyphicon-log-in"></span> Log in</a></li>';
+        echo '</ul>';
+
+    }
+
+    echo '</div><!-- /.navbar-collapse -->
+    </div><!-- /.container-fluid -->
+    </nav>';
+}
+
+/**
+* Add attributes to the HTTP header.
+*/
+public static function create_http_header()
+{
+   header( 'Cache-Control: no-store, no-cache, must-revalidate' );
+   header( 'Cache-Control: post-check=0, pre-check=0', false );
+   header( 'Pragma: no-cache' );
+}
+
+/**
+ * Open the XML file containing the community token
+ * @param $tokenFilePath
+ * @throws Exception
+ */
+public static function open_tokens_file($tokenFilePath)
+{
+    if (file_exists( $tokenFilePath ))
+    {
+        $tokenFile = simplexml_load_file( $tokenFilePath );
+    }
+    else
+    {
+        throw new Exception('Error: Cannot connect to tokens database!');
+    }
+
+
+    if (!$tokenFile)
+    {
+        throw new Exception('Error: Cannot open tokens database!');
+    }
+}
+
+
+/**
+ * Write the new token to the XML file
+ * @param $tokenId
+ */
+public static function write_new_token($tokenId)
+{    // write new tokenId to tokens file
+    $tokenFile->tokenId = $tokenId;
+
+    //Format XML to save indented tree rather than one line
+    $dom = new DOMDocument('1.0');
+    $dom->preserveWhiteSpace = false;
+    $dom->formatOutput = true;
+    $dom->loadXML( $tokenFile->asXML());
+    $dom->save( $tokenFilePath );
+}
+
+
+//moved from create project view.
+
+public static function create_project()
+{
+    
+    $airavataclient = Session::get("airavataClient");
+    
+    $project = new Project();
+    $project->owner = Session::get('username');
+    $project->name = $_POST['project-name'];
+    $project->description = $_POST['project-description'];
+
+
+    $projectId = null;
+
+    try
+    {
+        $projectId = $airavataclient->createProject( Session::get("gateway_id"), $project);
+
+        if ($projectId)
+        {
+            Utilities::print_success_message("<p>Project {$_POST['project-name']} created!</p>" .
+                '<p>You will be redirected to the summary page shortly, or you can
+                <a href="project/summary?projId=' . $projectId . '">go directly</a> to the project summary page.</p>');
+        }
+        else
+        {
+            Utilities::print_error_message("Error creating project {$_POST['project-name']}!");
+        }
+    }
+    catch (InvalidRequestException $ire)
+    {
+        Utilities::print_error_message('InvalidRequestException!<br><br>' . $ire->getMessage());
+    }
+    catch (AiravataClientException $ace)
+    {
+        Utilities::print_error_message('AiravataClientException!<br><br>' . $ace->getMessage());
+    }
+    catch (AiravataSystemException $ase)
+    {
+        Utilities::print_error_message('AiravataSystemException!<br><br>' . $ase->getMessage());
+    }
+
+    return $projectId;
+}
+
+/**
+ * Get experiments in project
+ * @param $projectId
+ * @return array|null
+ */
+public static function get_experiments_in_project($projectId)
+{
+    $airavataclient = Session::get("airavataClient");
+
+    $experiments = array();
+
+    try
+    {
+        $experiments = $airavataclient->getAllExperimentsInProject($projectId);
+    }
+    catch (InvalidRequestException $ire)
+    {
+        Utilities::print_error_message('InvalidRequestException!<br><br>' . $ire->getMessage());
+    }
+    catch (AiravataClientException $ace)
+    {
+        Utilities::print_error_message('AiravataClientException!<br><br>' . $ace->getMessage());
+    }
+    catch (AiravataSystemException $ase)
+    {
+        Utilities::print_error_message('AiravataSystemException!<br><br>' . $ase->getMessage());
+    }
+    catch (TTransportException $tte)
+    {
+        Utilities::print_error_message('TTransportException!<br><br>' . $tte->getMessage());
+    }
+
+    return $experiments;
+}
+
+public static function update_project($projectId, $projectDetails)
+{
+    $airavataclient = Session::get("airavataClient");
+
+    $updatedProject = new Project();
+    $updatedProject->owner = $projectDetails["owner"];
+    $updatedProject->name = $projectDetails["name"];
+    $updatedProject->description = $projectDetails["description"];
+
+    try
+    {
+        $airavataclient->updateProject($projectId, $updatedProject);
+
+        //Utilities::print_success_message('Project updated! Click <a href="project_summary.php?projId=' . $projectId . '">here</a> to view the project summary.');
+    }
+    catch (InvalidRequestException $ire)
+    {
+        Utilities::print_error_message('InvalidRequestException!<br><br>' . $ire->getMessage());
+    }
+    catch (ProjectNotFoundException $pnfe)
+    {
+        Utilities::print_error_message('ProjectNotFoundException!<br><br>' . $pnfe->getMessage());
+    }
+    catch (AiravataClientException $ace)
+    {
+        Utilities::print_error_message('AiravataClientException!<br><br>' . $ace->getMessage());
+    }
+    catch (AiravataSystemException $ase)
+    {
+        Utilities::print_error_message('AiravataSystemException!<br><br>' . $ase->getMessage());
+    }
+}
+
+
+/**
+ * Create a new experiment from the values submitted in the form
+ * @return null
+ */
+public static function create_experiment()
+{
+    $airavataclient = Session::get("airavataClient");
+
+    $experiment = Utilities::assemble_experiment();
+    $expId = null;
+
+    try
+    {
+        if($experiment)
+        {
+            $expId = $airavataclient->createExperiment( Session::get("gateway_id"), $experiment);
+        }
+
+        if ($expId)
+        {
+            /*
+            Utilities::print_success_message("Experiment {$_POST['experiment-name']} created!" .
+                ' <a href="experiment_summary.php?expId=' . $expId . '">Go to experiment summary page</a>');
+            */
+        }
+        else
+        {
+            Utilities::print_error_message("Error creating experiment {$_POST['experiment-name']}!");
+        }
+    }
+    catch (InvalidRequestException $ire)
+    {
+        Utilities::print_error_message('InvalidRequestException!<br><br>' . $ire->getMessage());
+    }
+    catch (AiravataClientException $ace)
+    {
+        Utilities::print_error_message('AiravataClientException!<br><br>' . $ace->getMessage());
+    }
+    catch (AiravataSystemException $ase)
+    {
+        Utilities::print_error_message('AiravataSystemException!<br><br>' . $ase->getMessage());
+    }
+
+    return $expId;
+}
+
+/*
+ * Required in Experiment Sumamry page.
+ *
+*/
+
+public static function list_output_files($experiment, $expStatus)
+{   
+
+    $expStatusVal = array_search($expStatus, ExperimentState::$__names);
+
+    if($expStatusVal == ExperimentState::COMPLETED )
+    {
+        $utility = new Utilities();
+        $experimentOutputs = $experiment->experimentOutputs;
+
+        foreach ((array)$experimentOutputs as $output)
+        {   
+            if ($output->type == DataType::URI || $output->type == DataType::STDOUT || $output->type == DataType::STDERR )
+            {
+                $explode = explode('/', $output->value);
+                //echo '<p>' . $output->key .  ': <a href="' . $output->value . '">' . $output->value . '</a></p>';
+                $outputPath = str_replace(Utilities::$experimentDataPathAbsolute, Constant::EXPERIMENT_DATA_ROOT, $output->value);
+                $outputPathArray = explode("/", $outputPath);
+
+                echo '<p>' . $output->name  . ' : ' . '<a target="_blank"
+                            href="' . URL::to("/") . "/.." . str_replace(Utilities::$experimentDataPathAbsolute, Constant::EXPERIMENT_DATA_ROOT, $output->value) . '">' . 
+                        $outputPathArray[ sizeof( $outputPathArray) - 1] . ' <span class="glyphicon glyphicon-new-window"></span></a></p>';
+            }
+            elseif ($output->type == DataType::STRING)
+            {
+                echo '<p>' . $output->value . '</p>';
+            }
+        }
+    }
+    else
+        echo "Experiment hasn't completed. Experiment Status is : " . $expStatus;
+}
+
+public static function get_experiment_values( $experiment, $project, $forSearch = false)
+{
+    $airavataclient = Session::get("airavataClient");
+    //var_dump( $experiment); exit;
+    $expVal = array();
+    $expVal["experimentStatusString"] = "";
+    $expVal["experimentTimeOfStateChange"] = "";
+    $expVal["experimentCreationTime"] = "";
+
+    if( $experiment->experimentStatus != null)
+    {
+        $experimentStatus = $experiment->experimentStatus;
+        $experimentState = $experimentStatus->experimentState;
+        $experimentStatusString = ExperimentState::$__names[$experimentState];
+        $expVal["experimentStatusString"] = $experimentStatusString;
+        $expVal["experimentTimeOfStateChange"] = date('Y-m-d H:i:s', $experimentStatus->timeOfStateChange/1000); // divide by 1000 since timeOfStateChange is in ms
+        $expVal["experimentCreationTime"] = date('Y-m-d H:i:s', $experiment->creationTime/1000); // divide by 1000 since creationTime is in ms
+    }
+    $jobStatus = $airavataclient->getJobStatuses($experiment->experimentID);
+
+    if ($jobStatus)
+    {
+        $jobName = array_keys($jobStatus);
+        $jobState = JobState::$__names[$jobStatus[$jobName[0]]->jobState];
+    }
+    else
+    {
+        $jobState = null;
+    }
+
+    $expVal["jobState"] = $jobState;
+    
+    if(! $forSearch)
+    {
+        $userConfigData = $experiment->userConfigurationData;
+        $scheduling = $userConfigData->computationalResourceScheduling;
+        $expVal['scheduling'] = $scheduling;
+        $expVal["computeResource"] = Utilities::get_compute_resource($scheduling->resourceHostId);
+    }
+    $expVal["applicationInterface"] = Utilities::get_application_interface($experiment->applicationId);
+
+
+    switch ($experimentStatusString)
+    {
+        case 'CREATED':
+        case 'VALIDATED':
+        case 'SCHEDULED':
+        case 'CANCELED':
+        case 'FAILED':
+            $expVal["editable"] = true;
+            break;
+        default:
+            $expVal["editable"] = false;
+            break;
+    }
+
+    switch ($experimentStatusString)
+    {
+        case 'CREATED':
+        case 'VALIDATED':
+        case 'SCHEDULED':
+        case 'LAUNCHED':
+        case 'EXECUTING':
+            $expVal["cancelable"] = true;
+            break;
+        default:
+            $expVal["cancelable"] = false;
+            break;
+    }
+
+    return $expVal;
+
+}
+
+public static function get_projsearch_results( $searchKey, $searchValue)
+{
+    $airavataclient = Session::get("airavataClient");;
+
+    $projects = array();
+
+    try
+    {
+        switch ( $searchKey)
+        {
+            case 'project-name':
+                $projects = $airavataclient->searchProjectsByProjectName( Session::get("gateway_id"), Session::get("username"), $searchValue);
+                break;
+            case 'project-description':
+                $projects = $airavataclient->searchProjectsByProjectDesc( Session::get("gateway_id"), Session::get("username"), $searchValue);
+                break;
+        }
+    }
+    catch (InvalidRequestException $ire)
+    {
+        Utilities::print_error_message('InvalidRequestException!<br><br>' . $ire->getMessage());
+    }
+    catch (AiravataClientException $ace)
+    {
+        Utilities::print_error_message('AiravataClientException!<br><br>' . $ace->getMessage());
+    }
+    catch (AiravataSystemException $ase)
+    {
+        if ($ase->airavataErrorType == 2) // 2 = INTERNAL_ERROR
+        {
+            Utilities::print_info_message('<p>You have not created any projects yet, so no results will be returned!</p>
+                                <p>Click <a href="create_project.php">here</a> to create a new project.</p>');
+        }
+        else
+        {
+            Utilities::print_error_message('There was a problem with Airavata. Please try again later, or report a bug using the link in the Help menu.');
+            //print_error_message('AiravataSystemException!<br><br>' . $ase->airavataErrorType . ': ' . $ase->getMessage());
+        }
+    }
+    catch (TTransportException $tte)
+    {
+        Utilities::print_error_message('TTransportException!<br><br>' . $tte->getMessage());
+    }
+
+    return $projects;
+}
+
+
+/**
+ * Create options for the search key select input
+ * @param $values
+ * @param $labels
+ * @param $disabled
+ */
+public static function create_options($values, $labels, $disabled)
+{
+    for ($i = 0; $i < sizeof($values); $i++)
+    {
+        $selected = '';
+
+        // if option was previously selected, mark it as selected
+        if (isset($_POST['search-key']))
+        {
+            if ($values[$i] == $_POST['search-key'])
+            {
+                $selected = 'selected';
+            }
+        }
+
+        echo '<option value="' . $values[$i] . '" ' . $disabled[$i] . ' ' . $selected . '>' . $labels[$i] . '</option>';
+    }
+}
+
+/**
+ * Get results of the user's search of experiments
+ * @return array|null
+ */
+public static function get_expsearch_results( $inputs)
+{
+    $airavataclient = Session::get("airavataClient");
+    $experiments = array();
+
+    try
+    {
+        switch ( $inputs["search-key"])
+        {
+            case 'experiment-name':
+                $experiments = $airavataclient->searchExperimentsByName(Session::get('gateway_id'), Session::get('username'), $inputs["search-value"]);
+                break;
+            case 'experiment-description':
+                $experiments = $airavataclient->searchExperimentsByDesc(Session::get('gateway_id'), Session::get('username'), $inputs["search-value"]);
+                break;
+            case 'application':
+                $experiments = $airavataclient->searchExperimentsByApplication(Session::get('gateway_id'), Session::get('username'), $inputs["search-value"]);
+                break;
+            case 'creation-time':
+                $experiments = $airavataclient->searchExperimentsByCreationTime(Session::get('gateway_id'), Session::get('username'), strtotime( $inputs["from-date"])*1000, strtotime( $inputs["to-date"])*1000 );
+                break;
+            case '':
+        }
+    }
+    catch (InvalidRequestException $ire)
+    {
+        Utilities::print_error_message('InvalidRequestException!<br><br>' . $ire->getMessage());
+    }
+    catch (AiravataClientException $ace)
+    {
+        Utilities::print_error_message('AiravataClientException!<br><br>' . $ace->getMessage());
+    }
+    catch (AiravataSystemException $ase)
+    {
+        if ($ase->airavataErrorType == 2) // 2 = INTERNAL_ERROR
+        {
+            Utilities::print_info_message('<p>You have not created any experiments yet, so no results will be returned!</p>
+                                <p>Click <a href="create_experiment.php">here</a> to create an experiment, or
+                                <a href="create_project.php">here</a> to create a new project.</p>');
+        }
+        else
+        {
+            Utilities::print_error_message('There was a problem with Airavata. Please try again later or report a bug using the link in the Help menu.');
+            //print_error_message('AiravataSystemException!<br><br>' . $ase->airavataErrorType . ': ' . $ase->getMessage());
+        }
+    }
+    catch (TTransportException $tte)
+    {
+        Utilities::print_error_message('TTransportException!<br><br>' . $tte->getMessage());
+    }
+
+    //get values of all experiments
+    $expContainer = array();
+    $expNum = 0;
+    foreach( $experiments as $experiment)
+    {
+        $expValue = Utilities::get_experiment_values( $experiment, Utilities::get_project($experiment->projectID), true );
+        $expContainer[$expNum]['experiment'] = $experiment;
+        if( $expValue["experimentStatusString"] == "FAILED")
+            $expValue["editable"] = false;
+        $expContainer[$expNum]['expValue'] = $expValue;
+        $expNum++;
+    }
+
+    return $expContainer;
+}
+
+public static function getExpStates(){
+    return ExperimentState::$__names;
+}
+
+
+public static function apply_changes_to_experiment($experiment, $input)
+{
+    $experiment->name = $input['experiment-name'];
+    $experiment->description = rtrim($input['experiment-description']);
+    $experiment->projectID = $input['project'];
+    //$experiment->applicationId = $_POST['application'];
+
+    $userConfigDataUpdated = $experiment->userConfigurationData;
+    $schedulingUpdated = $userConfigDataUpdated->computationalResourceScheduling;
+
+    $schedulingUpdated->resourceHostId = $input['compute-resource'];
+    $schedulingUpdated->nodeCount = $input['node-count'];
+    $schedulingUpdated->queueName = $_POST['queue-name'];
+    $schedulingUpdated->totalCPUCount = $input['cpu-count'];
+    //$schedulingUpdated->numberOfThreads = $input['threads'];
+    $schedulingUpdated->wallTimeLimit = $input['wall-time'];
+    //$schedulingUpdated->totalPhysicalMemory = $input['memory'];
+
+    /*
+    switch ($_POST['compute-resource'])
+    {
+        case 'trestles.sdsc.edu':
+            $schedulingUpdated->ComputationalProjectAccount = 'sds128';
+            break;
+        case 'stampede.tacc.xsede.org':
+        case 'lonestar.tacc.utexas.edu':
+            $schedulingUpdated->ComputationalProjectAccount = 'TG-STA110014S';
+            break;
+        default:
+            $schedulingUpdated->ComputationalProjectAccount = 'admin';
+    }
+    */
+
+    $userConfigDataUpdated->computationalResourceScheduling = $schedulingUpdated;
+    if( isset( $input["userDN"]) )
+        $userConfigDataUpdated->userDN = $input["userDN"];
+
+    $experiment->userConfigurationData = $userConfigDataUpdated;
+
+    $applicationInputs = Utilities::get_application_inputs($experiment->applicationId);
+
+    $experimentInputs = $experiment->experimentInputs; // get current inputs
+    //var_dump($experimentInputs);
+    $experimentInputs = Utilities::process_inputs($applicationInputs, $experimentInputs); // get new inputs
+    //var_dump($experimentInputs);
+
+    if ($experimentInputs)
+    {
+        $experiment->experimentInputs = $experimentInputs;
+        //var_dump($experiment);
+        return $experiment;
+    }
+}
+
+public static function read_config( $fileName = null){
+    $wsis_config = null;
+
+    if( $fileName == null)
+        $fileName = "app_config.ini";
+    try {
+        if (file_exists( app_path() . "/config/" . $fileName ) ) {
+
+            try
+            {
+                $wsis_config = parse_ini_file( app_path() . "/config/" . $fileName );
+            }
+
+            catch( \Exception $e)
+            {
+                print_r( $e); exit;
+            }
+        } 
+        else 
+        {
+            throw new Exception("Error: Cannot open file!");
+        }
+
+        if (!$wsis_config) 
+        {
+            throw new Exception('Error: Unable to read the file!');
+        }
+    }catch (Exception $e) {
+        throw new Exception('Unable to instantiate the client. Try editing the file.', 0, NULL);
+    }
+    return $wsis_config;
+
+}
+
+public static function get_job_details( $experimentId){
+    $airavataclient = Session::get("airavataClient");
+    return $airavataclient->getJobDetails( $experimentId);
+}
+
+public static function get_transfer_details( $experimentId){
+    $airavataclient = Session::get("airavataClient");
+    return $airavataclient->getDataTransferDetails( $experimentId);
+}
+
+}
+
+?>

http://git-wip-us.apache.org/repos/asf/airavata-php-gateway/blob/01413d65/app/libraries/wsis_config.ini
----------------------------------------------------------------------
diff --git a/app/libraries/wsis_config.ini b/app/libraries/wsis_config.ini
new file mode 100755
index 0000000..6afe638
--- /dev/null
+++ b/app/libraries/wsis_config.ini
@@ -0,0 +1,27 @@
+;Tenant admin's username
+;admin-username = "test@testphprg.scigap.org"
+;Super Tenant Admin's username
+admin-username = "scigap_admin"
+
+;Tenant admin's password
+;admin-password = "testadmin@scigap.org"
+;Super Tenant Admin's username
+admin-password = "sci9067@min"
+
+;Identity server domain
+server = "idp.scigap.org"
+
+;Identity server web services endpoint
+service-url = "https://idp.scigap.org:7443/services/"
+
+;Gateway Domain Name 
+gateway-id = "airavata.org"
+
+;Path the to server certificate file
+cafile-path = "/resources/security/idp_scigap_org.pem"
+
+;Enable HTTPS server verification
+verify-peer = true
+
+;Allow self signed server certificates
+allow-self-signed = false
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/airavata-php-gateway/blob/01413d65/app/libraries/wsis_utilities.php
----------------------------------------------------------------------
diff --git a/app/libraries/wsis_utilities.php b/app/libraries/wsis_utilities.php
new file mode 100755
index 0000000..fbf90f8
--- /dev/null
+++ b/app/libraries/wsis_utilities.php
@@ -0,0 +1,364 @@
+<?php
+
+require_once 'id_utilities.php';
+require_once 'WSISClient.php';
+
+//$GLOBALS['WSIS_ROOT'] = './lib/WSIS/';
+//require_once $GLOBALS['WSIS_ROOT'] . 'WSISClient.php';
+
+/**
+ * Utilities for ID management with a WSO2 IS 4.6.0
+ */
+
+class WSISUtilities implements IdUtilities{
+    /**
+     * wso2 IS client
+     * 
+     * @var WSISClient
+     * @access private
+     */
+    private $wsis_client;
+
+    /**
+     * Connect to the identity store.
+     * @return mixed|void
+     */
+    public function connect() { 
+   
+        $wsis_config = Utilities::read_config();    
+        if(substr($wsis_config['service-url'], -1) !== "/"){
+            $wsis_config['service-url'] = $wsis_config['service-url'] . "/";
+        }
+        
+        if(!substr($wsis_config['cafile-path'], 0) !== "/"){
+            $wsis_config['cafile-path'] = "/" . $wsis_config['cafile-path'];
+        }
+        $wsis_config['cafile-path'] = app_path() . $wsis_config['cafile-path'];            
+        
+        /*
+        if( Session::has("username"))
+        {
+            $username = Session::get("username");
+            $password = Session::get("password");
+        }
+        else
+        {
+            $username = $_POST["username"];
+            $password = $_POST["password"];
+        }
+        */
+        $username = $wsis_config['admin-username'];
+        $password = $wsis_config['admin-password'];
+        
+        $this->wsis_client = new WSISClient(
+                $username,
+                $password,
+                $wsis_config['server'],
+                $wsis_config['service-url'],
+                $wsis_config['cafile-path'],
+                $wsis_config['verify-peer'],
+                $wsis_config['allow-self-signed']
+        );    
+    }
+
+    /**
+     * Return true if the given username exists in the identity server.
+     * @param $username
+     * @return bool
+     */
+    public function username_exists($username) {
+        try{
+            //$this->wsis_client = new WSISClient( $username);
+            return $this->wsis_client->username_exists($username);
+        } catch (Exception $ex) {
+            print_r( $ex);
+            throw new Exception("Unable to check whether username exists", 0, NULL);
+        }
+        
+    }
+
+    /**
+     * authenticate a given user
+     * @param $username
+     * @param $password
+     * @return boolean
+     */
+    public function authenticate($username, $password) {
+        try{
+            return $this->wsis_client->authenticate($username, $password);
+        } catch (Exception $ex) {
+            var_dump( $ex);
+            throw new Exception("Unable to authenticate user", 0, NULL);
+        }        
+    }
+
+    /**
+     * Add a new user to the identity server.
+     * @param $username
+     * @param $password
+     * @return void
+     */
+    public function add_user($username, $password, $first_name, $last_name, $email, $organization,
+            $address, $country,$telephone, $mobile, $im, $url) {
+        try{
+            $this->wsis_client->addUser($username, $password, $first_name . " " . $last_name);
+        } catch (Exception $ex) {
+            var_dump($ex);
+            throw new Exception("Unable to add new user", 0, NULL);
+        }        
+    }
+
+    /**
+     * Get the user profile
+     * @param $username
+     * @return mixed|void
+     */
+    public function get_user_profile($username)
+    {
+        // TODO: Implement get_user_profile() method.
+    }
+
+    /**
+     * Update the user profile
+     *
+     * @param $username
+     * @param $first_name
+     * @param $last_name
+     * @param $email
+     * @param $organization
+     * @param $address
+     * @param $country
+     * @param $telephone
+     * @param $mobile
+     * @param $im
+     * @param $url
+     * @return mixed
+     */
+    public function update_user_profile($username, $first_name, $last_name, $email, $organization, $address,
+                                        $country, $telephone, $mobile, $im, $url)
+    {
+        // TODO: Implement update_user_profile() method.
+    }
+
+    /**
+     * Function to update user password
+     *
+     * @param $username
+     * @param $current_password
+     * @param $new_password
+     * @return mixed
+     */
+    public function change_password($username, $current_password, $new_password)
+    {
+        // TODO: Implement change_password() method.
+    }
+
+    /**
+     * Function to remove an existing user
+     *
+     * @param $username
+     * @return void
+     */
+    public function remove_user($username)
+    {
+        // TODO: Implement remove_user() method.
+    }
+
+    /**
+     * Function to check whether a user has permission for a particular permission string(api method).
+     *
+     * @param $username
+     * @param $permission_string
+     * @return bool
+     */
+    public function checkPermissionForUser($username, $permission_string)
+    {
+        // TODO: Implement checkPermissionForUser() method.
+    }
+
+    /**
+     * Function to get all the permissions that a particular user has.
+     *
+     * @param $username
+     * @return mixed
+     */
+    public function getUserPermissions($username)
+    {
+        // TODO: Implement getUserPermissions() method.
+    }
+
+    /**
+     * Function to check whether a role is existing 
+     *
+     * @param string $roleName 
+     * @return IsExistingRoleResponse
+     */
+    public function isExistingRole( $roleName){
+        try{
+            return $this->wsis_client->is_existing_role( $roleName);
+        } catch (Exception $ex) {
+            var_dump($ex);
+            throw new Exception("Unable to check if role exists.", 0, $ex);
+        }    
+    }
+
+    /**
+     * Function to add new role by providing the role name.
+     * 
+     * @param string $roleName
+     */
+    public function addRole($roleName){
+        try{
+            return $this->wsis_client->add_role( $roleName);
+        } catch (Exception $ex) {
+            var_dump( $ex);
+            throw new Exception("Unable to add role.", 0, $ex);
+        }        
+    }
+
+    /**
+     * Function to delete existing role
+     * 
+     * @param string $roleName
+     * @return void
+     * @throws Exception
+     */
+    public function deleteRole($roleName) {
+        try {
+            $this->wsis_client->delete_role($roleName);
+        } catch (Exception $ex) {
+            throw new Exception("Unable to delete role", 0, $ex);
+        }
+    }
+
+    /**
+     * Function to get the entire list of roles in the application
+     *
+     * @return mixed
+     */
+    public function getRoleNames()
+    {
+        try{
+            return $this->wsis_client->get_all_roles();
+        } catch (Exception $ex) {
+            var_dump($ex);
+            throw new Exception("Unable to get roles.", 0, NULL);
+        }        
+    }
+
+    /**
+     * Function to get the role list of a user
+     *
+     * @param $username
+     * @return mixed
+     */
+    public function getRoleListOfUser($username)
+    {
+        try{
+            return $this->wsis_client->get_user_roles( $username);
+        } catch (Exception $ex) {
+            var_dump($ex);
+            throw new Exception("Unable to get roles.", 0, NULL);
+        }  
+    }
+
+    /**
+     * Function to get the user list of a particular role
+     *
+     * @param $role
+     * @return mixed
+     */
+    public function getUserListOfRole($role)
+    {
+        try{
+            return $this->wsis_client->get_userlist_of_role( $role);
+        } catch (Exception $ex) {
+            var_dump( $ex); exit;
+            throw new Exception("Unable to get users.", 0, NULL);
+        }
+    }
+
+    /**
+     * Function to add a role to a user
+     *
+     * @param $username
+     * @param $role
+     * @return void
+     */
+    public function addUserToRole($username, $role)
+    {
+        // TODO: Implement addUserToRole() method.
+    }
+
+    /**
+     * Function to role from user
+     *
+     * @param $username
+     * @param $role
+     * @return void
+     */
+
+    /**
+     * Function to update role list of user 
+     *
+     * @param UpdateRoleListOfUser $parameters
+     * @return void
+     */
+    public function updateRoleListOfUser($username, $roles)
+    {
+        try{
+            return $this->wsis_client->update_user_roles( $username, $roles);
+        } catch (Exception $ex) {
+            var_dump($ex); exit;
+            throw new Exception("Unable to update User roles.", 0, NULL);
+        }  
+    }
+    public function removeUserFromRole($username, $role)
+    {
+        // TODO: Implement removeUserFromRole() method.
+    }
+
+    /**
+     * Function to list users
+     *
+     * @param void
+     * @return void
+     */
+    public function listUsers(){
+        try {
+            return $this->wsis_client->list_users();
+        } catch (Exception $ex) {
+    
+            throw new Exception( "Unable to list users", 0, $ex);
+        }
+    }
+
+    /**
+     * Function to get the tenant id
+     *
+     * @param GetTenantId $parameters
+     * @return GetTenantIdResponse
+     */
+    public function getTenantId(){
+        try {
+            return $this->wsis_client->get_tenant_id();
+        } catch (Exception $ex) {
+            var_dump( $ex->debug_message); 
+            throw new Exception("Unable to get the Tenant Id.", 0, $ex);
+        }
+    }
+    /**
+    * Function create a new Tenant
+    *
+    * @param Tenant $parameters
+    * @return void
+    */
+    public function createTenant( $inputs){
+        try {
+            return $this->wsis_client->create_tenant( $inputs);
+        } catch (Exception $ex) {
+            var_dump( $ex); 
+            //throw new Exception("Unable to create Tenant.", 0, $ex);
+        }
+    }
+}