/** * * 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.workflow.catalog.impl; import org.apache.airavata.model.WorkflowModel; import org.apache.airavata.model.application.io.InputDataObjectType; import org.apache.airavata.model.application.io.OutputDataObjectType; import org.apache.airavata.registry.core.workflow.catalog.resources.*; import org.apache.airavata.registry.core.workflow.catalog.utils.WorkflowCatalogThriftConversion; import org.apache.airavata.registry.core.workflow.catalog.utils.WorkflowCatalogUtils; import org.apache.airavata.registry.cpi.WorkflowCatalog; import org.apache.airavata.registry.cpi.WorkflowCatalogException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class WorkflowCatalogImpl implements WorkflowCatalog { private final static Logger logger = LoggerFactory.getLogger(WorkflowCatalogImpl.class); @Override public List<String> getAllWorkflows(String gatewayId) throws WorkflowCatalogException { List<String> workflowIds = new ArrayList<String>(); try { WorkflowResource resource = new WorkflowResource(); resource.setGatewayId(gatewayId); workflowIds = resource.getAllIds(); } catch (Exception e) { logger.error("Error while retrieving all the workflow template ids...", e); throw new WorkflowCatalogException(e); } return workflowIds; } @Override public WorkflowModel getWorkflow(String workflowTemplateId) throws WorkflowCatalogException { try { WorkflowResource resource = new WorkflowResource(); WorkflowResource wfResource = (WorkflowResource)resource.get(workflowTemplateId); return WorkflowCatalogThriftConversion.getWorkflow(wfResource); } catch (Exception e) { logger.error("Error while retrieving the workflow...", e); throw new WorkflowCatalogException(e); } } @Override public void deleteWorkflow(String workflowTemplateId) throws WorkflowCatalogException { try { WorkflowResource resource = new WorkflowResource(); resource.remove(workflowTemplateId); } catch (Exception e) { logger.error("Error while deleting the workflow...", e); throw new WorkflowCatalogException(e); } } @Override public String registerWorkflow(WorkflowModel workflow, String gatewayId) throws WorkflowCatalogException { try { WorkflowResource resource = new WorkflowResource(); resource.setWfTemplateId(WorkflowCatalogUtils.getID(workflow.getName())); resource.setWfName(workflow.getName()); resource.setGraph(workflow.getGraph()); resource.setGatewayId(gatewayId); if (workflow.getImage() != null){ resource.setImage(new String(workflow.getImage())); } resource.save(); workflow.setTemplateId(resource.getWfTemplateId()); List<InputDataObjectType> workflowInputs = workflow.getWorkflowInputs(); if (workflowInputs != null && workflowInputs.size() != 0){ for (InputDataObjectType input : workflowInputs){ WorkflowInputResource wfInputResource = new WorkflowInputResource(); wfInputResource.setWorkflowResource(resource); wfInputResource.setInputKey(input.getName()); wfInputResource.setInputVal(input.getValue()); wfInputResource.setWfTemplateId(resource.getWfTemplateId()); wfInputResource.setDataType(input.getType().toString()); wfInputResource.setAppArgument(input.getApplicationArgument()); wfInputResource.setStandardInput(input.isStandardInput()); wfInputResource.setUserFriendlyDesc(input.getUserFriendlyDescription()); wfInputResource.setMetadata(input.getMetaData()); wfInputResource.save(); } } List<OutputDataObjectType> workflowOutputs = workflow.getWorkflowOutputs(); if (workflowOutputs != null && workflowOutputs.size() != 0){ for (OutputDataObjectType output : workflowOutputs){ WorkflowOutputResource outputResource = new WorkflowOutputResource(); outputResource.setWorkflowResource(resource); outputResource.setOutputKey(output.getName()); outputResource.setOutputVal(output.getValue()); outputResource.setWfTemplateId(resource.getWfTemplateId()); outputResource.setDataType(output.getType().toString()); outputResource.setAppArgument(output.getApplicationArgument()); outputResource.setDataNameLocation(output.getLocation()); outputResource.setRequired(output.isIsRequired()); outputResource.setRequiredToCMD(output.isRequiredToAddedToCommandLine()); outputResource.setOutputStreaming(output.isOutputStreaming()); outputResource.setDataMovement(output.isDataMovement()); outputResource.save(); } } return resource.getWfTemplateId(); } catch (Exception e) { logger.error("Error while saving the workflow...", e); throw new WorkflowCatalogException(e); } } @Override public void updateWorkflow(String workflowTemplateId, WorkflowModel workflow) throws WorkflowCatalogException { try { WorkflowResource resource = new WorkflowResource(); WorkflowResource existingWF = (WorkflowResource)resource.get(workflowTemplateId); existingWF.setWfName(workflow.getName()); existingWF.setGraph(workflow.getGraph()); if (workflow.getImage() != null){ existingWF.setImage(new String(workflow.getImage())); } existingWF.save(); List<InputDataObjectType> existingwFInputs = workflow.getWorkflowInputs(); if (existingwFInputs != null && existingwFInputs.size() != 0){ for (InputDataObjectType input : existingwFInputs){ WorkflowInputResource wfInputResource = new WorkflowInputResource(); Map<String, String> ids = new HashMap<String, String>(); ids.put(WorkflowCatAbstractResource.WorkflowInputConstants.WF_TEMPLATE_ID,existingWF.getWfTemplateId()); ids.put(WorkflowCatAbstractResource.WorkflowInputConstants.INPUT_KEY,input.getName()); WorkflowInputResource existingInput = (WorkflowInputResource)wfInputResource.get(ids); existingInput.setWorkflowResource(existingWF); existingInput.setInputKey(input.getName()); existingInput.setInputVal(input.getValue()); existingInput.setWfTemplateId(existingWF.getWfTemplateId()); existingInput.setDataType(input.getType().toString()); existingInput.setAppArgument(input.getApplicationArgument()); existingInput.setStandardInput(input.isStandardInput()); existingInput.setUserFriendlyDesc(input.getUserFriendlyDescription()); existingInput.setMetadata(input.getMetaData()); existingInput.save(); } } List<OutputDataObjectType> workflowOutputs = workflow.getWorkflowOutputs(); if (workflowOutputs != null && workflowOutputs.size() != 0){ for (OutputDataObjectType output : workflowOutputs){ WorkflowOutputResource outputResource = new WorkflowOutputResource(); Map<String, String> ids = new HashMap<String, String>(); ids.put(WorkflowCatAbstractResource.WorkflowOutputConstants.WF_TEMPLATE_ID,existingWF.getWfTemplateId()); ids.put(WorkflowCatAbstractResource.WorkflowOutputConstants.OUTPUT_KEY,output.getName()); WorkflowOutputResource existingOutput = (WorkflowOutputResource)outputResource.get(ids); existingOutput.setWorkflowResource(existingWF); existingOutput.setOutputKey(output.getName()); existingOutput.setOutputVal(output.getValue()); existingOutput.setWfTemplateId(existingWF.getWfTemplateId()); existingOutput.setDataType(output.getType().toString()); existingOutput.setDataType(output.getType().toString()); existingOutput.setAppArgument(output.getApplicationArgument()); existingOutput.setDataNameLocation(output.getLocation()); existingOutput.setRequired(output.isIsRequired()); existingOutput.setRequiredToCMD(output.isRequiredToAddedToCommandLine()); existingOutput.setOutputStreaming(output.isOutputStreaming()); existingOutput.setDataMovement(output.isDataMovement()); existingOutput.save(); } } } catch (Exception e) { logger.error("Error while updating the workflow...", e); throw new WorkflowCatalogException(e); } } @Override public String getWorkflowTemplateId(String workflowName) throws WorkflowCatalogException { try { WorkflowResource resource = new WorkflowResource(); List<WorkflowCatalogResource> resourceList = resource.get(WorkflowCatAbstractResource.WorkflowConstants.WORKFLOW_NAME, workflowName); if (resourceList != null && !resourceList.isEmpty()){ WorkflowResource wfResource = (WorkflowResource)resourceList.get(0); return wfResource.getWfTemplateId(); } } catch (Exception e) { logger.error("Error while retrieving the workflow with the workflow name...", e); throw new WorkflowCatalogException(e); } return null; } @Override public boolean isWorkflowExistWithName(String workflowName) throws WorkflowCatalogException { try { WorkflowResource resource = new WorkflowResource(); List<WorkflowCatalogResource> resourceList = resource.get(WorkflowCatAbstractResource.WorkflowConstants.WORKFLOW_NAME, workflowName); if (resourceList != null && !resourceList.isEmpty()){ return true; } } catch (Exception e) { logger.error("Error while retrieving the workflow with the workflow name...", e); throw new WorkflowCatalogException(e); } return false; } @Override public void updateWorkflowOutputs(String workflowTemplateId, List<OutputDataObjectType> workflowOutputs) throws WorkflowCatalogException { WorkflowResource resource = new WorkflowResource(); WorkflowResource existingWF = (WorkflowResource)resource.get(workflowTemplateId); if (workflowOutputs != null && workflowOutputs.size() != 0) { for (OutputDataObjectType output : workflowOutputs) { WorkflowOutputResource outputResource = new WorkflowOutputResource(); Map<String, String> ids = new HashMap<String, String>(); ids.put(WorkflowCatAbstractResource.WorkflowOutputConstants.WF_TEMPLATE_ID, existingWF.getWfTemplateId()); ids.put(WorkflowCatAbstractResource.WorkflowOutputConstants.OUTPUT_KEY, output.getName()); WorkflowOutputResource existingOutput = (WorkflowOutputResource) outputResource.get(ids); existingOutput.setWorkflowResource(existingWF); existingOutput.setOutputKey(output.getName()); existingOutput.setOutputVal(output.getValue()); existingOutput.setWfTemplateId(existingWF.getWfTemplateId()); existingOutput.setDataType(output.getType().toString()); existingOutput.setDataType(output.getType().toString()); existingOutput.setAppArgument(output.getApplicationArgument()); existingOutput.setDataNameLocation(output.getLocation()); existingOutput.setRequired(output.isIsRequired()); existingOutput.setRequiredToCMD(output.isRequiredToAddedToCommandLine()); existingOutput.setOutputStreaming(output.isOutputStreaming()); existingOutput.setDataMovement(output.isDataMovement()); existingOutput.save(); } } } }