/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.core.component.execution.internal;
import de.rcenvironment.core.communication.common.NodeIdentifierUtils;
import de.rcenvironment.core.component.execution.api.EndpointDatumSerializer;
import de.rcenvironment.core.component.model.endpoint.api.EndpointDatum;
import de.rcenvironment.core.component.model.endpoint.api.EndpointDatumRecipient;
import de.rcenvironment.core.component.model.endpoint.api.EndpointDatumRecipientFactory;
import de.rcenvironment.core.component.model.endpoint.impl.EndpointDatumImpl;
import de.rcenvironment.core.datamodel.api.DataType;
import de.rcenvironment.core.datamodel.api.TypedDatum;
import de.rcenvironment.core.datamodel.api.TypedDatumSerializer;
import de.rcenvironment.core.datamodel.api.TypedDatumService;
import de.rcenvironment.core.utils.common.StringUtils;
/**
* Implementation of {@link EndpointDatumSerializer}.
*
* @author Doreen Seider
* @author Robert Mischke (8.0.0 id adaptations)
*/
public class EndpointDatumSerializerImpl implements EndpointDatumSerializer {
private TypedDatumSerializer typedDatumSerializer;
@Override
public String serializeEndpointDatum(EndpointDatum endpoint) {
String[] parts = new String[10];
parts[0] = endpoint.getInputName();
TypedDatum value = endpoint.getValue();
if (value.getDataType().equals(DataType.Internal)) {
parts[1] = ((InternalTDImpl) value).serialize();
} else {
parts[1] = typedDatumSerializer.serialize(value);
}
parts[2] = endpoint.getInputsComponentExecutionIdentifier();
parts[3] = endpoint.getInputsComponentInstanceName();
parts[4] = endpoint.getInputsNodeId().getLogicalNodeIdString();
parts[5] = endpoint.getOutputsComponentExecutionIdentifier();
parts[6] = endpoint.getOutputsNodeId().getLogicalNodeIdString();
parts[7] = endpoint.getWorkflowExecutionIdentifier();
parts[8] = endpoint.getWorkflowNodeId().getLogicalNodeIdString();
if (endpoint.getDataManagementId() == null) {
parts[9] = "";
} else {
parts[9] = String.valueOf(endpoint.getDataManagementId());
}
return StringUtils.escapeAndConcat(parts);
}
@Override
public EndpointDatum deserializeEndpointDatum(String serializedEndpoint) {
String[] parts = StringUtils.splitAndUnescape(serializedEndpoint);
EndpointDatumImpl endpoint = new EndpointDatumImpl();
try {
endpoint.setValue(InternalTDImpl.fromString(parts[1]));
} catch (IllegalArgumentException e) {
endpoint.setValue(typedDatumSerializer.deserialize(parts[1]));
}
EndpointDatumRecipient endpointDatumRecipient =
EndpointDatumRecipientFactory.createEndpointDatumRecipient(parts[0], parts[2], parts[3],
NodeIdentifierUtils.parseArbitraryIdStringToLogicalNodeIdWithExceptionWrapping(parts[4]));
endpoint.setEndpointDatumRecipient(endpointDatumRecipient);
endpoint.setOutputsComponentExecutionIdentifier(parts[5]);
endpoint.setOutputsNodeId(NodeIdentifierUtils
.parseArbitraryIdStringToLogicalNodeIdWithExceptionWrapping(parts[6]));
endpoint.setWorkflowExecutionIdentifier(parts[7]);
endpoint.setWorkflowNodeId(NodeIdentifierUtils
.parseArbitraryIdStringToLogicalNodeIdWithExceptionWrapping(parts[8]));
if (!parts[9].isEmpty()) {
endpoint.setDataManagementId(Long.valueOf(parts[9]));
}
return endpoint;
}
protected void bindTypedDatumService(TypedDatumService typedDatumService) {
typedDatumSerializer = typedDatumService.getSerializer();
}
}