You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by js...@apache.org on 2002/11/13 10:03:32 UTC

cvs commit: jakarta-commons-sandbox/jelly/src/java/org/apache/commons/jelly/tags/xml XPathExpression.java

jstrachan    2002/11/13 01:03:31

  Modified:    jelly/src/test/org/apache/commons/jelly/xml suite.jelly
               jelly/src/test/org/apache/commons/jelly/junit suite.jelly
               jelly/src/java/org/apache/commons/jelly/tags/xml
                        XPathExpression.java
  Log:
  Added a JellyUnit test case to demonstrate the bug that J. Matthew Pryor recently found in the XPath feature in Jelly.
  
  Plus I've now fixed the bug. When using the namespace context for the XPath expression, the default no-prefix namespace should not be used, as this breaks XPath and hides the default XPath function libraries.
  Inside XPath, the default namespace (i.e. when no prefix is used) should always be "".
  
  Revision  Changes    Path
  1.2       +56 -0     jakarta-commons-sandbox/jelly/src/test/org/apache/commons/jelly/xml/suite.jelly
  
  Index: suite.jelly
  ===================================================================
  RCS file: /home/cvs/jakarta-commons-sandbox/jelly/src/test/org/apache/commons/jelly/xml/suite.jelly,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- suite.jelly	12 Nov 2002 08:39:50 -0000	1.1
  +++ suite.jelly	13 Nov 2002 09:03:31 -0000	1.2
  @@ -18,4 +18,60 @@
   		<test:assert xpath="count($doc/bar) = 0"/>
   		
     </test:case>
  +  
  +  <test:case name="assertXPathTests">
  +  
  +    <x:parse var="doc">
  +      <foo>
  +      	<bar>cheese</bar>
  +      </foo>
  +    </x:parse>  
  +     
  +  
  +    <test:assert xpath="$doc/foo/bar">This should never fail</test:assert>
  +    <test:assert xpath="$doc/foo/bar = 'cheese'">This should never fail</test:assert>
  +    
  +    <j:catch var="ex">
  +		  <test:assert xpath="$doc/foo/xyz">This should always fail</test:assert>
  +		</j:catch>    	
  +		
  +		<test:assert test="${ex != null}">We should have created an exception</test:assert>
  +		
  +		The exception was: ${ex.message}
  +  </test:case>
  +
  +	<!-- test the use of namespaces with XPath -->
  +  <test:case name="assertXPathWithNamespaceTests" xmlns:a="fooURI" xmlns:z="doesNotMatch" xmlns="different">
  +  
  +    <x:parse var="doc">
  +      <foo xmlns="fooURI">
  +      	<bar>cheese</bar>
  +      </foo>
  +    </x:parse>  
  +     
  +    <test:assert xpath="$doc/a:foo/a:bar">This should never fail</test:assert>
  +    <test:assert xpath="$doc/b:foo/b:bar" xmlns:b="fooURI">This should never fail</test:assert>
  +    
  +    <j:catch var="ex">
  +		  <test:assert xpath="$doc/z:foo/z:bar">This should always fail</test:assert>
  +		</j:catch>    	
  +		
  +		<test:assert test="${ex != null}">We should have created an exception</test:assert>
  +		
  +    <j:catch var="ex">
  +		  <test:assert xpath="$doc/foo/bar">This should always fail, since foo is not in the empty namespace</test:assert>
  +		</j:catch>    	
  +		
  +		<test:assert test="${ex != null}">We should have created an exception</test:assert>
  +		
  +		<!-- 
  +			|| now lets test that the default namespace 'different' is ignored by the XPath expressions
  +			|| since XPath should ignore the default namespace - you must use a prefix in XPath to denote
  +			|| a namespace
  +			-->
  +		<test:assert xpath="$doc/*[local-name()='foo']"/>
  +  </test:case>
  +
  +
  +  
   </test:suite>
  
  
  
  1.6       +0 -47     jakarta-commons-sandbox/jelly/src/test/org/apache/commons/jelly/junit/suite.jelly
  
  Index: suite.jelly
  ===================================================================
  RCS file: /home/cvs/jakarta-commons-sandbox/jelly/src/test/org/apache/commons/jelly/junit/suite.jelly,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- suite.jelly	8 Nov 2002 18:35:06 -0000	1.5
  +++ suite.jelly	13 Nov 2002 09:03:31 -0000	1.6
  @@ -15,53 +15,6 @@
     </test:case>
   
   
  -  <test:case name="assertXPathTests">
  -  
  -    <x:parse var="doc">
  -      <foo>
  -      	<bar>cheese</bar>
  -      </foo>
  -    </x:parse>  
  -     
  -  
  -    <test:assert xpath="$doc/foo/bar">This should never fail</test:assert>
  -    <test:assert xpath="$doc/foo/bar = 'cheese'">This should never fail</test:assert>
  -    
  -    <j:catch var="ex">
  -		  <test:assert xpath="$doc/foo/xyz">This should always fail</test:assert>
  -		</j:catch>    	
  -		
  -		<test:assert test="${ex != null}">We should have created an exception</test:assert>
  -		
  -		The exception was: ${ex.message}
  -  </test:case>
  -
  -	<!-- test the use of namespaces with XPath -->
  -  <test:case name="assertXPathWithNamespaceTests" xmlns:a="fooURI" xmlns:z="doesNotMatch">
  -  
  -    <x:parse var="doc">
  -      <foo xmlns="fooURI">
  -      	<bar>cheese</bar>
  -      </foo>
  -    </x:parse>  
  -     
  -    <test:assert xpath="$doc/a:foo/a:bar">This should never fail</test:assert>
  -    <test:assert xpath="$doc/b:foo/b:bar" xmlns:b="fooURI">This should never fail</test:assert>
  -    
  -    <j:catch var="ex">
  -		  <test:assert xpath="$doc/z:foo/z:bar">This should always fail</test:assert>
  -		</j:catch>    	
  -		
  -		<test:assert test="${ex != null}">We should have created an exception</test:assert>
  -		
  -    <j:catch var="ex">
  -		  <test:assert xpath="$doc/foo/bar">This should always fail, since foo is not in the empty namespace</test:assert>
  -		</j:catch>    	
  -		
  -		<test:assert test="${ex != null}">We should have created an exception</test:assert>
  -  </test:case>
  -
  -
     <test:case name="failTests">
     
       <j:catch var="ex">
  
  
  
  1.9       +29 -6     jakarta-commons-sandbox/jelly/src/java/org/apache/commons/jelly/tags/xml/XPathExpression.java
  
  Index: XPathExpression.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons-sandbox/jelly/src/java/org/apache/commons/jelly/tags/xml/XPathExpression.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- XPathExpression.java	8 Nov 2002 18:27:51 -0000	1.8
  +++ XPathExpression.java	13 Nov 2002 09:03:31 -0000	1.9
  @@ -63,6 +63,8 @@
   
   import java.io.IOException;
   import java.io.Writer;
  +import java.util.Hashtable;
  +import java.util.Iterator;
   import java.util.Map;
   
   import org.apache.commons.jelly.JellyContext;
  @@ -98,7 +100,9 @@
       public XPathExpression(XPath xpath, TagScript tagScript) {
           this.xpath = xpath;
           
  -        Map uris = tagScript.getNamespaceContext();
  +        Map namespaceContext = tagScript.getNamespaceContext();
  +        
  +        Map uris = createUriMap(namespaceContext);
           
           if (log.isDebugEnabled()) {
           	log.debug( "Setting the namespace context to be: " + uris );
  @@ -131,5 +135,24 @@
           //log.debug( "Looking up XPath variable of name: " + localName + " value is: " + value );            
           
           return value;
  +    }
  +    
  +    // Implementation methods
  +    //-------------------------------------------------------------------------
  +    
  +    /**
  +     * Factory method to create a synchronized Map of non-null and non-blank
  +     * namespace prefixes to namespace URIs
     */ 
  +    protected Map createUriMap(Map namespaceContext) {
  +        // now lets clone the Map but ignoring default or null prefixes
  +        Map uris = new Hashtable(namespaceContext.size());
  +        for (Iterator iter = namespaceContext.entrySet().iterator(); iter.hasNext(); ) {
  +        	Map.Entry entry = (Map.Entry) iter.next();
  +        	String prefix = (String) entry.getKey();
  +        	if (prefix != null && prefix.length() != 0) {
  +        		uris.put(prefix, entry.getValue());
  +        	}
  +        }
  +        return uris;
       }
   }
  
  
  

--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>