You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@taverna.apache.org by st...@apache.org on 2016/10/21 09:48:45 UTC

[11/29] incubator-taverna-workbench git commit: Delete ProcessorEnactment rendering (Taverna 2 provenance)

Delete ProcessorEnactment rendering (Taverna 2 provenance)

results should now be shown purely by bundles and workflow reports


Project: http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/commit/5d00187a
Tree: http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/tree/5d00187a
Diff: http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/diff/5d00187a

Branch: refs/heads/master
Commit: 5d00187a6cede257f002e5d014c9b71ef9efcaf7
Parents: 359be67
Author: Stian Soiland-Reyes <st...@apache.org>
Authored: Fri Aug 19 11:53:08 2016 +0100
Committer: Stian Soiland-Reyes <st...@apache.org>
Committed: Fri Oct 21 09:17:10 2016 +0200

----------------------------------------------------------------------
 .../IntermediateValuesSwingWorker.java          |   43 -
 .../processor/ProcessorEnactmentsTreeModel.java |  184 ----
 .../processor/ProcessorEnactmentsTreeNode.java  |   80 --
 .../processor/ProcessorResultsComponent.java    | 1000 ------------------
 4 files changed, 1307 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/5d00187a/taverna-results-view/src/main/java/org/apache/taverna/workbench/views/results/processor/IntermediateValuesSwingWorker.java
----------------------------------------------------------------------
diff --git a/taverna-results-view/src/main/java/org/apache/taverna/workbench/views/results/processor/IntermediateValuesSwingWorker.java b/taverna-results-view/src/main/java/org/apache/taverna/workbench/views/results/processor/IntermediateValuesSwingWorker.java
deleted file mode 100644
index 08a9cb5..0000000
--- a/taverna-results-view/src/main/java/org/apache/taverna/workbench/views/results/processor/IntermediateValuesSwingWorker.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package org.apache.taverna.workbench.views.results.processor;
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import javax.swing.SwingWorker;
-
-public class IntermediateValuesSwingWorker extends
-		SwingWorker<ProcessorResultsComponent, String> {
-	private ProcessorResultsComponent component;
-	private Exception exception = null;
-
-	public IntermediateValuesSwingWorker(ProcessorResultsComponent component) {
-		this.component = component;
-	}
-
-	@Override
-	protected ProcessorResultsComponent doInBackground() throws Exception {
-		try {
-			component.populateEnactmentsMaps();
-		} catch (Exception e) {
-			this.exception = e;
-		}
-		return component;
-	}
-
-	public Exception getException() {
-		return exception;
-	}
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/5d00187a/taverna-results-view/src/main/java/org/apache/taverna/workbench/views/results/processor/ProcessorEnactmentsTreeModel.java
----------------------------------------------------------------------
diff --git a/taverna-results-view/src/main/java/org/apache/taverna/workbench/views/results/processor/ProcessorEnactmentsTreeModel.java b/taverna-results-view/src/main/java/org/apache/taverna/workbench/views/results/processor/ProcessorEnactmentsTreeModel.java
deleted file mode 100644
index 989e5a9..0000000
--- a/taverna-results-view/src/main/java/org/apache/taverna/workbench/views/results/processor/ProcessorEnactmentsTreeModel.java
+++ /dev/null
@@ -1,184 +0,0 @@
-package org.apache.taverna.workbench.views.results.processor;
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-
-import javax.swing.tree.DefaultMutableTreeNode;
-import javax.swing.tree.DefaultTreeModel;
-
-import org.apache.log4j.Logger;
-import org.apache.taverna.provenance.lineageservice.utils.ProcessorEnactment;
-import org.apache.taverna.workbench.views.results.processor.IterationTreeNode.ErrorState;
-
-/**
- * Model of the tree that contains enactments of a processor. Clicking on the
- * nodes of this tree triggers showing of results for this processor for this
- * particular enactment (invocation).
- * 
- * @author Alex Nenadic
- * @author Stian Soiland-Reyes
- */
-@SuppressWarnings("serial")
-public class ProcessorEnactmentsTreeModel extends DefaultTreeModel {
-	private static Logger logger = Logger
-			.getLogger(ProcessorEnactmentsTreeModel.class);
-
-	private Map<ProcessorEnactment, ProcessorEnactmentsTreeNode> processorEnactments = new ConcurrentHashMap<>();
-	private Map<String, ProcessorEnactment> processorEnactmentsById = new ConcurrentHashMap<>();
-	private final Set<ProcessorEnactment> enactmentsWithErrorOutputs;
-	private final Set<ProcessorEnactment> enactmentsWithErrorInputs;
-
-	public ProcessorEnactmentsTreeModel(
-			Set<ProcessorEnactment> enactmentsGotSoFar,
-			Set<ProcessorEnactment> enactmentsWithErrorInputs,
-			Set<ProcessorEnactment> enactmentsWithErrorOutputs) {
-		super(new DefaultMutableTreeNode("Invocations of processor"));
-		this.enactmentsWithErrorInputs = enactmentsWithErrorInputs;
-		this.enactmentsWithErrorOutputs = enactmentsWithErrorOutputs;
-		update(enactmentsGotSoFar);
-	}
-
-	public void update(Set<ProcessorEnactment> newEnactments) {
-		// First populate the ID map, so we can find parents later
-		for (ProcessorEnactment processorEnactment : newEnactments)
-			processorEnactmentsById.put(
-					processorEnactment.getProcessEnactmentId(),
-					processorEnactment);
-		for (ProcessorEnactment processorEnactment : newEnactments)
-			addProcessorEnactment(processorEnactment);
-	}
-
-	public ProcessorEnactmentsTreeNode addProcessorEnactment(
-			ProcessorEnactment processorEnactment) {
-		ProcessorEnactmentsTreeNode treeNode = processorEnactments
-				.get(processorEnactment);
-		boolean containsErrorsInOutputs = enactmentsWithErrorOutputs
-				.contains(processorEnactment);
-		boolean containsErrorsInInputs = enactmentsWithErrorInputs
-				.contains(processorEnactment);
-		if (treeNode != null) {
-			if (treeNode.getProcessorEnactment() != processorEnactment)
-				// Update it
-				treeNode.setProcessorEnactment(processorEnactment);
-			if (containsErrorsInInputs)
-				treeNode.setErrorState(ErrorState.INPUT_ERRORS);
-			else if (containsErrorsInOutputs)
-				treeNode.setErrorState(ErrorState.OUTPUT_ERRORS);
-			return treeNode;
-		}
-
-		List<Integer> iteration = iterationToIntegerList(processorEnactment
-				.getIteration());
-		String parentId = processorEnactment.getParentProcessorEnactmentId();
-		ProcessorEnactment parentProc = null;
-		List<Integer> parentIteration = null;
-		DefaultMutableTreeNode parentNode = getRoot();
-		if (parentId != null) {
-			parentProc = processorEnactmentsById.get(parentId);
-			if (parentProc == null)
-				logger.error("Can't find parent " + parentId);
-			else {
-				// Use treenode parent instead
-				parentNode = addProcessorEnactment(parentProc);
-				parentIteration = ((ProcessorEnactmentsTreeNode) parentNode)
-						.getIteration();
-			}
-		}
-
-		DefaultMutableTreeNode nodeToReplace = getNodeFor(parentNode,
-				iteration, parentIteration);
-		DefaultMutableTreeNode iterationParent = (DefaultMutableTreeNode) nodeToReplace
-				.getParent();
-		int position;
-		if (iterationParent == null) {
-			// nodeToReplace is the root, insert as first child
-			iterationParent = getRoot();
-			position = 0;
-		} else {
-			if (nodeToReplace.getChildCount() > 0)
-				logger.error("Replacing node " + nodeToReplace
-						+ " with unexpected " + nodeToReplace.getChildCount()
-						+ " children");
-			position = iterationParent.getIndex(nodeToReplace);
-			removeNodeFromParent(nodeToReplace);
-		}
-
-		ProcessorEnactmentsTreeNode newNode = new ProcessorEnactmentsTreeNode(
-				processorEnactment, parentIteration);
-		if (containsErrorsInInputs)
-			newNode.setErrorState(ErrorState.INPUT_ERRORS);
-		else if (containsErrorsInOutputs)
-			newNode.setErrorState(ErrorState.OUTPUT_ERRORS);
-
-		insertNodeInto(newNode, iterationParent, position);
-		processorEnactments.put(processorEnactment, newNode);
-		return newNode;
-	}
-
-	public static List<Integer> iterationToIntegerList(String iteration) {
-		// Strip []
-		iteration = iteration.substring(1, iteration.length()-1);
-		String[] iterationSlit = iteration.split(",");
-		List<Integer> integers =  new ArrayList<Integer>();
-		for (String index : iterationSlit) {
-			if (index.isEmpty())
-				continue;
-			integers.add(Integer.valueOf(index));
-		}
-		return integers;
-	}
-
-	@Override
-	public DefaultMutableTreeNode getRoot() {
-		return (DefaultMutableTreeNode) super.getRoot();
-	}
-
-	private DefaultMutableTreeNode getNodeFor(DefaultMutableTreeNode node,
-			List<Integer> remainingIteration, List<Integer> parentIteration) {
-		if (remainingIteration.isEmpty())
-			return node;
-		if (parentIteration == null)
-			parentIteration = new ArrayList<>();
-		int childPos = remainingIteration.get(0);
-		int needChildren = childPos + 1;
-		while (node.getChildCount() < needChildren) {
-			List<Integer> childIteration = new ArrayList<>(parentIteration);
-			childIteration.add(node.getChildCount());
-			DefaultMutableTreeNode newChild = new IterationTreeNode(
-					childIteration);
-			insertNodeInto(newChild, node, node.getChildCount());
-		}
-		DefaultMutableTreeNode child = (DefaultMutableTreeNode) node
-				.getChildAt(childPos);
-
-		List<Integer> childIteration = new ArrayList<>(parentIteration);
-		childIteration.add(childPos);
-		// Iteration 3.1.3
-//		if (iteration.size() > 1) {
-			// Recurse next iteration levels
-			return getNodeFor(child,
-					remainingIteration.subList(1, remainingIteration.size()),
-					childIteration);
-//		}
-//		return child;
-	}
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/5d00187a/taverna-results-view/src/main/java/org/apache/taverna/workbench/views/results/processor/ProcessorEnactmentsTreeNode.java
----------------------------------------------------------------------
diff --git a/taverna-results-view/src/main/java/org/apache/taverna/workbench/views/results/processor/ProcessorEnactmentsTreeNode.java b/taverna-results-view/src/main/java/org/apache/taverna/workbench/views/results/processor/ProcessorEnactmentsTreeNode.java
deleted file mode 100644
index 2d0c27c..0000000
--- a/taverna-results-view/src/main/java/org/apache/taverna/workbench/views/results/processor/ProcessorEnactmentsTreeNode.java
+++ /dev/null
@@ -1,80 +0,0 @@
-package org.apache.taverna.workbench.views.results.processor;
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import static org.apache.taverna.workbench.views.results.processor.ProcessorEnactmentsTreeModel.iterationToIntegerList;
-
-import java.util.ArrayList;
-import java.util.List;
-import org.apache.taverna.provenance.lineageservice.utils.ProcessorEnactment;
-
-
-/**
- * Node in a processor enactments tree. Contains a particular enactment of the
- * processor.
- * 
- * @author Alex Nenadic
- */
-@SuppressWarnings("serial")
-public class ProcessorEnactmentsTreeNode extends IterationTreeNode {
-	private List<Integer> myIteration = new ArrayList<>();
-	private List<Integer> parentIteration = new ArrayList<>();
-
-	public ProcessorEnactmentsTreeNode(ProcessorEnactment processorEnactment,
-			List<Integer> parentIteration) {
-		super();
-		this.parentIteration = parentIteration;
-		setProcessorEnactment(processorEnactment);
-	}
-
-	protected void updateFullIteration() {
-		List<Integer> fullIteration = new ArrayList<>();
-		if (getParentIteration() != null)
-			fullIteration.addAll(getParentIteration());
-		fullIteration.addAll(getMyIteration());
-		setIteration(fullIteration);
-	}
-
-	public final List<Integer> getMyIteration() {
-		return myIteration;
-	}
-
-	@Override
-	public final List<Integer> getParentIteration() {
-		return parentIteration;
-	}
-
-	public final ProcessorEnactment getProcessorEnactment() {
-		return (ProcessorEnactment) getUserObject();
-	}
-
-	public final void setMyIteration(List<Integer> myIteration) {
-		this.myIteration = myIteration;
-		updateFullIteration();
-	}
-
-	public final void setParentIteration(List<Integer> parentIteration) {
-		this.parentIteration = parentIteration;
-		updateFullIteration();
-	}
-
-	public final void setProcessorEnactment(
-			ProcessorEnactment processorEnactment) {
-		setUserObject(processorEnactment);
-		setMyIteration(iterationToIntegerList(processorEnactment.getIteration()));
-	}
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/5d00187a/taverna-results-view/src/main/java/org/apache/taverna/workbench/views/results/processor/ProcessorResultsComponent.java
----------------------------------------------------------------------
diff --git a/taverna-results-view/src/main/java/org/apache/taverna/workbench/views/results/processor/ProcessorResultsComponent.java b/taverna-results-view/src/main/java/org/apache/taverna/workbench/views/results/processor/ProcessorResultsComponent.java
deleted file mode 100644
index 27962da..0000000
--- a/taverna-results-view/src/main/java/org/apache/taverna/workbench/views/results/processor/ProcessorResultsComponent.java
+++ /dev/null
@@ -1,1000 +0,0 @@
-package org.apache.taverna.workbench.views.results.processor;
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import static java.awt.BorderLayout.CENTER;
-import static java.awt.BorderLayout.EAST;
-import static java.awt.BorderLayout.NORTH;
-import static java.awt.BorderLayout.SOUTH;
-import static java.awt.BorderLayout.WEST;
-import static java.awt.Color.RED;
-import static java.awt.GridBagConstraints.BOTH;
-import static java.awt.GridBagConstraints.NONE;
-import static java.util.Collections.emptyList;
-import static java.util.Collections.sort;
-import static java.util.Collections.synchronizedSet;
-import static javax.swing.BorderFactory.createEmptyBorder;
-import static javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED;
-import static javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED;
-import static javax.swing.SwingUtilities.invokeLater;
-import static javax.swing.SwingUtilities.isEventDispatchThread;
-import static javax.swing.border.EtchedBorder.LOWERED;
-import static javax.swing.tree.TreeSelectionModel.SINGLE_TREE_SELECTION;
-import static org.apache.taverna.workbench.MainWindow.getMainWindow;
-import static org.apache.taverna.workbench.icons.WorkbenchIcons.closeIcon;
-import static org.apache.taverna.workbench.icons.WorkbenchIcons.inputIcon;
-import static org.apache.taverna.workbench.icons.WorkbenchIcons.outputIcon;
-import static org.apache.taverna.workbench.icons.WorkbenchIcons.saveAllIcon;
-import static org.apache.taverna.workbench.views.results.processor.IterationTreeNode.ErrorState.INPUT_ERRORS;
-import static org.apache.taverna.workbench.views.results.processor.IterationTreeNode.ErrorState.OUTPUT_ERRORS;
-
-import java.awt.BorderLayout;
-import java.awt.Color;
-import java.awt.Component;
-import java.awt.FlowLayout;
-import java.awt.GridBagConstraints;
-import java.awt.GridBagLayout;
-import java.awt.Insets;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.awt.event.ItemEvent;
-import java.awt.event.ItemListener;
-import java.nio.file.Path;
-import java.sql.Timestamp;
-import java.text.NumberFormat;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-import java.util.TreeMap;
-import java.util.concurrent.ConcurrentHashMap;
-
-import javax.swing.AbstractAction;
-import javax.swing.Action;
-import javax.swing.JButton;
-import javax.swing.JCheckBox;
-import javax.swing.JComboBox;
-import javax.swing.JDialog;
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-import javax.swing.JSplitPane;
-import javax.swing.JTabbedPane;
-import javax.swing.JTree;
-import javax.swing.border.CompoundBorder;
-import javax.swing.border.EmptyBorder;
-import javax.swing.border.EtchedBorder;
-import javax.swing.event.ChangeEvent;
-import javax.swing.event.ChangeListener;
-import javax.swing.event.TreeSelectionEvent;
-import javax.swing.event.TreeSelectionListener;
-import javax.swing.tree.DefaultMutableTreeNode;
-import javax.swing.tree.DefaultTreeCellRenderer;
-import javax.swing.tree.TreePath;
-
-import org.apache.taverna.facade.WorkflowInstanceFacade;
-import org.apache.taverna.facade.WorkflowInstanceFacade.State;
-import org.apache.taverna.lang.ui.DialogTextArea;
-import org.apache.taverna.provenance.ProvenanceConnectorFactory;
-import org.apache.taverna.provenance.api.ProvenanceAccess;
-import org.apache.taverna.provenance.lineageservice.utils.Port;
-import org.apache.taverna.provenance.lineageservice.utils.ProcessorEnactment;
-import org.apache.taverna.reference.ReferenceService;
-import org.apache.taverna.reference.T2Reference;
-import org.apache.taverna.renderers.RendererRegistry;
-import org.apache.taverna.workbench.helper.HelpEnabledDialog;
-import org.apache.taverna.workbench.ui.SwingWorkerCompletionWaiter;
-import org.apache.taverna.workbench.views.results.processor.FilteredIterationTreeModel.FilterType;
-import org.apache.taverna.workbench.views.results.processor.IterationTreeNode.ErrorState;
-import org.apache.taverna.workbench.views.results.saveactions.SaveAllResultsSPI;
-import org.apache.taverna.workbench.views.results.saveactions.SaveIndividualResultSPI;
-import org.apache.taverna.workflowmodel.Dataflow;
-import org.apache.taverna.workflowmodel.Processor;
-import org.apache.taverna.workflowmodel.ProcessorInputPort;
-import org.apache.taverna.workflowmodel.ProcessorOutputPort;
-import org.apache.taverna.workflowmodel.utils.Tools;
-
-import org.apache.log4j.Logger;
-
-import org.apache.taverna.configuration.database.DatabaseConfiguration;
-
-/**
- * A component that contains a tabbed pane for displaying inputs and outputs of a processor (i.e.
- * intermediate results for a workflow run).
- *<p>
- *FIXME Needs deleting or converting to DataBundles
- * @author Alex Nenadic
- *
- */
-@SuppressWarnings("serial")
-public class ProcessorResultsComponent extends JPanel {
-	private static final Logger logger = Logger.getLogger(ProcessorResultsComponent.class);
-	private static final SimpleDateFormat ISO_8601 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-	private static final String HOURS = "h";
-	private static final String MINUTES = "m";
-	private static final String SECONDS = "s";
-	private static final String MILLISECONDS = "ms";
-
-	/**
-	 * JSplitPane that contains the invocation list for the processor on the
-	 * left and a tabbed pane with processors ports on the right.
-	 */
-	private JSplitPane splitPane;
-	/** Tree containing enactments (invocations) of the processor.*/
-	protected JTree processorEnactmentsTree;
-	/**
-	 * Tabbed pane - each tab contains a processor input/outputs data/results
-	 * tree and a RenderedProcessorResultComponent, which in turn contains the
-	 * currently selected node rendered according to its MIME type.
-	 */
-	private JTabbedPane tabbedPane;
-	/** Panel containing the title*/
-	private JPanel titlePanel;
-	private Processor processor;
-	@SuppressWarnings("unused")
-	private Dataflow dataflow;
-	private String runId;
-	@SuppressWarnings("unused")
-	private ReferenceService referenceService;
-	private WorkflowInstanceFacade facade; // in the case this is a fresh run
-	boolean resultsUpdateNeeded = false;
-
-	/** Enactments received for this processor */
-	private Set<ProcessorEnactment> enactmentsGotSoFar = synchronizedSet(new HashSet<ProcessorEnactment>());
-	private Set<String> enactmentIdsGotSoFar = synchronizedSet(new HashSet<String>());
-
-	private Map<String, ProcessorPortResultsViewTab> inputPortTabMap = new ConcurrentHashMap<>();
-	private Map<String, ProcessorPortResultsViewTab> outputPortTabMap = new ConcurrentHashMap<>();
-
-	/** All data for intermediate results is pulled from provenance.*/
-	private ProvenanceAccess provenanceAccess;
-	private ProcessorEnactmentsTreeModel processorEnactmentsTreeModel;
-	private FilteredIterationTreeModel filteredTreeModel;
-
-	/**
-	 * Map: enactment -> (port, t2Ref, tree).
-	 * <p>
-	 * Each enactment is mapped to a list of 3-element lists. The 3-element list
-	 * contains processor input/output port, t2ref to data consumed/produced on
-	 * that port and tree view of the data. Tree is only created on demand -
-	 * i.e. when user selects a particular enactment and a specific port.
-	 */
-	protected Map<ProcessorEnactment, List<List<Object>>> enactmentsToInputPortData = new ConcurrentHashMap<>();
-	protected Map<ProcessorEnactment, List<List<Object>>> enactmentsToOutputPortData = new ConcurrentHashMap<>();
-
-	protected Set<ProcessorEnactment> enactmentsWithErrorInputs = synchronizedSet(new HashSet<ProcessorEnactment>());
-	protected Set<ProcessorEnactment> enactmentsWithErrorOutputs = synchronizedSet(new HashSet<ProcessorEnactment>());
-
-	private JLabel iterationLabel;
-	/**
-	 * List of all existing 'save results' actions, each one can save results in
-	 * a different format
-	 */
-	private final List<SaveAllResultsSPI> saveActions;
-	private JButton saveAllButton;
-	private String processorId = null;
-	private List<Processor> processorsPath;
-	private ProcessorEnactmentsTreeNode procEnactmentTreeNode = null;
-	private final RendererRegistry rendererRegistry;
-	private final List<SaveIndividualResultSPI> saveIndividualActions;
-
-	public ProcessorResultsComponent(Processor processor, Dataflow dataflow,
-			String runId, ReferenceService referenceService,
-			RendererRegistry rendererRegistry,
-			List<SaveAllResultsSPI> saveActions,
-			List<SaveIndividualResultSPI> saveIndividualActions,
-			List<ProvenanceConnectorFactory> provenanceConnectorFactories,
-			DatabaseConfiguration databaseConfiguration) {
-		super(new BorderLayout());
-		this.processor = processor;
-		this.rendererRegistry = rendererRegistry;
-		this.saveActions = saveActions;
-		this.saveIndividualActions = saveIndividualActions;
-		this.processorsPath = Tools.getNestedPathForProcessor(processor,
-				dataflow);
-		this.dataflow = dataflow;
-		this.runId = runId;
-		this.referenceService = referenceService;
-		this.facade = null;
-		provenanceAccess = new ProvenanceAccess(
-				databaseConfiguration.getConnectorType(),
-				provenanceConnectorFactories);
-		initComponents();
-	}
-
-	public ProcessorResultsComponent(WorkflowInstanceFacade facade, Processor processor,
-			Dataflow dataflow, String runId, ReferenceService referenceService,
-			RendererRegistry rendererRegistry, List<SaveAllResultsSPI> saveActions,
-			List<SaveIndividualResultSPI> saveIndividualActions,
-			List<ProvenanceConnectorFactory> provenanceConnectorFactories,
-			DatabaseConfiguration databaseConfiguration) {
-		super(new BorderLayout());
-		this.processor = processor;
-		this.rendererRegistry = rendererRegistry;
-		this.saveActions = saveActions;
-		this.saveIndividualActions = saveIndividualActions;
-		this.processorsPath = Tools.getNestedPathForProcessor(processor, dataflow);
-		this.dataflow = dataflow;
-		this.runId = runId;
-		this.referenceService = referenceService;
-		this.facade = facade;
-		provenanceAccess = new ProvenanceAccess(databaseConfiguration.getConnectorType(), provenanceConnectorFactories);
-
-		/**
-		 * Is this still a running wf - do we need to periodically check with
-		 * provenance for new results?
-		 */
-		resultsUpdateNeeded = !(facade.getState().equals(State.cancelled) || facade
-				.getState().equals(State.completed));
-
-		initComponents();
-	}
-
-	public void initComponents() {
-		setBorder(new EtchedBorder());
-
-		titlePanel = new JPanel(new BorderLayout());
-		titlePanel.setBorder(new EmptyBorder(5, 0, 5, 0));
-		titlePanel.add(new JLabel("Intermediate results for service: " + processor.getLocalName()),
-				WEST);
-
-		String title = "<html><body>Intermediate values for the service <b>"
-				+ processor.getLocalName() + "</b></body></html>";
-		JLabel tableLabel = new JLabel(title);
-		titlePanel.add(tableLabel, WEST);
-		iterationLabel = new JLabel();
-		int spacing = iterationLabel.getFontMetrics(iterationLabel.getFont()).charWidth(' ');
-		iterationLabel.setBorder(createEmptyBorder(0, spacing * 5, 0, 0));
-		titlePanel.add(iterationLabel, CENTER);
-
-		saveAllButton = new JButton(new SaveAllAction("Save iteration values", this));
-		saveAllButton.setEnabled(false);
-
-		titlePanel.add(saveAllButton, EAST);
-		add(titlePanel, NORTH);
-
-		tabbedPane = new JTabbedPane();
-
-		// Create enactment to (port, t2ref, tree) lists maps.
-		enactmentsToInputPortData = new HashMap<>();
-		enactmentsToOutputPortData = new HashMap<>();
-
-		// Processor input ports
-		List<ProcessorInputPort> processorInputPorts = new ArrayList<>(
-				processor.getInputPorts());
-		sort(processorInputPorts, new Comparator<ProcessorInputPort>() {
-			@Override
-			public int compare(ProcessorInputPort o1, ProcessorInputPort o2) {
-				return o1.getName().compareTo(o2.getName());
-			}
-		});
-		for (ProcessorInputPort processorInputPort : processorInputPorts) {
-			String portName = processorInputPort.getName();
-			ProcessorPortResultsViewTab resultTab = new ProcessorPortResultsViewTab(
-					portName, rendererRegistry, saveIndividualActions);
-			resultTab.setIsOutputPortTab(false);
-			inputPortTabMap.put(portName, resultTab);
-			tabbedPane.addTab(portName, inputIcon, resultTab, "Input port "
-					+ portName);
-		}
-
-		// Processor output ports
-		List<ProcessorOutputPort> processorOutputPorts = new ArrayList<>(
-				processor.getOutputPorts());
-		sort(processorOutputPorts, new Comparator<ProcessorOutputPort>() {
-			@Override
-			public int compare(ProcessorOutputPort o1, ProcessorOutputPort o2) {
-				return o1.getName().compareTo(o2.getName());
-			}
-		});
-		for (ProcessorOutputPort processorOutputPort : processorOutputPorts) {
-			String portName = processorOutputPort.getName();
-			ProcessorPortResultsViewTab resultTab = new ProcessorPortResultsViewTab(
-					portName, rendererRegistry, saveIndividualActions);
-			resultTab.setIsOutputPortTab(true);
-			outputPortTabMap.put(portName, resultTab);
-			tabbedPane.addTab(portName, outputIcon, resultTab, "Output port "
-					+ portName);
-		}
-
-		processorEnactmentsTreeModel = new ProcessorEnactmentsTreeModel(enactmentsGotSoFar,
-				enactmentsWithErrorInputs, enactmentsWithErrorOutputs);
-		filteredTreeModel = new FilteredIterationTreeModel(processorEnactmentsTreeModel);
-		processorEnactmentsTree = new JTree(filteredTreeModel);
-		processorEnactmentsTree.setRootVisible(false);
-		processorEnactmentsTree.setShowsRootHandles(true);
-		processorEnactmentsTree.getSelectionModel().setSelectionMode(
-				SINGLE_TREE_SELECTION);
-		// Start listening for selections in the enactments tree
-		processorEnactmentsTree.addTreeSelectionListener(new TreeSelectionListener() {
-			@Override
-			public void valueChanged(TreeSelectionEvent e) {
-				// Change the result for the selected enactment in the
-				// current tab
-				setDataTreeForResultTab();
-			}
-		});
-		processorEnactmentsTree.setCellRenderer(new DefaultTreeCellRenderer() {
-			@Override
-			public Component getTreeCellRendererComponent(JTree tree, Object value,
-					boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) {
-				super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row,
-						hasFocus);
-				if (value instanceof IterationTreeNode) {
-					IterationTreeNode iterationTreeNode = (IterationTreeNode) value;
-					ErrorState errorState = iterationTreeNode.getErrorState();
-					if (errorState.equals(OUTPUT_ERRORS))
-						setForeground(RED);
-					else if (errorState.equals(INPUT_ERRORS))
-						setForeground(new Color(0xdd, 0xa7, 0x00));
-				}
-				return this;
-			}
-		});
-
-		// Register a tab change listener
-		tabbedPane.addChangeListener(new ChangeListener() {
-			@Override
-			public void stateChanged(ChangeEvent evt) {
-				setDataTreeForResultTab();
-			}
-		});
-
-		splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
-		splitPane.setBottomComponent(tabbedPane);
-
-		final JComboBox<FilterType> filterChoiceBox = new JComboBox<>(
-				new FilterType[] { FilterType.ALL, FilterType.RESULTS,
-						FilterType.ERRORS, FilterType.SKIPPED });
-		filterChoiceBox.addActionListener(new ActionListener() {
-			@Override
-			public void actionPerformed(ActionEvent e) {
-				filteredTreeModel.setFilter((FilterType) filterChoiceBox.getSelectedItem());
-				ProcessorResultsComponent.this.updateTree();
-			}
-		});
-
-		filterChoiceBox.setSelectedIndex(0);
-		JPanel enactmentsTreePanel = new JPanel(new BorderLayout());
-		JPanel enactmentsComboPanel = new JPanel(new BorderLayout());
-		enactmentsComboPanel.add(filterChoiceBox, BorderLayout.WEST);
-		enactmentsTreePanel.add(enactmentsComboPanel, NORTH);
-		enactmentsTreePanel.add(new JScrollPane(processorEnactmentsTree,
-				VERTICAL_SCROLLBAR_AS_NEEDED, HORIZONTAL_SCROLLBAR_AS_NEEDED),
-				CENTER);
-		splitPane.setTopComponent(enactmentsTreePanel);
-		add(splitPane, CENTER);
-
-		resultsUpdateNeeded = true;
-		update();
-	}
-
-	public static String formatMilliseconds(long timeInMiliseconds) {
-		double timeInSeconds;
-		if (timeInMiliseconds < 1000)
-			return timeInMiliseconds + " " + MILLISECONDS;
-		NumberFormat numberFormat = NumberFormat.getNumberInstance();
-		numberFormat.setMaximumFractionDigits(1);
-		numberFormat.setMinimumFractionDigits(1);
-		timeInSeconds = timeInMiliseconds / 1000.0;
-		if (timeInSeconds < 60)
-			return numberFormat.format(timeInSeconds) + " " + SECONDS;
-		double timeInMinutes = timeInSeconds / 60.0;
-		if (timeInMinutes < 60)
-			return numberFormat.format(timeInMinutes) + " " + MINUTES;
-		double timeInHours = timeInMinutes / 60.0;
-		return numberFormat.format(timeInHours) + " " + HOURS;
-	}
-
-	private void setDataTreeForResultTab() {
-		final ProcessorPortResultsViewTab selectedResultTab = (ProcessorPortResultsViewTab) tabbedPane
-				.getSelectedComponent();
-		if (processorEnactmentsTree.getSelectionModel().isSelectionEmpty()) {
-			disableResultTabForNode(selectedResultTab, null);
-			return;
-		}
-		TreePath selectedPath = processorEnactmentsTree.getSelectionModel()
-				.getSelectionPath();
-		Object lastPathComponent = selectedPath.getLastPathComponent();
-		if (!(lastPathComponent instanceof ProcessorEnactmentsTreeNode)) {
-			// Just an IterationTreeNode along the way, no data to show
-			disableResultTabForNode(selectedResultTab,
-					(DefaultMutableTreeNode) lastPathComponent);
-			return;
-		}
-
-		procEnactmentTreeNode = (ProcessorEnactmentsTreeNode) lastPathComponent;
-		ProcessorEnactment processorEnactment = (ProcessorEnactment) procEnactmentTreeNode
-				.getUserObject();
-
-		if (!processorEnactment.getProcessorId().equals(processorId)) {
-			/*
-			 * It's not our processor, must be a nested workflow iteration,
-			 * which we should not show
-			 */
-			disableResultTabForNode(selectedResultTab, procEnactmentTreeNode);
-			return;
-		}
-
-		// Update iterationLabel
-		StringBuilder iterationLabelText = labelForProcEnactment(procEnactmentTreeNode,
-				processorEnactment);
-		iterationLabel.setText(iterationLabelText.toString());
-		saveAllButton.setEnabled(true);
-
-		Map<ProcessorEnactment, List<List<Object>>> map;
-		if (selectedResultTab.getIsOutputPortTab()) // output port tab
-			map = enactmentsToOutputPortData;
-		else // input port tab
-			map = enactmentsToInputPortData;
-		List<List<Object>> listOfListsOfPortData = map.get(processorEnactment);
-		if (listOfListsOfPortData == null)
-			listOfListsOfPortData = emptyList();
-
-		JTree tree = null;
-		/*
-		 * Get the tree for this port and this enactment and show it on results
-		 * tab
-		 */
-		for (List<Object> listOfPortData : listOfListsOfPortData)
-			// Find data in the map for this port
-			if (selectedResultTab.getPortName().equals(
-					((Port) listOfPortData.get(0)).getPortName())) {
-				// list.get(0) contains the port
-				// list.get(1) contains the t2Ref to data
-				// list.get(2) contains the tree
-				if (listOfPortData.get(2) == null)
-					// tree has not been created yet
-					tree = createTreeForPort(selectedResultTab,
-							processorEnactment, map, listOfListsOfPortData,
-							listOfPortData);
-				else
-					tree = updateTreeForPort(selectedResultTab, listOfPortData);
-				break;
-			}
-
-		// Show the tree
-		selectedResultTab.setResultsTree(tree);
-	}
-
-	private JTree createTreeForPort(ProcessorPortResultsViewTab selectedTab,
-			ProcessorEnactment enactment,
-			Map<ProcessorEnactment, List<List<Object>>> map,
-			List<List<Object>> listOfPortDataLists, List<Object> portDataList) {
-		// Clear previously shown rendered result, if any
-		RenderedProcessorResultComponent renderedResultComponent = selectedTab
-				.getRenderedResultComponent();
-		renderedResultComponent.clearResult();
-
-		// Create a tree for this data
-		ProcessorResultsTreeModel treeModel = new ProcessorResultsTreeModel(
-				(Path) portDataList.get(1));
-		JTree tree = new JTree(new FilteredProcessorValueTreeModel(treeModel));
-		/*
-		 * Remember this triple and its index in the big list so we can update
-		 * the map for this enactment after we have finished iterating
-		 */
-		int index = listOfPortDataLists.indexOf(portDataList);
-		tree.getSelectionModel().setSelectionMode(SINGLE_TREE_SELECTION);
-		tree.setExpandsSelectedPaths(true);
-		tree.setRootVisible(false);
-		tree.setShowsRootHandles(true);
-		tree.setCellRenderer(new ProcessorResultCellRenderer());
-		// Expand the whole tree
-		/*
-		 * for (int row = 0; row < tree.getRowCount(); row++) { tree.expandRow(row); }
-		 */
-		tree.addTreeSelectionListener(new TreeSelectionListener() {
-			@Override
-			public void valueChanged(TreeSelectionEvent e) {
-				TreePath selectionPath = e.getNewLeadSelectionPath();
-				if (selectionPath != null) {
-					// Get the selected node
-					Object selectedNode = selectionPath.getLastPathComponent();
-					ProcessorPortResultsViewTab selectedResultTab = (ProcessorPortResultsViewTab) tabbedPane
-							.getSelectedComponent();
-					selectedResultTab.getRenderedResultComponent().setNode(
-							(ProcessorResultTreeNode) selectedNode);
-				}
-			}
-		});
-
-		portDataList.set(2, tree); // set the new tree
-		if (index != -1) {
-			/*
-			 * Put the tree in the map and put the modified list back to the map
-			 */
-			listOfPortDataLists.set(index, portDataList);
-			map.put(enactment, listOfPortDataLists);
-		}
-		return tree;
-	}
-
-	private JTree updateTreeForPort(ProcessorPortResultsViewTab selectedTab,
-			List<Object> portDataList) {
-		JTree tree = (JTree) portDataList.get(2);
-		/*
-		 * Show the right value in the rendering component i.e. render the
-		 * selected value for this port and this enactment if anything was
-		 * selected in the result for port tree.
-		 */
-		TreePath selectionPath = tree.getSelectionPath();
-		if (selectionPath != null) {
-			// Get the selected node
-			Object selectedNode = selectionPath.getLastPathComponent();
-			selectedTab.getRenderedResultComponent().setNode(
-					(ProcessorResultTreeNode) selectedNode);
-		}
-		return tree;
-	}
-
-	private void disableResultTabForNode(final ProcessorPortResultsViewTab selectedResultTab,
-			DefaultMutableTreeNode lastPathComponent) {
-		selectedResultTab.setResultsTree(null);
-		String label = labelForNode(lastPathComponent);
-		iterationLabel.setText(label);
-		saveAllButton.setEnabled(false);
-	}
-
-	private StringBuilder labelForProcEnactment(ProcessorEnactmentsTreeNode procEnactmentTreeNode,
-			ProcessorEnactment processorEnactment) {
-		StringBuilder iterationLabelText = new StringBuilder();
-		// Use <html> so we can match font metrics of titleJLabel
-		iterationLabelText.append("<html><body>");
-		iterationLabelText.append(procEnactmentTreeNode);
-		Timestamp started = processorEnactment.getEnactmentStarted();
-		Timestamp ended = processorEnactment.getEnactmentEnded();
-		if (started != null) {
-			if (procEnactmentTreeNode.getErrorState() == INPUT_ERRORS)
-				iterationLabelText.append(" <font color='#cc9700'>skipped</font> ");
-			else
-				iterationLabelText.append(" started ");
-			iterationLabelText.append(ISO_8601.format(started));
-		}
-		if (ended != null
-				&& procEnactmentTreeNode.getErrorState() != INPUT_ERRORS) {
-			// Don't show End time if there was input errors
-
-			if (started != null) {
-				iterationLabelText.append(", ");
-			}
-			if (procEnactmentTreeNode.getErrorState() == OUTPUT_ERRORS)
-				iterationLabelText.append(" <font color='red'>failed</font> ");
-			else
-				iterationLabelText.append(" ended ");
-			iterationLabelText.append(ISO_8601.format(ended));
-			if (started != null) {
-				long duration = ended.getTime() - started.getTime();
-				iterationLabelText.append(" (");
-				iterationLabelText.append(formatMilliseconds(duration));
-				iterationLabelText.append(")");
-			}
-		}
-		iterationLabelText.append("</body></html>");
-		return iterationLabelText;
-	}
-
-	private String labelForNode(DefaultMutableTreeNode node) {
-		if (node == null)
-			return "No selection";
-		StringBuilder label = new StringBuilder();
-		label.append(node);
-		if (node.getUserObject() != null) {
-			label.append(" containing ");
-			label.append(node.getLeafCount());
-			label.append(" iterations");
-		}
-		return label.toString();
-	}
-
-	public void populateEnactmentsMaps() {
-		synchronized (enactmentsGotSoFar) {
-			// Get processor enactments (invocations) from provenance
-
-			// Create the array of nested processors' names
-			String[] processorNamesPath = null;
-			if (processorsPath != null) { // should not be null really
-				processorNamesPath = new String[processorsPath.size()];
-				int i = 0;
-				for (Processor proc : processorsPath)
-					processorNamesPath[i++] = proc.getLocalName();
-			} else { // This should not really happen!
-				processorNamesPath = new String[1];
-				processorNamesPath[0] = processor.getLocalName();
-			}
-
-			List<ProcessorEnactment> processorEnactmentsStack = provenanceAccess
-					.getProcessorEnactments(runId, processorNamesPath);
-
-			if (processorId == null && !processorEnactmentsStack.isEmpty()) {
-				// Extract processor ID from very first processorEnactment
-				processorId = processorEnactmentsStack.get(0).getProcessorId();
-			}
-
-			while (!processorEnactmentsStack.isEmpty()) {
-				// fetch LAST one first, so we'll get the parent's early
-				ProcessorEnactment processorEnactment = processorEnactmentsStack
-						.remove(processorEnactmentsStack.size() - 1);
-				if (!enactmentsGotSoFar.contains(processorEnactment)) {
-					enactmentsGotSoFar.add(processorEnactment);
-					enactmentIdsGotSoFar.add(processorEnactment
-							.getProcessEnactmentId());
-
-					String parentId = processorEnactment
-							.getParentProcessorEnactmentId();
-					if (parentId != null
-							&& !enactmentIdsGotSoFar.contains(parentId)) {
-						/*
-						 * Also add parent (and their parent, etc) - so that we
-						 * can show the full iteration treeenactmentIdsGotSoFar
-						 */
-						ProcessorEnactment parentEnactment = provenanceAccess
-								.getProcessorEnactment(parentId);
-						if (parentEnactment == null) {
-							logger.error("Could not find parent processor enactment id="
-									+ parentId
-									+ ", skipping "
-									+ processorEnactment);
-							enactmentsGotSoFar.remove(processorEnactment);
-							enactmentIdsGotSoFar.remove(processorEnactment);
-							continue;
-						}
-						processorEnactmentsStack.add(parentEnactment);
-					}
-				}
-				if (!processorEnactment.getProcessorId().equals(processorId))
-					// A parent processors, no need to fetch their data bindings
-					continue;
-
-				String initialInputs = processorEnactment.getInitialInputsDataBindingId();
-				String finalOutputs = processorEnactment.getFinalOutputsDataBindingId();
-
-				boolean fetchingInputs = initialInputs != null
-						&& !enactmentsToInputPortData.containsKey(processorEnactment);
-				boolean fetchingOutputs = finalOutputs != null
-						&& !enactmentsToOutputPortData.containsKey(processorEnactment);
-
-				Map<Port, T2Reference> dataBindings = new HashMap<Port, T2Reference>();
-
-				if (fetchingInputs) {
-					dataBindings = provenanceAccess.getDataBindings(initialInputs);
-					enactmentsToInputPortData
-							.put(processorEnactment, new ArrayList<List<Object>>());
-				}
-				if (fetchingOutputs) {
-					enactmentsToOutputPortData.put(processorEnactment,
-							new ArrayList<List<Object>>());
-					if (!fetchingInputs
-							|| (finalOutputs != null && !finalOutputs
-									.equals(initialInputs)))
-						dataBindings.putAll(provenanceAccess.getDataBindings(finalOutputs));
-				}
-
-				for (Entry<Port, T2Reference> entry : dataBindings.entrySet()) {
-					/*
-					 * Create (port, t2Ref, tree) list for this enactment. Tree
-					 * is set to null initially and populated on demand (when
-					 * user clicks on particular enactment/iteration node).
-					 */
-					List<Object> dataOnPortList = new ArrayList<>();
-					Port port = entry.getKey();
-					dataOnPortList.add(port); // port
-					T2Reference t2Reference = entry.getValue();
-					dataOnPortList.add(t2Reference); // t2Ref
-					/*
-					 * tree (will be populated when a user clicks on this iteration and this port
-					 * tab is selected)
-					 */
-					dataOnPortList.add(null);
-
-					if (port.isInputPort() && fetchingInputs) { // Input port
-						if (t2Reference.containsErrors())
-							enactmentsWithErrorInputs.add(processorEnactment);
-						List<List<Object>> listOfPortDataLists = enactmentsToInputPortData
-								.get(processorEnactment);
-						listOfPortDataLists.add(dataOnPortList);
-						enactmentsToInputPortData.put(processorEnactment, listOfPortDataLists);
-					} else if (!port.isInputPort() && fetchingOutputs) { // output port
-						if (t2Reference.containsErrors())
-							enactmentsWithErrorOutputs.add(processorEnactment);
-						List<List<Object>> listOfPortDataLists = enactmentsToOutputPortData
-								.get(processorEnactment);
-						listOfPortDataLists.add(dataOnPortList);
-						enactmentsToOutputPortData.put(processorEnactment, listOfPortDataLists);
-					}
-				}
-			}
-		}
-	}
-
-	private List<TreePath> expandedPaths = new ArrayList<>();
-	private TreePath selectionPath = null;
-
-	private void rememberPaths() {
-		expandedPaths.clear();
-		for (Enumeration<?> e = processorEnactmentsTree
-				.getExpandedDescendants(new TreePath(filteredTreeModel
-						.getRoot())); (e != null) && e.hasMoreElements();)
-			expandedPaths.add((TreePath) e.nextElement());
-		selectionPath = processorEnactmentsTree.getSelectionPath();
-	}
-
-	private void reinstatePaths() {
-		for (TreePath path : expandedPaths)
-			if (filteredTreeModel.isShown((DefaultMutableTreeNode) path
-					.getLastPathComponent()))
-				processorEnactmentsTree.expandPath(path);
-		if (selectionPath != null) {
-			if (filteredTreeModel
-					.isShown((DefaultMutableTreeNode) selectionPath
-							.getLastPathComponent()))
-				processorEnactmentsTree.setSelectionPath(selectionPath);
-			else
-				processorEnactmentsTree.clearSelection();
-		}
-	}
-
-	public void updateTree() {
-		rememberPaths();
-		processorEnactmentsTreeModel.update(enactmentsGotSoFar);
-		filteredTreeModel.reload();
-		reinstatePaths();
-		DefaultMutableTreeNode firstLeaf = ((DefaultMutableTreeNode) filteredTreeModel
-				.getRoot()).getFirstLeaf();
-		if ((firstLeaf != null)
-				&& (processorEnactmentsTree.getPathForRow(0) == null))
-			processorEnactmentsTree.scrollPathToVisible(new TreePath(
-					(Object[]) firstLeaf.getPath()));
-
-		if (facade == null)
-			resultsUpdateNeeded = false;
-		setDataTreeForResultTab();
-	}
-
-	private Runnable updateTreeRunnable = new Runnable() {
-		@Override
-		public void run() {
-			updateTree();
-		}
-	};
-
-	public void update() {
-		if (resultsUpdateNeeded) {
-			IntermediateValuesSwingWorker intermediateValuesSwingWorker = new IntermediateValuesSwingWorker(
-					this);
-			IntermediateValuesInProgressDialog dialog = new IntermediateValuesInProgressDialog();
-			intermediateValuesSwingWorker
-					.addPropertyChangeListener(new SwingWorkerCompletionWaiter(
-							dialog));
-			intermediateValuesSwingWorker.execute();
-
-			try {
-				Thread.sleep(500);
-			} catch (InterruptedException e) {
-			}
-			if (!intermediateValuesSwingWorker.isDone())
-				dialog.setVisible(true);
-			if (intermediateValuesSwingWorker.getException() != null)
-				logger.error("Populating enactments failed",
-						intermediateValuesSwingWorker.getException());
-			else if (isEventDispatchThread())
-				updateTreeRunnable.run();
-			else
-				invokeLater(updateTreeRunnable);
-		}
-	}
-
-	public void clear() {
-		tabbedPane.removeAll();
-	}
-
-	public void onDispose() {
-	}
-
-	@Override
-	protected void finalize() throws Throwable {
-		onDispose();
-	}
-
-	private class SaveAllAction extends AbstractAction {
-		// private WorkflowResultsComponent parent;
-
-		public SaveAllAction(String name, ProcessorResultsComponent resultViewComponent) {
-			super(name);
-			// this.parent = resultViewComponent;
-			putValue(SMALL_ICON, saveAllIcon);
-		}
-
-		@Override
-		public void actionPerformed(ActionEvent e) {
-			ProcessorEnactment processorEnactment = (ProcessorEnactment) procEnactmentTreeNode
-					.getUserObject();
-
-			String initialInputs = processorEnactment.getInitialInputsDataBindingId();
-			String finalOutputs = processorEnactment.getFinalOutputsDataBindingId();
-
-			Map<String, T2Reference> inputBindings = new TreeMap<>();
-			for (Entry<Port, T2Reference> entry : provenanceAccess
-					.getDataBindings(initialInputs).entrySet())
-				inputBindings.put(entry.getKey().getPortName(),
-						entry.getValue());
-			Map<String, T2Reference> outputBindings = new TreeMap<>();
-			for (Entry<Port, T2Reference> entry : provenanceAccess
-					.getDataBindings(finalOutputs).entrySet())
-				outputBindings.put(entry.getKey().getPortName(),
-						entry.getValue());
-
-			String title = "Service iteration data saver";
-
-			final JDialog dialog = new HelpEnabledDialog(getMainWindow(),
-					title, true);
-			dialog.setResizable(false);
-			dialog.setLocationRelativeTo(getMainWindow());
-			JPanel panel = new JPanel(new BorderLayout());
-			DialogTextArea explanation = new DialogTextArea();
-			explanation
-					.setText("Select the service input and output ports to save the associated data");
-			explanation.setColumns(40);
-			explanation.setEditable(false);
-			explanation.setOpaque(false);
-			explanation.setBorder(new EmptyBorder(5, 20, 5, 20));
-			explanation.setFocusable(false);
-			explanation.setFont(new JLabel().getFont()); // make the font the same as for other
-															// components in the dialog
-			panel.add(explanation, NORTH);
-			final Map<String, JCheckBox> inputChecks = new HashMap<>();
-			final Map<String, JCheckBox> outputChecks = new HashMap<>();
-			final Map<JCheckBox, T2Reference> checkReferences = new HashMap<>();
-			final Map<String, T2Reference> chosenReferences = new HashMap<>();
-			final Set<Action> actionSet = new HashSet<Action>();
-
-			ItemListener listener = new ItemListener() {
-				@Override
-				public void itemStateChanged(ItemEvent e) {
-					JCheckBox source = (JCheckBox) e.getItemSelectable();
-					if (inputChecks.containsValue(source)
-							&& source.isSelected()
-							&& outputChecks.containsKey(source.getText()))
-						outputChecks.get(source.getText()).setSelected(false);
-					if (outputChecks.containsValue(source)
-							&& source.isSelected()
-							&& inputChecks.containsKey(source.getText()))
-						inputChecks.get(source.getText()).setSelected(false);
-					chosenReferences.clear();
-					for (JCheckBox checkBox : checkReferences.keySet())
-						if (checkBox.isSelected())
-							chosenReferences.put(checkBox.getText(),
-									checkReferences.get(checkBox));
-				}
-			};
-			JPanel portsPanel = new JPanel(new GridBagLayout());
-			portsPanel.setBorder(new CompoundBorder(new EmptyBorder(new Insets(
-					5, 10, 5, 10)), new EtchedBorder(LOWERED)));
-			if (!inputBindings.isEmpty()) {
-				GridBagConstraints gbc = new GridBagConstraints();
-				gbc.gridx = 0;
-				gbc.gridy = 0;
-				gbc.anchor = GridBagConstraints.WEST;
-				gbc.fill = NONE;
-				gbc.weightx = 0.0;
-				gbc.weighty = 0.0;
-				gbc.insets = new Insets(5, 10, 5, 10);
-				portsPanel.add(new JLabel("Iteration inputs:"), gbc);
-				// JPanel inputsPanel = new JPanel();
-				// WeakHashMap<String, T2Reference> pushedDataMap = null;
-
-				TreeMap<String, JCheckBox> sortedBoxes = new TreeMap<>();
-				for (Entry<String, T2Reference> inputEntry : inputBindings
-						.entrySet()) {
-					String portName = inputEntry.getKey();
-					T2Reference o = inputEntry.getValue();
-					JCheckBox checkBox = new JCheckBox(portName);
-					checkBox.setSelected(!outputBindings.containsKey(portName));
-					checkBox.addItemListener(listener);
-					inputChecks.put(portName, checkBox);
-					sortedBoxes.put(portName, checkBox);
-					checkReferences.put(checkBox, o);
-				}
-				gbc.insets = new Insets(0, 10, 0, 10);
-				for (String portName : sortedBoxes.keySet()) {
-					gbc.gridy++;
-					portsPanel.add(sortedBoxes.get(portName), gbc);
-				}
-				gbc.gridy++;
-				gbc.fill = BOTH;
-				gbc.weightx = 1.0;
-				gbc.weighty = 1.0;
-				gbc.insets = new Insets(5, 10, 5, 10);
-				portsPanel.add(new JLabel(""), gbc); // empty space
-			}
-			if (!outputBindings.isEmpty()) {
-				GridBagConstraints gbc = new GridBagConstraints();
-				gbc.gridx = 1;
-				gbc.gridy = 0;
-				gbc.anchor = GridBagConstraints.WEST;
-				gbc.fill = NONE;
-				gbc.weightx = 0.0;
-				gbc.weighty = 0.0;
-				gbc.insets = new Insets(5, 10, 5, 10);
-				portsPanel.add(new JLabel("Iteration outputs:"), gbc);
-				TreeMap<String, JCheckBox> sortedBoxes = new TreeMap<>();
-				for (Entry<String, T2Reference> outputEntry : outputBindings.entrySet()) {
-					String portName = outputEntry.getKey();
-					T2Reference o = outputEntry.getValue();
-					JCheckBox checkBox = new JCheckBox(portName);
-					checkBox.setSelected(true);
-
-					checkReferences.put(checkBox, o);
-					checkBox.addItemListener(listener);
-					outputChecks.put(portName, checkBox);
-					sortedBoxes.put(portName, checkBox);
-				}
-				gbc.insets = new Insets(0, 10, 0, 10);
-				for (String portName : sortedBoxes.keySet()) {
-					gbc.gridy++;
-					portsPanel.add(sortedBoxes.get(portName), gbc);
-				}
-				gbc.gridy++;
-				gbc.fill = BOTH;
-				gbc.weightx = 1.0;
-				gbc.weighty = 1.0;
-				gbc.insets = new Insets(5, 10, 5, 10);
-				portsPanel.add(new JLabel(""), gbc); // empty space
-			}
-			panel.add(portsPanel, CENTER);
-			chosenReferences.clear();
-			for (JCheckBox checkBox : checkReferences.keySet())
-				if (checkBox.isSelected())
-					chosenReferences.put(checkBox.getText(),
-							checkReferences.get(checkBox));
-
-			JPanel buttonsBar = new JPanel();
-			buttonsBar.setLayout(new FlowLayout());
-			// Get all existing 'Save result' actions
-			for (SaveAllResultsSPI spi : saveActions) {
-				AbstractAction action = spi.getAction();
-				actionSet.add(action);
-				JButton saveButton = new JButton((AbstractAction) action);
-				if (action instanceof SaveAllResultsSPI) {
-					// ((SaveAllResultsSPI) action).setChosenReferences(chosenReferences);
-					((SaveAllResultsSPI) action).setParent(dialog);
-				}
-				// saveButton.setEnabled(true);
-				buttonsBar.add(saveButton);
-			}
-			JButton cancelButton = new JButton("Cancel", closeIcon);
-			cancelButton.addActionListener(new ActionListener() {
-				@Override
-				public void actionPerformed(ActionEvent e) {
-					dialog.setVisible(false);
-				}
-			});
-			buttonsBar.add(cancelButton);
-			panel.add(buttonsBar, SOUTH);
-			panel.revalidate();
-			dialog.add(panel);
-			dialog.pack();
-			dialog.setVisible(true);
-		}
-	}
-}