/* * Copyright (C) 2006-2016 DLR, Germany * * All rights reserved * * http://www.rcenvironment.de/ */ package de.rcenvironment.components.outputwriter.gui; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.apache.commons.logging.LogFactory; import org.codehaus.jackson.annotate.JsonAutoDetect.Visibility; import org.codehaus.jackson.annotate.JsonMethod; import org.codehaus.jackson.map.ObjectMapper; import de.rcenvironment.components.outputwriter.common.OutputLocation; import de.rcenvironment.components.outputwriter.common.OutputLocationList; import de.rcenvironment.components.outputwriter.common.OutputWriterComponentConstants; import de.rcenvironment.core.component.model.endpoint.api.EndpointDescription; import de.rcenvironment.core.gui.workflow.editor.properties.Refreshable; import de.rcenvironment.core.gui.workflow.editor.properties.WorkflowNodeCommand; import de.rcenvironment.core.utils.common.JsonUtils; /** * A class for writing the outputLocation information into the component's configuration. * * @author Brigitte Boden */ public class EditOutputLocationsCommand extends WorkflowNodeCommand { private String oldGroupId; private OutputLocation out; private boolean executable = true; private boolean undoable = false; private Refreshable[] refreshable; private ObjectMapper mapper; private String oldJsonString; private List<String> oldInputs; public EditOutputLocationsCommand(OutputLocation out, Refreshable... refreshable) { super(); this.out = out; this.refreshable = refreshable; mapper = JsonUtils.getDefaultObjectMapper(); mapper.setVisibility(JsonMethod.ALL, Visibility.ANY); } /** * {@inheritDoc} * * @see de.rcenvironment.core.gui.workflow.editor.properties.WorkflowNodeCommand#initialize() */ @Override public void initialize() { } /** * {@inheritDoc} * * @see de.rcenvironment.core.gui.workflow.editor.properties.WorkflowNodeCommand#canExecute() */ @Override public boolean canExecute() { return executable; } /** * {@inheritDoc} * * @see de.rcenvironment.core.gui.workflow.editor.properties.WorkflowNodeCommand#canUndo() */ @Override public boolean canUndo() { return undoable; } /** * {@inheritDoc} * * @see de.rcenvironment.core.gui.workflow.editor.properties.WorkflowNodeCommand#execute() */ @Override public void execute() { OutputLocationList list; try { // Parse current location String inputJsonString = getProperties().getConfigurationDescription().getConfigurationValue( OutputWriterComponentConstants.CONFIG_KEY_OUTPUTLOCATIONS); if (inputJsonString != null && !inputJsonString.isEmpty()) { list = mapper.readValue(inputJsonString, OutputLocationList.class); } else { list = new OutputLocationList(); } if (list.getOutputLocationById(out.getGroupId()) != null) { oldInputs = list.getOutputLocationById(out.getGroupId()).getInputs(); } else { oldInputs = new ArrayList<String>(); } list.addOrReplaceOutputLocation(out); if (getProperties().getInputDescriptionsManager().isValidEndpointGroupName(out.getGroupId())) { getProperties().getInputDescriptionsManager().addDynamicEndpointGroupDescription( OutputWriterComponentConstants.EP_IDENTIFIER, out.getGroupId()); } for (String inputName : out.getInputs()) { EndpointDescription oldDesc = getProperties().getInputDescriptionsManager().getEndpointDescription(inputName); if (oldDesc != null) { getProperties().getInputDescriptionsManager().editDynamicEndpointDescription(inputName, inputName, oldDesc.getDataType(), oldDesc.getMetaData(), oldDesc.getDynamicEndpointIdentifier(), out.getGroupId()); } } for (String inputName : oldInputs) { if (!out.getInputs().contains(inputName)) { // For inputs that were removed from this OutputLocation, the input group must be changed EndpointDescription oldDesc = getProperties().getInputDescriptionsManager().getEndpointDescription(inputName); if (oldDesc != null) { getProperties().getInputDescriptionsManager().editDynamicEndpointDescription(inputName, inputName, oldDesc.getDataType(), oldDesc.getMetaData(), oldDesc.getDynamicEndpointIdentifier(), OutputWriterComponentConstants.DEFAULT_GROUP); } } } String outputJsonString = mapper.writeValueAsString(list); getProperties().getConfigurationDescription().setConfigurationValue(OutputWriterComponentConstants.CONFIG_KEY_OUTPUTLOCATIONS, outputJsonString); oldJsonString = inputJsonString; executable = false; undoable = true; if (refreshable != null) { for (Refreshable r : refreshable) { r.refresh(); } } } catch (IOException e) { LogFactory.getLog(getClass()).debug("Error when writing components to JSON: " + e.getMessage()); } } /** * {@inheritDoc} * * @see de.rcenvironment.core.gui.workflow.editor.properties.WorkflowNodeCommand#undo() */ @Override public void undo() { if (oldGroupId != null) { getProperties().getInputDescriptionsManager().removeDynamicEndpointGroupDescription(out.getGroupId()); getProperties().getInputDescriptionsManager().addDynamicEndpointGroupDescription(OutputWriterComponentConstants.EP_IDENTIFIER, oldGroupId); } String formerGroupId = oldGroupId; if (formerGroupId == null) { formerGroupId = out.getGroupId(); } for (String inputName : oldInputs) { EndpointDescription oldDesc = getProperties().getInputDescriptionsManager().getEndpointDescription(inputName); if (oldDesc != null) { getProperties().getInputDescriptionsManager().editDynamicEndpointDescription(inputName, inputName, oldDesc.getDataType(), oldDesc.getMetaData(), oldDesc.getDynamicEndpointIdentifier(), formerGroupId); } } for (String inputName : out.getInputs()) { if (!oldInputs.contains(inputName)) { // For inputs that were removed from this OutputLocation (by the undo operation), the input group must be changed EndpointDescription oldDesc = getProperties().getInputDescriptionsManager().getEndpointDescription(inputName); if (oldDesc != null) { getProperties().getInputDescriptionsManager().editDynamicEndpointDescription(inputName, inputName, oldDesc.getDataType(), oldDesc.getMetaData(), oldDesc.getDynamicEndpointIdentifier(), OutputWriterComponentConstants.DEFAULT_GROUP); } } } getProperties().getConfigurationDescription().setConfigurationValue(OutputWriterComponentConstants.CONFIG_KEY_OUTPUTLOCATIONS, oldJsonString); undoable = false; executable = true; if (refreshable != null) { for (Refreshable r : refreshable) { r.refresh(); } } } }