package org.jactr.eclipse.production.content; /* * default logging */ import java.util.HashSet; import java.util.Map; import java.util.Set; import org.antlr.runtime.tree.CommonTree; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.eclipse.jface.viewers.Viewer; import org.eclipse.zest.core.viewers.IGraphContentProvider; import org.jactr.eclipse.production.view.ProductionSequenceView; import org.jactr.tools.analysis.production.relationships.IRelationship; import org.jactr.tools.analysis.production.relationships.ProductionRelationships; public class SequenceContentProvider implements IGraphContentProvider { /** * Logger definition */ static private final transient Log LOGGER = LogFactory .getLog(SequenceContentProvider.class); private Map<CommonTree, ProductionRelationships> _relationships; private CommonTree _root; private ProductionSequenceView _view; private int _depth = 2; public SequenceContentProvider(ProductionSequenceView view, CommonTree root, int depth) { _root = root; _depth = depth; _view = view; } public Object[] getElements(Object inputElement) { if (_relationships == null) return new Object[0]; HashSet<IRelationship> relationships = new HashSet<IRelationship>(); HashSet<CommonTree> processedHeads = new HashSet<CommonTree>(); HashSet<CommonTree> processedTails = new HashSet<CommonTree>(); getUpstreamRelationships(_root, _depth, processedHeads, processedTails, relationships); getDownstreamRelationships(_root, _depth, processedHeads, processedTails, relationships); return relationships.toArray(); } public void dispose() { } public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { _relationships = (Map<CommonTree, ProductionRelationships>) newInput; } protected void getUpstreamRelationships(CommonTree root, int depth, Set<CommonTree> processedHeads, Set<CommonTree> processedTails, Set<IRelationship> relationships) { /* * by the time we reach one, the node is terminal and we dont want any of * its relationships */ if (depth <= 1) return; ProductionRelationships rels = _relationships.get(root); if (rels == null) return; Set<CommonTree> toFollow = new HashSet<CommonTree>(); for (IRelationship relation : rels.getHeadRelationships()) if (_view.isShowingAmbiguous() && relation.getScore() == 0) { relationships.add(relation); toFollow.add(relation.getHeadProduction()); } else if (_view.isShowingPositive() && relation.getScore() > 0) { relationships.add(relation); toFollow.add(relation.getHeadProduction()); } else if (_view.isShowingNegative() && relation.getScore() < 0) { relationships.add(relation); toFollow.add(relation.getHeadProduction()); } processedHeads.add(root); for (CommonTree node : toFollow) { // if (!processedHeads.contains(node)) getUpstreamRelationships(node, depth - 1, processedHeads, processedTails, relationships); // if (!processedTails.contains(node)) // getDownstreamRelationships(root, depth - 1, processedHeads, // processedTails, relationships); } } protected void getDownstreamRelationships(CommonTree root, int depth, Set<CommonTree> processedHeads, Set<CommonTree> processedTails, Set<IRelationship> relationships) { if (depth <= 1) return; ProductionRelationships rels = _relationships.get(root); if (rels == null) return; Set<CommonTree> toFollow = new HashSet<CommonTree>(); for (IRelationship relation : rels.getTailRelationships()) if (_view.isShowingAmbiguous() && relation.getScore() == 0) { relationships.add(relation); toFollow.add(relation.getTailProduction()); } else if (_view.isShowingPositive() && relation.getScore() > 0) { relationships.add(relation); toFollow.add(relation.getTailProduction()); } else if (_view.isShowingNegative() && relation.getScore() < 0) { relationships.add(relation); toFollow.add(relation.getTailProduction()); } processedTails.add(root); for (CommonTree node : toFollow) { // if (!processedHeads.contains(node)) // getUpstreamRelationships(node, depth - 1, processedHeads, // processedTails, relationships); // if (!processedTails.contains(node)) getDownstreamRelationships(root, depth - 1, processedHeads, processedTails, relationships); } } public Object getDestination(Object rel) { return ((IRelationship) rel).getTailProduction(); } public Object getSource(Object rel) { return ((IRelationship) rel).getHeadProduction(); } }