You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jena.apache.org by an...@apache.org on 2017/10/23 12:44:04 UTC
[2/3] jena git commit: JENA-1403: Consolidate regex compilation in
RegexJava
JENA-1403: Consolidate regex compilation in RegexJava
Project: http://git-wip-us.apache.org/repos/asf/jena/repo
Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/4d9524af
Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/4d9524af
Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/4d9524af
Branch: refs/heads/master
Commit: 4d9524af417d1c89f92341343f2d8e1cd241756c
Parents: fb1a171
Author: Andy Seaborne <an...@apache.org>
Authored: Mon Oct 23 12:56:18 2017 +0100
Committer: Andy Seaborne <an...@apache.org>
Committed: Mon Oct 23 12:56:18 2017 +0100
----------------------------------------------------------------------
.../apache/jena/sparql/expr/E_StrReplace.java | 7 +-
.../org/apache/jena/sparql/expr/RegexJava.java | 76 +++++++++-----------
.../jena/sparql/expr/nodevalue/XSDFuncOp.java | 21 ++----
.../apache/jena/sparql/expr/TestFunctions.java | 19 ++++-
.../apache/jena/sparql/expr/TestXSDFuncOp.java | 13 ++--
5 files changed, 68 insertions(+), 68 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/jena/blob/4d9524af/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_StrReplace.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_StrReplace.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_StrReplace.java
index 26811bf..1d458c3 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_StrReplace.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/E_StrReplace.java
@@ -32,10 +32,11 @@ public class E_StrReplace extends ExprFunctionN {
super(symbol, expr1, expr2, expr3, expr4) ;
if ( isString(expr2) && (expr4 == null || isString(expr4)) ) {
- int flags = 0 ;
+ String flags = null;
if ( expr4 != null && expr4.isConstant() && expr4.getConstant().isString() )
- flags = RegexJava.makeMask(expr4.getConstant().getString()) ;
- pattern = Pattern.compile(expr2.getConstant().getString(), flags) ;
+ flags = expr4.getConstant().getString();
+ String patternStr = expr2.getConstant().getString();
+ pattern = RegexJava.makePattern("REPLACE", patternStr, flags);
}
}
http://git-wip-us.apache.org/repos/asf/jena/blob/4d9524af/jena-arq/src/main/java/org/apache/jena/sparql/expr/RegexJava.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/RegexJava.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/RegexJava.java
index d4faba2..c6bfbb0 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/RegexJava.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/RegexJava.java
@@ -18,66 +18,60 @@
package org.apache.jena.sparql.expr;
-import java.util.regex.Matcher ;
-import java.util.regex.Pattern ;
-import java.util.regex.PatternSyntaxException ;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.regex.PatternSyntaxException;
public class RegexJava implements RegexEngine
{
- Pattern regexPattern ;
+ private Pattern regexPattern;
- public RegexJava(String pattern, String flags)
- {
- regexPattern = makePattern(pattern, flags) ;
+ public RegexJava(String pattern, String flags) {
+ regexPattern = makePattern("Regex", pattern, flags);
}
-
+
@Override
- public boolean match(String s)
- {
- Matcher m = regexPattern.matcher(s) ;
- return m.find() ;
+ public boolean match(String s) {
+ Matcher m = regexPattern.matcher(s);
+ return m.find();
}
-
- private Pattern makePattern(String patternStr, String flags)
- {
- try {
- int mask = 0 ;
+
+ public static Pattern makePattern(String label, String patternStr, String flags) {
+ try {
+ int mask = 0;
if ( flags != null ) {
- mask = makeMask(flags) ;
+ mask = makeMask(flags);
if ( flags.contains("q") )
patternStr = Pattern.quote(patternStr);
}
-
- return Pattern.compile(patternStr, mask) ;
- }
- catch (PatternSyntaxException pEx)
- { throw new ExprEvalException("Regex: Pattern exception: "+pEx) ; }
+ return Pattern.compile(patternStr, mask);
+ }
+ catch (PatternSyntaxException pEx) {
+ throw new ExprEvalException(label+" pattern exception: " + pEx);
+ }
}
- public static int makeMask(String modifiers)
- {
+ public static int makeMask(String modifiers) {
if ( modifiers == null )
- return 0 ;
-
- int newMask = 0 ;
- for ( int i = 0 ; i < modifiers.length() ; i++ )
- {
- switch(modifiers.charAt(i))
- {
+ return 0;
+
+ int newMask = 0;
+ for ( int i = 0; i < modifiers.length(); i++ ) {
+ switch (modifiers.charAt(i)) {
case 'i':
- newMask |= Pattern.UNICODE_CASE ;
+ newMask |= Pattern.UNICODE_CASE;
newMask |= Pattern.CASE_INSENSITIVE;
- break ;
- case 'm': newMask |= Pattern.MULTILINE ; break ;
- case 's': newMask |= Pattern.DOTALL ; break ;
- //case 'x': newMask |= Pattern.; break ;
- case 'q': ; break ;
+ break;
+ case 'm': newMask |= Pattern.MULTILINE; break;
+ case 's': newMask |= Pattern.DOTALL; break;
+ // Not suported by Java regex
+ //case 'x': newMask |= Pattern.; break;
+ case 'q':; break;
default:
- throw new ExprEvalException("Unsupported flag in regex modifiers: "+modifiers.charAt(i)) ;
+ throw new ExprEvalException("Unsupported flag in regex modifiers: "+modifiers.charAt(i));
}
}
- return newMask ;
+ return newMask;
}
-
}
http://git-wip-us.apache.org/repos/asf/jena/blob/4d9524af/jena-arq/src/main/java/org/apache/jena/sparql/expr/nodevalue/XSDFuncOp.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/nodevalue/XSDFuncOp.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/nodevalue/XSDFuncOp.java
index e5081ee..e7ac670 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/nodevalue/XSDFuncOp.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/nodevalue/XSDFuncOp.java
@@ -40,7 +40,6 @@ import java.text.NumberFormat ;
import java.util.*;
import java.util.regex.Matcher ;
import java.util.regex.Pattern ;
-import java.util.regex.PatternSyntaxException ;
import javax.xml.datatype.DatatypeConstants ;
import javax.xml.datatype.DatatypeConstants.Field ;
@@ -58,7 +57,7 @@ import org.apache.jena.graph.NodeFactory ;
import org.apache.jena.rdf.model.impl.Util ;
import org.apache.jena.sparql.ARQInternalErrorException ;
import org.apache.jena.sparql.SystemARQ ;
-import org.apache.jena.sparql.expr.* ;
+import org.apache.jena.sparql.expr.*;
import org.apache.jena.sparql.util.DateTimeStruct ;
/**
* Implementation of XQuery/XPath functions and operators.
@@ -466,18 +465,12 @@ public class XSDFuncOp
}
public static NodeValue strReplace(NodeValue nvStr, NodeValue nvPattern, NodeValue nvReplacement, NodeValue nvFlags) {
- String pat = checkAndGetStringLiteral("replace", nvPattern).getLiteralLexicalForm() ;
- int flags = 0 ;
- if ( nvFlags != null ) {
- String flagsStr = checkAndGetStringLiteral("replace", nvFlags).getLiteralLexicalForm() ;
- flags = RegexJava.makeMask(flagsStr) ;
- }
- try {
- return strReplace(nvStr, Pattern.compile(pat, flags), nvReplacement) ;
- } catch (PatternSyntaxException ex){
- throw new ExprEvalException("PatternSyntaxException", ex) ;
- }
- }
+ String pat = checkAndGetStringLiteral("replace", nvPattern).getLiteralLexicalForm();
+ String flagsStr = null;
+ if ( nvFlags != null )
+ flagsStr = checkAndGetStringLiteral("replace", nvFlags).getLiteralLexicalForm();
+ return strReplace(nvStr, RegexJava.makePattern("replace", pat, flagsStr), nvReplacement);
+ }
public static NodeValue strReplace(NodeValue nvStr, Pattern pattern, NodeValue nvReplacement) {
String n = checkAndGetStringLiteral("replace", nvStr).getLiteralLexicalForm() ;
http://git-wip-us.apache.org/repos/asf/jena/blob/4d9524af/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestFunctions.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestFunctions.java b/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestFunctions.java
index a3aea88..e8ef732 100644
--- a/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestFunctions.java
+++ b/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestFunctions.java
@@ -319,7 +319,24 @@ public class TestFunctions
@Test public void exprFnReplace06() { test("fn:replace('abcbd', 'B.', 'Z', 'i')", NodeValue.makeString("aZZ")) ; }
// Bad group
- @Test public void exprReplace13() { testEvalException("REPLACE('abc', '.*', '$1')") ; }
+ @Test
+ public void exprReplace13() {
+ testEvalException("REPLACE('abc', '.*', '$1')");
+ }
+
+ // Bad pattern ; static (parse or build time) compilation.
+ @Test(expected = ExprException.class)
+ public void exprReplace14() {
+ ExprUtils.parse("REPLACE('abc', '^(a){-9}', 'ABC')");
+ }
+
+ // Bad pattern : dynamic (eval time) exception.
+ // The pattern for fn:replace is not compiled on build - if that changes, this test will fail.
+ // See exprReplace14.
+ @Test
+ public void exprReplace15() {
+ testEvalException("fn:replace('abc', '^(a){-9}', 'ABC')");
+ }
@Test public void exprBoolean1() { test("fn:boolean('')", FALSE) ; }
@Test public void exprBoolean2() { test("fn:boolean(0)", FALSE) ; }
http://git-wip-us.apache.org/repos/asf/jena/blob/4d9524af/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestXSDFuncOp.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestXSDFuncOp.java b/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestXSDFuncOp.java
index 47d774e..afa0388 100644
--- a/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestXSDFuncOp.java
+++ b/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestXSDFuncOp.java
@@ -18,9 +18,6 @@
package org.apache.jena.sparql.expr;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
import org.apache.jena.atlas.junit.BaseTest ;
import org.apache.jena.datatypes.xsd.XSDDatatype ;
import org.apache.jena.graph.Node ;
@@ -857,17 +854,15 @@ public class TestXSDFuncOp extends BaseTest
assertNotNull(result.asNode()) ;
}
- @Test public void testStrReplace()
- {
+ @Test(expected=ExprEvalException.class)
+ public void testStrReplace() {
//test invalid pattern
NodeValue wrong = NodeValue.makeString("^(?:-*[^-]){-9}");
NodeValue nvStr= NodeValue.makeString("AGIKLAKLMTUARAR");
NodeValue empty= NodeValue.makeString("");
- try {
- XSDFuncOp.strReplace(nvStr, wrong, empty);
- fail("Should have thrown an exception as the regex is not valid.");
- } catch (ExprEvalException ex) {}
+ XSDFuncOp.strReplace(nvStr, wrong, empty);
}
+
// All compatible - no timezone.
private static NodeValue nv_dt = NodeValue.makeNode("2010-03-22T20:31:54.5", XSDDatatype.XSDdateTime) ;
private static NodeValue nv_d = NodeValue.makeNode("2010-03-22", XSDDatatype.XSDdate) ;