/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.core.component.execution.internal;
import java.util.List;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import de.rcenvironment.core.component.execution.api.ComponentExecutionContext;
import de.rcenvironment.core.component.model.endpoint.api.EndpointDatumRecipient;
import de.rcenvironment.core.component.model.endpoint.impl.EndpointDatumImpl;
import de.rcenvironment.core.datamodel.api.TypedDatum;
import de.rcenvironment.core.utils.common.StringUtils;
import de.rcenvironment.core.utils.incubator.DebugSettings;
/**
* Writes {@link TypedDatum}s to outputs.
*
* @author Doreen Seider
*/
public class TypedDatumToOutputWriter {
private static final Log LOG = LogFactory.getLog(TypedDatumToOutputWriter.class);
private static final boolean VERBOSE_LOGGING = DebugSettings.getVerboseLoggingEnabled(TypedDatumToOutputWriter.class);
private static EndpointDatumDispatcher endpointDatumDispatcher;
private ComponentExecutionContext compExeCtx;
@Deprecated
public TypedDatumToOutputWriter() {}
protected TypedDatumToOutputWriter(ComponentExecutionRelatedInstances compExeRelatedInstances) {
this.compExeCtx = compExeRelatedInstances.compExeCtx;
}
protected void writeTypedDatumToOutput(String outputName, TypedDatum datumToSend) {
writeTypedDatumToOutput(outputName, datumToSend, null);
}
protected void writeTypedDatumToOutput(String outputName, TypedDatum datumToSend, Long outputDmId) {
writeTypedDatumToCertainConnectedOutputs(outputName, datumToSend, null, null, outputDmId);
}
protected void writeTypedDatumToOutputConsideringOnlyCertainInputs(String outputName, TypedDatum datumToSend, String inputCompExeId,
String inputName) {
writeTypedDatumToCertainConnectedOutputs(outputName, datumToSend, inputCompExeId, inputName, null);
}
private void writeTypedDatumToCertainConnectedOutputs(String outputName, TypedDatum datumToSend, String inputCompExeId,
String inputName, Long outputDmId) {
Map<String, List<EndpointDatumRecipient>> endpointDatumRecipients = compExeCtx.getEndpointDatumRecipients();
if (endpointDatumRecipients.containsKey(outputName)) {
for (EndpointDatumRecipient epRecipient : endpointDatumRecipients.get(outputName)) {
if (considerRecipient(epRecipient, inputCompExeId, inputName)) {
EndpointDatumImpl endpointDatum = new EndpointDatumImpl();
endpointDatum.setEndpointDatumRecipient(epRecipient);
endpointDatum.setOutputsComponentExecutionIdentifier(
compExeCtx.getExecutionIdentifier());
endpointDatum.setOutputsNodeId(compExeCtx.getNodeId());
endpointDatum.setWorkflowExecutionIdentifier(
compExeCtx.getWorkflowExecutionIdentifier());
endpointDatum.setWorkflowNodeId(compExeCtx.getWorkflowNodeId());
endpointDatum.setDataManagementId(outputDmId);
endpointDatum.setValue(datumToSend);
endpointDatumDispatcher.dispatchEndpointDatum(endpointDatum);
if (VERBOSE_LOGGING) {
LOG.debug(StringUtils.format("Sent at %s@%s: %s (-> %s@%s)", outputName,
compExeCtx.getInstanceName(), datumToSend,
epRecipient.getInputName(), epRecipient.getInputsComponentInstanceName()));
}
}
}
}
}
private boolean considerRecipient(EndpointDatumRecipient epRecipient, String inputCompExeId, String inputName) {
return inputCompExeId == null
|| (epRecipient.getInputName().equals(inputName) && epRecipient.getInputsComponentExecutionIdentifier().equals(inputCompExeId));
}
protected void bindEndpointDatumDispatcher(EndpointDatumDispatcher newService) {
TypedDatumToOutputWriter.endpointDatumDispatcher = newService;
}
}