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
{