1 16 package org.apache.commons.jelly.expression.xpath; 17 18 import java.util.Hashtable ; 19 import java.util.Iterator ; 20 import java.util.Map ; 21 22 import org.apache.commons.jelly.JellyContext; 23 import org.apache.commons.jelly.expression.Expression; 24 import org.apache.commons.jelly.expression.ExpressionSupport; 25 import org.apache.commons.jelly.impl.TagScript; 26 import org.apache.commons.logging.Log; 27 import org.apache.commons.logging.LogFactory; 28 import org.jaxen.SimpleNamespaceContext; 29 import org.jaxen.VariableContext; 30 import org.jaxen.XPath; 31 import org.jaxen.JaxenException; 32 import org.jaxen.dom4j.Dom4jXPath; 33 34 39 public class XPathExpression extends ExpressionSupport implements VariableContext { 40 41 42 private Log log = LogFactory.getLog(XPathExpression.class); 43 44 private String text; 45 private Expression xpathExpr; 46 private JellyContext context; 47 private Map uris; 48 49 public XPathExpression() { 50 } 51 52 public XPathExpression(String text, 53 Expression xpathExpr, 54 TagScript tagScript) { 55 this.text = text; 56 this.xpathExpr = xpathExpr; 57 58 Map namespaceContext = tagScript.getNamespaceContext(); 59 60 this.uris = createUriMap(namespaceContext); 61 } 62 63 public String toString() { 64 return getExpressionText(); 65 } 66 67 public String getExpressionText() { 70 return this.text; 71 } 72 73 public Object evaluate(JellyContext context) { 74 this.context = context; 75 76 try 77 { 78 XPath xpath = new Dom4jXPath( this.xpathExpr.evaluateAsString( context ) ); 79 80 xpath.setVariableContext(this); 81 82 if (log.isDebugEnabled()) { 83 log.debug( "Setting the namespace context to be: " + uris ); 84 } 85 86 xpath.setNamespaceContext( new SimpleNamespaceContext( this.uris ) ); 87 88 return xpath; 89 } 90 catch (JaxenException e) 91 { 92 log.error( "Error constructing xpath", 93 e ); 94 } 95 96 return null; 97 } 98 99 public Object getVariableValue( 102 String namespaceURI, 103 String prefix, 104 String localName) { 105 106 Object value = context.getVariable(localName); 107 108 110 return value; 111 } 112 113 116 120 protected Map createUriMap(Map namespaceContext) { 121 Map uris = new Hashtable (namespaceContext.size()); 123 for (Iterator iter = namespaceContext.entrySet().iterator(); iter.hasNext(); ) { 124 Map.Entry entry = (Map.Entry ) iter.next(); 125 String prefix = (String ) entry.getKey(); 126 if (prefix != null && prefix.length() != 0) { 127 uris.put(prefix, entry.getValue()); 128 } 129 } 130 return uris; 131 } 132 } 133 | Popular Tags |