/*
* 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 command class for deleting output locations.
*
* @author Brigitte Boden
*/
public class RemoveOutputLocationsCommand extends WorkflowNodeCommand {
private List<String> identifiers;
private ObjectMapper mapper;
private boolean executable = true;
private Refreshable[] refreshable;
private boolean undoable = false;
private String oldJsonString;
private List<OutputLocation> oldLocations;
public RemoveOutputLocationsCommand(List<String> ids, Refreshable... refreshable) {
this.identifiers = ids;
this.refreshable = refreshable;
mapper = JsonUtils.getDefaultObjectMapper();
mapper.setVisibility(JsonMethod.ALL, Visibility.ANY);
}
public RemoveOutputLocationsCommand(String id, Refreshable... refreshable) {
this.identifiers = new ArrayList<String>();
this.identifiers.add(id);
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() {
// Do nothing
}
/**
* {@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);
list = mapper.readValue(inputJsonString, OutputLocationList.class);
oldLocations = new ArrayList<OutputLocation>();
for (String id : identifiers) {
for (String inputName : list.getOutputLocationById(id).getInputs()) {
oldLocations.add(list.getOutputLocationById(id));
EndpointDescription oldDesc = getProperties().getInputDescriptionsManager().getEndpointDescription(inputName);
if (oldDesc != null) {
getProperties().getInputDescriptionsManager().editDynamicEndpointDescription(inputName, inputName,
oldDesc.getDataType(),
oldDesc.getMetaData(), oldDesc.getDynamicEndpointIdentifier(), OutputWriterComponentConstants.DEFAULT_GROUP);
}
}
getProperties().getInputDescriptionsManager().removeDynamicEndpointGroupDescription(
list.getOutputLocationById(id).getGroupId());
list.removeLocation(id);
}
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() {
getProperties().getConfigurationDescription().setConfigurationValue(OutputWriterComponentConstants.CONFIG_KEY_OUTPUTLOCATIONS,
oldJsonString);
for (OutputLocation out : oldLocations) {
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());
}
}
}
executable = true;
undoable = false;
if (refreshable != null) {
for (Refreshable r : refreshable) {
r.refresh();
}
}
}
}