/** * * 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.application.io.InputDataObjectType; import org.apache.airavata.model.application.io.OutputDataObjectType; import org.apache.airavata.model.commons.ErrorModel; import org.apache.airavata.model.experiment.ExperimentModel; import org.apache.airavata.model.experiment.ExperimentStatistics; import org.apache.airavata.model.experiment.ExperimentSummaryModel; import org.apache.airavata.model.experiment.UserConfigurationDataModel; import org.apache.airavata.model.job.JobModel; import org.apache.airavata.model.process.ProcessModel; import org.apache.airavata.model.scheduling.ComputationalResourceSchedulingModel; import org.apache.airavata.model.status.*; import org.apache.airavata.model.task.TaskModel; 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.resources.*; import org.apache.airavata.registry.core.experiment.catalog.utils.ThriftDataModelConversion; import org.apache.airavata.registry.cpi.CompositeIdentifier; import org.apache.airavata.registry.cpi.RegistryException; import org.apache.airavata.registry.cpi.ResultOrderType; import org.apache.airavata.registry.cpi.utils.Constants; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.sql.Timestamp; import java.util.*; public class ExperimentRegistry { private GatewayResource gatewayResource; private WorkerResource workerResource; private final static Logger logger = LoggerFactory.getLogger(ExperimentRegistry.class); public ExperimentRegistry(GatewayResource gateway, UserResource user) throws RegistryException { gatewayResource = gateway; if (!gatewayResource.isExists(ResourceType.GATEWAY_WORKER, user.getUserName())) { workerResource = ExpCatResourceUtils.addGatewayWorker(gateway, user); } else { workerResource = (WorkerResource) ExpCatResourceUtils.getWorker(gateway.getGatewayId(), user.getUserName()); } } //CPI Add Methods public String addExperiment(ExperimentModel experiment) throws RegistryException { String experimentId; try { if (!ExpCatResourceUtils.isUserExist(experiment.getUserName(), experiment.getGatewayId())) { ExpCatResourceUtils.addUser(experiment.getUserName(), null, experiment.getGatewayId()); } if (!workerResource.isProjectExists(experiment.getProjectId())) { logger.error("Project does not exist in the system.."); throw new Exception("Project does not exist in the system, Please create the project first..."); } experimentId = AiravataUtils.getId(experiment.getExperimentName()); experiment.setExperimentId(experimentId); ExperimentResource experimentResource = new ExperimentResource(); experimentResource.setExperimentId(experimentId); experimentResource.setProjectId(experiment.getProjectId()); experimentResource.setGatewayId(experiment.getGatewayId()); experimentResource.setExperimentType(experiment.getExperimentType().toString()); experimentResource.setUserName(experiment.getUserName()); experimentResource.setExperimentName(experiment.getExperimentName()); experimentResource.setCreationTime(AiravataUtils.getTime(experiment.getCreationTime())); experimentResource.setDescription(experiment.getDescription()); experimentResource.setExecutionId(experiment.getExecutionId()); experimentResource.setGatewayExecutionId(experiment.getGatewayExecutionId()); experimentResource.setGatewayInstanceId(experiment.getGatewayInstanceId()); if(experiment.isEnableEmailNotification()){ experimentResource.setEnableEmailNotification(true); if(experiment.getEmailAddresses() != null){ experimentResource.setEmailAddresses(StringUtils.join(experiment.getEmailAddresses(), ",")); } }else{ experimentResource.setEnableEmailNotification(false); } experimentResource.save(); if(experiment.getUserConfigurationData() != null) { addUserConfigData(experiment.getUserConfigurationData(), experimentId); } if(experiment.getExperimentInputs() != null && experiment.getExperimentInputs().size() > 0) { addExpInputs(experiment.getExperimentInputs(), experimentId); } if(experiment.getExperimentOutputs() != null && experiment.getExperimentOutputs().size() > 0) { addExpOutputs(experiment.getExperimentOutputs(), experimentId); } ExperimentStatus experimentStatus = new ExperimentStatus(); experimentStatus.setState(ExperimentState.CREATED); experimentStatus.setTimeOfStateChange(AiravataUtils.getCurrentTimestamp().getTime()); addExperimentStatus(experimentStatus, experimentId); List<ErrorModel> errors = experiment.getErrors(); if (errors != null && !errors.isEmpty()) { for (ErrorModel errror : errors) { addExperimentError(errror, experimentId); } } } catch (Exception e) { logger.error("Error while saving experiment to registry", e); throw new RegistryException(e); } return experimentId; } public String addUserConfigData(UserConfigurationDataModel configurationData, String experimentId) throws RegistryException { try { UserConfigurationDataResource configDataResource = new UserConfigurationDataResource(); configDataResource.setExperimentId(experimentId); configDataResource.setAiravataAutoSchedule(configurationData.isAiravataAutoSchedule()); configDataResource.setOverrideManualScheduledParams(configurationData.isOverrideManualScheduledParams()); configDataResource.setShareExperimentPublically(configurationData.isShareExperimentPublicly()); configDataResource.setThrottleResources(configurationData.isThrottleResources()); configDataResource.setUserDn(configurationData.getUserDN()); configDataResource.setGenerateCert(configurationData.isGenerateCert()); configDataResource.setResourceHostId(configurationData.getComputationalResourceScheduling().getResourceHostId()); configDataResource.setTotalCpuCount(configurationData.getComputationalResourceScheduling().getTotalCPUCount()); configDataResource.setNodeCount(configurationData.getComputationalResourceScheduling().getNodeCount()); configDataResource.setNumberOfThreads(configurationData.getComputationalResourceScheduling().getNumberOfThreads()); configDataResource.setQueueName(configurationData.getComputationalResourceScheduling().getQueueName()); configDataResource.setWallTimeLimit(configurationData.getComputationalResourceScheduling().getWallTimeLimit()); configDataResource.setTotalPhysicalMemory(configurationData.getComputationalResourceScheduling().getTotalPhysicalMemory()); configDataResource.setStaticWorkingDir(configurationData.getComputationalResourceScheduling().getStaticWorkingDir()); configDataResource.setStorageId(configurationData.getStorageId()); configDataResource.setExperimentDataDir(configurationData.getExperimentDataDir()); configDataResource.setUseUserCRPref(configurationData.isUseUserCRPref()); configDataResource.setOverrideLoginUserName(configurationData.getComputationalResourceScheduling().getOverrideLoginUserName()); configDataResource.setOverrideScratchLocation(configurationData.getComputationalResourceScheduling().getOverrideScratchLocation()); configDataResource.setOverrideAllocationProjectNumber(configurationData.getComputationalResourceScheduling().getOverrideAllocationProjectNumber()); configDataResource.save(); } catch (Exception e) { logger.error("Unable to save user config data", e); throw new RegistryException(e); } return experimentId; } public String addExpInputs(List<InputDataObjectType> exInputs, String experimentId) throws RegistryException { try { for (InputDataObjectType input : exInputs) { ExperimentInputResource resource = new ExperimentInputResource(); resource.setExperimentId(experimentId); resource.setInputName(input.getName()); resource.setInputValue(input.getValue()); if (input.getType() != null) { resource.setDataType(input.getType().toString()); } resource.setMetadata(input.getMetaData()); resource.setApplicationArgument(input.getApplicationArgument()); resource.setInputOrder(input.getInputOrder()); resource.setIsRequired(input.isIsRequired()); resource.setRequiredToAddedToCmd(input.isRequiredToAddedToCommandLine()); resource.setStorageResourceId(input.getStorageResourceId()); resource.setIsReadOnly(input.isIsReadOnly()); resource.save(); } } catch (Exception e) { logger.error("Unable to save experiment inputs", e); throw new RegistryException(e); } return experimentId; } public String addExpOutputs(List<OutputDataObjectType> exOutput, String expId) throws RegistryException { try { for (OutputDataObjectType output : exOutput) { ExperimentOutputResource resource = new ExperimentOutputResource(); resource.setExperimentId(expId); resource.setOutputName(output.getName()); resource.setOutputValue(output.getValue()); if (output.getType() != null) { resource.setDataType(output.getType().toString()); } resource.setApplicationArgument(output.getApplicationArgument()); resource.setIsRequired(output.isIsRequired()); resource.setRequiredToAddedToCmd(output.isRequiredToAddedToCommandLine()); resource.setDataMovement(output.isDataMovement()); resource.setLocation(output.getLocation()); resource.setSearchQuery(output.getSearchQuery()); resource.setOutputStreaming(output.isOutputStreaming()); resource.setStorageResourceId(output.getStorageResourceId()); resource.save(); } } catch (Exception e) { logger.error("Error while adding experiment outputs...", e); throw new RegistryException(e); } return expId; } public String addExperimentStatus(ExperimentStatus experimentStatus, String expId) throws RegistryException { try { ExperimentResource experiment = new ExperimentResource(); experiment.setExperimentId(expId); ExperimentStatusResource status = experiment.getExperimentStatus(); ExperimentState newState = experimentStatus.getState(); if (status == null) { status = (ExperimentStatusResource) experiment.create(ResourceType.EXPERIMENT_STATUS); status.setStatusId(getStatusID("EXPERIMENT_STATE")); }else { String state = status.getState(); if (newState != null && !state.equals(newState.toString())){ status.setStatusId(getStatusID("EXPERIMENT_STATE")); } } status.setExperimentId(expId); status.setTimeOfStateChange(AiravataUtils.getTime(experimentStatus.getTimeOfStateChange())); if (newState != null){ status.setState(newState.toString()); } status.setReason(experimentStatus.getReason()); status.save(); logger.debug(expId, "Added experiment {} status to {}.", expId, experimentStatus.toString()); } catch (Exception e) { logger.error(expId, "Error while adding experiment status...", e); throw new RegistryException(e); } return expId; } public String addExperimentError(ErrorModel experimentError, String expId) throws RegistryException { try { ExperimentErrorResource error = new ExperimentErrorResource(); if (experimentError.getErrorId() == null){ error.setErrorId(AiravataUtils.getId("EXP_ERROR")); }else { error.setErrorId(experimentError.getErrorId()); } error.setExperimentId(expId); error.setCreationTime(AiravataUtils.getTime(experimentError.getCreationTime())); error.setActualErrorMessage(experimentError.getActualErrorMessage()); error.setUserFriendlyMessage(experimentError.getUserFriendlyMessage()); error.setTransientOrPersistent(experimentError.isTransientOrPersistent()); if(experimentError.getRootCauseErrorIdList() != null) { error.setRootCauseErrorIdList(StringUtils.join(experimentError.getRootCauseErrorIdList(), ",")); } error.save(); } catch (Exception e) { logger.error(expId, "Error while updating experiment status...", e); throw new RegistryException(e); } return expId; } public String addProcess(ProcessModel process, String expId) throws RegistryException { try { ProcessResource processResource = new ProcessResource(); String processId = AiravataUtils.getId("PROCESS"); process.setProcessId(processId); processResource.setProcessId(processId); processResource.setExperimentId(expId); processResource.setCreationTime(AiravataUtils.getTime(process.getCreationTime())); processResource.setLastUpdateTime(AiravataUtils.getTime(process.getLastUpdateTime())); processResource.setProcessDetail(process.getProcessDetail()); processResource.setApplicationInterfaceId(process.getApplicationInterfaceId()); processResource.setTaskDag(process.getTaskDag()); processResource.setGatewayExecutionId(process.getGatewayExecutionId()); processResource.setComputeResourceId(process.getComputeResourceId()); processResource.setApplicationInterfaceId(process.getApplicationInterfaceId()); processResource.setStorageResourceId(process.getStorageResourceId()); processResource.setUserDn(process.getUserDn()); processResource.setGenerateCert(process.isGenerateCert()); processResource.setExperimentDataDir(process.getExperimentDataDir()); processResource.setUserName(process.getUserName()); processResource.setUseUserCRPref(process.isUseUserCRPref()); if(process.isEnableEmailNotification()){ processResource.setEnableEmailNotification(true); if(process.getEmailAddresses() != null){ processResource.setEmailAddresses(StringUtils.join(process.getEmailAddresses(), ",")); } }else{ processResource.setEnableEmailNotification(false); } processResource.save(); if(process.getProcessResourceSchedule() != null) { addProcessResourceSchedule(process.getProcessResourceSchedule(), process.getProcessId()); } if(process.getProcessInputs() != null && process.getProcessInputs().size() > 0) { addProcessInputs(process.getProcessInputs(), process.getProcessId()); } if(process.getProcessOutputs() != null && process.getProcessOutputs().size() > 0) { addProcessOutputs(process.getProcessOutputs(), process.getProcessId()); } ProcessStatus processStatus = new ProcessStatus(); processStatus.setState(ProcessState.CREATED); List<ProcessStatus> processStatuses = new ArrayList<>(); processStatuses.add(processStatus); addProcessStatus(processStatuses.get(0), process.getProcessId()); if(process.getProcessErrors() != null) { addProcessError(process.getProcessErrors().get(0), process.getProcessId()); } } catch (Exception e) { logger.error(expId, "Error while adding process...", e); throw new RegistryException(e); } return process.getProcessId(); } public String addProcessResourceSchedule(ComputationalResourceSchedulingModel resourceSchedule, String processID) throws RegistryException { try { ProcessResourceScheduleResource processResourceSchedule = new ProcessResourceScheduleResource(); processResourceSchedule.setProcessId(processID); processResourceSchedule.setResourceHostId(resourceSchedule.getResourceHostId()); processResourceSchedule.setTotalCpuCount(resourceSchedule.getTotalCPUCount()); processResourceSchedule.setNodeCount(resourceSchedule.getNodeCount()); processResourceSchedule.setNumberOfThreads(resourceSchedule.getNumberOfThreads()); processResourceSchedule.setQueueName(resourceSchedule.getQueueName()); processResourceSchedule.setWallTimeLimit(resourceSchedule.getWallTimeLimit()); processResourceSchedule.setTotalPhysicalMemory(resourceSchedule.getTotalPhysicalMemory()); processResourceSchedule.setOverrideAllocationProjectNumber(resourceSchedule.getOverrideAllocationProjectNumber()); processResourceSchedule.setOverrideLoginUserName(resourceSchedule.getOverrideLoginUserName()); processResourceSchedule.setOverrideScratchLocation(resourceSchedule.getOverrideScratchLocation()); processResourceSchedule.setStaticWorkingDir(resourceSchedule.getStaticWorkingDir()); processResourceSchedule.save(); } catch (Exception e) { logger.error("Unable to save user config data", e); throw new RegistryException(e); } return processID; } public String addProcessInputs(List<InputDataObjectType> processInputs, String processID) throws RegistryException { try { for (InputDataObjectType input : processInputs) { ProcessInputResource resource = new ProcessInputResource(); resource.setProcessId(processID); resource.setInputName(input.getName()); resource.setInputValue(input.getValue()); if (input.getType() != null) { resource.setDataType(input.getType().toString()); } resource.setMetadata(input.getMetaData()); resource.setApplicationArgument(input.getApplicationArgument()); resource.setInputOrder(input.getInputOrder()); resource.setIsRequired(input.isIsRequired()); resource.setRequiredToAddedToCmd(input.isRequiredToAddedToCommandLine()); resource.setStorageResourceId(input.getStorageResourceId()); resource.setIsReadOnly(input.isIsReadOnly()); resource.save(); } return processID; } catch (Exception e) { logger.error("Unable to save process inputs", e); throw new RegistryException(e); } } public String addProcessOutputs(List<OutputDataObjectType> processOutput, String processID) throws RegistryException { try { for (OutputDataObjectType output : processOutput) { ProcessOutputResource resource = new ProcessOutputResource(); resource.setProcessId(processID); resource.setOutputName(output.getName()); resource.setOutputValue(output.getValue()); if (output.getType() != null) { resource.setDataType(output.getType().toString()); } resource.setApplicationArgument(output.getApplicationArgument()); resource.setIsRequired(output.isIsRequired()); resource.setRequiredToAddedToCmd(output.isRequiredToAddedToCommandLine()); resource.setDataMovement(output.isDataMovement()); resource.setLocation(output.getLocation()); resource.setSearchQuery(output.getSearchQuery()); resource.setOutputStreaming(output.isOutputStreaming()); resource.setStorageResourceId(output.getStorageResourceId()); resource.save(); } return processID; } catch (Exception e) { logger.error("Error while adding process outputs...", e); throw new RegistryException(e); } } public String addProcessStatus(ProcessStatus processStatus, String processID) throws RegistryException { try { ProcessResource processResource = new ProcessResource(); processResource.setProcessId(processID); ProcessStatusResource status = processResource.getProcessStatus(); ProcessState newState = processStatus.getState(); if (status == null) { status = (ProcessStatusResource) processResource.create(ResourceType.PROCESS_STATUS); status.setStatusId(getStatusID("PROCESS_STATE")); }else { String state = status.getState(); if (newState != null && !state.equals(newState.toString())){ status.setStatusId(getStatusID("PROCESS_STATE")); } } status.setProcessId(processID); status.setTimeOfStateChange(AiravataUtils.getTime(processStatus.getTimeOfStateChange())); if (newState != null){ status.setState(newState.toString()); } status.setReason(processStatus.getReason()); status.save(); logger.debug(processID, "Added process {} status to {}.", processID, processStatus.toString()); } catch (Exception e) { logger.error(processID, "Error while adding process status...", e); throw new RegistryException(e); } return processID; } public String addProcessError(ErrorModel processError, String processID) throws RegistryException { try { ProcessErrorResource error = new ProcessErrorResource(); error.setProcessId(processID); if (processError.getErrorId() == null){ error.setErrorId(AiravataUtils.getId("PROCESS_ERROR")); }else { error.setErrorId(processError.getErrorId()); } error.setCreationTime(AiravataUtils.getTime(processError.getCreationTime())); error.setActualErrorMessage(processError.getActualErrorMessage()); error.setUserFriendlyMessage(processError.getUserFriendlyMessage()); error.setTransientOrPersistent(processError.isTransientOrPersistent()); if(processError.getRootCauseErrorIdList() != null) { error.setRootCauseErrorIdList(StringUtils.join(processError.getRootCauseErrorIdList(), ",")); } error.save(); } catch (Exception e) { logger.error(processID, "Error while adding process status...", e); throw new RegistryException(e); } return processID; } public String addTask(TaskModel task, String processID) throws RegistryException { try { TaskResource taskResource = new TaskResource(); task.setTaskId(AiravataUtils.getId("TASK")); taskResource.setTaskId(task.getTaskId()); taskResource.setParentProcessId(task.getParentProcessId()); taskResource.setTaskType(task.getTaskType().toString()); taskResource.setCreationTime(AiravataUtils.getTime(task.getCreationTime())); taskResource.setLastUpdateTime(AiravataUtils.getTime(task.getLastUpdateTime())); taskResource.setTaskDetail(task.getTaskDetail()); taskResource.setSubTaskModel(task.getSubTaskModel()); taskResource.save(); TaskStatus taskStatus = new TaskStatus(); taskStatus.setState(TaskState.CREATED); taskStatus.setTimeOfStateChange(AiravataUtils.getCurrentTimestamp().getTime()); addTaskStatus(taskStatus, task.getTaskId()); if(task.getTaskErrors() != null) { addTaskError(task.getTaskErrors().get(0), task.getTaskId()); } } catch (Exception e) { logger.error(processID, "Error while adding task...", e); throw new RegistryException(e); } return task.getTaskId(); } public String addTaskStatus(TaskStatus taskStatus, String taskID) throws RegistryException { try { TaskResource taskResource = new TaskResource(); taskResource.setTaskId(taskID); TaskStatusResource status = taskResource.getTaskStatus(); TaskState newState = taskStatus.getState(); if (status == null) { status = (TaskStatusResource) taskResource.create(ResourceType.TASK_STATUS); status.setStatusId(getStatusID("TASK_STATE")); }else { String state = status.getState(); if (newState != null && !state.equals(newState.toString())){ status.setStatusId(getStatusID("TASK_STATE")); } } status.setTaskId(taskID); status.setTimeOfStateChange(AiravataUtils.getTime(taskStatus.getTimeOfStateChange())); if (newState != null){ status.setState(newState.toString()); } status.setReason(taskStatus.getReason()); status.save(); logger.debug(taskID, "Added task {} status to {}.", taskID, taskStatus.toString()); } catch (Exception e) { logger.error(taskID, "Error while adding task status...", e); throw new RegistryException(e); } return taskID; } public String addTaskError(ErrorModel taskError, String taskId) throws RegistryException { try { TaskErrorResource error = new TaskErrorResource(); error.setTaskId(taskId); if (taskError.getErrorId() == null){ error.setErrorId(AiravataUtils.getId("TASK_ERROR")); }else { error.setErrorId(taskError.getErrorId()); } error.setCreationTime(AiravataUtils.getTime(taskError.getCreationTime())); error.setActualErrorMessage(taskError.getActualErrorMessage()); error.setUserFriendlyMessage(taskError.getUserFriendlyMessage()); error.setTransientOrPersistent(taskError.isTransientOrPersistent()); if(taskError.getRootCauseErrorIdList() != null) { error.setRootCauseErrorIdList(StringUtils.join(taskError.getRootCauseErrorIdList(), ",")); } error.save(); } catch (Exception e) { logger.error(taskId, "Error while adding task status...", e); throw new RegistryException(e); } return taskId; } public String addJob(JobModel job, String processId) throws RegistryException { try { JobResource jobResource = new JobResource(); jobResource.setJobId(job.getJobId()); jobResource.setProcessId(processId); jobResource.setTaskId(job.getTaskId()); jobResource.setJobDescription(job.getJobDescription()); jobResource.setCreationTime(AiravataUtils.getTime(job.getCreationTime())); jobResource.setComputeResourceConsumed(job.getComputeResourceConsumed()); jobResource.setJobName(job.getJobName()); jobResource.setWorkingDir(job.getWorkingDir()); jobResource.setExitCode(job.getExitCode()); jobResource.setStdOut(job.getStdOut()); jobResource.setStdErr(job.getStdErr()); jobResource.save(); } catch (Exception e) { logger.error(processId, "Error while adding task...", e); throw new RegistryException(e); } return processId; } public String addJobStatus(JobStatus jobStatus, CompositeIdentifier cis) throws RegistryException { String taskId = (String)cis.getTopLevelIdentifier(); String jobID = (String)cis.getSecondLevelIdentifier(); try { JobResource jobResource = new JobResource(); jobResource.setJobId(jobID); JobStatusResource status = jobResource.getJobStatus(); if (status == null) { status = new JobStatusResource(); } status.setStatusId(getStatusID(jobID)); status.setJobId(jobID); status.setTaskId(taskId); status.setTimeOfStateChange(AiravataUtils.getTime(jobStatus.getTimeOfStateChange())); status.setState(jobStatus.getJobState().toString()); status.setReason(jobStatus.getReason()); status.save(); logger.debug(jobID, "Added job {} status to {}.", jobID, jobStatus.toString()); } catch (Exception e) { logger.error(jobID, "Error while adding job status...", e); throw new RegistryException(e); } return jobID; } //CPI Update Methods public void updateExperiment(ExperimentModel experiment, String expId) throws RegistryException { try { if (!workerResource.isProjectExists(experiment.getProjectId())) { logger.error("Project does not exist in the system.."); throw new Exception("Project does not exist in the system, Please create the project first..."); } ExperimentResource existingExperiment = gatewayResource.getExperiment(expId); existingExperiment.setExperimentName(experiment.getExperimentName()); existingExperiment.setUserName(experiment.getUserName()); existingExperiment.setGatewayId(experiment.getGatewayId()); existingExperiment.setGatewayExecutionId(experiment.getGatewayExecutionId()); existingExperiment.setGatewayInstanceId(experiment.getGatewayInstanceId()); existingExperiment.setProjectId(experiment.getProjectId()); existingExperiment.setCreationTime(AiravataUtils.getTime(experiment.getCreationTime())); existingExperiment.setDescription(experiment.getDescription()); existingExperiment.setExecutionId(experiment.getExecutionId()); if(experiment.isEnableEmailNotification()){ existingExperiment.setEnableEmailNotification(true); if(experiment.getEmailAddresses() != null){ existingExperiment.setEmailAddresses(StringUtils.join(experiment.getEmailAddresses(), ",")); } }else{ existingExperiment.setEnableEmailNotification(false); } existingExperiment.save(); UserConfigurationDataModel userConfigurationData = experiment.getUserConfigurationData(); if (userConfigurationData != null) { updateUserConfigData(userConfigurationData, expId); } List<InputDataObjectType> experimentInputs = experiment.getExperimentInputs(); if (experimentInputs != null && !experimentInputs.isEmpty()) { updateExpInputs(experimentInputs, expId); } List<OutputDataObjectType> experimentOutputs = experiment.getExperimentOutputs(); if (experimentOutputs != null && !experimentOutputs.isEmpty()) { updateExpOutputs(experimentOutputs, expId); } List<ExperimentStatus> experimentStatuses = experiment.getExperimentStatus(); if (experimentStatuses != null && experimentStatuses.size() > 0) { if (experimentStatuses.get(0) != null) { updateExperimentStatus(experimentStatuses.get(0), expId); } } List<ErrorModel> errors = experiment.getErrors(); if (errors != null && !errors.isEmpty()) { for (ErrorModel errror : errors) { updateExperimentError(errror, expId); } } } catch (Exception e) { logger.error("Error while updating experiment...", e); throw new RegistryException(e); } } public void updateExpInputs(List<InputDataObjectType> exInputs, String expID) throws RegistryException { try { ExperimentResource experimentResource = new ExperimentResource(); experimentResource.setExperimentId(expID); List<ExperimentInputResource> experimentInputs = experimentResource.getExperimentInputs(); for (InputDataObjectType input : exInputs) { for (ExperimentInputResource exinput : experimentInputs) { if (exinput.getInputName().equals(input.getName())) { exinput.setInputValue(input.getValue()); exinput.setExperimentId(expID); if (input.getType() != null) { exinput.setDataType(input.getType().toString()); } exinput.setMetadata(input.getMetaData()); exinput.setApplicationArgument(input.getApplicationArgument()); exinput.setInputOrder(input.getInputOrder()); exinput.setIsRequired(input.isIsRequired()); exinput.setRequiredToAddedToCmd(input.isRequiredToAddedToCommandLine()); exinput.setStorageResourceId(input.getStorageResourceId()); exinput.setIsReadOnly(input.isIsReadOnly()); exinput.save(); } } } } catch (Exception e) { logger.error("Unable to update experiment inputs", e); throw new RegistryException(e); } } public void updateExpOutputs(List<OutputDataObjectType> exOutput, String expId) throws RegistryException { try { ExperimentResource experiment = gatewayResource.getExperiment(expId); List<ExperimentOutputResource> existingExpOutputs = experiment.getExperimentOutputs(); for (OutputDataObjectType output : exOutput) { for (ExperimentOutputResource resource : existingExpOutputs) { if (resource.getOutputName().equals(output.getName())) { resource.setExperimentId(expId); resource.setOutputName(output.getName()); resource.setOutputValue(output.getValue()); if (output.getType() != null) { resource.setDataType(output.getType().toString()); } resource.setIsRequired(output.isIsRequired()); resource.setRequiredToAddedToCmd(output.isRequiredToAddedToCommandLine()); resource.setDataMovement(output.isDataMovement()); resource.setLocation(output.getLocation()); resource.setApplicationArgument(output.getApplicationArgument()); resource.setSearchQuery(output.getSearchQuery()); resource.setOutputStreaming(output.isOutputStreaming()); resource.setStorageResourceId(output.getStorageResourceId()); resource.save(); } } } } catch (Exception e) { logger.error("Error while updating experiment outputs", e); throw new RegistryException(e); } } public String updateExperimentStatus(ExperimentStatus experimentStatus, String expId) throws RegistryException { return addExperimentStatus(experimentStatus, expId); } public String updateExperimentError(ErrorModel experimentError, String expId) throws RegistryException { return addExperimentError(experimentError, expId); } public String updateUserConfigData(UserConfigurationDataModel configurationData, String experimentId) throws RegistryException { try { ExperimentResource experimentResource = new ExperimentResource(); experimentResource.setExperimentId(experimentId); UserConfigurationDataResource configDataResource = experimentResource.getUserConfigurationDataResource(); configDataResource.setExperimentId(experimentId); configDataResource.setAiravataAutoSchedule(configurationData.isAiravataAutoSchedule()); configDataResource.setOverrideManualScheduledParams(configurationData.isOverrideManualScheduledParams()); configDataResource.setShareExperimentPublically(configurationData.isShareExperimentPublicly()); configDataResource.setThrottleResources(configurationData.isThrottleResources()); configDataResource.setUserDn(configurationData.getUserDN()); configDataResource.setGenerateCert(configurationData.isGenerateCert()); configDataResource.setStorageId(configurationData.getStorageId()); configDataResource.setResourceHostId(configurationData.getComputationalResourceScheduling().getResourceHostId()); configDataResource.setTotalCpuCount(configurationData.getComputationalResourceScheduling().getTotalCPUCount()); configDataResource.setNodeCount(configurationData.getComputationalResourceScheduling().getNodeCount()); configDataResource.setNumberOfThreads(configurationData.getComputationalResourceScheduling().getNumberOfThreads()); configDataResource.setQueueName(configurationData.getComputationalResourceScheduling().getQueueName()); configDataResource.setWallTimeLimit(configurationData.getComputationalResourceScheduling().getWallTimeLimit()); configDataResource.setTotalPhysicalMemory(configurationData.getComputationalResourceScheduling().getTotalPhysicalMemory()); configDataResource.setStaticWorkingDir(configurationData.getComputationalResourceScheduling().getStaticWorkingDir()); configDataResource.setExperimentDataDir(configurationData.getExperimentDataDir()); configDataResource.setUseUserCRPref(configurationData.isUseUserCRPref()); configDataResource.setOverrideLoginUserName(configurationData.getComputationalResourceScheduling().getOverrideLoginUserName()); configDataResource.setOverrideScratchLocation(configurationData.getComputationalResourceScheduling().getOverrideScratchLocation()); configDataResource.setOverrideAllocationProjectNumber(configurationData.getComputationalResourceScheduling().getOverrideAllocationProjectNumber()); configDataResource.save(); } catch (Exception e) { logger.error("Unable to save user config data", e); throw new RegistryException(e); } return experimentId; } public void updateProcess(ProcessModel process, String processId) throws RegistryException { try { ExperimentResource experimentResource = new ExperimentResource(); ProcessResource processResource = experimentResource.getProcess(processId); processResource.setProcessId(process.getProcessId()); processResource.setExperimentId(process.getExperimentId()); processResource.setCreationTime(AiravataUtils.getTime(process.getCreationTime())); processResource.setLastUpdateTime(AiravataUtils.getTime(process.getLastUpdateTime())); processResource.setProcessDetail(process.getProcessDetail()); processResource.setApplicationInterfaceId(process.getApplicationInterfaceId()); processResource.setTaskDag(process.getTaskDag()); processResource.setGatewayExecutionId(process.getGatewayExecutionId()); processResource.setComputeResourceId(process.getComputeResourceId()); processResource.setApplicationDeploymentId(process.getApplicationDeploymentId()); processResource.setStorageResourceId(process.getStorageResourceId()); processResource.setUserDn(process.getUserDn()); processResource.setGenerateCert(process.isGenerateCert()); processResource.setExperimentDataDir(process.getExperimentDataDir()); processResource.setUserName(process.getUserName()); processResource.setUseUserCRPref(process.isUseUserCRPref()); if(process.isEnableEmailNotification()){ processResource.setEnableEmailNotification(true); if(process.getEmailAddresses() != null){ processResource.setEmailAddresses(StringUtils.join(process.getEmailAddresses(), ",")); } }else{ processResource.setEnableEmailNotification(false); } processResource.save(); if(process.getProcessResourceSchedule() != null) { updateProcessResourceSchedule(process.getProcessResourceSchedule(), process.getProcessId()); } if(process.getProcessInputs() != null && process.getProcessInputs().size() > 0) { updateProcessInputs(process.getProcessInputs(), process.getProcessId()); } if(process.getProcessOutputs() != null && process.getProcessOutputs().size() > 0) { updateProcessOutputs(process.getProcessOutputs(), process.getProcessId()); } if(process.getProcessStatuses() != null) { updateProcessStatus(process.getProcessStatuses().get(0), process.getProcessId()); } if(process.getProcessErrors() != null) { updateProcessError(process.getProcessErrors().get(0), process.getProcessId()); } if(process.getTasks() != null && process.getTasks().size() > 0){ for(TaskModel task : process.getTasks()){ updateTask(task, task.getTaskId()); } } } catch (Exception e) { logger.error("Error while updating process...", e); throw new RegistryException(e); } } public String updateProcessResourceSchedule(ComputationalResourceSchedulingModel resourceSchedule, String processID) throws RegistryException { try { ProcessResource processResource = new ProcessResource(); processResource.setProcessId(processID); ProcessResourceScheduleResource processResourceSchedule = processResource.getProcessResourceSchedule(); processResourceSchedule.setProcessId(processID); processResourceSchedule.setResourceHostId(resourceSchedule.getResourceHostId()); processResourceSchedule.setTotalCpuCount(resourceSchedule.getTotalCPUCount()); processResourceSchedule.setNodeCount(resourceSchedule.getNodeCount()); processResourceSchedule.setNumberOfThreads(resourceSchedule.getNumberOfThreads()); processResourceSchedule.setQueueName(resourceSchedule.getQueueName()); processResourceSchedule.setWallTimeLimit(resourceSchedule.getWallTimeLimit()); processResourceSchedule.setTotalPhysicalMemory(resourceSchedule.getTotalPhysicalMemory()); processResourceSchedule.setOverrideAllocationProjectNumber(resourceSchedule.getOverrideAllocationProjectNumber()); processResourceSchedule.setOverrideLoginUserName(resourceSchedule.getOverrideLoginUserName()); processResourceSchedule.setOverrideScratchLocation(resourceSchedule.getOverrideScratchLocation()); processResourceSchedule.setStaticWorkingDir(resourceSchedule.getStaticWorkingDir()); processResourceSchedule.save(); } catch (Exception e) { logger.error("Unable to save process resource schedule data", e); throw new RegistryException(e); } return processID; } public void updateProcessInputs(List<InputDataObjectType> processInputs, String processID) throws RegistryException { try { ProcessResource processResource = new ProcessResource(); processResource.setProcessId(processID); List<ProcessInputResource> existingProcessInputs = processResource.getProcessInputs(); for (InputDataObjectType input : processInputs) { for (ProcessInputResource exinput : existingProcessInputs) { if (exinput.getInputName().equals(input.getName())) { exinput.setProcessId(processID); exinput.setInputValue(input.getValue()); if (input.getType() != null) { exinput.setDataType(input.getType().toString()); } exinput.setMetadata(input.getMetaData()); exinput.setApplicationArgument(input.getApplicationArgument()); exinput.setInputOrder(input.getInputOrder()); exinput.setIsRequired(input.isIsRequired()); exinput.setRequiredToAddedToCmd(input.isRequiredToAddedToCommandLine()); exinput.setStorageResourceId(input.getStorageResourceId()); exinput.setIsReadOnly(input.isIsReadOnly()); exinput.save(); } } } } catch (Exception e) { logger.error("Unable to update experiment inputs", e); throw new RegistryException(e); } } public void updateProcessOutputs(List<OutputDataObjectType> processOutput, String processID) throws RegistryException { try { ProcessResource processResource = new ProcessResource(); processResource.setProcessId(processID); List<ProcessOutputResource> existingProcessOutputs = processResource.getProcessOutputs(); for (OutputDataObjectType output : processOutput) { for (ProcessOutputResource resource : existingProcessOutputs) { if (resource.getOutputName().equals(output.getName())) { resource.setProcessId(processID); resource.setOutputName(output.getName()); resource.setOutputValue(output.getValue()); if (output.getType() != null) { resource.setDataType(output.getType().toString()); } resource.setIsRequired(output.isIsRequired()); resource.setRequiredToAddedToCmd(output.isRequiredToAddedToCommandLine()); resource.setDataMovement(output.isDataMovement()); resource.setLocation(output.getLocation()); resource.setApplicationArgument(output.getApplicationArgument()); resource.setSearchQuery(output.getSearchQuery()); resource.setOutputStreaming(output.isOutputStreaming()); resource.setStorageResourceId(output.getStorageResourceId()); resource.save(); } } } } catch (Exception e) { logger.error("Error while updating process outputs", e); throw new RegistryException(e); } } public String updateProcessStatus(ProcessStatus processStatus, String processID) throws RegistryException { return addProcessStatus(processStatus, processID); } public String updateProcessError(ErrorModel processErrors, String processID) throws RegistryException { return addProcessError(processErrors, processID); } public String updateTask(TaskModel task, String taskID) throws RegistryException { try { ProcessResource processResource = new ProcessResource(); TaskResource taskResource = processResource.getTask(taskID); taskResource.setTaskId(task.getTaskId()); taskResource.setParentProcessId(task.getParentProcessId()); taskResource.setTaskType(task.getTaskType().toString()); taskResource.setCreationTime(AiravataUtils.getTime(task.getCreationTime())); taskResource.setLastUpdateTime(AiravataUtils.getTime(task.getLastUpdateTime())); taskResource.setTaskDetail(task.getTaskDetail()); taskResource.setSubTaskModel(task.getSubTaskModel()); taskResource.save(); if(task.getTaskErrors() != null) { updateTaskError(task.getTaskErrors().get(0), task.getTaskId()); } if(task.getTaskErrors() != null) { updateTaskError(task.getTaskErrors().get(0), task.getTaskId()); } } catch (Exception e) { logger.error(taskID, "Error while adding task...", e); throw new RegistryException(e); } return taskID; } public String updateTaskStatus(TaskStatus taskStatus, String taskID) throws RegistryException { return addTaskStatus(taskStatus, taskID); } public String updateTaskError(ErrorModel taskError, String taskID) throws RegistryException { return addTaskError(taskError, taskID); } public String updateJob(JobModel job, CompositeIdentifier cis) throws RegistryException { String taskId = (String) cis.getTopLevelIdentifier(); String jobId = (String) cis.getSecondLevelIdentifier(); try { TaskResource taskResource = new TaskResource(); taskResource.setTaskId(taskId); JobResource jobResource = taskResource.getJob(jobId); jobResource.setJobId(jobId); jobResource.setTaskId(job.getTaskId()); jobResource.setProcessId(job.getProcessId()); jobResource.setJobDescription(job.getJobDescription()); jobResource.setCreationTime(AiravataUtils.getTime(job.getCreationTime())); jobResource.setComputeResourceConsumed(job.getComputeResourceConsumed()); jobResource.setJobName(job.getJobName()); jobResource.setWorkingDir(job.getWorkingDir()); jobResource.setStdOut(job.getStdOut()); jobResource.setStdErr(job.getStdErr()); jobResource.setExitCode(job.getExitCode()); jobResource.save(); } catch (Exception e) { logger.error(jobId, "Error while adding job...", e); throw new RegistryException(e); } return jobId; } public String updateJobStatus(JobStatus jobStatus, CompositeIdentifier cis) throws RegistryException { return addJobStatus(jobStatus, cis); } public void updateExperimentField(String expID, String fieldName, Object value) throws RegistryException { try { ExperimentResource experiment = gatewayResource.getExperiment(expID); if (fieldName.equals(Constants.FieldConstants.ExperimentConstants.EXPERIMENT_NAME)) { experiment.setExperimentName((String) value); experiment.save(); } else if (fieldName.equals(Constants.FieldConstants.ExperimentConstants.USER_NAME)) { experiment.setUserName((String) value); experiment.save(); } else if (fieldName.equals(Constants.FieldConstants.ExperimentConstants.DESCRIPTION)) { experiment.setDescription((String) value); experiment.save(); } else { logger.error("Unsupported field type for Experiment"); } } catch (Exception e) { logger.error("Error while updating fields in experiment...", e); throw new RegistryException(e); } } public void updateUserConfigDataField(String expID, String fieldName, Object value) throws RegistryException { try { ExperimentResource experiment = new ExperimentResource(); experiment.setExperimentId(expID); UserConfigurationDataResource exConfigData = (UserConfigurationDataResource) experiment.get(ResourceType.USER_CONFIGURATION_DATA, expID); if (fieldName.equals(Constants.FieldConstants.UserConfigurationDataConstants.AIRAVATA_AUTO_SCHEDULE)) { exConfigData.setAiravataAutoSchedule((Boolean) value); exConfigData.save(); } else if (fieldName.equals(Constants.FieldConstants.UserConfigurationDataConstants.OVERRIDE_MANUAL_PARAMS)) { exConfigData.setOverrideManualScheduledParams((Boolean) value); exConfigData.save(); } else if (fieldName.equals(Constants.FieldConstants.UserConfigurationDataConstants.SHARE_EXP)) { exConfigData.setShareExperimentPublically((Boolean) value); exConfigData.save(); } else if (fieldName.equals(Constants.FieldConstants.UserConfigurationDataConstants.COMPUTATIONAL_RESOURCE_SCHEDULING)) { updateComputeResourceScheduling((ComputationalResourceSchedulingModel) value, expID); } else { logger.error("Unsupported field type for Experiment config data"); } } catch (Exception e) { logger.error("Error while updating fields in experiment config...", e); throw new RegistryException(e); } } public void updateComputeResourceScheduling(ComputationalResourceSchedulingModel value, String expID) throws RegistryException { ExperimentResource experiment = new ExperimentResource(); experiment.setExperimentId(expID); UserConfigurationDataResource configDataResource = experiment.getUserConfigurationDataResource(); configDataResource.setResourceHostId(value.getResourceHostId()); configDataResource.setTotalCpuCount(value.getTotalCPUCount()); configDataResource.setNodeCount(value.getNodeCount()); configDataResource.setNumberOfThreads(value.getNumberOfThreads()); configDataResource.setQueueName(value.getQueueName()); configDataResource.setWallTimeLimit(value.getWallTimeLimit()); configDataResource.setTotalPhysicalMemory(value.getTotalPhysicalMemory()); configDataResource.setStaticWorkingDir(value.getStaticWorkingDir()); configDataResource.setOverrideLoginUserName(value.getOverrideLoginUserName()); configDataResource.setOverrideScratchLocation(value.getOverrideScratchLocation()); configDataResource.setOverrideAllocationProjectNumber(value.getOverrideAllocationProjectNumber()); configDataResource.save(); } //CPI get methods public Object getExperiment(String expId, String fieldName) throws RegistryException { try { ExperimentResource resource = gatewayResource.getExperiment(expId); if (fieldName == null) { return ThriftDataModelConversion.getExperiment(resource); } else if (fieldName.equals(Constants.FieldConstants.ExperimentConstants.EXPERIMENT_INPUTS)) { return ThriftDataModelConversion.getExpInputs(resource.getExperimentInputs()); } else if (fieldName.equals(Constants.FieldConstants.ExperimentConstants.EXPERIMENT_OUTPUTS)) { return ThriftDataModelConversion.getExpOutputs(resource.getExperimentOutputs()); } else if (fieldName.equals(Constants.FieldConstants.ExperimentConstants.EXPERIMENT_STATUS)) { return ThriftDataModelConversion.getExperimentStatus(resource.getExperimentStatus()); } else if (fieldName.equals(Constants.FieldConstants.ExperimentConstants.EXPERIMENT_ERRORS)) { return ThriftDataModelConversion.getExperimentErrorList(resource.getExperimentErrors()); } else if (fieldName.equals(Constants.FieldConstants.ExperimentConstants.USER_CONFIGURATION_DATA)) { return ThriftDataModelConversion.getUserConfigData(resource.getUserConfigurationDataResource()); } else { logger.error("Unsupported field name for experiment data.."); } } catch (Exception e) { logger.error("Error while getting experiment info...", e); throw new RegistryException(e); } return null; } public Object getExperimentInputs(String expID) throws RegistryException { return getExperiment(expID, Constants.FieldConstants.ExperimentConstants.EXPERIMENT_INPUTS); } public Object getExperimentOutputs(String expID) throws RegistryException { return getExperiment(expID, Constants.FieldConstants.ExperimentConstants.EXPERIMENT_OUTPUTS); } public Object getExperimentErrors(String expID) throws RegistryException { return getExperiment(expID, Constants.FieldConstants.ExperimentConstants.EXPERIMENT_ERRORS); } public Object getExperimentStatus(String expID) throws RegistryException { return getExperiment(expID, Constants.FieldConstants.ExperimentConstants.EXPERIMENT_STATUS); } public Object getUserConfigData(String expId, String fieldName) throws RegistryException { try { ExperimentResource resource = gatewayResource.getExperiment(expId); UserConfigurationDataResource userConfigData = resource.getUserConfigurationDataResource(); if (fieldName == null) { return ThriftDataModelConversion.getUserConfigData(userConfigData); } else if (fieldName.equals(Constants.FieldConstants.UserConfigurationDataConstants.COMPUTATIONAL_RESOURCE_SCHEDULING)){ return ThriftDataModelConversion.getComputationalResourceScheduling(userConfigData); } else { logger.error("Unsupported field name for experiment configuration data.."); } } catch (Exception e) { logger.error("Error while getting config data..", e); throw new RegistryException(e); } return null; } public Object getProcess(String processId, String fieldName) throws RegistryException { try { ExperimentResource experimentResource = new ExperimentResource(); ProcessResource resource = experimentResource.getProcess(processId); if (fieldName == null) { return ThriftDataModelConversion.getProcessModel(resource); } else if (fieldName.equals(Constants.FieldConstants.ProcessConstants.PROCESS_ERROR)) { return ThriftDataModelConversion.getErrorModel(resource.getProcessError()); } else if (fieldName.equals(Constants.FieldConstants.ProcessConstants.PROCESS_STATUS)) { return ThriftDataModelConversion.getProcessStatus(resource.getProcessStatus()); } else if (fieldName.equals(Constants.FieldConstants.ProcessConstants.PROCESS_INPUTS)) { return ThriftDataModelConversion.getProcessInputs(resource.getProcessInputs()); } else if (fieldName.equals(Constants.FieldConstants.ProcessConstants.PROCESS_OUTPUTS)) { return ThriftDataModelConversion.getProcessOutputs(resource.getProcessOutputs()); } else if (fieldName.equals(Constants.FieldConstants.ProcessConstants.PROCESS_RESOURCE_SCHEDULE)) { return ThriftDataModelConversion.getProcessResourceSchedule(resource.getProcessResourceSchedule()); } else { logger.error("Unsupported field name for process data.."); } }catch (Exception e) { logger.error("Error while getting process data..", e); throw new RegistryException(e); } return null; } public Object getProcessError(String processId) throws RegistryException { return getProcess(processId, Constants.FieldConstants.ProcessConstants.PROCESS_ERROR); } public Object getProcessStatus(String processId) throws RegistryException { return getProcess(processId, Constants.FieldConstants.ProcessConstants.PROCESS_STATUS); } public Object getProcessInputs(String processId) throws RegistryException { return getProcess(processId, Constants.FieldConstants.ProcessConstants.PROCESS_INPUTS); } public Object getProcessOutputs(String processId) throws RegistryException { return getProcess(processId, Constants.FieldConstants.ProcessConstants.PROCESS_OUTPUTS); } public Object getProcessResourceSchedule(String processId) throws RegistryException { return getProcess(processId, Constants.FieldConstants.ProcessConstants.PROCESS_RESOURCE_SCHEDULE); } public Object getTask(String taskId, String fieldName) throws RegistryException { try { ProcessResource processResource = new ProcessResource(); TaskResource resource = processResource.getTask(taskId); if (fieldName == null) { return ThriftDataModelConversion.getTaskModel(resource); } else if (fieldName.equals(Constants.FieldConstants.TaskConstants.TASK_ERROR)) { return ThriftDataModelConversion.getErrorModel(resource.getTaskError()); } else if (fieldName.equals(Constants.FieldConstants.TaskConstants.TASK_STATUS)) { return ThriftDataModelConversion.getTaskStatus(resource.getTaskStatus()); } else { logger.error("Unsupported field name for task data.."); } }catch (Exception e) { logger.error("Error while getting task data..", e); throw new RegistryException(e); } return null; } public Object getTaskError(String taskId) throws RegistryException { return getTask(taskId, Constants.FieldConstants.TaskConstants.TASK_ERROR); } public Object getTaskStatus(String taskId) throws RegistryException { return getTask(taskId, Constants.FieldConstants.TaskConstants.TASK_STATUS); } public Object getJob(CompositeIdentifier cis, String fieldName) throws RegistryException { String taskId = (String) cis.getTopLevelIdentifier(); String jobId = (String) cis.getSecondLevelIdentifier(); try { TaskResource taskResource = new TaskResource(); taskResource.setTaskId(taskId); JobResource resource = taskResource.getJob(jobId); if (fieldName == null) { return ThriftDataModelConversion.getJobModel(resource); } else if (fieldName.equals(Constants.FieldConstants.JobConstants.JOB_STATUS)) { return ThriftDataModelConversion.getJobStatus(resource.getJobStatus()); } else { logger.error("Unsupported field name for job basic data.."); } }catch (Exception e) { logger.error("Error while getting job data..", e); throw new RegistryException(e); } return null; } public Object getJobStatus(CompositeIdentifier cis) throws RegistryException { return getJob(cis, Constants.FieldConstants.JobConstants.JOB_STATUS); } public List<ExperimentModel> getExperimentList(String fieldName, Object value) throws RegistryException { List<ExperimentModel> experiments = new ArrayList<ExperimentModel>(); try { if (fieldName.equals(Constants.FieldConstants.ExperimentConstants.USER_NAME)) { WorkerResource resource = (WorkerResource) gatewayResource.create(ResourceType.GATEWAY_WORKER); resource.setUser((String) value); List<ExperimentResource> resources = resource.getExperiments(); for (ExperimentResource experimentResource : resources) { ExperimentModel experiment = ThriftDataModelConversion.getExperiment(experimentResource); experiments.add(experiment); } return experiments; } else if (fieldName.equals(Constants.FieldConstants.ExperimentConstants.PROJECT_ID)) { ProjectResource project = workerResource.getProject((String) value); List<ExperimentResource> resources = project.getExperiments(); for (ExperimentResource resource : resources) { ExperimentModel experiment = ThriftDataModelConversion.getExperiment(resource); experiments.add(experiment); } return experiments; } else if (fieldName.equals(Constants.FieldConstants.ExperimentConstants.GATEWAY_ID)) { List<ExperimentResource> resources = gatewayResource.getExperiments(); for (ExperimentResource resource : resources) { ExperimentModel experiment = ThriftDataModelConversion.getExperiment(resource); experiments.add(experiment); } return experiments; } else { logger.error("Unsupported field name to retrieve experiment list..."); } } catch (Exception e) { logger.error("Error while getting experiment list...", e); throw new RegistryException(e); } return experiments; } public List<ProcessModel> getProcessList(String fieldName, Object value) throws RegistryException { List<ProcessModel> processes = new ArrayList<ProcessModel>(); try { if (fieldName.equals(Constants.FieldConstants.ProcessConstants.EXPERIMENT_ID)) { ExperimentResource experimentResource = new ExperimentResource(); experimentResource.setExperimentId((String) value); List<ProcessResource> resources = experimentResource.getProcessList(); for (ProcessResource processResource : resources) { ProcessModel processModel = ThriftDataModelConversion.getProcessModel(processResource); processes.add(processModel); } return processes; } else { logger.error("Unsupported field name to retrieve process list..."); } } catch (Exception e) { logger.error("Error while getting process list...", e); throw new RegistryException(e); } return processes; } public List<TaskModel> getTaskList(String fieldName, Object value) throws RegistryException { List<TaskModel> tasks = new ArrayList<TaskModel>(); try { if (fieldName.equals(Constants.FieldConstants.TaskConstants.PARENT_PROCESS_ID)) { ProcessResource processResource = new ProcessResource(); processResource.setProcessId((String) value); List<TaskResource> resources = processResource.getTaskList(); for (TaskResource taskResource : resources) { TaskModel taskModel = ThriftDataModelConversion.getTaskModel(taskResource); tasks.add(taskModel); } return tasks; } else { logger.error("Unsupported field name to retrieve task list..."); } } catch (Exception e) { logger.error("Error while getting task list...", e); throw new RegistryException(e); } return tasks; } public List<JobModel> getJobList(String fieldName, Object value) throws RegistryException { List<JobModel> jobs = new ArrayList<JobModel>(); try { if (fieldName.equals(Constants.FieldConstants.JobConstants.PROCESS_ID)) { ProcessResource processResource = new ProcessResource(); processResource.setProcessId((String) value); List<JobResource> resources = processResource.getJobList(); for (JobResource jobResource : resources) { JobModel jobModel = ThriftDataModelConversion.getJobModel(jobResource); JobStatusResource latestSR = jobResource.getJobStatus(); if (latestSR != null) { JobStatus jobStatus = new JobStatus(JobState.valueOf(latestSR.getState())); jobStatus.setReason(latestSR.getReason()); List<JobStatus> statuses = new ArrayList<>(); statuses.add(jobStatus); jobModel.setJobStatuses(statuses); } jobs.add(jobModel); } return jobs; }else if (fieldName.equals(Constants.FieldConstants.JobConstants.TASK_ID)) { TaskResource taskResource = new TaskResource(); taskResource.setTaskId((String) value); List<JobResource> resources = taskResource.getJobList(); for (JobResource jobResource : resources) { JobModel jobModel = ThriftDataModelConversion.getJobModel(jobResource); JobStatusResource latestSR = jobResource.getJobStatus(); if (latestSR != null) { JobStatus jobStatus = new JobStatus(JobState.valueOf(latestSR.getState())); jobStatus.setReason(latestSR.getReason()); List<JobStatus> statuses = new ArrayList<>(); statuses.add(jobStatus); jobModel.setJobStatuses(statuses); } jobs.add(jobModel); } return jobs; }else { logger.error("Unsupported field name to retrieve job list..."); } } catch (Exception e) { logger.error("Error while getting job list...", e); throw new RegistryException(e); } return jobs; } public List<ExperimentModel> getExperimentList(String fieldName, Object value, int limit, int offset, Object orderByIdentifier, ResultOrderType resultOrderType) throws RegistryException { List<ExperimentModel> experiments = new ArrayList<ExperimentModel>(); try { if (fieldName.equals(Constants.FieldConstants.ExperimentConstants.USER_NAME)) { WorkerResource resource = (WorkerResource) gatewayResource.create(ResourceType.GATEWAY_WORKER); resource.setUser((String) value); List<ExperimentResource> resources = resource.getExperiments(limit, offset, orderByIdentifier, resultOrderType); for (ExperimentResource experimentResource : resources) { ExperimentModel experiment = ThriftDataModelConversion.getExperiment(experimentResource); experiments.add(experiment); } return experiments; } else if (fieldName.equals(Constants.FieldConstants.ExperimentConstants.PROJECT_ID)) { ProjectResource project = workerResource.getProject((String) value); List<ExperimentResource> resources = project.getExperiments(limit, offset, Constants.FieldConstants.ExperimentConstants.CREATION_TIME, ResultOrderType.DESC); for (ExperimentResource resource : resources) { ExperimentModel experiment = ThriftDataModelConversion.getExperiment(resource); experiments.add(experiment); } return experiments; } logger.error("Unsupported field name to retrieve experiment list..."); } catch (Exception e) { logger.error("Error while getting experiment list...", e); throw new RegistryException(e); } return experiments; } //CPI Search Methods public List<ExperimentSummaryModel> searchExperiments(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<ExperimentSummaryModel> experimentSummaries = new ArrayList<>(); long fromTime = 0; long toTime = 0; try { for (String field : filters.keySet()) { if (field.equals(Constants.FieldConstants.ExperimentConstants.EXPERIMENT_NAME)) { fil.put(AbstractExpCatResource.ExperimentConstants.EXPERIMENT_NAME, filters.get(field)); } else if (field.equals(Constants.FieldConstants.ExperimentConstants.USER_NAME)) { fil.put(AbstractExpCatResource.ExperimentConstants.USER_NAME, filters.get(field)); } else if (field.equals(Constants.FieldConstants.ExperimentConstants.PROJECT_ID)) { fil.put(AbstractExpCatResource.ExperimentConstants.PROJECT_ID, filters.get(field)); } else if (field.equals(Constants.FieldConstants.ExperimentConstants.GATEWAY_ID)) { fil.put(AbstractExpCatResource.ExperimentConstants.GATEWAY_ID, filters.get(field)); } else if (field.equals(Constants.FieldConstants.ExperimentConstants.DESCRIPTION)) { fil.put(AbstractExpCatResource.ExperimentConstants.DESCRIPTION, filters.get(field)); } else if (field.equals(Constants.FieldConstants.ExperimentConstants.EXECUTION_ID)) { fil.put(AbstractExpCatResource.ExperimentConstants.EXECUTION_ID, filters.get(field)); } else if (field.equals(Constants.FieldConstants.ExperimentConstants.EXPERIMENT_STATUS)) { fil.put(AbstractExpCatResource.ExperimentStatusConstants.STATE, filters.get(field)); } else if (field.equals(Constants.FieldConstants.ExperimentConstants.FROM_DATE)) { fromTime = Long.parseLong(filters.get(field)); } else if (field.equals(Constants.FieldConstants.ExperimentConstants.TO_DATE)) { toTime = Long.parseLong(filters.get(field)); } } List<ExperimentSummaryResource> experimentSummaryResources; if (fromTime != 0 && toTime != 0) { experimentSummaryResources = workerResource.searchExperiments(null, new Timestamp(fromTime), new Timestamp(toTime), fil ,limit , offset, orderByIdentifier, resultOrderType); } else { experimentSummaryResources = workerResource .searchExperiments(null, null, null, fil, limit, offset, orderByIdentifier, resultOrderType); } if (experimentSummaryResources != null && !experimentSummaryResources.isEmpty()) { for (ExperimentSummaryResource ex : experimentSummaryResources) { experimentSummaries.add(ThriftDataModelConversion.getExperimentSummary(ex)); } } return experimentSummaries; } catch (Exception e) { logger.error("Error while retrieving experiment summary from registry", e); throw new RegistryException(e); } } return null; } public List<ExperimentSummaryModel> searchAllAccessibleExperiments(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<ExperimentSummaryModel> experimentSummaries = new ArrayList<>(); long fromTime = 0; long toTime = 0; try { for (String field : filters.keySet()) { if (field.equals(Constants.FieldConstants.ExperimentConstants.EXPERIMENT_NAME)) { fil.put(AbstractExpCatResource.ExperimentConstants.EXPERIMENT_NAME, filters.get(field)); } else if (field.equals(Constants.FieldConstants.ExperimentConstants.USER_NAME)) { fil.put(AbstractExpCatResource.ExperimentConstants.USER_NAME, filters.get(field)); } else if (field.equals(Constants.FieldConstants.ExperimentConstants.PROJECT_ID)) { fil.put(AbstractExpCatResource.ExperimentConstants.PROJECT_ID, filters.get(field)); } else if (field.equals(Constants.FieldConstants.ExperimentConstants.GATEWAY_ID)) { fil.put(AbstractExpCatResource.ExperimentConstants.GATEWAY_ID, filters.get(field)); } else if (field.equals(Constants.FieldConstants.ExperimentConstants.DESCRIPTION)) { fil.put(AbstractExpCatResource.ExperimentConstants.DESCRIPTION, filters.get(field)); } else if (field.equals(Constants.FieldConstants.ExperimentConstants.EXECUTION_ID)) { fil.put(AbstractExpCatResource.ExperimentConstants.EXECUTION_ID, filters.get(field)); } else if (field.equals(Constants.FieldConstants.ExperimentConstants.EXPERIMENT_STATUS)) { fil.put(AbstractExpCatResource.ExperimentStatusConstants.STATE, filters.get(field)); } else if (field.equals(Constants.FieldConstants.ExperimentConstants.FROM_DATE)) { fromTime = Long.parseLong(filters.get(field)); } else if (field.equals(Constants.FieldConstants.ExperimentConstants.TO_DATE)) { toTime = Long.parseLong(filters.get(field)); } } List<ExperimentSummaryResource> experimentSummaryResources; if (fromTime != 0 && toTime != 0) { experimentSummaryResources = workerResource.searchExperiments(accessibleIds, new Timestamp(fromTime), new Timestamp(toTime), fil ,limit , offset, orderByIdentifier, resultOrderType); } else { experimentSummaryResources = workerResource .searchExperiments(accessibleIds, null, null, fil, limit, offset, orderByIdentifier, resultOrderType); } if (experimentSummaryResources != null && !experimentSummaryResources.isEmpty()) { for (ExperimentSummaryResource ex : experimentSummaryResources) { experimentSummaries.add(ThriftDataModelConversion.getExperimentSummary(ex)); } } return experimentSummaries; } catch (Exception e) { logger.error("Error while retrieving experiment summary from registry", e); throw new RegistryException(e); } } return null; } public ExperimentStatistics getExperimentStatistics(Map<String,String> filters) throws RegistryException { try { ExperimentStatistics experimentStatistics = new ExperimentStatistics(); ExperimentStatisticsResource experimentStatisticsResource = workerResource.getExperimentStatistics( filters.get(Constants.FieldConstants.ExperimentConstants.GATEWAY_ID), new Timestamp(Long.parseLong(filters.get(Constants.FieldConstants.ExperimentConstants.FROM_DATE))), new Timestamp(Long.parseLong(filters.get(Constants.FieldConstants.ExperimentConstants.TO_DATE))), filters.get(Constants.FieldConstants.ExperimentConstants.USER_NAME), filters.get(Constants.FieldConstants.ExperimentConstants.EXECUTION_ID), filters.get(Constants.FieldConstants.ExperimentConstants.RESOURCE_HOST_ID) ); experimentStatistics.setAllExperimentCount(experimentStatisticsResource.getAllExperimentCount()); experimentStatistics.setCreatedExperimentCount(experimentStatisticsResource.getCreatedExperimentCount()); experimentStatistics.setRunningExperimentCount(experimentStatisticsResource.getRunningExperimentCount()); experimentStatistics.setCompletedExperimentCount(experimentStatisticsResource.getCompletedExperimentCount()); experimentStatistics.setFailedExperimentCount(experimentStatisticsResource.getFailedExperimentCount()); experimentStatistics.setCancelledExperimentCount(experimentStatisticsResource.getCancelledExperimentCount()); ArrayList<ExperimentSummaryModel> experimentSummaries = new ArrayList(); for (ExperimentSummaryResource ex : experimentStatisticsResource.getAllExperiments()) { experimentSummaries.add(ThriftDataModelConversion.getExperimentSummary(ex)); } experimentStatistics.setAllExperiments(experimentSummaries); experimentSummaries = new ArrayList(); for (ExperimentSummaryResource ex : experimentStatisticsResource.getCreatedExperiments()) { experimentSummaries.add(ThriftDataModelConversion.getExperimentSummary(ex)); } experimentStatistics.setCreatedExperiments(experimentSummaries); experimentSummaries = new ArrayList(); for (ExperimentSummaryResource ex : experimentStatisticsResource.getRunningExperiments()) { experimentSummaries.add(ThriftDataModelConversion.getExperimentSummary(ex)); } experimentStatistics.setRunningExperiments(experimentSummaries); experimentSummaries = new ArrayList(); for (ExperimentSummaryResource ex : experimentStatisticsResource.getCompletedExperiments()) { experimentSummaries.add(ThriftDataModelConversion.getExperimentSummary(ex)); } experimentStatistics.setCompletedExperiments(experimentSummaries); experimentSummaries = new ArrayList(); for (ExperimentSummaryResource ex : experimentStatisticsResource.getFailedExperiments()) { experimentSummaries.add(ThriftDataModelConversion.getExperimentSummary(ex)); } experimentStatistics.setFailedExperiments(experimentSummaries); experimentSummaries = new ArrayList(); for (ExperimentSummaryResource ex : experimentStatisticsResource.getCancelledExperiments()) { experimentSummaries.add(ThriftDataModelConversion.getExperimentSummary(ex)); } experimentStatistics.setCancelledExperiments(experimentSummaries); return experimentStatistics; } catch (RegistryException e) { logger.error("Error while retrieving experiment statistics from registry", e); throw new RegistryException(e); } } //CPI getIds method public List<String> getExperimentIDs(String fieldName, Object value) throws RegistryException { List<String> expIDs = new ArrayList<String>(); try { if (fieldName.equals(Constants.FieldConstants.ExperimentConstants.GATEWAY_ID)) { if (gatewayResource == null) { logger.error("You should use an existing gateway in order to retrieve experiments.."); return null; } else { List<ExperimentResource> resources = gatewayResource.getExperiments(); for (ExperimentResource resource : resources) { String expID = resource.getExperimentId(); expIDs.add(expID); } } } else if (fieldName.equals(Constants.FieldConstants.ExperimentConstants.USER_NAME)) { List<ExperimentResource> resources = workerResource.getExperiments(); for (ExperimentResource resource : resources) { expIDs.add(resource.getExperimentId()); } } else if (fieldName.equals(Constants.FieldConstants.ExperimentConstants.PROJECT_ID)) { List<ExperimentResource> resources = workerResource.getExperiments(); for (ExperimentResource resource : resources) { expIDs.add(resource.getExperimentId()); } } } catch (Exception e) { logger.error("Error while retrieving experiment ids..", e); throw new RegistryException(e); } return expIDs; } public List<String> getProcessIds(String fieldName, Object value) throws RegistryException { List<String> processIds = new ArrayList<String>(); List<ProcessModel> processes = getProcessList(fieldName, value); for (ProcessModel td : processes) { processIds.add(td.getProcessId()); } return processIds; } public List<String> getTaskIds(String fieldName, Object value) throws RegistryException { List<String> taskIds = new ArrayList<String>(); List<TaskModel> tasks = getTaskList(fieldName, value); for (TaskModel task : tasks) { taskIds.add(task.getTaskId()); } return taskIds; } public List<String> getJobIds(String fieldName, Object value) throws RegistryException { List<String> jobIds = new ArrayList<String>(); List<JobModel> jobs = getJobList(fieldName, value); for (JobModel job : jobs) { jobIds.add(job.getJobId()); } return jobIds; } //Remove CPI methods public void removeExperiment(String experimentId) throws RegistryException { try { gatewayResource.remove(ResourceType.EXPERIMENT, experimentId); } catch (Exception e) { logger.error("Error while removing experiment..", e); throw new RegistryException(e); } } public void removeUserConfigData(String experimentId) throws RegistryException { try { ExperimentResource experiment = new ExperimentResource(); experiment.setExperimentId(experimentId); experiment.remove(ResourceType.USER_CONFIGURATION_DATA, experimentId); } catch (Exception e) { logger.error("Error while removing experiment config..", e); throw new RegistryException(e); } } public void removeProcess(String processId) throws RegistryException { try { ExperimentResource experiment = new ExperimentResource(); experiment.remove(ResourceType.PROCESS, processId); } catch (Exception e) { logger.error("Error while removing workflow node..", e); throw new RegistryException(e); } } public void removeProcessResourceSchedule(String processId) throws RegistryException { try { ExperimentResource experiment = new ExperimentResource(); experiment.remove(ResourceType.PROCESS_RESOURCE_SCHEDULE, processId); } catch (Exception e) { logger.error("Error while removing workflow node..", e); throw new RegistryException(e); } } public void removeTask(String taskId) throws RegistryException { try { ProcessResource process = new ProcessResource(); process.remove(ResourceType.TASK, taskId); } catch (Exception e) { logger.error("Error while removing task details..", e); throw new RegistryException(e); } } public void removeJob(CompositeIdentifier cis) throws RegistryException { try { String processId = (String) cis.getTopLevelIdentifier(); String jobId = (String) cis.getSecondLevelIdentifier(); ProcessResource process = new ProcessResource(); process.setProcessId(processId); process.remove(ResourceType.JOB, jobId); } catch (Exception e) { logger.error("Error while removing task details..", e); throw new RegistryException(e); } } //isExists CPI methods public boolean isExperimentExist(String expID) throws RegistryException { try { return gatewayResource.isExists(ResourceType.EXPERIMENT, expID); } catch (Exception e) { logger.error("Error while retrieving experiment...", e); throw new RegistryException(e); } } public boolean isUserConfigDataExist(String expID) throws RegistryException { try { ExperimentResource experiment = gatewayResource.getExperiment(expID); experiment.isExists(ResourceType.USER_CONFIGURATION_DATA, expID); return true; } catch (Exception e) { logger.error("Error while retrieving experiment...", e); throw new RegistryException(e); } } public boolean isProcessExist(String processId) throws RegistryException { try { ExperimentResource experiment = new ExperimentResource(); return experiment.isExists(ResourceType.PROCESS, processId); } catch (Exception e) { logger.error("Error while retrieving process...", e); throw new RegistryException(e); } } public boolean isProcessResourceScheduleExist(String processId) throws RegistryException { try { ExperimentResource experiment = new ExperimentResource(); return experiment.isExists(ResourceType.PROCESS_RESOURCE_SCHEDULE, processId); } catch (Exception e) { logger.error("Error while retrieving process...", e); throw new RegistryException(e); } } public boolean isTaskExist(String taskId) throws RegistryException { try { ProcessResource process = new ProcessResource(); return process.isExists(ResourceType.TASK, taskId); } catch (Exception e) { logger.error("Error while retrieving task.....", e); throw new RegistryException(e); } } public boolean isJobExist(CompositeIdentifier cis) throws RegistryException { String taskId = (String) cis.getTopLevelIdentifier(); String jobId = (String) cis.getSecondLevelIdentifier(); try { TaskResource taskResource = new TaskResource(); taskResource.setTaskId(taskId); return taskResource.isExists(ResourceType.JOB, jobId); } catch (Exception e) { logger.error("Error while retrieving job.....", e); throw new RegistryException(e); } } public boolean createQueueStatuses(List<QueueStatusModel> queueStatusModels) throws RegistryException { for(QueueStatusModel qModel : queueStatusModels){ QueueStatusResource queueStatusResource = new QueueStatusResource(); queueStatusResource.setHostName(qModel.getHostName()); queueStatusResource.setQueueName(qModel.getQueueName()); queueStatusResource.setTime(qModel.getTime()); queueStatusResource.setQueueUp(qModel.isQueueUp()); queueStatusResource.setRunningJobs(qModel.getRunningJobs()); queueStatusResource.setQueuedJobs(qModel.getQueuedJobs()); queueStatusResource.save(); } return true; } public List<QueueStatusModel> getLatestQueueStatuses() throws RegistryException { List<QueueStatusModel> queueStatusModels = new ArrayList<>(); List<ExperimentCatResource> queueStatusResources = (new QueueStatusResource()).get(ResourceType.QUEUE_STATUS); for(ExperimentCatResource r : queueStatusResources){ QueueStatusResource qResource = (QueueStatusResource) r; QueueStatusModel queueStatusModel = new QueueStatusModel(); queueStatusModel.setHostName(qResource.getHostName()); queueStatusModel.setQueueName(qResource.getQueueName()); queueStatusModel.setTime(qResource.getTime()); queueStatusModel.setQueueUp(qResource.getQueueUp()); queueStatusModel.setRunningJobs(qResource.getRunningJobs()); queueStatusModel.setQueuedJobs(qResource.getQueuedJobs()); queueStatusModels.add(queueStatusModel); } return queueStatusModels; } public String getStatusID(String parentId) { String status = parentId.replaceAll("\\s", ""); return status + "_" + UUID.randomUUID(); } public String getErrorID(String parentId) { String error = parentId.replaceAll("\\s", ""); return error + "_" + UUID.randomUUID(); } public boolean isValidStatusTransition(Object object1, Object object2) { if (object1 instanceof ExperimentState && object2 instanceof ExperimentState) { ExperimentState oldState = (ExperimentState) object1; ExperimentState nextState = (ExperimentState) object2; if (nextState == null) { return false; } switch (oldState) { case CREATED: return true; case VALIDATED: return nextState != ExperimentState.CREATED; case SCHEDULED: return nextState != ExperimentState.CREATED || nextState != ExperimentState.VALIDATED; case LAUNCHED: return nextState != ExperimentState.CREATED || nextState != ExperimentState.VALIDATED || nextState != ExperimentState.SCHEDULED; case EXECUTING: return nextState != ExperimentState.CREATED || nextState != ExperimentState.VALIDATED || nextState != ExperimentState.SCHEDULED || nextState != ExperimentState.LAUNCHED; case CANCELING: return nextState == ExperimentState.CANCELING || nextState == ExperimentState.CANCELED || nextState == ExperimentState.COMPLETED || nextState == ExperimentState.FAILED; case CANCELED: return nextState == ExperimentState.CANCELED; case COMPLETED: return nextState == ExperimentState.COMPLETED; case FAILED: return nextState == ExperimentState.FAILED; default: return false; } } else if (object1 instanceof ProcessState && object2 instanceof ProcessState) { ProcessState oldState = (ProcessState) object1; ProcessState nextState = (ProcessState) object2; if (nextState == null) { return false; } return true; // TODO - need the state machine to complete these data // switch (oldState) { // case CREATED: // return true; // default: // return false; // } } else if (object1 instanceof TaskState && object2 instanceof TaskState) { TaskState oldState = (TaskState) object1; TaskState nextState = (TaskState) object2; if (nextState == null) { return false; } return true; // TODO - need the state machine to complete these data // switch (oldState) { // case CREATED: // return true; // default: // return false; // } }else if (object1 instanceof JobState && object2 instanceof JobState) { JobState oldState = (JobState) object1; JobState nextState = (JobState) object2; if (nextState == null) { return false; } return true; // TODO - need the state machine to complete these data // switch (oldState) { // default: // return false; // } } return false; } }