Author: andy
Date: Sat Jul 19 18:23:48 2014
New Revision: 1611942

URL: http://svn.apache.org/r1611942
Log:
JENA-741 : Handle bad replace group

Modified:
    
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/nodevalue/XSDFuncOp.java
    
jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/expr/TestFunctions.java

Modified: 
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/nodevalue/XSDFuncOp.java
URL: 
http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/nodevalue/XSDFuncOp.java?rev=1611942&r1=1611941&r2=1611942&view=diff
==============================================================================
--- 
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/nodevalue/XSDFuncOp.java
 (original)
+++ 
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/expr/nodevalue/XSDFuncOp.java
 Sat Jul 19 18:23:48 2014
@@ -398,21 +398,25 @@ public class XSDFuncOp
     
     private static String replaceAll(Matcher matcher, String rep) {
         // Follow Java -- return matcher.replaceAll(rep) ;
-        StringBuffer sb = null ;   // Delay until needed
-        while(matcher.find()) {
-            if ( sb == null )
-                sb = new StringBuffer() ;
-            else {
-                // Do one match of zerolength string otherwise filter out.
-                if (matcher.start() == matcher.end() )
-                    continue ;
+        try {
+            StringBuffer sb = null ;   // Delay until needed
+            while(matcher.find()) {
+                if ( sb == null )
+                    sb = new StringBuffer() ;
+                else {
+                    // Do one match of zerolength string otherwise filter out.
+                    if (matcher.start() == matcher.end() )
+                        continue ;
+                }
+                matcher.appendReplacement(sb, rep);
             }
-            matcher.appendReplacement(sb, rep);
+            if ( sb == null )
+                return null ;
+            matcher.appendTail(sb);
+            return sb.toString();
+        } catch (IndexOutOfBoundsException ex) {
+            throw new ExprEvalException("IndexOutOfBounds", ex) ; 
         }
-        if ( sb == null )
-            return null ;
-        matcher.appendTail(sb);
-        return sb.toString();
     }
 
     public static NodeValue strReplace(NodeValue nvStr, NodeValue nvPattern, 
NodeValue nvReplacement) {

Modified: 
jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/expr/TestFunctions.java
URL: 
http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/expr/TestFunctions.java?rev=1611942&r1=1611941&r2=1611942&view=diff
==============================================================================
--- 
jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/expr/TestFunctions.java
 (original)
+++ 
jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/expr/TestFunctions.java
 Sat Jul 19 18:23:48 2014
@@ -175,6 +175,9 @@ public class TestFunctions
     @Test public void exprReplace11()  { test("REPLACE('', '.', 'Z')",      
NodeValue.makeString("")) ; }
     @Test public void exprReplace12()  { test("REPLACE('', '(a|b)?', 'Z')", 
NodeValue.makeString("Z")) ; }
 
+    // Bad group
+    @Test public void exprReplace13()  { testEvalException("REPLACE('abc', 
'.*', '$1')") ; }
+
     @Test public void exprBoolean1()    { test("fn:boolean('')", FALSE) ; }
     @Test public void exprBoolean2()    { test("fn:boolean(0)", FALSE) ; }
     @Test public void exprBoolean3()    { test("fn:boolean(''^^xsd:string)", 
FALSE) ; }


Reply via email to