<?php

use Airavata\API\Error\AuthorizationException;
use Airavata\API\Error\ExperimentNotFoundException;
use Airavata\Model\Status\JobState;

class ExperimentController extends BaseController
{

    /**
     * Limit used in fetching paginated results
     * @var int
     */
    var $limit = 20;

    /**
     *    Instantiate a new ExperimentController Instance
     **/

    public function __construct()
    {
        $this->beforeFilter('verifylogin');
        $this->beforeFilter('verifyauthorizeduser');
        Session::put("nav-active", "experiment");
    }

    public function createView()
    {
        Session::forget('exp_create_app_id');
        Session::forget('exp_create_continue');
        return View::make('experiment/create');
    }

    public function createSubmit()
    {
        if (isset($_POST['continue'])) {
            Session::put('exp_create_continue', true);
            $appInterfaces = AppUtilities::get_all_applications();
            foreach($appInterfaces as $id=>$name){
                if($id == $_POST['application']){
                    Session::put('exp_create_app_id', AppUtilities::get_application_interface($id)->applicationModules[0]);
                }
            }

            $computeResources = CRUtilities::create_compute_resources_select($_POST['application'], null);

            $nodeCount = Config::get('pga_config.airavata')["node-count"];
            $cpuCount = Config::get('pga_config.airavata')["total-cpu-count"];
            $wallTimeLimit = Config::get('pga_config.airavata')["wall-time-limit"];

            $queueDefaults = array("queueName" => Config::get('pga_config.airavata')["queue-name"],
                "nodeCount" => $nodeCount,
                "cpuCount" => $cpuCount,
                "wallTimeLimit" => $wallTimeLimit
            );

            $experimentInputs = array(
                "disabled" => ' disabled',
                "experimentName" => $_POST['experiment-name'],
                "experimentDescription" => $_POST['experiment-description'] . ' ',
                "project" => $_POST['project'],
                "application" => $_POST['application'],
                "echo" => ($_POST['application'] == 'Echo') ? ' selected' : '',
                "wrf" => ($_POST['application'] == 'WRF') ? ' selected' : '',
                "queueDefaults" => $queueDefaults,
                "advancedOptions" => Config::get('pga_config.airavata')["advanced-experiment-options"],
                "computeResources" => $computeResources,
                "resourceHostId" => null,
                "advancedOptions" => Config::get('pga_config.airavata')["advanced-experiment-options"],
                "allowedFileSize" => $this->getAllowedFileSize()
            );

            if(Config::get('pga_config.airavata')["data-sharing-enabled"]){
                $users = SharingUtilities::getProfilesForSharedUsers($_POST['project']);
                $owner = array();

                $projectOwner = array();
                $sharedProjectOwner = SharingUtilities::getSharedResourceOwner($_POST['project']);
                if (Session::get("username") !== $sharedProjectOwner) {
                    $projectOwner[$sharedProjectOwner] = $users[$sharedProjectOwner];
                    $users = array_diff_key($users, $projectOwner);
                }

                return View::make("experiment/create-complete", array("expInputs" => $experimentInputs,
                    "users" => json_encode($users), "owner" => json_encode($owner),
                    "canEditSharing" => true,
                    "projectOwner" => json_encode($projectOwner),
                    "updateSharingViaAjax" => false));
            }else{
                return View::make("experiment/no-sharing-create-complete", array("expInputs" => $experimentInputs));
            }

        } else if (isset($_POST['save']) || isset($_POST['launch'])) {
            try {
                $computeResourceId = Input::get("compute-resource");
                //Validate entered queue details
                $queueValues = array("queueName" => Input::get("queue-name"),
                    "nodeCount" => Input::get("node-count"),
                    "cpuCount" => Input::get("cpu-count"),
                    "wallTimeLimit" => Input::get("walltime-count")
                );
                if($this->validateQueueData($computeResourceId, $queueValues))
                    $expId = ExperimentUtilities::create_experiment();
                else
                    return Redirect::to("experiment/create")->with("error-message", "Validate the number of nodes, CPUs and the wall time limit");
            } catch (Exception $ex) {
                Log::error("Failed to create experiment!");
                Log::error($ex);
                return Redirect::to("experiment/create")->with("error-message", "Failed to create experiment: " . $ex->getMessage());
            }

            if (isset($_POST['launch']) && $expId) {
                ExperimentUtilities::launch_experiment($expId);
            }
            /* Not required.
            else
            {
                CommonUtilities::print_success_message("<p>Experiment {$_POST['experiment-name']} created!</p>" .
                    '<p>You will be redirected to the summary page shortly, or you can
                    <a href=' . URL::to('/') . '"/experiment/summary?expId=' . $expId . '">go directly</a> to experiment summary page.</p>');

            }*/
            return Redirect::to('experiment/summary?expId=' . urlencode($expId));
        } else
            return Redirect::to("home")->with("message", "Something went wrong here. Please file a bug report using the link in the Help menu.");
    }

    public function summary()
    {
        $experiment = null;
        try {
            $experiment = ExperimentUtilities::get_experiment($_GET['expId']);
        } catch (ExperimentNotFoundException $enf) {

            Log::error("Experiment wasn't found", array("message" => $enf->getMessage(), "username" => Session::get("username"), "gateway_id" => Session::get("gateway_id")));
            return $this->makeInvalidExperimentView();
        } catch (AuthorizationException $ae) {

            Log::error("User isn't authorized to see experiment", array("message" => $ae->getMessage(), "username" => Session::get("username"), "gateway_id" => Session::get("gateway_id")));
            return $this->makeInvalidExperimentView();
        }
        // Assume that experiment is not null now

        if(isset($_GET['isAutoRefresh']) && $_GET['isAutoRefresh'] == 'true'){
            $autoRefresh = true;
        }else{
            $autoRefresh = false;
        }
        //viewing experiments of other gateways is not allowed if user is not super admin
        if( $experiment->gatewayId != Session::get("gateway_id") && !Session::has("super-admin")){
            Session::put("permissionDenied", true);
            CommonUtilities::print_error_message('It seems that you do not have permissions to view this experiment or it belongs to another gateway.');
            if (Input::has("dashboard"))
                return View::make("partials/experiment-info", array("invalidExperimentId" => 1, "users" => json_encode(array())));
            else
                return View::make("experiment/summary", array("invalidExperimentId" => 1, "users" => json_encode(array())));
        }
        else
            Session::forget("permissionDenied");


        $project = null;
        if(Config::get('pga_config.airavata')["data-sharing-enabled"]){
            if (SharingUtilities::userCanRead(Session::get("username"), $experiment->projectId)) {
                $project = ProjectUtilities::get_project($experiment->projectId);
            }
        } elseif ($experiment->userName == Session::get("username")){
            // When sharing is disabled the backend checks the auth token claims map
            // to make sure the authenticating user is the same as the project
            // owner. So the project can only be loaded when the user is the
            // project owner, which can be inferred from the experiment's owner.
            $project = ProjectUtilities::get_project($experiment->projectId);
        }
        $expVal = ExperimentUtilities::get_experiment_values($experiment);
        $jobDetails = ExperimentUtilities::get_job_details($experiment->experimentId);
//            var_dump( $jobDetails); exit;
        foreach( $jobDetails as $index => $jobDetail){
            if(isset($jobDetail->jobStatuses) and !empty($jobDetail->jobStatuses)){
                  ExperimentUtilities::latestStatus($jobDetails[$index]->jobStatuses)->jobStateName = JobState::$__names[ExperimentUtilities::latestStatus($jobDetail->jobStatuses)->jobState];
            }
            else{
                $jobDetails[ $index]->jobStatuses = [new stdClass()];
                $jobDetails[ $index]->jobStatuses[0]->jobStateName = null;
            }
        }
        $expVal["jobDetails"] = $jobDetails;

        $writeableProjects = ProjectUtilities::get_all_user_writeable_projects(Session::get("gateway_id"), Session::get("username"));

        $data = array(
            "expId" => Input::get("expId"),
            "experiment" => $experiment,
            "project" => $project,
            "jobDetails" => $jobDetails,
            "expVal" => $expVal,
            "autoRefresh"=> $autoRefresh,
            "writeableProjects" => $writeableProjects
        );
        if(Config::get('pga_config.airavata')["data-sharing-enabled"]){
            $users = SharingUtilities::getProfilesForSharedUsers(Input::get("expId"));
            $sharedExperimentOwner = SharingUtilities::getSharedResourceOwner($experiment->experimentId);
            $sharedProjectOwner = SharingUtilities::getSharedResourceOwner($experiment->projectId);

            $owner = array();
            $projectOwner = array();
            if (Session::get("username") !== $sharedExperimentOwner) {
                $owner[$sharedExperimentOwner] = $users[$sharedExperimentOwner];
            }
            if (Session::get("username") !== $sharedProjectOwner) {
                $projectOwner[$sharedProjectOwner] = $users[$sharedProjectOwner];
            }
            // Subtract out the owner and project owner from list of users
            $users = array_diff_key($users, $owner);
            $users = array_diff_key($users, $projectOwner);
            // If project owner is the same as owner, just show the owner, not the project owner
            $projectOwner = array_diff_key($projectOwner, $owner);
            // Only allow editing sharing on the summary page if the owner
            // and the experiment isn't editable. If the experiment is
            // editable, the sharing can be edited on the edit page.
            $canEditSharing = (Session::get("username") === $sharedExperimentOwner) && !$expVal["editable"];
            $data['can_write'] = SharingUtilities::userCanWrite(Session::get("username"), $experiment->experimentId);
            $data["users"] = json_encode($users);
            $data["owner"] = json_encode($owner);
            $data["projectOwner"] = json_encode($projectOwner);
            $data["canEditSharing"] = $canEditSharing;
            // The summary page has it's own Update Sharing button
            $data["updateSharingViaAjax"] = true;
        }

        if( Input::has("dashboard"))
        {
            $detailedExperiment = ExperimentUtilities::get_detailed_experiment( $_GET['expId']);
            $data["detailedExperiment"] = $detailedExperiment;
        }

        if (Request::ajax()) {
            //admin wants to see an experiment summary
            if (Input::has("dashboard")) {
                $data["dashboard"] = true;
                return View::make("partials/experiment-info", $data);
            } else
                return json_encode($data);
        } else {
            return View::make("experiment/summary", $data);
        }
    }

    private function makeInvalidExperimentView() {

        if (Input::has("dashboard"))
            return View::make("partials/experiment-info", array("invalidExperimentId" => 1));
        else
            return View::make("experiment/summary", array("invalidExperimentId" => 1));
    }

    public function expChange()
    {
        //var_dump( Input::all() ); exit;
        $experiment = ExperimentUtilities::get_experiment(Input::get('expId'));
        $expVal = ExperimentUtilities::get_experiment_values($experiment);
        $expVal["jobState"] = ExperimentUtilities::get_job_status($experiment);
        /*if (isset($_POST['save']))
        {
            $updatedExperiment = CommonUtilities::apply_changes_to_experiment($experiment);

            CommonUtilities::update_experiment($experiment->experimentId, $updatedExperiment);
        }*/
        if (isset($_POST['launch'])) {
            ExperimentUtilities::launch_experiment($experiment->experimentId);
            return Redirect::to('experiment/summary?expId=' . urlencode($experiment->experimentId));
        } elseif (isset($_POST['cancel'])) {
            ExperimentUtilities::cancel_experiment($experiment->experimentId);
            return Redirect::to('experiment/summary?expId=' . urlencode($experiment->experimentId));
        } elseif (isset($_POST['update-sharing'])) {
            if(Config::get('pga_config.airavata')["data-sharing-enabled"]){
                $share = $_POST['share-settings'];
                ExperimentUtilities::update_experiment_sharing($experiment->experimentId, json_decode($share));
            }
            return Redirect::to('experiment/summary?expId=' . urlencode($experiment->experimentId));
        }
    }

    public function editView()
    {
        $experiment = ExperimentUtilities::get_experiment($_GET['expId']);
        $expVal = ExperimentUtilities::get_experiment_values($experiment);
        $expVal["jobState"] = ExperimentUtilities::get_job_status($experiment);


        $appInterfaces = AppUtilities::get_all_applications();
        foreach($appInterfaces as $id=>$name) {
            if ($id == $experiment->executionId) {
                $appId = AppUtilities::get_application_interface($id)->applicationModules[0];
            }
        }

        $nodeCount = Config::get('pga_config.airavata')["node-count"];
        $cpuCount = Config::get('pga_config.airavata')["total-cpu-count"];
        $wallTimeLimit = Config::get('pga_config.airavata')["wall-time-limit"];
        $cpusPerNode = 0;

        $queueDefaults = array("queueName" => Config::get('pga_config.airavata')["queue-name"],
            "nodeCount" => $nodeCount,
            "cpuCount" => $cpuCount,
            "wallTimeLimit" => $wallTimeLimit,
            "cpusPerNode" => $cpusPerNode
        );

        $computeResourceId = $experiment->userConfigurationData->computationalResourceScheduling->resourceHostId;
        $appDeployments = Airavata::getAllApplicationDeployments(Session::get('authz-token'), Session::get("gateway_id"));
        $correctAppDeployment = null;
        foreach($appDeployments as $appDeployment){
            if($appDeployment->computeHostId == $computeResourceId && $appDeployment->appModuleId == $appId){
                $correctAppDeployment = $appDeployment;
                break;
            }
        }

        $appDeploymentDefaults = array();
        if($correctAppDeployment != null){
            $appDeploymentDefaults['nodeCount'] = $correctAppDeployment->defaultNodeCount;
            $appDeploymentDefaults['cpuCount'] = $correctAppDeployment->defaultCPUCount;
            $appDeploymentDefaults['wallTimeLimit'] = $wallTimeLimit;
            $appDeploymentDefaults['queueName'] = $correctAppDeployment->defaultQueueName;
        }

        $computeResources = CRUtilities::create_compute_resources_select($experiment->executionId, $expVal['scheduling']->resourceHostId);

        $userComputeResourcePreferences = URPUtilities::get_all_validated_user_compute_resource_prefs();
        $userHasComputeResourcePreference = array_key_exists($expVal['scheduling']->resourceHostId, $userComputeResourcePreferences);
        $batchQueues = ExperimentUtilities::getQueueDatafromResourceId($computeResourceId);

        $experimentInputs = array(
            "disabled" => ' ',
            "experimentName" => $experiment->experimentName,
            "experimentDescription" => $experiment->description,
            "application" => $experiment->executionId,
            "autoSchedule" => $experiment->userConfigurationData->airavataAutoSchedule,
            "userDN" => $experiment->userConfigurationData->userDN,
            "userHasComputeResourcePreference" => $userHasComputeResourcePreference,
            "useUserCRPref" => $experiment->userConfigurationData->useUserCRPref,
            "allowedFileSize" => $this->getAllowedFileSize(),
            'experiment' => $experiment,
            "queueDefaults" => $queueDefaults,
            'computeResources' => $computeResources,
            "resourceHostId" => $expVal['scheduling']->resourceHostId,
            'project' => $experiment->projectId,
            'expVal' => $expVal,
            'cloning' => true,
            'advancedOptions' => Config::get('pga_config.airavata')["advanced-experiment-options"],
            'batchQueues' => $batchQueues
        );

        if(Config::get('pga_config.airavata')["data-sharing-enabled"]){
            if (SharingUtilities::userCanWrite(Session::get("username"), $_GET['expId']) === true) {
                $users = SharingUtilities::getProfilesForSharedUsers($_GET['expId']);
                $sharedExperimentOwner = SharingUtilities::getSharedResourceOwner($experiment->experimentId);
                $sharedProjectOwner = SharingUtilities::getSharedResourceOwner($experiment->projectId);

                $owner = array();
                $projectOwner = array();
                if (Session::get("username") !==  $sharedExperimentOwner) {
                    $owner[$sharedExperimentOwner] = $users[$sharedExperimentOwner];
                }
                if (Session::get("username") !== $sharedProjectOwner) {
                    $projectOwner[$sharedProjectOwner] = $users[$sharedProjectOwner];
                }
                // Subtract out owner and project owner from list of users
                $users = array_diff_key($users, $owner);
                $users = array_diff_key($users, $projectOwner);
                // If project owner is the same as owner, just show the owner, not the project owner
                $projectOwner = array_diff_key($projectOwner, $owner);

                $canEditSharing = Session::get("username") === $sharedExperimentOwner;

                return View::make("experiment/edit", array("expInputs" => $experimentInputs,
                    "users" => json_encode($users), "owner" => json_encode($owner),
                    "canEditSharing" => $canEditSharing,
                    "projectOwner" => json_encode($projectOwner),
                    "updateSharingViaAjax" => false,
                    "cpusPerNode" => $cpusPerNode,
                    "appDeploymentDefaults" => $appDeploymentDefaults,
                    "queueDefaults" => $queueDefaults
                ));
            }
            else {
                Redirect::to("experiment/summary?expId=" . urlencode($experiment->experimentId))->with("error", "You do not have permission to edit this experiment");
            }
        }else {
            return View::make("experiment/no-sharing-edit", array("expInputs" => $experimentInputs));
        }
    }

    public function cloneExperiment()
    {
        try{
            $cloneId = ExperimentUtilities::clone_experiment(Input::get('expId'), Input::get('projectId'));
            return Redirect::to('experiment/edit?expId=' . urlencode($cloneId));
        }catch (Exception $ex){
            return Redirect::to("experiment/summary?expId=" . urlencode(Input::get('expId')))
                ->with("cloning-error", "Failed to clone experiment: " . $ex->getMessage());
        }
    }

    public function editSubmit()
    {
        $experiment = ExperimentUtilities::get_experiment(Input::get('expId')); // update local experiment variable
        try {
            $computeResourceId = Input::get("compute-resource");
            //Validate entered queue details
            $queueValues = array("queueName" => Input::get("queue-name"),
                "nodeCount" => Input::get("node-count"),
                "cpuCount" => Input::get("cpu-count"),
                "wallTimeLimit" => Input::get("walltime-count")
            );
            if($this->validateQueueData($computeResourceId, $queueValues)) {
                $updatedExperiment = ExperimentUtilities::apply_changes_to_experiment($experiment, Input::all());
            } else {
                $errMessage = "Validate the number of nodes, CPUs and the wall time limit";
                return Redirect::to("experiment/edit?expId=" . urlencode(Input::get('expId')))->with("error-message", $errMessage);
            }
        } catch (Exception $ex) {
            $errMessage = "Failed to update experiment: " . $ex->getMessage();
            Log::error($errMessage);
            Log::error($ex);
            return Redirect::to("experiment/edit?expId=" . urlencode(Input::get('expId')))->with("error-message", $errMessage);
        }

        if(Config::get('pga_config.airavata')["data-sharing-enabled"]){
            if (SharingUtilities::userCanWrite(Session::get("username"), Input::get('expId'))) {
                if (isset($_POST['save']) || isset($_POST['launch'])) {

                    ExperimentUtilities::update_experiment($experiment->experimentId, $updatedExperiment);

                    if (isset($_POST['save'])) {
                        $experiment = ExperimentUtilities::get_experiment(Input::get('expId')); // update local experiment variable
                    }
                    if (isset($_POST['launch'])) {
                        ExperimentUtilities::launch_experiment($experiment->experimentId);
                    }

                    return Redirect::to('experiment/summary?expId=' . urlencode($experiment->experimentId));
                } else
                    return View::make("home");
            }
        }else{
            if (isset($_POST['save']) || isset($_POST['launch'])) {

                ExperimentUtilities::update_experiment($experiment->experimentId, $updatedExperiment);

                if (isset($_POST['save'])) {
                    $experiment = ExperimentUtilities::get_experiment(Input::get('expId')); // update local experiment variable
                }
                if (isset($_POST['launch'])) {
                    ExperimentUtilities::launch_experiment($experiment->experimentId);
                }

                return Redirect::to('experiment/summary?expId=' . urlencode($experiment->experimentId));
            } else
                return View::make("home");
        }
    }

    public function getQueueView()
    {
        $appId = Session::get('exp_create_app_id');
        $computeResourceId = Input::get("crId");
        $appDeployments = Airavata::getAllApplicationDeployments(Session::get('authz-token'), Session::get("gateway_id"));

        $nodeCount = Config::get('pga_config.airavata')["node-count"];
        $cpuCount = Config::get('pga_config.airavata')["total-cpu-count"];
        $wallTimeLimit = Config::get('pga_config.airavata')["wall-time-limit"];
        $cpusPerNode = 0;
        $queueName = Config::get('pga_config.airavata')["queue-name"];

        $queueDefaults = array("queueName" => $queueName,
            "nodeCount" => $nodeCount,
            "cpuCount" => $cpuCount,
            "wallTimeLimit" => $wallTimeLimit,
            "cpusPerNode" => $cpusPerNode
        );

        $queues = ExperimentUtilities::getQueueDatafromResourceId($computeResourceId);
        $userComputeResourcePreferences = URPUtilities::get_all_validated_user_compute_resource_prefs();
        $userHasComputeResourcePreference = array_key_exists($computeResourceId, $userComputeResourcePreferences);
        if ($userHasComputeResourcePreference)
        {
            $queueDefaults['queueName'] = $userComputeResourcePreferences[$computeResourceId]->preferredBatchQueue;
        }else{
            foreach($queues as $aQueue){
                if($aQueue->isDefaultQueue){
                    $queueDefaults['queueName'] = $aQueue->queueName;
                    break;
                }
            }
        }

        $correctAppDeployment = null;
        foreach($appDeployments as $appDeployment){
            if($appDeployment->computeHostId == $computeResourceId && $appDeployment->appModuleId == $appId){
                $correctAppDeployment = $appDeployment;
                break;
            }
        }

        $appDeploymentDefaults = array();
        if($correctAppDeployment != null){
            $appDeploymentDefaults['nodeCount'] = $correctAppDeployment->defaultNodeCount;
            $appDeploymentDefaults['cpuCount'] = $correctAppDeployment->defaultCPUCount;
            $appDeploymentDefaults['queueName'] = $correctAppDeployment->defaultQueueName;
        }

        return View::make("partials/experiment-queue-block", array("queues" => $queues,
            "queueDefaults" => $queueDefaults,
            "appDeploymentDefaults" => $appDeploymentDefaults,
            "useUserCRPref" => $userHasComputeResourcePreference,
            "userHasComputeResourcePreference" => $userHasComputeResourcePreference,
            "cpusPerNode" => $cpusPerNode));
    }

    public function browseView()
    {
        $pageNo = Input::get('pageNo');
        $prev = Input::get('prev');
        $isSearch = Input::get('search');
        if (empty($pageNo) || isset($isSearch) ) {
            $pageNo = 1;
        } else {
            if (isset($prev)) {
                $pageNo -= 1;
            } else {
                $pageNo += 1;
            }
        }

        $expContainer = ExperimentUtilities::get_expsearch_results_with_pagination(Input::all(), $this->limit,
            ($pageNo - 1) * $this->limit);
        $experimentStates = ExperimentUtilities::getExpStates();

        $can_write = array();
        foreach ($expContainer as $experiment) {
            if(Config::get('pga_config.airavata')["data-sharing-enabled"]){
                $can_write[$experiment['experiment']->experimentId] = SharingUtilities::userCanWrite(Session::get("username"),
                    $experiment['experiment']->experimentId);
            } else {
                $can_write[$experiment['experiment']->experimentId] = true;
            }
        }

        return View::make('experiment/browse', array(
            'input' => Input::all(),
            'pageNo' => $pageNo,
            'limit' => $this->limit,
            'expStates' => $experimentStates,
            'expContainer' => $expContainer,
            'can_write' => $can_write
        ));
    }

    /**
     * Generate JSON containing permissions information for this project.
     *
     * This function retrieves the user profile and permissions for every user
     * other than the client that has access to the project. In the event that
     * the project does not exist, return an error message.
     */
    public function sharedUsers()
    {
        if (Session::has("authz-token") && array_key_exists('resourceId', $_GET)) {
            return Response::json(SharingUtilities::getProfilesForSharedUsers($_GET['resourceId']));
        }
        else {
            return Response::json(array("error" => "Error: No project specified"));
        }
    }

    public function unsharedUsers()
    {
        if (Session::has("authz-token") && array_key_exists('resourceId', $_GET)) {
            return Response::json(SharingUtilities::getProfilesForUnsharedUsers($_GET['resourceId']));
        }
        else {
            return Response::json(array("error" => "Error: No experiment specified"));
        }
    }

    public function updateSharing()
    {
        try{
            // Convert the JSON array to an object
            $sharing_info = json_decode(json_encode(Input::json()->all()));
            ExperimentUtilities::update_experiment_sharing(Input::get('expId'), $sharing_info);
            return Response::json(array("success" => true));
        }catch (Exception $ex){
            Log::error("failed to update sharing for experiment", array(Input::all()));
            Log::error($ex);
            return Response::json(array("success" => false, "error" => "Error: failed to update sharing: " . $ex->getMessage()));
        }
    }

    private function getAllowedFileSize()
    {
        // Condition added to deal with php ini default value set for post_max_size issue.
        // NOTE: the following assumes that upload_max_filesize and
        // post_max_size are in megabytes (for example, if
        // upload_max_filesize is 8M then $allowedFileSize is 8, but the 'M'
        // is assumed and not considered)
        $allowedFileSize = intval( ini_get( 'upload_max_filesize' ) );
        $serverLimit = intval( ini_get( 'post_max_size' ) );
        if( $serverLimit < $allowedFileSize) {
            $allowedFileSize = $serverLimit;
        }
        return $allowedFileSize;
    }

    private function validateQueueData($computeResourceId, $queue)
    {
        $queues = ExperimentUtilities::getQueueDatafromResourceId($computeResourceId);
        $queueName = $queue['queueName'];

        foreach($queues as $aQueue){
            if($aQueue->queueName == $queueName) {
                if($queue['nodeCount'] <= $aQueue->maxNodes && $queue['cpuCount'] <= $aQueue->maxProcessors && $queue['wallTimeLimit'] <= $aQueue->maxRunTime)
                    return true;
            }
        }

        return false;
    }
}

?>
