/** * * 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.model.status.TaskState; 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.Job; import org.apache.airavata.registry.core.experiment.catalog.model.Task; import org.apache.airavata.registry.core.experiment.catalog.model.TaskError; import org.apache.airavata.registry.core.experiment.catalog.model.TaskStatus; import org.apache.airavata.registry.core.experiment.catalog.utils.QueryGenerator; import org.apache.airavata.registry.cpi.RegistryException; 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 TaskResource extends AbstractExpCatResource { private static final Logger logger = LoggerFactory.getLogger(TaskResource.class); private String taskId; private String taskType; private String parentProcessId; private Timestamp creationTime; private Timestamp lastUpdateTime; private String taskDetail; private byte[] subTaskModel; public String getTaskId() { return taskId; } public void setTaskId(String taskId) { this.taskId = taskId; } public String getTaskType() { return taskType; } public void setTaskType(String taskType) { this.taskType = taskType; } public String getParentProcessId() { return parentProcessId; } public void setParentProcessId(String parentProcessId) { this.parentProcessId = parentProcessId; } public Timestamp getCreationTime() { return creationTime; } public void setCreationTime(Timestamp creationTime) { this.creationTime = creationTime; } public Timestamp getLastUpdateTime() { return lastUpdateTime; } public void setLastUpdateTime(Timestamp lastUpdateTime) { this.lastUpdateTime = lastUpdateTime; } public String getTaskDetail() { return taskDetail; } public void setTaskDetail(String taskDetail) { this.taskDetail = taskDetail; } public byte[] getSubTaskModel() { return subTaskModel; } public void setSubTaskModel(byte[] subTaskModel) { this.subTaskModel = subTaskModel; } public ExperimentCatResource create(ResourceType type) throws RegistryException { switch (type){ case TASK_STATUS: TaskStatusResource taskStatusResource = new TaskStatusResource(); taskStatusResource.setTaskId(taskId); return taskStatusResource; case TASK_ERROR: TaskErrorResource taskErrorResource = new TaskErrorResource(); taskErrorResource.setTaskId(taskId); return taskErrorResource; case JOB: JobResource jobResource = new JobResource(); jobResource.setTaskId(taskId); return jobResource; default: logger.error("Unsupported resource type for task data resource.", new UnsupportedOperationException()); throw new UnsupportedOperationException(); } } public void remove(ResourceType type, Object name) throws RegistryException{ EntityManager em = null; try { em = ExpCatResourceUtils.getEntityManager(); em.getTransaction().begin(); Query q; QueryGenerator generator; switch (type) { case TASK_STATUS: generator = new QueryGenerator(TASK_STATUS); generator.setParameter(TaskStatusConstants.STATUS_ID, name); q = generator.deleteQuery(em); q.executeUpdate(); break; case TASK_ERROR: generator = new QueryGenerator(TASK_ERROR); generator.setParameter(TaskErrorConstants.ERROR_ID, name); q = generator.deleteQuery(em); q.executeUpdate(); break; case JOB: generator = new QueryGenerator(JOB); generator.setParameter(JobConstants.JOB_ID, name); generator.setParameter(JobConstants.TASK_ID, taskId); q = generator.deleteQuery(em); q.executeUpdate(); break; default: logger.error("Unsupported resource type for job details resource.", new IllegalArgumentException()); break; } em.getTransaction().commit(); if (em.isOpen()) { if (em.getTransaction().isActive()){ em.getTransaction().rollback(); } 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 ExperimentCatResource get(ResourceType type, Object name) throws RegistryException { EntityManager em = null; try { em = ExpCatResourceUtils.getEntityManager(); em.getTransaction().begin(); QueryGenerator generator; Query q; switch (type) { case TASK_STATUS: generator = new QueryGenerator(TASK_STATUS); generator.setParameter(TaskStatusConstants.STATUS_ID, name); q = generator.selectQuery(em); TaskStatus status = (TaskStatus) q.getSingleResult(); TaskStatusResource statusResource = (TaskStatusResource) Utils.getResource(ResourceType.TASK_STATUS, status); em.getTransaction().commit(); if (em.isOpen()) { if (em.getTransaction().isActive()){ em.getTransaction().rollback(); } em.close(); } return statusResource; case TASK_ERROR: generator = new QueryGenerator(TASK_ERROR); generator.setParameter(TaskErrorConstants.ERROR_ID, name); q = generator.selectQuery(em); TaskError error = (TaskError) q.getSingleResult(); TaskErrorResource errorResource = (TaskErrorResource) Utils.getResource( ResourceType.TASK_ERROR, error ); em.getTransaction().commit(); if (em.isOpen()) { if (em.getTransaction().isActive()){ em.getTransaction().rollback(); } em.close(); } return errorResource; case JOB: generator = new QueryGenerator(JOB); generator.setParameter(JobConstants.JOB_ID, name); generator.setParameter(JobConstants.TASK_ID, taskId); q = generator.selectQuery(em); Job job = (Job) q.getSingleResult(); JobResource jobResource = (JobResource) Utils.getResource(ResourceType.JOB, job); em.getTransaction().commit(); if (em.isOpen()) { if (em.getTransaction().isActive()){ em.getTransaction().rollback(); } em.close(); } return jobResource; default: em.getTransaction().commit(); if (em.isOpen()) { if (em.getTransaction().isActive()){ em.getTransaction().rollback(); } em.close(); } logger.error("Unsupported resource type for Task resource.", new IllegalArgumentException()); throw new IllegalArgumentException("Unsupported resource type for Task 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(); } } } public List<ExperimentCatResource> get(ResourceType type) throws RegistryException{ List<ExperimentCatResource> resourceList = new ArrayList<ExperimentCatResource>(); EntityManager em = null; try { em = ExpCatResourceUtils.getEntityManager(); em.getTransaction().begin(); Query q; QueryGenerator generator; List results; switch (type) { case TASK_ERROR: generator = new QueryGenerator(TASK_ERROR); generator.setParameter(TaskErrorConstants.TASK_ID, taskId); q = generator.selectQuery(em); results = q.getResultList(); if (results.size() != 0) { for (Object result : results) { TaskError taskError = (TaskError) result; TaskErrorResource taskErrorResource = (TaskErrorResource) Utils.getResource(ResourceType.TASK_ERROR, taskError); resourceList.add(taskErrorResource); } } break; case TASK_STATUS: generator = new QueryGenerator(TASK_STATUS); generator.setParameter(TaskStatusConstants.TASK_ID, taskId); q = generator.selectQuery(em); results = q.getResultList(); if (results.size() != 0) { for (Object result : results) { TaskStatus taskStatus = (TaskStatus) result; TaskStatusResource taskStatusResource = (TaskStatusResource) Utils.getResource(ResourceType.TASK_STATUS, taskStatus); resourceList.add(taskStatusResource); } } break; case JOB: generator = new QueryGenerator(JOB); generator.setParameter(JobConstants.TASK_ID, taskId); q = generator.selectQuery(em); results = q.getResultList(); if (results.size() != 0) { for (Object result : results) { Job job = (Job) result; JobResource jobResource = (JobResource) Utils.getResource(ResourceType.JOB, job); resourceList.add(jobResource); } } break; default: logger.error("Unsupported resource type for task resource.", new UnsupportedOperationException()); throw new UnsupportedOperationException(); } em.getTransaction().commit(); if (em.isOpen()) { if (em.getTransaction().isActive()){ em.getTransaction().rollback(); } 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(); } } return resourceList; } public void save() throws RegistryException{ EntityManager em = null; try { em = ExpCatResourceUtils.getEntityManager(); Task task; Task existingTask = em.find(Task.class, taskId); if (em.isOpen()) { if (em.getTransaction().isActive()){ em.getTransaction().rollback(); } em.close(); } em = ExpCatResourceUtils.getEntityManager(); em.getTransaction().begin(); if(existingTask == null){ task = new Task(); }else { task = existingTask; } task.setTaskId(taskId); task.setTaskType(taskType); task.setParentProcessId(parentProcessId); task.setCreationTime(creationTime); task.setLastUpdateTime(lastUpdateTime); task.setTaskDetail(taskDetail); task.setSetSubTaskModel(subTaskModel); if (existingTask == null){ em.persist(task); }else { em.merge(task); } em.getTransaction().commit(); if (em.isOpen()) { if (em.getTransaction().isActive()){ em.getTransaction().rollback(); } 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 List<TaskStatusResource> getTaskStatuses() throws RegistryException{ List<TaskStatusResource> taskStatusResources = new ArrayList(); List<ExperimentCatResource> resources = get(ResourceType.TASK_STATUS); for (ExperimentCatResource resource : resources) { TaskStatusResource statusResource = (TaskStatusResource) resource; taskStatusResources.add(statusResource); } return taskStatusResources; } public TaskStatusResource getTaskStatus() throws RegistryException{ List<TaskStatusResource> taskStatusResources = getTaskStatuses(); if(taskStatusResources.size() == 0){ return null; }else{ TaskStatusResource max = taskStatusResources.get(0); for(int i=1; i<taskStatusResources.size();i++) { if (taskStatusResources.get(i).getTimeOfStateChange().after(max.getTimeOfStateChange()) || (taskStatusResources.get(i).getTimeOfStateChange().equals(max.getTimeOfStateChange()) && taskStatusResources.get(i).getState().equals(TaskState.COMPLETED.toString())) || (taskStatusResources.get(i).getTimeOfStateChange().equals(max.getTimeOfStateChange()) && taskStatusResources.get(i).getState().equals(TaskState.FAILED.toString())) || (taskStatusResources.get(i).getTimeOfStateChange().equals(max.getTimeOfStateChange()) && taskStatusResources.get(i).getState().equals(TaskState.CANCELED.toString()))) { max = taskStatusResources.get(i); } } return max; } } public List<TaskErrorResource> getTaskErrors() throws RegistryException{ List<TaskErrorResource> taskErrorResources = new ArrayList(); List<ExperimentCatResource> resources = get(ResourceType.TASK_ERROR); for (ExperimentCatResource resource : resources) { TaskErrorResource errorResource = (TaskErrorResource) resource; taskErrorResources.add(errorResource); } return taskErrorResources; } public TaskErrorResource getTaskError() throws RegistryException{ List<TaskErrorResource> taskErrorResources = getTaskErrors(); if(taskErrorResources.size() == 0){ return null; }else{ TaskErrorResource max = taskErrorResources.get(0); for(int i=1; i<taskErrorResources.size();i++){ if(taskErrorResources.get(i).getCreationTime().after(max.getCreationTime())){ max = taskErrorResources.get(i); } } return max; } } public JobResource getJob(String jobId) throws RegistryException { return (JobResource) get(ResourceType.JOB, jobId); } public List<JobResource> getJobList() throws RegistryException { List<JobResource> jobResources = new ArrayList(); List<ExperimentCatResource> resources = get(ResourceType.JOB); for (ExperimentCatResource resource : resources) { JobResource jobResource = (JobResource) resource; jobResources.add(jobResource); } return jobResources; } }