KEYCLOAK-4738 Make sure script engine always uses correct classloader

This commit is contained in:
Stian Thorgersen committed 2017-04-20 09:28:46 +02:00
1 parent e54c1d7de1
commit 4da07474fa
2 files changed
+21 -8

No files matched your search

@@ -110,7 +110,13 @@ public class DefaultScriptingProvider implements ScriptingProvider {
* Looks-up a {@link ScriptEngine} based on the MIME-type provided by the given {@link Script}.
*/
private ScriptEngine lookupScriptEngineFor(ScriptModel script) {
return scriptEngineManager.getEngineByMimeType(script.getMimeType());
ClassLoader cl = Thread.currentThread().getContextClassLoader();
try {
Thread.currentThread().setContextClassLoader(DefaultScriptingProvider.class.getClassLoader());
return scriptEngineManager.getEngineByMimeType(script.getMimeType());
} finally {
Thread.currentThread().setContextClassLoader(cl);
}
}
@Override
@@ -29,9 +29,13 @@ public class DefaultScriptingProviderFactory implements ScriptingProviderFactory
static final String ID = "script-based-auth";
private ScriptEngineManager scriptEngineManager;
@Override
public ScriptingProvider create(KeycloakSession session) {
return new DefaultScriptingProvider(ScriptEngineManagerHolder.SCRIPT_ENGINE_MANAGER);
lazyInit();
return new DefaultScriptingProvider(scriptEngineManager);
}
@Override
@@ -54,11 +58,14 @@ public class DefaultScriptingProviderFactory implements ScriptingProviderFactory
return ID;
}
/**
* Holder class for lazy initialization of {@link ScriptEngineManager}.
*/
private static class ScriptEngineManagerHolder {
private static final ScriptEngineManager SCRIPT_ENGINE_MANAGER = new ScriptEngineManager();
private void lazyInit() {
if (scriptEngineManager == null) {
synchronized (this) {
if (scriptEngineManager == null) {
scriptEngineManager = new ScriptEngineManager();
}
}
}
}
}