blob: 3ea89979e8ccfcb471fe7b9c68a3abf885058997 [file] [log] [blame]
<?php
use Airavata\API\Error\AiravataClientException;
use Airavata\API\Error\AiravataSystemException;
use Airavata\API\Error\InvalidRequestException;
use Airavata\Facades\Airavata;
use Airavata\Model\Workspace\Project;
use Airavata\Model\Group\ResourcePermissionType;
class ProjectUtilities
{
/**
* Get all projects owned by the given user
* @param $username
* @return null
*/
public static function get_all_user_projects($gatewayId, $username)
{
$userProjects = null;
try {
$userProjects = Airavata::getUserProjects(Session::get('authz-token'), $gatewayId, $username, -1, 0);
// Add a optionLabel that disambiguates shared projects
foreach ($userProjects as $project) {
$optionLabel = $project->name;
if ($project->owner != Session::get('username')) {
$optionLabel = $optionLabel . ' (owned by ' . $project->owner . ')';
}
$project->optionLabel = $optionLabel;
}
//var_dump( $userProjects); exit;
} catch (InvalidRequestException $ire) {
CommonUtilities::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) {
CommonUtilities::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
{
CommonUtilities::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 {
CommonUtilities::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;
}
public static function get_all_user_writeable_projects($gatewayId, $username)
{
$writeableProjects = array();
$userProjects = ProjectUtilities::get_all_user_projects($gatewayId, $username);
if (Config::get('pga_config.airavata')["data-sharing-enabled"]){
foreach($userProjects as $project) {
if (SharingUtilities::userCanWrite($username, $project->projectID)) {
$writeableProjects[] = $project;
}
}
} else {
$writeableProjects = $userProjects;
}
return $writeableProjects;
}
/**
* Get the project with the given ID
* @param $projectId
* @return null
*/
public static function get_project($projectId)
{
try {
return Airavata::getProject(Session::get('authz-token'), $projectId);
} catch (InvalidRequestException $ire) {
CommonUtilities::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) {
CommonUtilities::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) {
CommonUtilities::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 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';
if ($editable) {
// this should only return projects the user can write
$userProjects = ProjectUtilities::get_all_user_writeable_projects(Session::get("gateway_id"), Session::get('username'));
} else {
$userProjects = ProjectUtilities::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="' . htmlspecialchars($project->projectID) . '" ' . $selected . '>' . htmlspecialchars($project->optionLabel) . '</option>';
}
}
echo '</select>';
}
//moved from create project view.
public static function create_project()
{
$project = new Project();
$project->owner = Session::get('username');
$project->name = $_POST['project-name'];
$project->description = $_POST['project-description'];
$project->gatewayId = Config::get('pga_config.airavata')['gateway-id'];
$projectId = null;
try {
$projectId = Airavata::createProject(Session::get('authz-token'), Config::get('pga_config.airavata')['gateway-id'], $project);
if ($projectId) {
CommonUtilities::print_success_message("<p>Project " . htmlspecialchars($_POST['project-name']) . " created!</p>" .
'<p>You will be redirected to the summary page shortly, or you can
<a href="project/summary?projId=' . urlencode($projectId) . '">go directly</a> to the project summary page.</p>');
} else {
CommonUtilities::print_error_message("Error creating project ". htmlspecialchars($_POST['project-name']) . "!");
}
} catch (InvalidRequestException $ire) {
CommonUtilities::print_error_message('InvalidRequestException!<br><br>' . $ire->getMessage());
} catch (AiravataClientException $ace) {
CommonUtilities::print_error_message('AiravataClientException!<br><br>' . $ace->getMessage());
} catch (AiravataSystemException $ase) {
CommonUtilities::print_error_message('AiravataSystemException!<br><br>' . $ase->getMessage());
}
if (Config::get('pga_config.airavata')["data-sharing-enabled"]){
$share = $_POST['share-settings'];
ProjectUtilities::share_project($projectId, json_decode($share));
}
return $projectId;
}
public static function create_default_project($username)
{
$project = new Project();
$project->owner = $username;
$project->name = "Default Project";
$project->gatewayId = Config::get('pga_config.airavata')['gateway-id'];
$project->description = "This is the default project for user " . $project->owner;
$projectId = null;
try {
$projectId = Airavata::createProject(Session::get('authz-token'), Config::get('pga_config.airavata')['gateway-id'], $project);
if (Config::get('pga_config.airavata')["data-sharing-enabled"]){
$share = new stdClass();
$share->{$username} = new stdClass();
$share->{$username}->read = true;
$share->{$username}->write = true;
ProjectUtilities::share_project($projectId, $share);
}
} catch (InvalidRequestException $ire) {
CommonUtilities::print_error_message('InvalidRequestException!<br><br>' . $ire->getMessage());
} catch (AiravataClientException $ace) {
CommonUtilities::print_error_message('AiravataClientException!<br><br>' . $ace->getMessage());
} catch (AiravataSystemException $ase) {
CommonUtilities::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)
{
$experiments = array();
try {
$experiments = Airavata::getExperimentsInProject(Session::get('authz-token'), $projectId, -1, 0);
} catch (InvalidRequestException $ire) {
CommonUtilities::print_error_message('InvalidRequestException!<br><br>' . $ire->getMessage());
} catch (AiravataClientException $ace) {
CommonUtilities::print_error_message('AiravataClientException!<br><br>' . $ace->getMessage());
} catch (AiravataSystemException $ase) {
CommonUtilities::print_error_message('AiravataSystemException!<br><br>' . $ase->getMessage());
} catch (TTransportException $tte) {
CommonUtilities::print_error_message('TTransportException!<br><br>' . $tte->getMessage());
}
for($i = 0; $i < count($experiments); $i++) {
if (!SharingUtilities::userCanRead(Session::get("username"), $experiments[$i]->experimentId)) {
array_splice($experiments, $i, 1);
}
}
return $experiments;
}
public static function update_project($projectId, $projectDetails)
{
$updatedProject = new Project();
$updatedProject->owner = $projectDetails->owner;
$updatedProject->name = $projectDetails->name;
$updatedProject->description = $projectDetails->description;
$updatedProject->gatewayId = Config::get('pga_config.airavata')['gateway-id'];
Airavata::updateProject(Session::get('authz-token'), $projectId, $updatedProject);
if (Config::get('pga_config.airavata')["data-sharing-enabled"] && array_key_exists('share-settings', $_POST)){
$share = $_POST['share-settings'];
ProjectUtilities::share_project($projectId, json_decode($share));
}
}
public static function get_all_user_accessible_projects_with_pagination($limit, $offset)
{
$projects = array();
try {
$projects = $projects = Airavata::searchProjects(Session::get('authz-token'), Session::get("gateway_id"),
Session::get("username"), [], $limit, $offset);
} catch (InvalidRequestException $ire) {
CommonUtilities::print_error_message('InvalidRequestException!<br><br>' . $ire->getMessage());
} catch (AiravataClientException $ace) {
CommonUtilities::print_error_message('AiravataClientException!<br><br>' . $ace->getMessage());
} catch (AiravataSystemException $ase) {
if ($ase->airavataErrorType == 2) // 2 = INTERNAL_ERROR
{
CommonUtilities::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 {
CommonUtilities::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) {
CommonUtilities::print_error_message('TTransportException!<br><br>' . $tte->getMessage());
}
return $projects;
}
public static function get_proj_search_results_with_pagination($searchKey, $searchValue, $limit, $offset)
{
$projects = array();
try {
switch ($searchKey) {
case 'project-name':
$filters[\Airavata\Model\Experiment\ProjectSearchFields::PROJECT_NAME] = $searchValue;
$projects = Airavata::searchProjects(Session::get('authz-token'), Session::get("gateway_id"),
Session::get("username"), $filters, $limit, $offset);
break;
case 'project-description':
$filters[\Airavata\Model\Experiment\ProjectSearchFields::PROJECT_DESCRIPTION] = $searchValue;
$projects = Airavata::searchProjects(Session::get('authz-token'), Session::get("gateway_id"),
Session::get("username"), $filters, $limit, $offset);
break;
}
} catch (InvalidRequestException $ire) {
CommonUtilities::print_error_message('InvalidRequestException!<br><br>' . $ire->getMessage());
} catch (AiravataClientException $ace) {
CommonUtilities::print_error_message('AiravataClientException!<br><br>' . $ace->getMessage());
} catch (AiravataSystemException $ase) {
if ($ase->airavataErrorType == 2) // 2 = INTERNAL_ERROR
{
CommonUtilities::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 {
CommonUtilities::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) {
CommonUtilities::print_error_message('TTransportException!<br><br>' . $tte->getMessage());
}
return $projects;
}
/**
* Set sharing settings for a given project.
* @param projectId
* @param $users A map of username => {read_permission, write_permission}
*/
private static function share_project($projectId, $users) {
$project = Airavata::getProject(Session::get("authz-token"), $projectId);
$users->{$project->owner} = new stdClass();
$users->{$project->owner}->read = true;
$users->{$project->owner}->write = true;
$wadd = array();
$wrevoke = array();
$radd = array();
$rrevoke = array();
foreach ($users as $user => $perms) {
if ($perms->write) {
$wadd[$user] = ResourcePermissionType::WRITE;
}
else {
$wrevoke[$user] = ResourcePermissionType::WRITE;
}
if ($perms->read) {
$radd[$user] = ResourcePermissionType::READ;
}
else {
$rrevoke[$user] = ResourcePermissionType::READ;
}
}
GrouperUtilities::shareResourceWithUsers($projectId, $wadd);
GrouperUtilities::revokeSharingOfResourceFromUsers($projectId, $wrevoke);
GrouperUtilities::shareResourceWithUsers($projectId, $radd);
GrouperUtilities::revokeSharingOfResourceFromUsers($projectId, $rrevoke);
}
}