Related tdf#116767: Call URLClassLoader.close

...which required the return type of
com.sun.star.script.framework.provider.ClassLoaderFactory.getURLClassLoader to
be changed.  (In theory, there could be 3rd-party scripting providers that hook
into the framework and are affected by that incompatible change, but,
practically, chances should be low.)

Change-Id: I083c398726aaf62df7286d6da86b9d2056a5a8c1
Reviewed-on: https://gerrit.libreoffice.org/77146
Tested-by: Jenkins
Reviewed-by: Stephan Bergmann <sbergman@redhat.com>
This commit is contained in:
Stephan Bergmann
2019-08-08 13:27:52 +02:00
parent 41dbf08b99
commit 418533f0af
2 changed files with 55 additions and 46 deletions
@@ -33,7 +33,7 @@ public class ClassLoaderFactory {
private ClassLoaderFactory() {}
public static ClassLoader getURLClassLoader(ScriptMetaData scriptData) {
public static URLClassLoader getURLClassLoader(ScriptMetaData scriptData) {
ClassLoader parent = scriptData.getClass().getClassLoader();
URL[] classPath = scriptData.getClassPath();
LogUtils.DEBUG("Classpath has length " + classPath.length);
@@ -45,7 +45,7 @@ public class ClassLoaderFactory {
return getURLClassLoader(parent, classPath);
}
public static ClassLoader getURLClassLoader(final ClassLoader parent,
public static URLClassLoader getURLClassLoader(final ClassLoader parent,
final URL[] classpath) {
return AccessController.doPrivileged(
new PrivilegedAction<URLClassLoader>() {
@@ -45,6 +45,8 @@ import com.sun.star.uno.Any;
import com.sun.star.uno.Type;
import com.sun.star.uno.XComponentContext;
import java.io.IOException;
import java.net.URLClassLoader;
import java.util.ArrayList;
public class ScriptProviderForJava {
@@ -182,56 +184,63 @@ class ScriptImpl implements XScript {
ScriptDescriptor scriptDesc =
new ScriptDescriptor(metaData.getLanguageName());
LogUtils.DEBUG("Classloader starting...");
ClassLoader scriptLoader =
ClassLoaderFactory.getURLClassLoader(metaData);
LogUtils.DEBUG("Classloader finished...");
ArrayList<Object> invocationArgList = new ArrayList<Object>();
Object[] invocationArgs = null;
LogUtils.DEBUG("Parameter Mapping...");
// Setup Context Object
XScriptContext xSc =
ScriptContext.createContext(m_xModel, m_xInvocContext,
m_xContext, m_xMultiComponentFactory);
scriptDesc.addArgumentType(XScriptContext.class);
invocationArgList.add(xSc);
for (int i = 0; i < params.length; i++) {
scriptDesc.addArgumentType(params[ i ].getClass());
invocationArgList.add(params[ i ]);
}
if (!invocationArgList.isEmpty()) {
invocationArgs = invocationArgList.toArray();
}
LogUtils.DEBUG("ScriptProxy starting... ");
ScriptProxy script = null;
try {
LogUtils.DEBUG("Classloader starting...");
String className = metaData.getLanguageName().substring(0,
metaData.getLanguageName().lastIndexOf('.'));
try (URLClassLoader scriptLoader = ClassLoaderFactory.getURLClassLoader(metaData)) {
LogUtils.DEBUG("Classloader finished...");
LogUtils.DEBUG("About to load Class " + className + " starting... ");
ArrayList<Object> invocationArgList = new ArrayList<Object>();
long start = new java.util.Date().getTime();
Class<?> c = scriptLoader.loadClass(className);
long end = new java.util.Date().getTime();
LogUtils.DEBUG("Parameter Mapping...");
LogUtils.DEBUG("loadClass took: " + (end - start) + "milliseconds");
// Setup Context Object
XScriptContext xSc =
ScriptContext.createContext(m_xModel, m_xInvocContext,
m_xContext, m_xMultiComponentFactory);
scriptDesc.addArgumentType(XScriptContext.class);
invocationArgList.add(xSc);
for (int i = 0; i < params.length; i++) {
scriptDesc.addArgumentType(params[ i ].getClass());
invocationArgList.add(params[ i ]);
}
if (!invocationArgList.isEmpty()) {
invocationArgs = invocationArgList.toArray();
}
LogUtils.DEBUG("ScriptProxy starting... ");
try {
LogUtils.DEBUG("class loaded ... ");
script = m_resolutionPolicy.getProxy(scriptDesc, c);
LogUtils.DEBUG("script resolved ... ");
} catch (NoSuchMethodException e) {
String className = metaData.getLanguageName().substring(0,
metaData.getLanguageName().lastIndexOf('.'));
LogUtils.DEBUG("About to load Class " + className + " starting... ");
long start = new java.util.Date().getTime();
Class<?> c = scriptLoader.loadClass(className);
long end = new java.util.Date().getTime();
LogUtils.DEBUG("loadClass took: " + (end - start) + "milliseconds");
try {
LogUtils.DEBUG("class loaded ... ");
script = m_resolutionPolicy.getProxy(scriptDesc, c);
LogUtils.DEBUG("script resolved ... ");
} catch (NoSuchMethodException e) {
// Framework error
ScriptFrameworkErrorException e2 = new ScriptFrameworkErrorException(
e.toString(), null, metaData.getLanguageName(),
metaData.getLanguage(), ScriptFrameworkErrorType.NO_SUCH_SCRIPT);
e2.initCause(e);
throw e2;
}
} catch (ClassNotFoundException e) {
// Framework error
ScriptFrameworkErrorException e2 = new ScriptFrameworkErrorException(
e.toString(), null, metaData.getLanguageName(),
@@ -239,11 +248,11 @@ class ScriptImpl implements XScript {
e2.initCause(e);
throw e2;
}
} catch (ClassNotFoundException e) {
} catch (IOException e) {
// Framework error
ScriptFrameworkErrorException e2 = new ScriptFrameworkErrorException(
e.toString(), null, metaData.getLanguageName(),
metaData.getLanguage(), ScriptFrameworkErrorType.NO_SUCH_SCRIPT);
e.toString(), null, metaData.getLanguageName(), metaData.getLanguage(),
ScriptFrameworkErrorType.NO_SUCH_SCRIPT);
e2.initCause(e);
throw e2;
}