/* * Copyright (C) 2006-2016 DLR, Germany * * All rights reserved * * http://www.rcenvironment.de/ */ package de.rcenvironment.components.optimizer.gui.properties.commands; import java.util.HashMap; import java.util.List; import java.util.Map; import de.rcenvironment.components.optimizer.common.OptimizerComponentConstants; import de.rcenvironment.core.component.api.ComponentConstants; import de.rcenvironment.core.component.model.endpoint.api.EndpointDescription; import de.rcenvironment.core.component.workflow.model.api.WorkflowNode; import de.rcenvironment.core.datamodel.api.EndpointType; import de.rcenvironment.core.gui.workflow.editor.commands.endpoint.RemoveDynamicEndpointCommand; import de.rcenvironment.core.gui.workflow.editor.properties.Refreshable; /** * Removes a input to a {@link WorkflowNode}. * * @author Sascha Zur */ public class OptimizerRemoveDynamicEndpointCommand extends RemoveDynamicEndpointCommand { private static final String DESIGN_VARIABLE = "Design"; public OptimizerRemoveDynamicEndpointCommand(EndpointType direction, List<String> names, String id, Refreshable... refreshable) { super(direction, id, names, refreshable); } @Override public void execute() { super.execute(); for (String name : names) { EndpointDescription oldDescription = oldDescriptions.get(name); final WorkflowNode workflowNode = getWorkflowNode(); switch (direction) { case INPUT: for (EndpointDescription variable : workflowNode.getOutputDescriptionsManager().getDynamicEndpointDescriptions()) { if (variable.getDynamicEndpointIdentifier().equals(DESIGN_VARIABLE)) { if (!workflowNode.getInputDescriptionsManager().isValidEndpointName( OptimizerDynamicEndpointCommandHelper.createGradientChannelName(name, variable.getName()))) { workflowNode.getInputDescriptionsManager().removeDynamicEndpointDescription( OptimizerDynamicEndpointCommandHelper.createGradientChannelName(name, variable.getName())); } } } OptimizerDynamicEndpointCommandHelper.removeUpperLowerBoundsEndpoints(oldDescription.getName(), oldDescription.getMetaData(), workflowNode); break; case OUTPUT: for (EndpointDescription function : workflowNode.getInputDescriptionsManager().getDynamicEndpointDescriptions()) { if (!workflowNode.getInputDescriptionsManager().isValidEndpointName( OptimizerDynamicEndpointCommandHelper.createGradientChannelName(function.getName(), name))) { workflowNode.getInputDescriptionsManager().removeDynamicEndpointDescription( OptimizerDynamicEndpointCommandHelper.createGradientChannelName(function.getName(), name)); } } if (getWorkflowNode().getOutputDescriptionsManager().getEndpointDescription( name + OptimizerComponentConstants.OPTIMUM_VARIABLE_SUFFIX) != null) { getWorkflowNode().getOutputDescriptionsManager().removeDynamicEndpointDescription( name + OptimizerComponentConstants.OPTIMUM_VARIABLE_SUFFIX); } if ((oldDescription.getMetaData().get(OptimizerComponentConstants.META_HAS_STARTVALUE) == null && oldDescription.getMetaData().get(OptimizerComponentConstants.META_STARTVALUE).isEmpty()) || (oldDescription.getMetaData().get(OptimizerComponentConstants.META_HAS_STARTVALUE) != null && !Boolean.parseBoolean(oldDescription.getMetaData().get(OptimizerComponentConstants.META_HAS_STARTVALUE)))) { getWorkflowNode().getInputDescriptionsManager().removeDynamicEndpointDescription( name + OptimizerComponentConstants.STARTVALUE_SIGNATURE); } if ((oldDescription.getMetaData().get(OptimizerComponentConstants.META_USE_STEP) != null && !oldDescription.getMetaData().get(OptimizerComponentConstants.META_USE_STEP).isEmpty())) { if (oldDescription.getMetaData().get(OptimizerComponentConstants.META_USE_UNIFIED_STEP) != null && !Boolean.parseBoolean(oldDescription.getMetaData().get(OptimizerComponentConstants.META_USE_UNIFIED_STEP))) { workflowNode.getInputDescriptionsManager().removeDynamicEndpointDescription( name + OptimizerComponentConstants.STEP_VALUE_SIGNATURE); } } OptimizerDynamicEndpointCommandHelper.removeUpperLowerBoundsEndpoints(oldDescription.getName(), oldDescription.getMetaData(), workflowNode); break; default: throw new RuntimeException(); } if (refreshable != null) { for (Refreshable r : refreshable) { r.refresh(); } } } } @Override public void undo() { final WorkflowNode workflowNode = getWorkflowNode(); super.undo(); for (String name : names) { EndpointDescription oldDescription = oldDescriptions.get(name); switch (direction) { case INPUT: for (EndpointDescription variable : workflowNode.getOutputDescriptionsManager().getDynamicEndpointDescriptions()) { if (variable.getDynamicEndpointIdentifier().equals(DESIGN_VARIABLE)) { if (oldDescription.getMetaDataValue(OptimizerComponentConstants.HAS_GRADIENT) != null && Boolean.parseBoolean(oldDescription.getMetaDataValue(OptimizerComponentConstants.HAS_GRADIENT)) && workflowNode.getInputDescriptionsManager().isValidEndpointName( OptimizerDynamicEndpointCommandHelper.createGradientChannelName(name, variable.getName()))) { Map<String, String> gradientData = new HashMap<>(); for (String key : oldDescription.getMetaData().keySet()) { if (!key.equals(OptimizerComponentConstants.METADATA_VECTOR_SIZE) && !key.equals(ComponentConstants.INPUT_METADATA_KEY_INPUT_DATUM_HANDLING) && !key.equals(ComponentConstants.INPUT_METADATA_KEY_INPUT_EXECUTION_CONSTRAINT)) { gradientData.put(key, "-"); } else { gradientData.put(key, oldDescription.getMetaDataValue(key)); } } workflowNode.getInputDescriptionsManager().addDynamicEndpointDescription( OptimizerComponentConstants.ID_GRADIENTS, OptimizerDynamicEndpointCommandHelper.createGradientChannelName(name, variable.getName()), variable.getDataType(), gradientData); } } } OptimizerDynamicEndpointCommandHelper.addLowerAndUpperBoundsEndpoints(oldDescription.getName(), oldDescription.getDataType(), oldDescription.getMetaData(), workflowNode); break; case OUTPUT: for (EndpointDescription function : workflowNode.getInputDescriptionsManager().getDynamicEndpointDescriptions()) { if (function.getMetaDataValue(OptimizerComponentConstants.HAS_GRADIENT) != null && Boolean.parseBoolean(function.getMetaDataValue(OptimizerComponentConstants.HAS_GRADIENT))) { workflowNode.getInputDescriptionsManager().addDynamicEndpointDescription(OptimizerComponentConstants.ID_GRADIENTS, OptimizerDynamicEndpointCommandHelper.createGradientChannelName(function.getName(), name), oldDescription.getDataType(), new HashMap<String, String>()); } } getWorkflowNode().getOutputDescriptionsManager().addDynamicEndpointDescription(OptimizerComponentConstants.ID_OPTIMA, name + OptimizerComponentConstants.OPTIMUM_VARIABLE_SUFFIX, oldDescription.getDataType(), oldDescription.getMetaData()); if ((oldDescription.getMetaData().get(OptimizerComponentConstants.META_HAS_STARTVALUE) == null && oldDescription.getMetaData().get(OptimizerComponentConstants.META_STARTVALUE).isEmpty()) || (oldDescription.getMetaData().get(OptimizerComponentConstants.META_HAS_STARTVALUE) != null && !Boolean.parseBoolean(oldDescription.getMetaData().get(OptimizerComponentConstants.META_HAS_STARTVALUE)))) { getWorkflowNode().getInputDescriptionsManager().addDynamicEndpointDescription( OptimizerComponentConstants.ID_STARTVALUES, name + OptimizerComponentConstants.STARTVALUE_SIGNATURE, oldDescription.getDataType(), new HashMap<String, String>()); } if ((oldDescription.getMetaData().get(OptimizerComponentConstants.META_USE_STEP) != null && !oldDescription.getMetaData().get(OptimizerComponentConstants.META_USE_STEP).isEmpty())) { if (oldDescription.getMetaData().get(OptimizerComponentConstants.META_USE_UNIFIED_STEP) != null && !Boolean.parseBoolean(oldDescription.getMetaData().get(OptimizerComponentConstants.META_USE_UNIFIED_STEP))) { Map<String, String> stepValueMetaData = new HashMap<>(); workflowNode.getInputDescriptionsManager().addDynamicEndpointDescription(OptimizerComponentConstants.ID_STARTVALUES, name + OptimizerComponentConstants.STEP_VALUE_SIGNATURE, oldDescription.getDataType(), stepValueMetaData); } } OptimizerDynamicEndpointCommandHelper.addLowerAndUpperBoundsEndpoints(oldDescription.getName(), oldDescription.getDataType(), oldDescription.getMetaData(), workflowNode); break; default: throw new RuntimeException(); } if (refreshable != null) { for (Refreshable r : refreshable) { r.refresh(); } } } } }