blob: cf7f42a5a98c16b31857f0f8f917e7b9054c3ac7 [file] [log] [blame]
/**
*
*/
package net.sf.taverna.t2.workbench.ui.views.contextualviews.activity;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.swing.JPanel;
import org.apache.log4j.Logger;
import uk.org.taverna.commons.services.ActivityTypeNotFoundException;
import uk.org.taverna.commons.services.InvalidConfigurationException;
import uk.org.taverna.commons.services.ServiceRegistry;
import uk.org.taverna.scufl2.api.activity.Activity;
import uk.org.taverna.scufl2.api.common.Scufl2Tools;
import uk.org.taverna.scufl2.api.configurations.Configuration;
import uk.org.taverna.scufl2.api.port.ActivityPort;
import uk.org.taverna.scufl2.api.port.InputActivityPort;
import uk.org.taverna.scufl2.api.port.OutputActivityPort;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
/**
* @author alanrw
*/
@SuppressWarnings("serial")
public abstract class ActivityConfigurationPanel extends JPanel {
private static final Logger logger = Logger.getLogger(ActivityConfigurationPanel.class);
private final static Scufl2Tools scufl2Tools = new Scufl2Tools();
// protected final URITools uriTools = new URITools();
private final Activity activity;
private final Configuration configuration;
private final List<ActivityPortConfiguration> inputPorts;
private final List<ActivityPortConfiguration> outputPorts;
protected ObjectNode json;
public ActivityConfigurationPanel(Activity activity) {
this(activity, scufl2Tools.configurationFor(activity,
activity.getParent()));
}
public ActivityConfigurationPanel(Activity activity,
Configuration configuration) {
this.activity = activity;
this.configuration = configuration;
inputPorts = new ArrayList<>();
outputPorts = new ArrayList<>();
}
/**
* Initializes the configuration panel. This method is also used to discard
* any changes and reset the panel to its initial state. Subclasses should
* implement this method to set up the panel and must call
* <tt>super.initialise()</tt> first.
*/
protected void initialise() {
json = configuration.getJson().deepCopy();
inputPorts.clear();
for (InputActivityPort activityPort : activity.getInputPorts())
inputPorts.add(new ActivityPortConfiguration(activityPort));
outputPorts.clear();
for (OutputActivityPort activityPort : activity.getOutputPorts())
outputPorts.add(new ActivityPortConfiguration(activityPort));
}
public abstract boolean checkValues();
public abstract void noteConfiguration();
public boolean isConfigurationChanged() {
noteConfiguration();
if (portsChanged(inputPorts, activity.getInputPorts().size()))
return true;
if (portsChanged(outputPorts, activity.getOutputPorts().size()))
return true;
return !json.equals(configuration.getJson());
}
public Configuration getConfiguration() {
return configuration;
}
public ObjectNode getJson() {
return json;
}
protected void setJson(ObjectNode json) {
this.json = json;
}
public void refreshConfiguration() {
initialise();
}
public void whenOpened() {
}
public void whenClosed() {
}
/**
* Convenience method for getting simple String property values.
*
* @param name
* the property name
* @return the property value
*/
protected String getProperty(String name) {
JsonNode jsonNode = json.get(name);
if (jsonNode == null)
return null;
return json.get(name).asText();
}
/**
* Convenience method for setting simple String property values.
*
* @param name
* the property name
* @param value
* the property value
*/
protected void setProperty(String name, String value) {
json.put(name, value);
}
public List<ActivityPortConfiguration> getInputPorts() {
return inputPorts;
}
public List<ActivityPortConfiguration> getOutputPorts() {
return outputPorts;
}
protected void configureInputPorts(ServiceRegistry serviceRegistry) {
try {
Map<String, InputActivityPort> newInputPorts = new HashMap<>();
for (InputActivityPort port : serviceRegistry
.getActivityInputPorts(getActivity().getType(), getJson()))
newInputPorts.put(port.getName(), port);
List<ActivityPortConfiguration> inputPorts = getInputPorts();
for (ActivityPortConfiguration portConfig : new ArrayList<>(
inputPorts))
if (newInputPorts.containsKey(portConfig.getName())) {
InputActivityPort port = newInputPorts.remove(portConfig
.getName());
portConfig.setDepth(port.getDepth());
} else
inputPorts.remove(portConfig);
for (InputActivityPort newPort : newInputPorts.values())
inputPorts.add(new ActivityPortConfiguration(newPort.getName(),
newPort.getDepth()));
} catch (InvalidConfigurationException | ActivityTypeNotFoundException e) {
logger.warn("Error configuring input ports", e);
}
}
protected void configureOutputPorts(ServiceRegistry serviceRegistry) {
try {
Map<String, OutputActivityPort> newOutputPorts = new HashMap<>();
for (OutputActivityPort port : serviceRegistry
.getActivityOutputPorts(getActivity().getType(), getJson()))
newOutputPorts.put(port.getName(), port);
List<ActivityPortConfiguration> outputPorts = getOutputPorts();
for (ActivityPortConfiguration portConfig : new ArrayList<>(
outputPorts))
if (newOutputPorts.containsKey(portConfig.getName())) {
OutputActivityPort port = newOutputPorts.remove(portConfig
.getName());
portConfig.setDepth(port.getDepth());
portConfig.setGranularDepth(port.getGranularDepth());
} else
outputPorts.remove(portConfig);
for (OutputActivityPort newPort : newOutputPorts.values())
outputPorts.add(new ActivityPortConfiguration(
newPort.getName(), newPort.getDepth()));
} catch (InvalidConfigurationException | ActivityTypeNotFoundException e) {
logger.warn("Error configuring output ports", e);
}
}
private boolean portsChanged(List<ActivityPortConfiguration> portDefinitions, int ports) {
int checkedPorts = 0;
for (ActivityPortConfiguration portDefinition : portDefinitions) {
String portName = portDefinition.getName();
int portDepth = portDefinition.getDepth();
ActivityPort activityPort = portDefinition.getActivityPort();
if (activityPort == null)
// new port added
return true;
if (!activityPort.getName().equals(portName))
// port name changed
return true;
if (!activityPort.getDepth().equals(portDepth))
// port depth changed
return true;
checkedPorts++;
}
if (checkedPorts < ports)
// ports deleted
return true;
return false;
}
public Activity getActivity() {
return activity;
}
}