/** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.airavata.registry.core.experiment.catalog.impl; import org.apache.airavata.common.utils.AiravataUtils; import org.apache.airavata.model.workspace.Project; import org.apache.airavata.registry.core.experiment.catalog.ExpCatResourceUtils; import org.apache.airavata.registry.core.experiment.catalog.ResourceType; import org.apache.airavata.registry.core.experiment.catalog.resources.*; import org.apache.airavata.registry.core.experiment.catalog.utils.ThriftDataModelConversion; import org.apache.airavata.registry.cpi.RegistryException; import org.apache.airavata.registry.cpi.ResultOrderType; import org.apache.airavata.registry.cpi.utils.Constants; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.*; public class ProjectRegistry { private GatewayResource gatewayResource; private WorkerResource workerResource; private final static Logger logger = LoggerFactory.getLogger(ProjectRegistry.class); public ProjectRegistry(GatewayResource gatewayResource, UserResource user) throws RegistryException { if (!ExpCatResourceUtils.isGatewayExist(gatewayResource.getGatewayId())){ this.gatewayResource = gatewayResource; }else { this.gatewayResource = (GatewayResource) ExpCatResourceUtils.getGateway(gatewayResource.getGatewayId()); } if (!gatewayResource.isExists(ResourceType.GATEWAY_WORKER, user.getUserName())){ workerResource = ExpCatResourceUtils.addGatewayWorker(gatewayResource, user); }else { workerResource = (WorkerResource) ExpCatResourceUtils.getWorker(gatewayResource.getGatewayId(), user.getUserName()); } } public String addProject (Project project, String gatewayId) throws RegistryException{ String projectId; try { if (!ExpCatResourceUtils.isUserExist(project.getOwner(), gatewayId)){ ExpCatResourceUtils.addUser(project.getOwner(), null, gatewayId); } ProjectResource projectResource = new ProjectResource(); projectId = getProjectId(project.getName()); projectResource.setId(projectId); project.setProjectID(projectId); projectResource.setName(project.getName()); projectResource.setDescription(project.getDescription()); projectResource.setCreationTime(AiravataUtils.getTime(project.getCreationTime())); projectResource.setGatewayId(gatewayId); WorkerResource worker = new WorkerResource(project.getOwner(), gatewayId); projectResource.setWorker(worker); projectResource.save(); ProjectUserResource resource = (ProjectUserResource)projectResource.create( ResourceType.PROJECT_USER); resource.setProjectId(project.getProjectID()); resource.setUserName(project.getOwner()); resource.save(); }catch (Exception e){ logger.error("Error while saving project to registry", e); throw new RegistryException(e); } return projectId; } private String getProjectId (String projectName){ String pro = projectName.replaceAll("\\s", ""); return pro + "_" + UUID.randomUUID(); } public void updateProject (Project project, String projectId) throws RegistryException{ try { ProjectResource existingProject = workerResource.getProject(projectId); existingProject.setDescription(project.getDescription()); existingProject.setName(project.getName()); WorkerResource worker = new WorkerResource(project.getOwner(), project.getGatewayId()); existingProject.setWorker(worker); existingProject.save(); ProjectUserResource resource = (ProjectUserResource)existingProject.create( ResourceType.PROJECT_USER); resource.setProjectId(projectId); resource.setUserName(project.getOwner()); resource.save(); }catch (Exception e){ logger.error("Error while saving project to registry", e); throw new RegistryException(e); } } public Project getProject (String projectId) throws RegistryException{ try { ProjectResource project = workerResource.getProject(projectId); if (project != null){ return ThriftDataModelConversion.getProject(project); } }catch (Exception e){ logger.error("Error while retrieving project from registry", e); throw new RegistryException(e); } return null; } /** * Get list of projects of the user * @param fieldName * @param value * @return * @throws RegistryException */ public List<Project> getProjectList (String fieldName, Object value) throws RegistryException{ return getProjectList(fieldName, value, -1, -1, null, null); } /** * Get projects list with pagination and result ordering * @param fieldName * @param value * @param limit * @param offset * @param orderByIdentifier * @param resultOrderType * @return * @throws RegistryException */ public List<Project> getProjectList (String fieldName, Object value, int limit, int offset, Object orderByIdentifier, ResultOrderType resultOrderType) throws RegistryException{ List<Project> projects = new ArrayList<Project>(); try { if (fieldName.equals(Constants.FieldConstants.ProjectConstants.OWNER)){ workerResource.setUser((String)value); List<ProjectResource> projectList = workerResource.getProjects(); if (projectList != null && !projectList.isEmpty()){ for (ProjectResource pr : projectList){ projects.add(ThriftDataModelConversion.getProject(pr)); } } return projects; } }catch (Exception e){ logger.error("Error while retrieving project from registry", e); throw new RegistryException(e); } return projects; } /** * To search projects of user with the given filter criteria. All the matching results will be sent. * Results are not ordered in any order * @param filters * @return * @throws RegistryException */ public List<Project> searchProjects (Map<String, String> filters) throws RegistryException{ return searchProjects(filters, -1, -1, null, null); } /** * To search the projects of user with the given filter criteria and retrieve the results with * pagination support. Results can be ordered based on an identifier (i.e column) either ASC or * DESC. * * @param filters * @param limit * @param offset * @param orderByIdentifier * @param resultOrderType * @return * @throws RegistryException */ public List<Project> searchProjects(Map<String, String> filters, int limit, int offset, Object orderByIdentifier, ResultOrderType resultOrderType) throws RegistryException { Map<String, String> fil = new HashMap<String, String>(); if (filters != null && filters.size() != 0){ List<Project> projects = new ArrayList<Project>(); try { for (String field : filters.keySet()){ if (field.equals(Constants.FieldConstants.ProjectConstants.PROJECT_NAME)){ fil.put(AbstractExpCatResource.ProjectConstants.PROJECT_NAME, filters.get(field)); }else if (field.equals(Constants.FieldConstants.ProjectConstants.OWNER)){ fil.put(AbstractExpCatResource.ProjectConstants.USERNAME, filters.get(field)); }else if (field.equals(Constants.FieldConstants.ProjectConstants.DESCRIPTION)){ fil.put(AbstractExpCatResource.ProjectConstants.DESCRIPTION, filters.get(field)); }else if (field.equals(Constants.FieldConstants.ProjectConstants.GATEWAY_ID)){ fil.put(AbstractExpCatResource.ProjectConstants.GATEWAY_ID, filters.get(field)); } } List<ProjectResource> projectResources = workerResource .searchProjects(fil, null, limit, offset, orderByIdentifier, resultOrderType); if (projectResources != null && !projectResources.isEmpty()){ for (ProjectResource pr : projectResources){ projects.add(ThriftDataModelConversion.getProject(pr)); } } return projects; }catch (Exception e){ logger.error("Error while retrieving project from registry", e); throw new RegistryException(e); } } return null; } /** * To search the projects where the user have access(owner or shared with) with the given filter criteria and retrieve the results with * pagination support. Results can be ordered based on an identifier (i.e column) either ASC or * DESC. * * @param accessibleIds * @param filters * @param limit * @param offset * @param orderByIdentifier * @param resultOrderType * @return * @throws RegistryException */ public List<Project> searchAllAccessibleProjects(List<String> accessibleIds, Map<String, String> filters, int limit, int offset, Object orderByIdentifier, ResultOrderType resultOrderType) throws RegistryException { Map<String, String> fil = new HashMap<String, String>(); if (filters != null && filters.size() != 0){ List<Project> projects = new ArrayList<Project>(); try { for (String field : filters.keySet()){ if (field.equals(Constants.FieldConstants.ProjectConstants.PROJECT_NAME)){ fil.put(AbstractExpCatResource.ProjectConstants.PROJECT_NAME, filters.get(field)); }else if (field.equals(Constants.FieldConstants.ProjectConstants.OWNER)){ fil.put(AbstractExpCatResource.ProjectConstants.USERNAME, filters.get(field)); }else if (field.equals(Constants.FieldConstants.ProjectConstants.DESCRIPTION)){ fil.put(AbstractExpCatResource.ProjectConstants.DESCRIPTION, filters.get(field)); }else if (field.equals(Constants.FieldConstants.ProjectConstants.GATEWAY_ID)){ fil.put(AbstractExpCatResource.ProjectConstants.GATEWAY_ID, filters.get(field)); } } List<ProjectResource> projectResources = workerResource .searchProjects(fil, accessibleIds, limit, offset, orderByIdentifier, resultOrderType); if (projectResources != null && !projectResources.isEmpty()){ for (ProjectResource pr : projectResources){ projects.add(ThriftDataModelConversion.getProject(pr)); } } return projects; }catch (Exception e){ logger.error("Error while retrieving project from registry", e); throw new RegistryException(e); } } return null; } public List<String> getProjectIDs (String fieldName, Object value) throws RegistryException{ List<String> projectIds = new ArrayList<String>(); try { if (fieldName.equals(Constants.FieldConstants.ProjectConstants.OWNER)){ workerResource.setUser((String)value); List<ProjectResource> projectList = workerResource.getProjects(); if (projectList != null && !projectList.isEmpty()){ for (ProjectResource pr : projectList){ projectIds.add(pr.getName()); } } return projectIds; } }catch (Exception e){ logger.error("Error while retrieving projects from registry", e); throw new RegistryException(e); } return projectIds; } public void removeProject (String projectId) throws RegistryException { try { workerResource.removeProject(projectId); } catch (Exception e) { logger.error("Error while removing the project..", e); throw new RegistryException(e); } } public boolean isProjectExist(String projectId) throws RegistryException { try { return workerResource.isProjectExists(projectId); } catch (Exception e) { logger.error("Error while retrieving project...", e); throw new RegistryException(e); } } }