corrected lock order & cached precompiled script class instance
diff --git a/src/main/java/org/apache/sling/scripting/resolver/internal/BundledScriptFinder.java b/src/main/java/org/apache/sling/scripting/resolver/internal/BundledScriptFinder.java
index 77f917a..49a1e33 100644
--- a/src/main/java/org/apache/sling/scripting/resolver/internal/BundledScriptFinder.java
+++ b/src/main/java/org/apache/sling/scripting/resolver/internal/BundledScriptFinder.java
@@ -71,7 +71,7 @@
if (bundledScriptURL != null) {
try {
return new PrecompiledScript(scriptEngineManager.getEngineByExtension(extension),
- bundle.loadClass(fromClassResourceToClassname(classResource)));
+ bundle.loadClass(fromClassResourceToClassname(classResource)).getDeclaredConstructor().newInstance());
} catch (Exception e) {
throw new RuntimeException(e);
}
diff --git a/src/main/java/org/apache/sling/scripting/resolver/internal/BundledScriptServlet.java b/src/main/java/org/apache/sling/scripting/resolver/internal/BundledScriptServlet.java
index 3d3714a..c3cbf76 100644
--- a/src/main/java/org/apache/sling/scripting/resolver/internal/BundledScriptServlet.java
+++ b/src/main/java/org/apache/sling/scripting/resolver/internal/BundledScriptServlet.java
@@ -88,14 +88,15 @@
}
String scriptsMapKey = getScriptsMapKey(request);
- ScriptEngineExecutable script = scriptsMap.get(scriptsMapKey);
+ ScriptEngineExecutable script;
lock.readLock().lock();
try {
+ script = scriptsMap.get(scriptsMapKey);
if (script == null) {
lock.readLock().unlock();
lock.writeLock().lock();
try {
- script = scriptsMap.get(getScriptsMapKey(request));
+ script = scriptsMap.get(scriptsMapKey);
if (script == null) {
if (StringUtils.isEmpty(m_delegatedResourceType)) {
script = m_bundledScriptFinder.getScript(request, m_bundle, precompiledScripts);
@@ -106,8 +107,8 @@
scriptsMap.put(scriptsMapKey, script);
}
}
- } finally {
lock.readLock().lock();
+ } finally {
lock.writeLock().unlock();
}
}
diff --git a/src/main/java/org/apache/sling/scripting/resolver/internal/PrecompiledScript.java b/src/main/java/org/apache/sling/scripting/resolver/internal/PrecompiledScript.java
index 84bb5c1..8e65f4c 100644
--- a/src/main/java/org/apache/sling/scripting/resolver/internal/PrecompiledScript.java
+++ b/src/main/java/org/apache/sling/scripting/resolver/internal/PrecompiledScript.java
@@ -30,16 +30,16 @@
public class PrecompiledScript implements ScriptEngineExecutable {
private ScriptEngine scriptEngine;
- private Class precompiledScript;
+ private Object precompiledScript;
- PrecompiledScript(ScriptEngine scriptEngine, Class precompiledScript) {
+ PrecompiledScript(ScriptEngine scriptEngine, Object precompiledScript) {
this.scriptEngine = scriptEngine;
this.precompiledScript = precompiledScript;
}
@Override
public String getName() {
- return precompiledScript.getName();
+ return precompiledScript.getClass().getName();
}
@Override
diff --git a/src/main/java/org/apache/sling/scripting/resolver/internal/Script.java b/src/main/java/org/apache/sling/scripting/resolver/internal/Script.java
index bbefc16..24c5357 100644
--- a/src/main/java/org/apache/sling/scripting/resolver/internal/Script.java
+++ b/src/main/java/org/apache/sling/scripting/resolver/internal/Script.java
@@ -40,16 +40,25 @@
private ScriptEngine scriptEngine;
private String sourceCode;
private CompiledScript compiledScript = null;
- private Lock lock = new ReentrantLock();
+ private Lock compilationLock = new ReentrantLock();
+ private Lock readLock = new ReentrantLock();
+
Script(URL url, ScriptEngine scriptEngine) {
this.url = url;
this.scriptEngine = scriptEngine;
}
- private synchronized String getSourceCode() throws IOException {
+ private String getSourceCode() throws IOException {
if (sourceCode == null) {
- sourceCode = IOUtils.toString(url.openStream(), StandardCharsets.UTF_8);
+ readLock.lock();
+ try {
+ if (sourceCode == null) {
+ sourceCode = IOUtils.toString(url.openStream(), StandardCharsets.UTF_8);
+ }
+ } finally {
+ readLock.unlock();
+ }
}
return sourceCode;
}
@@ -65,7 +74,7 @@
public void eval(ScriptContext context) throws ScriptException {
try {
if (scriptEngine instanceof Compilable && compiledScript == null) {
- lock.lock();
+ compilationLock.lock();
try {
if (scriptEngine instanceof Compilable && compiledScript == null) {
compiledScript =
@@ -73,7 +82,7 @@
.compile(new ScriptNameAwareReader(new StringReader(getSourceCode()), getName()));
}
} finally {
- lock.unlock();
+ compilationLock.unlock();
}
}
if (compiledScript != null) {