/** * * 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.resources; import org.apache.airavata.registry.core.experiment.catalog.ExpCatResourceUtils; import org.apache.airavata.registry.core.experiment.catalog.ExperimentCatResource; import org.apache.airavata.registry.core.experiment.catalog.ResourceType; import org.apache.airavata.registry.core.experiment.catalog.model.*; import org.apache.airavata.registry.core.experiment.catalog.utils.QueryGenerator; 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 javax.persistence.EntityManager; import javax.persistence.Query; import java.sql.Timestamp; import java.util.ArrayList; import java.util.List; public class ProjectResource extends AbstractExpCatResource { private final static Logger logger = LoggerFactory.getLogger(ProjectResource.class); private String name; private String id; private String gatewayId; private WorkerResource worker; private String description; private Timestamp creationTime; /** *x */ public ProjectResource() { } /** * * @param type child resource type * @return child resource */ public ExperimentCatResource create(ResourceType type) throws RegistryException { if (type == ResourceType.EXPERIMENT) { ExperimentResource experimentResource = new ExperimentResource(); experimentResource.setGatewayExecutionId(gatewayId); experimentResource.setUserName(worker.getUser()); experimentResource.setProjectId(id); return experimentResource; } else if (type == ResourceType.PROJECT_USER){ ProjectUserResource pr = new ProjectUserResource(); pr.setProjectId(id); pr.setUserName(worker.getUser()); return pr; } else { logger.error("Unsupported resource type for project resource.", new IllegalArgumentException()); throw new IllegalArgumentException("Unsupported resource type for project resource."); } } /** * * @param type child resource type * @param name child resource name */ public void remove(ResourceType type, Object name) throws RegistryException{ EntityManager em = null; try { em = ExpCatResourceUtils.getEntityManager(); em.getTransaction().begin(); if (type == ResourceType.EXPERIMENT) { QueryGenerator generator = new QueryGenerator(EXPERIMENT); generator.setParameter(ExperimentConstants.EXPERIMENT_ID, name); Query q = generator.deleteQuery(em); q.executeUpdate(); } else if (type == ResourceType.PROJECT_USER) { QueryGenerator generator = new QueryGenerator(PROJECT_USER); generator.setParameter(ProjectUserConstants.USERNAME, name); generator.setParameter(ProjectUserConstants.PROJECT_ID, this.id); Query q = generator.deleteQuery(em); q.executeUpdate(); } else { em.getTransaction().commit(); em.close(); logger.error("Unsupported resource type for project resource.", new IllegalArgumentException()); throw new IllegalArgumentException("Unsupported resource type for project resource."); } em.getTransaction().commit(); em.close(); } catch (Exception e) { logger.error(e.getMessage(), e); throw new RegistryException(e); } finally { if (em != null && em.isOpen()) { if (em.getTransaction().isActive()){ em.getTransaction().rollback(); } em.close(); } } } /** * * @param type child resource type * @param name child resource name * @return child resource */ public ExperimentCatResource get(ResourceType type, Object name) throws RegistryException { EntityManager em = null; try { if (type == ResourceType.EXPERIMENT) { em = ExpCatResourceUtils.getEntityManager(); em.getTransaction().begin(); QueryGenerator generator = new QueryGenerator(EXPERIMENT); generator.setParameter(ExperimentConstants.EXPERIMENT_ID, name); Query q = generator.selectQuery(em); Experiment experiment = (Experiment) q.getSingleResult(); ExperimentResource experimentResource = (ExperimentResource) Utils.getResource(ResourceType.EXPERIMENT, experiment); em.getTransaction().commit(); em.close(); return experimentResource; } else if (type == ResourceType.PROJECT_USER) { em = ExpCatResourceUtils.getEntityManager(); em.getTransaction().begin(); QueryGenerator generator = new QueryGenerator(PROJECT_USER); generator.setParameter(ProjectUserConstants.USERNAME, name); generator.setParameter(ProjectUserConstants.PROJECT_ID, this.id); Query q = generator.selectQuery(em); ProjectUser prUser = (ProjectUser) q.getSingleResult(); ExperimentResource experimentResource = (ExperimentResource) Utils.getResource(ResourceType.PROJECT_USER, prUser); em.getTransaction().commit(); em.close(); return experimentResource; } else { logger.error("Unsupported resource type for project resource.", new IllegalArgumentException()); throw new IllegalArgumentException("Unsupported resource type for project resource."); } } catch (Exception e) { throw new RegistryException(e); } finally { if (em != null && em.isOpen()) { if (em.getTransaction().isActive()){ em.getTransaction().rollback(); } em.close(); } } } /** * * @param type child resource type * @return list of child resources */ @Override public List<ExperimentCatResource> get(ResourceType type) throws RegistryException{ List<ExperimentCatResource> resourceList = new ArrayList<ExperimentCatResource>(); EntityManager em = null; try { if (type == ResourceType.EXPERIMENT) { em = ExpCatResourceUtils.getEntityManager(); em.getTransaction().begin(); QueryGenerator generator = new QueryGenerator(EXPERIMENT); generator.setParameter(ExperimentConstants.PROJECT_ID, id); Query q = generator.selectQuery(em); List<?> results = q.getResultList(); if (results.size() != 0) { for (Object result : results) { Experiment experiment = (Experiment) result; ExperimentResource experimentResource = (ExperimentResource) Utils.getResource(ResourceType.EXPERIMENT, experiment); resourceList.add(experimentResource); } } em.getTransaction().commit(); em.close(); } else if (type == ResourceType.PROJECT_USER) { em = ExpCatResourceUtils.getEntityManager(); em.getTransaction().begin(); QueryGenerator generator = new QueryGenerator(PROJECT_USER); generator.setParameter(ProjectUserConstants.PROJECT_ID, id); Query q = generator.selectQuery(em); List<?> results = q.getResultList(); if (results.size() != 0) { for (Object result : results) { ProjectUser projectUser = (ProjectUser) result; ProjectUserResource pr = (ProjectUserResource) Utils.getResource(ResourceType.PROJECT_USER, projectUser); resourceList.add(pr); } } em.getTransaction().commit(); em.close(); } else { logger.error("Unsupported resource type for project resource.", new IllegalArgumentException()); throw new IllegalArgumentException("Unsupported resource type for project resource."); } } catch (Exception e) { logger.error(e.getMessage(), e); throw new RegistryException(e); } finally { if (em != null && em.isOpen()) { if (em.getTransaction().isActive()){ em.getTransaction().rollback(); } em.close(); } } return resourceList; } /** * Get results with pagination and ordering * * @param type * @param limit * @param offset * @param orderByIdentifier * @return * @throws org.apache.airavata.registry.cpi.RegistryException */ public List<ExperimentCatResource> get(ResourceType type, int limit, int offset, Object orderByIdentifier, ResultOrderType resultOrderType) throws RegistryException{ List<ExperimentCatResource> resourceList = new ArrayList<ExperimentCatResource>(); EntityManager em = null; try { if (type == ResourceType.EXPERIMENT) { em = ExpCatResourceUtils.getEntityManager(); em.getTransaction().begin(); QueryGenerator generator = new QueryGenerator(EXPERIMENT); generator.setParameter(ExperimentConstants.PROJECT_ID, id); Query q; //ordering - supported only by CREATION_TIME if(orderByIdentifier != null && resultOrderType != null && orderByIdentifier.equals(Constants.FieldConstants.ExperimentConstants.CREATION_TIME)) { q = generator.selectQuery(em, ExperimentConstants.CREATION_TIME, resultOrderType); }else{ q = generator.selectQuery(em); } //pagination if(limit>0 && offset>=0){ q.setFirstResult(offset); q.setMaxResults(limit); } List<?> results = q.getResultList(); if (results.size() != 0) { for (Object result : results) { Experiment experiment = (Experiment) result; ExperimentResource experimentResource = (ExperimentResource) Utils.getResource(ResourceType.EXPERIMENT, experiment); resourceList.add(experimentResource); } } em.getTransaction().commit(); em.close(); } else if (type == ResourceType.PROJECT_USER) { em = ExpCatResourceUtils.getEntityManager(); em.getTransaction().begin(); QueryGenerator generator = new QueryGenerator(PROJECT_USER); generator.setParameter(ProjectUserConstants.PROJECT_ID, id); Query q; //ordering - only supported only by CREATION_TIME if(orderByIdentifier != null && resultOrderType != null && orderByIdentifier.equals(Constants.FieldConstants.ProjectConstants.CREATION_TIME)) { q = generator.selectQuery(em, ProjectConstants.CREATION_TIME, resultOrderType); }else{ q = generator.selectQuery(em); } //pagination if(limit>0 && offset>=0){ q.setFirstResult(offset); q.setMaxResults(limit); } List<?> results = q.getResultList(); if (results.size() != 0) { for (Object result : results) { ProjectUser projectUser = (ProjectUser) result; ProjectUserResource pr = (ProjectUserResource) Utils.getResource(ResourceType.PROJECT_USER, projectUser); resourceList.add(pr); } } em.getTransaction().commit(); em.close(); } else { logger.error("Unsupported resource type for project resource.", new IllegalArgumentException()); throw new IllegalArgumentException("Unsupported resource type for project resource."); } } catch (Exception e) { logger.error(e.getMessage(), e); throw new RegistryException(e); } finally { if (em != null && em.isOpen()) { if (em.getTransaction().isActive()){ em.getTransaction().rollback(); } em.close(); } } return resourceList; } /** * save project to the database */ public void save() throws RegistryException{ EntityManager em = null; try { em = ExpCatResourceUtils.getEntityManager(); Project existingProject = em.find(Project.class, id); em.close(); em = ExpCatResourceUtils.getEntityManager(); em.getTransaction().begin(); Project project = new Project(); project.setProjectId(id); project.setProjectName(name); project.setGatewayId(gatewayId); project.setUserName(worker.getUser()); project.setDescription(description); project.setCreationTime(creationTime); if (existingProject != null) { existingProject.setProjectName(name); existingProject.setGatewayId(gatewayId); existingProject.setUserName(worker.getUser()); existingProject.setDescription(description); existingProject.setCreationTime(creationTime); em.merge(existingProject); } else { em.persist(project); } em.getTransaction().commit(); em.close(); } catch (Exception e) { logger.error(e.getMessage(), e); throw new RegistryException(e); } finally { if (em != null && em.isOpen()) { if (em.getTransaction().isActive()){ em.getTransaction().rollback(); } em.close(); } } } public String getId() { return id; } public void setId(String id) { this.id = id; } /** * * @return project name */ public String getName() { return name; } /** * * @param name project name */ public void setName(String name) { this.name = name; } /** * * @return gateway worker */ public WorkerResource getWorker() { return worker; } /** * * @param worker gateway worker */ public void setWorker(WorkerResource worker) { this.worker = worker; } public String getGatewayId() { return gatewayId; } public void setGatewayId(String gatewayId) { this.gatewayId = gatewayId; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public Timestamp getCreationTime() { return creationTime; } public void setCreationTime(Timestamp creationTime) { this.creationTime = creationTime; } /** * * @param experimentId experiment ID * @return whether the experiment exist */ public boolean isExperimentExists(String experimentId) throws RegistryException{ return isExists(ResourceType.EXPERIMENT, experimentId); } /** * * @param experimentId experiment ID * @return experiment resource */ public ExperimentResource createExperiment(String experimentId) throws RegistryException{ ExperimentResource experimentResource = (ExperimentResource)create(ResourceType.EXPERIMENT); experimentResource.setExperimentId(experimentId); return experimentResource; } /** * * @param experimentId experiment ID * @return experiment resource */ public ExperimentResource getExperiment(String experimentId) throws RegistryException{ return (ExperimentResource)get(ResourceType.EXPERIMENT,experimentId); } /** * * @return list of experiments */ public List<ExperimentResource> getExperiments() throws RegistryException{ List<ExperimentCatResource> list = get(ResourceType.EXPERIMENT); List<ExperimentResource> result=new ArrayList<ExperimentResource>(); for (ExperimentCatResource resource : list) { result.add((ExperimentResource) resource); } return result; } public List<ExperimentResource> getExperiments(int limit, int offset, Object orderByIdentifier, ResultOrderType resultOrderType) throws RegistryException{ List<ExperimentCatResource> list = get(ResourceType.EXPERIMENT, limit, offset, orderByIdentifier, resultOrderType); List<ExperimentResource> result=new ArrayList<ExperimentResource>(); for (ExperimentCatResource resource : list) { result.add((ExperimentResource) resource); } return result; } /** * * @param experimentId experiment ID */ public void removeExperiment(String experimentId) throws RegistryException{ remove(ResourceType.EXPERIMENT, experimentId); } public List<ProjectUserResource> getProjectUserList () throws RegistryException{ List<ExperimentCatResource> resources = get(ResourceType.PROJECT_USER); List<ProjectUserResource> projectUserResources = new ArrayList<ProjectUserResource>(); if (resources != null && !resources.isEmpty()){ for (ExperimentCatResource r : resources){ projectUserResources.add((ProjectUserResource)r); } } return projectUserResources; } }