Jerven, thanks for a good bug report (and double-thanks for accompanying it with a PR fix!).
Jena is as strong as we make it together. ajs6f Jerven Tjalling Bolleman wrote on 10/23/17 2:40 PM:
Dear Andy and all other Jena developers, Thank you for taking and improving the patch! As well as all your excellent work over the years. Regards, Jerven On 10/23/2017 12:23 PM, Andy Seaborne wrote:> Does that seem sensible? Yes - recorded as JENA-1403. The static compilation case (the constructor E_strReplase) should also throw a ExprException. Thanks Andy https://issues.apache.org/jira/browse/JENA-1403 On 23/10/17 09:23, Jerven Tjalling Bolleman wrote:Dear Jena Developers, I am doing some strange stuff with building regexes from data inside a sparql store. Sometimes that leads to invalid regexes which ends up throwing PatternSyntaxExceptions. For my use case it is fine that these would not evaluate properly. I believe however that the specific exception about pattern syntax should be caught and turned into a ExprEvalException so that evaluation of queries can continue. i.e. the following stacktrace (against jena 3.4.0) should be caught and not propegated. java.util.regex.PatternSyntaxException: Illegal repetition near index 10 ^(?:-*[^-]){-9} ^ at java.util.regex.Pattern.error(Pattern.java:1955) at java.util.regex.Pattern.closure(Pattern.java:3157) at java.util.regex.Pattern.group0(Pattern.java:2912) at java.util.regex.Pattern.sequence(Pattern.java:2051) at java.util.regex.Pattern.expr(Pattern.java:1996) at java.util.regex.Pattern.compile(Pattern.java:1696) at java.util.regex.Pattern.<init>(Pattern.java:1351) at java.util.regex.Pattern.compile(Pattern.java:1054) at org.apache.jena.sparql.expr.nodevalue.XSDFuncOp.strReplace(XSDFuncOp.java:474) at org.apache.jena.sparql.expr.nodevalue.XSDFuncOp.strReplace(XSDFuncOp.java:518) I suggest modifying the function 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) ; } return strReplace(nvStr, Pattern.compile(pat, flags), nvReplacement) ; } to be something like 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) ; } } Does that seem sensible? Regards, Jerven
