You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ra...@apache.org on 2019/05/22 08:38:26 UTC
[sling-org-apache-sling-scripting-core] 01/03: SLING-8425 - NPE in
SlingScriptEngineManager when Sling is run on GraalVM
This is an automated email from the ASF dual-hosted git repository.
radu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-scripting-core.git
commit 7114133f465b608337550aa64a189cf15aa8967f
Author: Paul Bjorkstrand <pa...@gmail.com>
AuthorDate: Mon May 20 10:23:20 2019 -0500
SLING-8425 - NPE in SlingScriptEngineManager when Sling is run on GraalVM
* fix NPE on GraalVM
---
.../core/impl/jsr223/SlingScriptEngineManager.java | 12 +++--
.../impl/jsr223/SlingScriptEngineManagerTest.java | 53 +++++++++++++++++-----
2 files changed, 50 insertions(+), 15 deletions(-)
diff --git a/src/main/java/org/apache/sling/scripting/core/impl/jsr223/SlingScriptEngineManager.java b/src/main/java/org/apache/sling/scripting/core/impl/jsr223/SlingScriptEngineManager.java
index 34d975a..b5f800a 100644
--- a/src/main/java/org/apache/sling/scripting/core/impl/jsr223/SlingScriptEngineManager.java
+++ b/src/main/java/org/apache/sling/scripting/core/impl/jsr223/SlingScriptEngineManager.java
@@ -293,13 +293,19 @@ public class SlingScriptEngineManager extends ScriptEngineManager implements Bun
private void registerAssociations(ScriptEngineFactory factory) {
for (String extension : factory.getExtensions()) {
- internalManager.registerEngineExtension(extension, factory);
+ if (extension != null && !extension.isEmpty()) {
+ internalManager.registerEngineExtension(extension, factory);
+ }
}
for (String mimeType : factory.getMimeTypes()) {
- internalManager.registerEngineMimeType(mimeType, factory);
+ if (mimeType != null && !mimeType.isEmpty()) {
+ internalManager.registerEngineMimeType(mimeType, factory);
+ }
}
for (String name : factory.getNames()) {
- internalManager.registerEngineName(name, factory);
+ if (name != null && !name.isEmpty()) {
+ internalManager.registerEngineName(name, factory);
+ }
}
}
diff --git a/src/test/java/org/apache/sling/scripting/core/impl/jsr223/SlingScriptEngineManagerTest.java b/src/test/java/org/apache/sling/scripting/core/impl/jsr223/SlingScriptEngineManagerTest.java
index b61757f..e737ede 100644
--- a/src/test/java/org/apache/sling/scripting/core/impl/jsr223/SlingScriptEngineManagerTest.java
+++ b/src/test/java/org/apache/sling/scripting/core/impl/jsr223/SlingScriptEngineManagerTest.java
@@ -72,15 +72,20 @@ public class SlingScriptEngineManagerTest {
@Test
public void testPlatformScriptEngines() {
+ int jvmProvidedScriptEngineFactoryCount = jvmProvidedScriptEngineFactoryCount();
ScriptEngineManager scriptEngineManager = context.getService(ScriptEngineManager.class);
assertNotNull("Expected a ScriptEngineManager would be already registered.", scriptEngineManager);
- assertEquals("The ScriptEngineManager should have had 1 ScriptEngineFactory registered.", 1, scriptEngineManager
- .getEngineFactories().size());
+ {
+ int expectedScriptEngineFactories = jvmProvidedScriptEngineFactoryCount;
+ assertEquals("The ScriptEngineManager should have had " + expectedScriptEngineFactories + " ScriptEngineFactory registered.", expectedScriptEngineFactories, scriptEngineManager
+ .getEngineFactories().size());
+ }
}
@Test
public void testOSGiRegisteredFactoriesDifferentServiceRanking() throws Exception {
- int expectedEvents = 3;
+ int jvmProvidedScriptEngineFactoryCount = jvmProvidedScriptEngineFactoryCount();
+ int expectedEvents = jvmProvidedScriptEngineFactoryCount + 1;
CountDownLatch latch = new CountDownLatch(expectedEvents);
TestEventHandler eventHandler = new TestEventHandler
(latch, "org/apache/sling/scripting/core/impl/jsr223/SlingScriptEngineManager/UPDATED");
@@ -108,9 +113,12 @@ public class SlingScriptEngineManagerTest {
ScriptEngineManager scriptEngineManager = context.getService(ScriptEngineManager.class);
assertNotNull("Expected a ScriptEngineManager would be already registered.", scriptEngineManager);
List<ScriptEngineFactory> factories = scriptEngineManager.getEngineFactories();
- assertEquals("The ScriptEngineManager should have had 3 ScriptEngineFactories registered.", 3, factories.size());
- assertEquals(f1.getEngineName(), factories.get(2).getEngineName());
- assertEquals(f2.getEngineName(), factories.get(1).getEngineName());
+ {
+ int expectedScriptEngineFactories = jvmProvidedScriptEngineFactoryCount + 2;
+ assertEquals("The ScriptEngineManager should have had " + expectedScriptEngineFactories + " ScriptEngineFactories registered.", expectedScriptEngineFactories, factories.size());
+ }
+ assertEquals(f1.getEngineName(), factories.get(jvmProvidedScriptEngineFactoryCount + 1).getEngineName());
+ assertEquals(f2.getEngineName(), factories.get(jvmProvidedScriptEngineFactoryCount).getEngineName());
SlingScriptEngineManager slingScriptEngineManager = context.getService(SlingScriptEngineManager.class);
assertEquals(2, slingScriptEngineManager.getProperties(f1).get(Constants.SERVICE_RANKING));
@@ -118,8 +126,11 @@ public class SlingScriptEngineManagerTest {
f1SR.unregister();
factories = scriptEngineManager.getEngineFactories();
- assertEquals("The ScriptEngineManager should have had 2 ScriptEngineFactories registered.", 2, factories.size());
- assertEquals(f2.getEngineName(), factories.get(1).getEngineName());
+ {
+ int expectedScriptEngineFactories = jvmProvidedScriptEngineFactoryCount + 1;
+ assertEquals("The ScriptEngineManager should have had " + expectedScriptEngineFactories + " ScriptEngineFactories registered.", expectedScriptEngineFactories, factories.size());
+ }
+ assertEquals(f2.getEngineName(), factories.get(jvmProvidedScriptEngineFactoryCount).getEngineName());
assertEquals(f2, scriptEngineManager.getEngineByName("f2").getFactory());
assertEquals(f2, scriptEngineManager.getEngineByExtension("f2").getFactory());
@@ -138,6 +149,7 @@ public class SlingScriptEngineManagerTest {
@Test
public void testBundledScriptEngineFactory() throws Exception {
+ int jvmProvidedScriptEngineFactoryCount = jvmProvidedScriptEngineFactoryCount();
final URL url = createFactoryFile().toURI().toURL();
Bundle bundle = mock(Bundle.class);
BundleWiring wiring = mock(BundleWiring.class);
@@ -166,14 +178,20 @@ public class SlingScriptEngineManagerTest {
assertNotNull("Expected that the SlingScriptEngineManager would already be registered.", slingScriptEngineManager);
slingScriptEngineManager.bundleChanged(bundleEvent);
List<ScriptEngineFactory> factories = slingScriptEngineManager.getEngineFactories();
- assertEquals("Expected 2 ScriptEngineFactories.", 2, factories.size());
- assertEquals("Dummy Scripting Engine", factories.get(1).getEngineName());
+ {
+ int expectedScriptEngineFactories = jvmProvidedScriptEngineFactoryCount + 1;
+ assertEquals("Expected " + expectedScriptEngineFactories + " ScriptEngineFactories.", expectedScriptEngineFactories, factories.size());
+ }
+ assertEquals("Dummy Scripting Engine", factories.get(jvmProvidedScriptEngineFactoryCount).getEngineName());
bundleEvent = new BundleEvent(BundleEvent.STOPPED, bundle);
slingScriptEngineManager.bundleChanged(bundleEvent);
factories = slingScriptEngineManager.getEngineFactories();
- assertEquals("Expected 1 ScriptEngineFactory.", 1, factories.size());
- assertEquals("Oracle Nashorn", factories.get(0).getEngineName());
+ {
+ int expectedScriptEngineFactories = jvmProvidedScriptEngineFactoryCount;
+ assertEquals("Expected " + expectedScriptEngineFactories + " ScriptEngineFactory.", expectedScriptEngineFactories, factories.size());
+ }
+ //assertEquals("Oracle Nashorn", factories.get(0).getEngineName());
assertNull("Did not expect references to the already unregistered DummyScriptEngineFactory", slingScriptEngineManager
.getEngineByExtension("dummy"));
assertNull("Did not expect references to the already unregistered DummyScriptEngineFactory",
@@ -182,6 +200,17 @@ public class SlingScriptEngineManagerTest {
slingScriptEngineManager.getEngineByName("Dummy"));
}
+ private int jvmProvidedScriptEngineFactoryCount() {
+ ClassLoader loader = Thread.currentThread().getContextClassLoader();
+ try {
+ Thread.currentThread().setContextClassLoader(null);
+ return new ScriptEngineManager(ClassLoader.getSystemClassLoader()).getEngineFactories().size();
+ }
+ finally {
+ Thread.currentThread().setContextClassLoader(loader);
+ }
+ }
+
private ScriptEngineFactory mockScriptEngineFactory(String engineName, String engineVersion, List<String> extensions, String
languageName, String languageVersion, List<String> mimeTypes) {
ScriptEngineFactory factory = mock(ScriptEngineFactory.class);