diff --git a/distribution/bin/check-licenses.py b/distribution/bin/check-licenses.py index 70afd9031362..6690632bd942 100755 --- a/distribution/bin/check-licenses.py +++ b/distribution/bin/check-licenses.py @@ -310,6 +310,7 @@ def build_compatible_license_names(): compatible_licenses['SPDX-License-Identifier: MIT'] = 'MIT License' compatible_licenses['The Go license'] = 'The Go license' + compatible_licenses['Universal Permissive License, Version 1.0'] = 'Universal Permissive License, Version 1.0' compatible_licenses['-'] = '-' return compatible_licenses diff --git a/indexing-service/pom.xml b/indexing-service/pom.xml index ea410b0f8eb2..398f579f4a6c 100644 --- a/indexing-service/pom.xml +++ b/indexing-service/pom.xml @@ -187,6 +187,16 @@ commons-collections4 provided + + org.graalvm.js + js-scriptengine + runtime + + + org.graalvm.js + js + runtime + com.cronutils cron-utils diff --git a/indexing-service/src/main/java/org/apache/druid/indexing/overlord/setup/JavaScriptUtil.java b/indexing-service/src/main/java/org/apache/druid/indexing/overlord/setup/JavaScriptUtil.java new file mode 100644 index 000000000000..1b969647fc8b --- /dev/null +++ b/indexing-service/src/main/java/org/apache/druid/indexing/overlord/setup/JavaScriptUtil.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.druid.indexing.overlord.setup; + +import javax.script.Bindings; +import javax.script.Compilable; +import javax.script.Invocable; +import javax.script.ScriptContext; +import javax.script.ScriptEngine; +import javax.script.ScriptEngineManager; +import javax.script.ScriptException; + +public class JavaScriptUtil +{ + public static T compileSelectorFunction(Class interfaceClass, String function) + { + final ScriptEngine engine = new ScriptEngineManager().getEngineByName("js"); + Bindings bindings = engine.getBindings(ScriptContext.ENGINE_SCOPE); + bindings.put("polyglot.js.nashorn-compat", true); + try { + ((Compilable) engine).compile("var apply = " + function).eval(); + return ((Invocable) engine).getInterface(interfaceClass); + } + catch (ScriptException e) { + throw new RuntimeException(e); + } + } +} diff --git a/indexing-service/src/main/java/org/apache/druid/indexing/overlord/setup/JavaScriptWorkerSelectStrategy.java b/indexing-service/src/main/java/org/apache/druid/indexing/overlord/setup/JavaScriptWorkerSelectStrategy.java index f9cc2da3c74d..88c8d6931648 100644 --- a/indexing-service/src/main/java/org/apache/druid/indexing/overlord/setup/JavaScriptWorkerSelectStrategy.java +++ b/indexing-service/src/main/java/org/apache/druid/indexing/overlord/setup/JavaScriptWorkerSelectStrategy.java @@ -29,12 +29,6 @@ import org.apache.druid.indexing.overlord.config.WorkerTaskRunnerConfig; import org.apache.druid.js.JavaScriptConfig; -import javax.script.Compilable; -import javax.script.Invocable; -import javax.script.ScriptEngine; -import javax.script.ScriptEngineManager; -import javax.script.ScriptException; - public class JavaScriptWorkerSelectStrategy implements WorkerSelectStrategy { public interface SelectorFunction @@ -59,18 +53,6 @@ public JavaScriptWorkerSelectStrategy( this.function = fn; } - private SelectorFunction compileSelectorFunction() - { - final ScriptEngine engine = new ScriptEngineManager().getEngineByName("javascript"); - try { - ((Compilable) engine).compile("var apply = " + function).eval(); - return ((Invocable) engine).getInterface(SelectorFunction.class); - } - catch (ScriptException e) { - throw new RuntimeException(e); - } - } - @Override public ImmutableWorkerInfo findWorkerForTask( WorkerTaskRunnerConfig config, @@ -78,7 +60,7 @@ public ImmutableWorkerInfo findWorkerForTask( Task task ) { - fnSelector = fnSelector == null ? compileSelectorFunction() : fnSelector; + fnSelector = fnSelector == null ? JavaScriptUtil.compileSelectorFunction(SelectorFunction.class, function) : fnSelector; String worker = fnSelector.apply(config, zkWorkers, task); return worker == null ? null : zkWorkers.get(worker); } diff --git a/indexing-service/src/test/java/org/apache/druid/indexing/overlord/setup/JavaScriptWorkerSelectStrategyTest.java b/indexing-service/src/test/java/org/apache/druid/indexing/overlord/setup/JavaScriptWorkerSelectStrategyTest.java index c767bf64c7a6..c2a02d3d1e5f 100644 --- a/indexing-service/src/test/java/org/apache/druid/indexing/overlord/setup/JavaScriptWorkerSelectStrategyTest.java +++ b/indexing-service/src/test/java/org/apache/druid/indexing/overlord/setup/JavaScriptWorkerSelectStrategyTest.java @@ -32,14 +32,10 @@ import org.hamcrest.CoreMatchers; import org.joda.time.Period; import org.junit.Assert; -import org.junit.Assume; -import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; -import javax.script.ScriptEngineManager; - public class JavaScriptWorkerSelectStrategyTest { @Rule @@ -76,13 +72,6 @@ public class JavaScriptWorkerSelectStrategyTest JavaScriptConfig.getEnabledInstance() ); - @Before - public void checkJdkCompatibility() - { - // skip tests for newer JDKs without javascript support - Assume.assumeNotNull(new ScriptEngineManager().getEngineByName("javascript")); - } - @Test public void testSerde() throws Exception { diff --git a/licenses.yaml b/licenses.yaml index 9b7370e22e13..340768191c55 100644 --- a/licenses.yaml +++ b/licenses.yaml @@ -5038,6 +5038,22 @@ libraries: --- +name: GraalVM +license_category: binary +license_name: Universal Permissive License, Version 1.0 +license_file_path: licenses/bin/graal.UPL +version: 22.3.5 +module: core +libraries: + - org.graalvm.js: js + - org.graalvm.js: js-scriptengine + - org.graalvm.regex: regex + - org.graalvm.sdk: graal-sdk + - org.graalvm.js: js-scriptengine + - org.graalvm.truffle: truffle-api + +--- + name: jakarta.el license_category: binary module: core diff --git a/pom.xml b/pom.xml index b913fb973e5e..998d383a064d 100644 --- a/pom.xml +++ b/pom.xml @@ -114,6 +114,7 @@ 5.13.0 5.13.0 3.3.6 + 22.3.5 5.14.2 1.12.638 2.8.0 @@ -669,6 +670,16 @@ jaxb-runtime 2.3.3 + + org.graalvm.js + js + ${graaljs.version} + + + org.graalvm.js + js-scriptengine + ${graaljs.version} + org.jdbi jdbi diff --git a/services/pom.xml b/services/pom.xml index f610ca186a26..b92184f99d00 100644 --- a/services/pom.xml +++ b/services/pom.xml @@ -238,6 +238,16 @@ org.jdbi jdbi + + org.graalvm.js + js-scriptengine + runtime + + + org.graalvm.js + js + runtime + org.apache.druid diff --git a/services/src/main/java/org/apache/druid/server/router/JavaScriptTieredBrokerSelectorStrategy.java b/services/src/main/java/org/apache/druid/server/router/JavaScriptTieredBrokerSelectorStrategy.java index 347fcf0c1c88..b6a1995a64b0 100644 --- a/services/src/main/java/org/apache/druid/server/router/JavaScriptTieredBrokerSelectorStrategy.java +++ b/services/src/main/java/org/apache/druid/server/router/JavaScriptTieredBrokerSelectorStrategy.java @@ -24,15 +24,10 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.google.common.base.Optional; import com.google.common.base.Preconditions; +import org.apache.druid.indexing.overlord.setup.JavaScriptUtil; import org.apache.druid.js.JavaScriptConfig; import org.apache.druid.query.Query; -import javax.script.Compilable; -import javax.script.Invocable; -import javax.script.ScriptEngine; -import javax.script.ScriptEngineManager; -import javax.script.ScriptException; - public class JavaScriptTieredBrokerSelectorStrategy implements TieredBrokerSelectorStrategy { public interface SelectorFunction @@ -57,22 +52,10 @@ public JavaScriptTieredBrokerSelectorStrategy( this.function = fn; } - private SelectorFunction compileSelectorFunction() - { - final ScriptEngine engine = new ScriptEngineManager().getEngineByName("javascript"); - try { - ((Compilable) engine).compile("var apply = " + function).eval(); - return ((Invocable) engine).getInterface(SelectorFunction.class); - } - catch (ScriptException e) { - throw new RuntimeException(e); - } - } - @Override public Optional getBrokerServiceName(TieredBrokerConfig config, Query query) { - fnSelector = fnSelector == null ? compileSelectorFunction() : fnSelector; + fnSelector = fnSelector == null ? JavaScriptUtil.compileSelectorFunction(SelectorFunction.class, function) : fnSelector; return Optional.fromNullable(fnSelector.apply(config, query)); } diff --git a/services/src/test/java/org/apache/druid/server/router/JavaScriptTieredBrokerSelectorStrategyTest.java b/services/src/test/java/org/apache/druid/server/router/JavaScriptTieredBrokerSelectorStrategyTest.java index fa8e931f0cdb..ec1ddb9f66a6 100644 --- a/services/src/test/java/org/apache/druid/server/router/JavaScriptTieredBrokerSelectorStrategyTest.java +++ b/services/src/test/java/org/apache/druid/server/router/JavaScriptTieredBrokerSelectorStrategyTest.java @@ -32,13 +32,10 @@ import org.apache.druid.query.topn.TopNQueryBuilder; import org.hamcrest.CoreMatchers; import org.junit.Assert; -import org.junit.Assume; -import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; -import javax.script.ScriptEngineManager; import java.util.LinkedHashMap; public class JavaScriptTieredBrokerSelectorStrategyTest @@ -51,13 +48,6 @@ public class JavaScriptTieredBrokerSelectorStrategyTest JavaScriptConfig.getEnabledInstance() ); - @Before - public void checkJdkCompatibility() - { - // skip tests for newer JDKs without javascript support - Assume.assumeNotNull(new ScriptEngineManager().getEngineByName("javascript")); - } - @Test public void testSerde() throws Exception {