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
The following commit(s) were added to refs/heads/master by this push:
new a0bc18c SLING-7311 - The SlingScriptEngineManager doesn't correctly
flush script engine associations
a0bc18c is described below
commit a0bc18cc24dfe543b3214f2cd4ae63b362f63dcc
Author: Radu Cotescu <[email protected]>
AuthorDate: Thu Dec 14 09:03:00 2017 +0100
SLING-7311 - The SlingScriptEngineManager doesn't correctly flush script
engine associations
* added tests to verify stale entries
* made sure the internal script engine manager is always refreshed on change
---
.../core/impl/jsr223/SlingScriptEngineManager.java | 31 +++++++++-------------
.../impl/jsr223/SlingScriptEngineManagerTest.java | 25 ++++++++++++-----
2 files changed, 32 insertions(+), 24 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 6f1ece9..f82bc04 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
@@ -18,12 +18,6 @@
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
package org.apache.sling.scripting.core.impl.jsr223;
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.net.URL;
-import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Dictionary;
@@ -85,18 +79,7 @@ public class SlingScriptEngineManager extends
ScriptEngineManager implements Bun
private final Map<ScriptEngineFactory, Map<String, Object>>
factoriesProperties = new HashMap<>();
private final Set<ServiceReference<ScriptEngineFactory>> serviceReferences
= new HashSet<>();
- private final ScriptEngineManager internalManager;
- {
- ClassLoader loader = Thread.currentThread().getContextClassLoader();
- try {
- Thread.currentThread().setContextClassLoader(null);
- internalManager = new
ScriptEngineManager(ClassLoader.getSystemClassLoader());
- }
- finally {
- Thread.currentThread().setContextClassLoader(loader);
- }
- }
-
+ private ScriptEngineManager internalManager;
private SortedSet<SortableScriptEngineFactory> factories = new TreeSet<>();
private ComponentContext componentContext;
@@ -236,6 +219,7 @@ public class SlingScriptEngineManager extends
ScriptEngineManager implements Bun
private void updateFactories() {
readWriteLock.writeLock().lock();
try {
+ internalManager = getInternalScriptEngineManager();
factories = new TreeSet<>();
long fakeBundleIdCounter = Long.MIN_VALUE;
// first add the platform factories
@@ -289,6 +273,17 @@ public class SlingScriptEngineManager extends
ScriptEngineManager implements Bun
}
}
+ private ScriptEngineManager getInternalScriptEngineManager() {
+ ClassLoader loader = Thread.currentThread().getContextClassLoader();
+ try {
+ Thread.currentThread().setContextClassLoader(null);
+ return new ScriptEngineManager(ClassLoader.getSystemClassLoader());
+ }
+ finally {
+ Thread.currentThread().setContextClassLoader(loader);
+ }
+ }
+
private void registerAssociations(ScriptEngineFactory factory) {
for (String extension : factory.getExtensions()) {
internalManager.registerEngineExtension(extension, 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 33a46f4..b61757f 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
@@ -53,6 +53,7 @@ import org.osgi.service.event.EventHandler;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@@ -91,9 +92,9 @@ public class SlingScriptEngineManagerTest {
);
ScriptEngineFactory f1 = mockScriptEngineFactory("f1", "1.0",
Collections.singletonList("f1"), "f1", "1.0", Collections
- .singletonList("text"));
+ .singletonList("f1/text"));
ScriptEngineFactory f2 = mockScriptEngineFactory("f2", "1.0",
Collections.singletonList("f2"), "f2", "1.0", Collections
- .singletonList("text"));
+ .singletonList("f2/text"));
ServiceRegistration<ScriptEngineFactory> f1SR =
context.bundleContext().registerService(ScriptEngineFactory.class, f1, new
Hashtable<String, Object>() {{
@@ -122,7 +123,13 @@ public class SlingScriptEngineManagerTest {
assertEquals(f2,
scriptEngineManager.getEngineByName("f2").getFactory());
assertEquals(f2,
scriptEngineManager.getEngineByExtension("f2").getFactory());
- assertEquals(f2,
scriptEngineManager.getEngineByMimeType("text").getFactory());
+ assertEquals(f2,
scriptEngineManager.getEngineByMimeType("f2/text").getFactory());
+ assertNull("Did not expect references to the already unregistered f1
ScriptEngineFactory", scriptEngineManager.getEngineByName
+ ("f1"));
+ assertNull("Did not expect references to the already unregistered f1
ScriptEngineFactory", scriptEngineManager
+ .getEngineByExtension("f1"));
+ assertNull("Did not expect references to the already unregistered f1
ScriptEngineFactory", scriptEngineManager
+ .getEngineByMimeType("f1/text"));
latch.await(2, TimeUnit.SECONDS);
assertEquals("Expected a different number of processed " +
SlingScriptEngineManager.EVENT_TOPIC_SCRIPT_MANAGER_UPDATED + " events.",
@@ -136,13 +143,13 @@ public class SlingScriptEngineManagerTest {
BundleWiring wiring = mock(BundleWiring.class);
ClassLoader loader = new SecureClassLoader(){
@Override
- protected Class<?> loadClass(String name, boolean resolve) throws
ClassNotFoundException {
+ protected Class<?> loadClass(String name, boolean resolve) {
return name.equals(SCRIPT_ENGINE_FACTORY.getName()) ?
SCRIPT_ENGINE_FACTORY : null;
}
@Override
- public Enumeration<URL> getResources(String name) throws
IOException {
- Vector v = new Vector();
+ public Enumeration<URL> getResources(String name) {
+ Vector<URL> v = new Vector<>();
v.add(url);
return v.elements();
}
@@ -167,6 +174,12 @@ public class SlingScriptEngineManagerTest {
factories = slingScriptEngineManager.getEngineFactories();
assertEquals("Expected 1 ScriptEngineFactory.", 1, 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",
+
slingScriptEngineManager.getEngineByMimeType("application/x-dummy"));
+ assertNull("Did not expect references to the already unregistered
DummyScriptEngineFactory",
+ slingScriptEngineManager.getEngineByName("Dummy"));
}
private ScriptEngineFactory mockScriptEngineFactory(String engineName,
String engineVersion, List<String> extensions, String
--
To stop receiving notification emails like this one, please contact
['"[email protected]" <[email protected]>'].