Hi guys, to prepare the drop of nashorn i added joni as an optional license, it is a jruby library providing a java implementation of emacs regex and therefore we can use it for jsonschema validation implementation. I amde it optional for now but code is ready to make it mainstream.
Its license (and of its single dep) is MIT and i wonder if we want to just shade it (with minimize=true?) and drop the nashorn dependency. it will be faster anyway since it will avoid the interpretation of the js and just compile and run the regex. wdyt? Romain ---------- Forwarded message --------- From: <[email protected]> Date: lun. 2 juil. 2018 à 12:20 Subject: johnzon git commit: provide a Joni integration for jsonschema when nashorn will be completely dropped - todo: check if we shade it with minimal=true To: <[email protected]> Repository: johnzon Updated Branches: refs/heads/master 0c09b74f2 -> 33d2acff3 provide a Joni integration for jsonschema when nashorn will be completely dropped - todo: check if we shade it with minimal=true Project: http://git-wip-us.apache.org/repos/asf/johnzon/repo Commit: http://git-wip-us.apache.org/repos/asf/johnzon/commit/33d2acff Tree: http://git-wip-us.apache.org/repos/asf/johnzon/tree/33d2acff Diff: http://git-wip-us.apache.org/repos/asf/johnzon/diff/33d2acff Branch: refs/heads/master Commit: 33d2acff3600d82c5e3a735b869d7b49975c5e76 Parents: 0c09b74 Author: Romain Manni-Bucau <[email protected]> Authored: Mon Jul 2 12:20:10 2018 +0200 Committer: Romain Manni-Bucau <[email protected]> Committed: Mon Jul 2 12:20:10 2018 +0200 ---------------------------------------------------------------------- LICENSE | 5 ++ johnzon-jsonschema/pom.xml | 8 +++ .../johnzon/jsonschema/regex/JoniRegex.java | 70 ++++++++++++++++++++ .../johnzon/jsonschema/regex/JsRegexTest.java | 45 +++++++++++++ 4 files changed, 128 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/johnzon/blob/33d2acff/LICENSE ---------------------------------------------------------------------- diff --git a/LICENSE b/LICENSE index 261eeb9..ef77930 100644 --- a/LICENSE +++ b/LICENSE @@ -199,3 +199,8 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + +----- + +This product bundles Joni, which is available under a +"MIT" license. For details, see https://github.com/jruby/joni. \ No newline at end of file http://git-wip-us.apache.org/repos/asf/johnzon/blob/33d2acff/johnzon-jsonschema/pom.xml ---------------------------------------------------------------------- diff --git a/johnzon-jsonschema/pom.xml b/johnzon-jsonschema/pom.xml index b0d0086..1f74030 100644 --- a/johnzon-jsonschema/pom.xml +++ b/johnzon-jsonschema/pom.xml @@ -29,6 +29,14 @@ <name>Johnzon :: JSON Schema</name> <dependencies> + <dependency> <!-- only when nashorn will be dropped --> + <groupId>org.jruby.joni</groupId> + <artifactId>joni</artifactId> + <version>2.1.16</version> + <scope>provided</scope> + <optional>true</optional> + </dependency> + <dependency> <groupId>org.apache.johnzon</groupId> <artifactId>johnzon-core</artifactId> http://git-wip-us.apache.org/repos/asf/johnzon/blob/33d2acff/johnzon-jsonschema/src/main/java/org/apache/johnzon/jsonschema/regex/JoniRegex.java ---------------------------------------------------------------------- diff --git a/johnzon-jsonschema/src/main/java/org/apache/johnzon/jsonschema/regex/JoniRegex.java b/johnzon-jsonschema/src/main/java/org/apache/johnzon/jsonschema/regex/JoniRegex.java new file mode 100644 index 0000000..d0871c7 --- /dev/null +++ b/johnzon-jsonschema/src/main/java/org/apache/johnzon/jsonschema/regex/JoniRegex.java @@ -0,0 +1,70 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.johnzon.jsonschema.regex; + +import java.nio.charset.StandardCharsets; +import java.util.function.Predicate; + +import org.jcodings.specific.ASCIIEncoding; +import org.joni.Matcher; +import org.joni.Option; +import org.joni.Regex; +import org.joni.Syntax; + +public class JoniRegex implements Predicate<CharSequence> { + private final Regex regex; + private final String toStr; + + public JoniRegex(final String regex) { + if (regex.startsWith("/") && regex.length() > 1) { + final int end = regex.lastIndexOf('/'); + if (end < 0) { + this.regex = new Regex(regex); + } else { + final String optStr = regex.substring(end + 1); + int option = Option.SINGLELINE; + + if (optStr.contains("i")) { + option |= Option.IGNORECASE; + } else if (optStr.contains("m")) { + option &= ~Option.SINGLELINE; + option |= Option.NEGATE_SINGLELINE; + } + + this.regex = new Regex( + regex.getBytes(StandardCharsets.US_ASCII), 1, end, option, + ASCIIEncoding.INSTANCE, Syntax.ECMAScript); + } + } else { + this.regex = new Regex(regex); + } + this.toStr = "JoniRegex{" + regex + '}'; + } + + @Override + public boolean test(final CharSequence string) { + return regex.matcher(string.toString().getBytes(StandardCharsets.UTF_8)) + .search(0, string.length(), Option.NONE) > Matcher.FAILED; + } + + @Override + public String toString() { + return toStr; + } +} http://git-wip-us.apache.org/repos/asf/johnzon/blob/33d2acff/johnzon-jsonschema/src/test/java/org/apache/johnzon/jsonschema/regex/JsRegexTest.java ---------------------------------------------------------------------- diff --git a/johnzon-jsonschema/src/test/java/org/apache/johnzon/jsonschema/regex/JsRegexTest.java b/johnzon-jsonschema/src/test/java/org/apache/johnzon/jsonschema/regex/JsRegexTest.java new file mode 100644 index 0000000..b925ff7 --- /dev/null +++ b/johnzon-jsonschema/src/test/java/org/apache/johnzon/jsonschema/regex/JsRegexTest.java @@ -0,0 +1,45 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.johnzon.jsonschema.regex; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import java.util.stream.Stream; + +import org.junit.Test; + +public class JsRegexTest { + + @Test + public void valid() { + final String regex = "/^foo/i"; + Stream.of("foo", "foobar", "FoO_") + .forEach(val -> Stream.of(new JavascriptRegex(regex), new JoniRegex(regex)) + .forEach(validator -> assertTrue(validator.toString() + " # " + val, validator.test(val)))); + } + + @Test + public void invalid() { + final String regex = "/^foo/"; + Stream.of("bar", "FoO") + .forEach(val -> Stream.of(new JavascriptRegex(regex), new JoniRegex(regex)) + .forEach(validator -> assertFalse(validator.toString() + " # " + val, validator.test(val)))); + } +}
