/* * Copyright (C) 2006-2016 DLR, Germany * * All rights reserved * * http://www.rcenvironment.de/ */ package de.rcenvironment.core.gui.workflow.execute; import java.util.ArrayList; import java.util.List; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.Viewer; import de.rcenvironment.core.component.workflow.model.api.WorkflowDescription; import de.rcenvironment.core.component.workflow.model.api.WorkflowNode; /** * Returns a list of all TreeNodes to be shown in the TreeViewer. * * @author Goekhan Guerkan */ public class TreeContentProvider implements ITreeContentProvider { private static final String VERSION = " (Version: "; private List<String> componentsWithOneVersion; private List<String> componentsWithMoreVersions; @Override public Object[] getElements(Object element) { List<TreeNode> nodes = prepareTreeNodes(((WorkflowDescription) element)); return nodes.toArray(); } private List<TreeNode> prepareTreeNodes(WorkflowDescription description) { List<TreeNode> treeNodes = new ArrayList<TreeNode>(); List<WorkflowNode> nodes = description.getWorkflowNodes(); componentsWithOneVersion = new ArrayList<String>(); componentsWithMoreVersions = new ArrayList<String>(); // 1. Step: get all different component types. for (WorkflowNode node : nodes) { String componentName = node.getComponentDescription().getName(); VersionHelper versions = checkIfSameComponentHasDifferentVersion(nodes, componentName); if (versions.getVersionList().size() == 1) { if (!componentsWithOneVersion.contains(componentName)) { componentsWithOneVersion.add(componentName); } } else { for (String version : versions.getVersionList()) { String finalCompName = node.getComponentDescription().getName() + VERSION + version + ")"; if (!componentsWithMoreVersions.contains(finalCompName)) { componentsWithMoreVersions.add(finalCompName); } } } } // 2. Step: get all components to the collected types. // TreeNodeFather is the Component type which has a TreeNode List with TreeNode Children for each Component for (String type : componentsWithOneVersion) { TreeNode treeNodeFather = new TreeNode(type, false); for (WorkflowNode node : nodes) { if (node.getComponentDescription().getName().equals(type)) { TreeNode treeNodeChild = new TreeNode(node.getName(), true, node, treeNodeFather); treeNodeFather.addChildNode(treeNodeChild); } } treeNodes.add(treeNodeFather); } for (String type : componentsWithMoreVersions) { TreeNode treeNodeFather = new TreeNode(type, false); for (WorkflowNode node : nodes) { String temp = node.getComponentDescription().getName() + VERSION + node.getComponentDescription().getVersion() + ")"; if (temp.equals(type)) { TreeNode treeNodeChild = new TreeNode(node.getName(), true, node, treeNodeFather); treeNodeFather.addChildNode(treeNodeChild); } } treeNodes.add(treeNodeFather); } return treeNodes; } private VersionHelper checkIfSameComponentHasDifferentVersion(List<WorkflowNode> nodes, String componentString) { VersionHelper versionHelper = new VersionHelper(); for (WorkflowNode node : nodes) { if (node.getComponentDescription().getName().equals(componentString)) { versionHelper.addVersion(node.getComponentDescription().getVersion()); } } return versionHelper; } /** * Helper class to collect the versions of a component type. * * @author G�khan G�rkan */ public class VersionHelper { private List<String> versionList = new ArrayList<String>(); /** * Adds a version to a Component. * * @param version Version to add. */ public void addVersion(String version) { if (!versionList.contains(version)) { versionList.add(version); } } public List<String> getVersionList() { return versionList; } } @Override public Object getParent(Object element) { TreeNode node = (TreeNode) element; if (node.isChildElement()) { return node.getFatherNode(); } return null; } @Override public boolean hasChildren(Object element) { TreeNode node = (TreeNode) element; return !node.isChildElement(); } @Override public Object[] getChildren(Object element) { TreeNode node = (TreeNode) element; if (!node.isChildElement()) { return node.getChildrenNodes().toArray(); } return null; } @Override public void dispose() { } @Override public void inputChanged(Viewer tree, Object oldInput, Object newInput) { } /** * Returns number of component types. * * @return number of types. */ public int getNodeTypeCount() { if (componentsWithMoreVersions != null) { return componentsWithMoreVersions.size() + componentsWithOneVersion.size(); } return 0; } }