/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.core.component.workflow.execution.api;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.LinkedList;
import java.util.List;
import org.apache.commons.logging.LogFactory;
import de.rcenvironment.core.component.model.endpoint.api.EndpointChange;
import de.rcenvironment.core.component.model.endpoint.api.EndpointChange.Type;
import de.rcenvironment.core.component.model.endpoint.api.EndpointDescriptionsManager;
import de.rcenvironment.core.component.workflow.model.api.Connection;
import de.rcenvironment.core.component.workflow.model.api.WorkflowDescription;
import de.rcenvironment.core.datamodel.api.DataType;
/**
* {@link PropertyChangeListener} for {@link EndpointChange}s.
*
* @author Christian Weiss
* @author Doreen Seider
*/
public class EndpointChangeListener implements PropertyChangeListener {
private final WorkflowDescription workflowDesc;
public EndpointChangeListener(WorkflowDescription newWorkflowDesc) {
workflowDesc = newWorkflowDesc;
}
@Override
public void propertyChange(PropertyChangeEvent event) {
if (!(event.getNewValue() instanceof EndpointChange)) {
LogFactory.getLog(getClass()).debug("ignoring property change event because it is not of type "
+ EndpointChange.class.getSimpleName());
return;
}
EndpointChange epChange = (EndpointChange) event.getNewValue();
if (epChange.getType() == Type.Removed) {
onRemoved(epChange);
} else if (epChange.getType() == Type.Modified) {
onModified(epChange);
}
}
private void onRemoved(EndpointChange epChange) {
// if an endpoint was removed, automatically remove the associated connections
final List<Connection> superfluousConnections = new LinkedList<Connection>();
final String removedEndpointId = epChange.getOldEndpointDescription().getIdentifier();
// check for each connection if the removed endpoint is one of the connection
// endpoints
for (Connection connection : workflowDesc.getConnections()) {
final boolean sourceRemoved = connection.getOutput().getIdentifier().equals(removedEndpointId);
final boolean targetRemoved = connection.getInput().getIdentifier().equals(removedEndpointId);
// if one of the endpoints of the connection was removed, the connection is superfluous
if (sourceRemoved || targetRemoved) {
superfluousConnections.add(connection);
}
}
// remove all connections that have been identified as superfluous
workflowDesc.removeConnections(superfluousConnections);
}
private void onModified(EndpointChange epChange) {
if (epChange.getEndpointDescription().getDataType() != epChange.getOldEndpointDescription().getDataType()) {
onEndpointDataTypeChanged(epChange);
} else if (!epChange.getEndpointDescription().getName().equals(epChange.getOldEndpointDescription().getName())) {
for (Connection connection : workflowDesc.getConnections()) {
if (connection.getInput().getIdentifier().equals(epChange.getEndpointDescription().getIdentifier())) {
connection.getInput().setName(epChange.getEndpointDescription().getName());
} else if (connection.getOutput().getIdentifier().equals(epChange.getEndpointDescription().getIdentifier())) {
connection.getOutput().setName(epChange.getEndpointDescription().getName());
}
}
}
}
private void onEndpointDataTypeChanged(EndpointChange epChange) {
DataType newDataType = epChange.getEndpointDescription().getDataType();
if (epChange.getOldEndpointDescription().isDataTypeValid(newDataType)) {
for (Connection connection : workflowDesc.getConnections()) {
if (connection.getInput().getIdentifier().equals(epChange.getEndpointDescription().getIdentifier())) {
EndpointDescriptionsManager outputDescManager = workflowDesc.getWorkflowNode(connection.getSourceNode().getIdentifier())
.getComponentDescription().getOutputDescriptionsManager();
outputDescManager.removeConnectedDataType(connection.getOutput().getName(),
epChange.getOldEndpointDescription().getDataType());
outputDescManager.addConnectedDataType(connection.getOutput().getName(),
epChange.getEndpointDescription().getDataType());
} else if (connection.getOutput().getIdentifier().equals(epChange.getEndpointDescription().getIdentifier())) {
EndpointDescriptionsManager inputDescManager = workflowDesc.getWorkflowNode(connection.getTargetNode().getIdentifier())
.getComponentDescription().getInputDescriptionsManager();
inputDescManager.removeConnectedDataType(connection.getInput().getName(),
epChange.getOldEndpointDescription().getDataType());
inputDescManager.addConnectedDataType(connection.getInput().getName(),
epChange.getEndpointDescription().getDataType());
}
}
} else {
onRemoved(epChange);
}
}
}