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:
@@ -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>() {
|
||||
|
||||
+53
-44
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user