package fr.inria.soctrace.framesoc.ui.treefilter; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; import org.eclipse.jface.viewers.IBaseLabelProvider; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.swt.widgets.Shell; import fr.inria.linuxtools.tmf.ui.widgets.timegraph.dialogs.TimeGraphFilterDialog; import fr.inria.soctrace.framesoc.ui.model.CategoryNode; import fr.inria.soctrace.framesoc.ui.model.EventProducerNode; import fr.inria.soctrace.framesoc.ui.model.EventTypeNode; import fr.inria.soctrace.framesoc.ui.model.ITreeNode; import fr.inria.soctrace.framesoc.ui.utils.AlphanumComparator; import fr.inria.soctrace.lib.model.EventProducer; import fr.inria.soctrace.lib.model.EventType; /** * Filter dialog for tree hierarchies. * * It provides specify methods for event types and event producers hierarchies. * * @author "Generoso Pagano <generoso.pagano@inria.fr>" */ public class TreeFilterDialog extends TimeGraphFilterDialog { public TreeFilterDialog(Shell parent) { super(parent); } @Override public void setContentProvider(ITreeContentProvider contentProvider) { super.setContentProvider(contentProvider); } @Override public void setColumnNames(String[] columnNames) { super.setColumnNames(columnNames); } @Override public void setLabelProvider(IBaseLabelProvider labelProvider) { super.setLabelProvider(labelProvider); } @Override public void setInput(Object input) { super.setInput(input); } @Override public void setExpandedElements(Object[] elements) { super.setExpandedElements(elements); } @Override public void create() { super.create(); } @Override public int open() { return super.open(); } /** * Get the event type hierarchy * * @param types * collection of event types * @return an array containing the roots of the type hierarchy */ public static CategoryNode[] getTypeHierarchy(Collection<EventType> types) { Map<Integer, CategoryNode> categories = new HashMap<>(); List<EventType> eTypes = (List<EventType>) types; // Sort the types alphabetically Collections.sort(eTypes, new Comparator<EventType>() { @Override public int compare(EventType o1, EventType o2) { return AlphanumComparator.compare(o1.getName(), o2.getName()); } }); for (EventType et : types) { EventTypeNode etn = new EventTypeNode(et); if (!categories.containsKey(et.getCategory())) { categories.put(et.getCategory(), new CategoryNode(et.getCategory())); } categories.get(et.getCategory()).addChild(etn); } return categories.values().toArray(new CategoryNode[categories.values().size()]); } /** * Get the event producer hierarchy * * @param producers * collection of event producers * @return an array containing the roots of the producer hierarchy */ public static EventProducerNode[] getProducerHierarchy(Collection<EventProducer> producers) { Map<Integer, EventProducerNode> prodMap = new HashMap<>(); for (EventProducer ep : producers) { prodMap.put(ep.getId(), new EventProducerNode(ep)); } List<EventProducerNode> roots = new ArrayList<>(); List<EventProducer> lProducers = (List<EventProducer>) producers; // Sort the producers alphabetically Collections.sort(lProducers, new Comparator<EventProducer>() { @Override public int compare(EventProducer o1, EventProducer o2) { return AlphanumComparator.compare(o1.getName(), o2.getName()); } }); for (EventProducer ep : lProducers) { EventProducerNode node = prodMap.get(ep.getId()); int parentId = ep.getParentId(); if (parentId == EventProducer.NO_PARENT_ID) { roots.add(node); } else { EventProducerNode parentNode = prodMap.get(parentId); if (parentNode == null) { StringBuilder sb = new StringBuilder(); sb.append("The passed collection of producers contains a broken hierarchy: "); sb.append("parent of "); sb.append(ep.getWholeName()); sb.append(" not found (parent id="); sb.append(ep.getParentId()); sb.append(")."); throw new IllegalArgumentException(sb.toString()); } parentNode.addChild(node); } } return roots.toArray(new EventProducerNode[roots.size()]); } /** * Explores the list of top-level inputs and returns all the inputs * * @param inputs * The top-level inputs * @return All the inputs */ public static List<Object> listAllInputs(List<? extends ITreeNode> inputs) { ArrayList<Object> items = new ArrayList<>(); for (ITreeNode entry : inputs) { items.add(entry); if (entry.hasChildren()) { items.addAll(listAllInputs(entry.getChildren())); } } return items; } public static void printHierarchy(Collection<? extends ITreeNode> roots, String tab) { for (ITreeNode node : roots) { System.out.println(tab + node.getName()); if (node.hasChildren()) { printHierarchy(node.getChildren(), tab + " "); } } } }