/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.core.datamanagement.commons;
import java.io.Serializable;
import java.util.Map;
import de.rcenvironment.core.communication.common.IdentifierException;
import de.rcenvironment.core.communication.common.LogicalNodeId;
import de.rcenvironment.core.communication.common.NodeIdentifierUtils;
import de.rcenvironment.core.datamodel.api.FinalWorkflowState;
/**
* Identifier for a workflow run.
*
* @author Jan Flink
* @author Robert Mischke
*/
public class WorkflowRunDescription implements Serializable, Comparable<WorkflowRunDescription> {
private static final long serialVersionUID = 2449195140856943911L;
private final Long workflowRunID;
private final String workflowTitle;
private final String controllerLogicalNodeId;
// as this object is created from a string for on the server side anyway, only parse this id on demand on the client side
private transient LogicalNodeId controllerLogicalNodeIdObject;
private final String storageLogicalNodeId;
// as this object is created from a string for on the server side anyway, only parse this id on demand on the client side
private transient LogicalNodeId storageLogicalNodeIdObject;
private final Long startTime;
private final Long endTime;
private final FinalWorkflowState finalState;
private final Boolean areFilesDeleted;
private final Boolean markedForDeletion;
private final Map<String, String> metaData;
public WorkflowRunDescription(Long workflowRunID, String workflowTitle, String controllerLogicalNodeId,
String storageLogicalNodeId, Long startTime, Long endTime, FinalWorkflowState finalState, Boolean areFilesDeleted,
Boolean markedForDeletion, Map<String, String> metaData) {
this.workflowRunID = workflowRunID;
this.workflowTitle = workflowTitle;
this.controllerLogicalNodeId = controllerLogicalNodeId;
this.storageLogicalNodeId = storageLogicalNodeId;
this.startTime = startTime;
this.endTime = endTime;
this.finalState = finalState;
this.areFilesDeleted = areFilesDeleted;
this.markedForDeletion = markedForDeletion;
this.metaData = metaData;
}
/**
* Returns a copy of the given {@link WorkflowRunDescription} that shares all field values with the original, except for
* {@link #controllerLogicalNodeId} and {@link #storageLogicalNodeId}, which are replaced by a new value. This method is used to fix
* inconsistent node ids received from remote nodes, as they are returned by the remote data management as-is with no further checks.
*
* @param original the original to copy values from
* @param newNodeIdString the new {@link #controllerLogicalNodeId} and {@link #storageLogicalNodeId} to set
* @return the copy
*/
public static WorkflowRunDescription cloneAndReplaceNodeIds(WorkflowRunDescription original, String newNodeIdString) {
return new WorkflowRunDescription(original.workflowRunID, original.workflowTitle, newNodeIdString, newNodeIdString,
original.startTime, original.endTime, original.finalState, original.areFilesDeleted, original.markedForDeletion,
original.getMetaData());
}
public String getWorkflowTitle() {
return workflowTitle;
}
public String getControllerLogicalNodeIdString() {
return controllerLogicalNodeId;
}
/**
* @return returns the {@link LogicalNodeId} representation of the stored instance or logical node id representing the execution
* location; this should be used in place of {@link #getLogicalNodeIdString()} for type safety
*/
public synchronized LogicalNodeId getControllerLogicalNodeId() {
if (controllerLogicalNodeIdObject == null && controllerLogicalNodeId != null) { // also return null in case the string id is ever
// null
try {
controllerLogicalNodeIdObject = NodeIdentifierUtils.parseArbitraryIdStringToLogicalNodeId(controllerLogicalNodeId);
} catch (IdentifierException e) {
throw new RuntimeException("Failed to parse component run location string (expected an instance id or logical node id)", e);
}
}
return controllerLogicalNodeIdObject;
}
public String getStorageLogicalNodeIdString() {
return storageLogicalNodeId;
}
/**
* @return returns the {@link LogicalNodeId} representation of the stored instance or logical node id representing the execution
* location; this should be used in place of {@link #getLogicalNodeIdString()} for type safety
*/
public synchronized LogicalNodeId getStorageLogicalNodeId() {
// return null in case the string id is ever
// null
if (storageLogicalNodeIdObject == null && storageLogicalNodeId != null) {
try {
storageLogicalNodeIdObject = NodeIdentifierUtils.parseArbitraryIdStringToLogicalNodeId(storageLogicalNodeId);
} catch (IdentifierException e) {
throw new RuntimeException("Failed to parse component run location string (expected an instance id or logical node id)", e);
}
}
return storageLogicalNodeIdObject;
}
public Long getStartTime() {
return startTime;
}
public Long getEndTime() {
return endTime;
}
public Map<String, String> getMetaData() {
return metaData;
}
public Long getWorkflowRunID() {
return workflowRunID;
}
public FinalWorkflowState getFinalState() {
return finalState;
}
public Boolean getAreFilesDeleted() {
return areFilesDeleted;
}
public Boolean isMarkedForDeletion() {
return markedForDeletion;
}
/**
* Checks if the properties contain a field with additional information.
*
* @return the value for additional information, if available, and null, else.
*/
public String getAdditionalInformationIfAvailable() {
if (metaData.containsKey(PropertiesKeys.ADDITIONAL_INFORMATION)) {
return metaData.get(PropertiesKeys.ADDITIONAL_INFORMATION);
}
return null;
}
/**
* Checks if the properties contain a field with an error log file.
*
* @return the reference to the error log file, if available, and null, else.
*/
public String getErrorLogFileReference() {
return metaData.get(PropertiesKeys.ERROR_LOG_FILE);
}
@Override
public int compareTo(WorkflowRunDescription arg0) {
return getStartTime().compareTo(arg0.getStartTime());
}
}