1 package net.sourceforge.pmd.util.viewer.model; 2 3 import java.io.StringReader; 4 import java.util.ArrayList; 5 import java.util.List; 6 7 import net.sourceforge.pmd.TargetJDKVersion; 8 import net.sourceforge.pmd.ast.ASTCompilationUnit; 9 import net.sourceforge.pmd.ast.ParseException; 10 import net.sourceforge.pmd.ast.SimpleNode; 11 import net.sourceforge.pmd.jaxen.DocumentNavigator; 12 13 import org.jaxen.BaseXPath; 14 import org.jaxen.JaxenException; 15 import org.jaxen.XPath; 16 17 public class ViewerModel { 18 19 private List<ViewerModelListener> listeners; 20 private SimpleNode rootNode; 21 private List evaluationResults; 22 23 public ViewerModel() { 24 listeners = new ArrayList<ViewerModelListener>(5); 25 } 26 27 public SimpleNode getRootNode() { 28 return rootNode; 29 } 30 31 /** 32 * commits source code to the model. 33 * all existing source will be replaced 34 */ 35 public void commitSource(String source, TargetJDKVersion jdk) { 36 ASTCompilationUnit compilationUnit = jdk.createParser(new StringReader(source)).CompilationUnit(); 37 rootNode = compilationUnit; 38 fireViewerModelEvent(new ViewerModelEvent(this, ViewerModelEvent.CODE_RECOMPILED)); 39 } 40 41 /** 42 * determines whether the model has a compiled tree at it's disposal 43 * 44 * @return true if there is an AST, false otherwise 45 */ 46 public boolean hasCompiledTree() { 47 return rootNode != null; 48 } 49 50 /** 51 * evaluates the given XPath expression against the current tree 52 * 53 * @param xPath XPath expression to be evaluated 54 * @param evaluator object which requests the evaluation 55 */ 56 public void evaluateXPathExpression(String xPath, Object evaluator) 57 throws ParseException, JaxenException { 58 XPath xpath = new BaseXPath(xPath, new DocumentNavigator()); 59 evaluationResults = xpath.selectNodes(rootNode); 60 fireViewerModelEvent(new ViewerModelEvent(evaluator, ViewerModelEvent.PATH_EXPRESSION_EVALUATED)); 61 } 62 63 /** 64 * retrieves the results of last evaluation 65 * 66 * @return a list containing the nodes selected by the last XPath expression 67 * <p/> 68 * evaluation 69 */ 70 public List getLastEvaluationResults() { 71 return evaluationResults; 72 } 73 74 /** 75 * selects the given node in the AST 76 * 77 * @param node node to be selected 78 * @param selector object which requests the selection 79 */ 80 public void selectNode(SimpleNode node, Object selector) { 81 fireViewerModelEvent(new ViewerModelEvent(selector, ViewerModelEvent.NODE_SELECTED, node)); 82 } 83 84 /** 85 * appends the given fragment to the XPath expression 86 * 87 * @param pathFragment fragment to be added 88 * @param appender object that is trying to append the fragment 89 */ 90 public void appendToXPathExpression(String pathFragment, Object appender) { 91 fireViewerModelEvent(new ViewerModelEvent(appender, ViewerModelEvent.PATH_EXPRESSION_APPENDED, pathFragment)); 92 } 93 94 public void addViewerModelListener(ViewerModelListener l) { 95 listeners.add(l); 96 } 97 98 public void removeViewerModelListener(ViewerModelListener l) { 99 listeners.remove(l); 100 } 101 102 protected void fireViewerModelEvent(ViewerModelEvent e) { 103 for (int i = 0; i < listeners.size(); i++) { 104 listeners.get(i).viewerModelChanged(e); 105 } 106 } 107 }