BundledScriptServlet should release all locks before executing script
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 32de5a5..53247ed 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
@@ -60,10 +60,11 @@
if ((req instanceof SlingHttpServletRequest) && (res instanceof SlingHttpServletResponse)) {
SlingHttpServletRequest request = (SlingHttpServletRequest) req;
SlingHttpServletResponse response = (SlingHttpServletResponse) res;
+
+ String scriptsMapKey = getScriptsMapKey(request);
+ Script script = scriptsMap.get(scriptsMapKey);
lock.readLock().lock();
try {
- String scriptsMapKey = getScriptsMapKey(request);
- Script script = scriptsMap.get(scriptsMapKey);
if (script == null) {
lock.readLock().unlock();
lock.writeLock().lock();
@@ -71,40 +72,41 @@
script = scriptsMap.get(getScriptsMapKey(request));
if (script == null) {
script = m_bundledScriptFinder.getScript(request, m_bundle);
- scriptsMap.put(scriptsMapKey, script);
+ if (script != null) {
+ scriptsMap.put(scriptsMapKey, script);
+ }
+ lock.readLock().lock();
}
- lock.readLock().lock();
} finally {
lock.writeLock().unlock();
}
}
- if (script != null) {
- if (request.getAttribute(SlingConstants.ATTR_INCLUDE_SERVLET_PATH) == null) {
- final String contentType = request.getResponseContentType();
- if (contentType != null) {
- response.setContentType(contentType);
- if (contentType.startsWith("text/")) {
- response.setCharacterEncoding("UTF-8");
- }
- }
- }
- ScriptContext scriptContext = m_scriptContextProvider.prepareScriptContext(request, response, script);
- try {
- script.eval(scriptContext);
- } catch (ScriptException se) {
- Throwable cause = (se.getCause() == null) ? se : se.getCause();
- throw new ScriptEvaluationException(script.getName(), se.getMessage(), cause);
- }
- } else {
- response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
- }
} finally {
lock.readLock().unlock();
}
+ if (script != null) {
+ if (request.getAttribute(SlingConstants.ATTR_INCLUDE_SERVLET_PATH) == null) {
+ final String contentType = request.getResponseContentType();
+ if (contentType != null) {
+ response.setContentType(contentType);
+ if (contentType.startsWith("text/")) {
+ response.setCharacterEncoding("UTF-8");
+ }
+ }
+ }
+ ScriptContext scriptContext = m_scriptContextProvider.prepareScriptContext(request, response, script);
+ try {
+ script.eval(scriptContext);
+ } catch (ScriptException se) {
+ Throwable cause = (se.getCause() == null) ? se : se.getCause();
+ throw new ScriptEvaluationException(script.getName(), se.getMessage(), cause);
+ }
+ } else {
+ response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+ }
} else {
throw new ServletException("Not a Sling HTTP request/response");
}
-
}
private String getScriptsMapKey(SlingHttpServletRequest request) {