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