Kaydet (Commit) dd6c4f4d authored tarafından Stephan Bergmann's avatar Stephan Bergmann

fdo#46102: Load Java scripts with class loaders that actually find them

ScriptMetaData.createURL produces weird URLs (ending in "/ucb/", and potentially
still containing vnd.sun.star.expand: prefix) that are apparently good for
loading documents for editing via UCBStreamHandler, but cannot meaningfully be
passed to a URLClassLoader.

It is unclear to me how the Java script provider shall ever have found the
script jars in the past.
üst a09d5511
......@@ -50,7 +50,14 @@ import com.sun.star.script.framework.io.UCBStreamHandler;
import com.sun.star.ucb.XSimpleFileAccess2;
import com.sun.star.uno.AnyConverter;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.uno.XComponentContext;
import com.sun.star.uri.UriReferenceFactory;
import com.sun.star.uri.XVndSunStarExpandUrl;
import com.sun.star.util.XMacroExpander;
public class ScriptMetaData extends ScriptEntry implements Cloneable {
private boolean hasSource = false;
......@@ -246,7 +253,8 @@ public class ScriptMetaData extends ScriptEntry implements Cloneable {
return "\nParcelLocation = " + getParcelLocation() + "\nLocationPlaceHolder = " + locationPlaceHolder + super.toString();
}
public URL[] getClassPath() throws java.net.MalformedURLException
public URL[] getClassPath(XComponentContext context)
throws java.net.MalformedURLException
{
try
{
......@@ -274,7 +282,7 @@ public class ScriptMetaData extends ScriptEntry implements Cloneable {
{
String relativeClasspath = (String)stk.nextElement();
String pathToProcess = PathUtils.make_url( parcelPath, relativeClasspath);
URL url = createURL( pathToProcess );
URL url = expandURL( context, pathToProcess );
if ( url != null )
{
classPathVec.add ( url );
......@@ -283,7 +291,7 @@ public class ScriptMetaData extends ScriptEntry implements Cloneable {
}
if ( classPathVec.size() == 0)
{
URL url = createURL( parcelPath );
URL url = expandURL( context, parcelPath );
if ( url != null )
{
classPathVec.add(url);
......@@ -300,6 +308,38 @@ public class ScriptMetaData extends ScriptEntry implements Cloneable {
}
}
private URL expandURL(XComponentContext context, String url)
throws java.net.MalformedURLException
{
XVndSunStarExpandUrl exp = UnoRuntime.queryInterface(
XVndSunStarExpandUrl.class,
UriReferenceFactory.create(context).parse(url));
String expurl;
if (exp == null) {
expurl = url;
} else {
XMacroExpander expander;
try {
expander = (XMacroExpander) AnyConverter.toObject(
XMacroExpander.class,
context.getValueByName(
"/singletons/com.sun.star.util.theMacroExpander"));
} catch (com.sun.star.lang.IllegalArgumentException e) {
throw new RuntimeException(e);
}
try {
expurl = exp.expand(expander);
} catch (com.sun.star.lang.IllegalArgumentException e) {
java.net.MalformedURLException e2 =
new java.net.MalformedURLException(e.toString());
e2.initCause(e);
throw e2;
}
}
return new URL(expurl);
}
private URL createURL( String path ) throws java.net.MalformedURLException
{
URL url = null;
......
......@@ -31,6 +31,7 @@ import java.net.*;
import com.sun.star.script.framework.log.LogUtils;
import com.sun.star.script.framework.container.ScriptMetaData;
import com.sun.star.uno.XComponentContext;
/**
* Class Loader Factory
......@@ -42,11 +43,12 @@ public class ClassLoaderFactory
{
private ClassLoaderFactory() {}
public static ClassLoader getURLClassLoader( ScriptMetaData scriptData )
public static ClassLoader getURLClassLoader(
XComponentContext context, ScriptMetaData scriptData )
throws NoSuitableClassLoaderException, MalformedURLException
{
ClassLoader parent = scriptData.getClass().getClassLoader();
URL[] classPath = scriptData.getClassPath();
URL[] classPath = scriptData.getClassPath(context);
LogUtils.DEBUG("Classpath has length " + classPath.length );
for ( int i=0; i < classPath.length; i++ )
{
......
......@@ -202,7 +202,8 @@ public class ScriptEditorForBeanShell
try {
ClassLoader cl = null;
try {
cl = ClassLoaderFactory.getURLClassLoader( entry );
cl = ClassLoaderFactory.getURLClassLoader(
context.getComponentContext(), entry );
}
catch (Exception ignore) // TODO re-examine error handling
{
......
......@@ -196,7 +196,8 @@ class ScriptImpl implements XScript
ClassLoader cl = null;
URL sourceUrl = null;
try {
cl = ClassLoaderFactory.getURLClassLoader( metaData );
cl = ClassLoaderFactory.getURLClassLoader(
m_xContext, metaData );
sourceUrl = metaData.getSourceURL();
}
catch ( java.net.MalformedURLException mfu )
......
......@@ -205,7 +205,7 @@ class ScriptImpl implements XScript
try {
LogUtils.DEBUG( "Classloader starting..." );
scriptLoader = ClassLoaderFactory.getURLClassLoader(
metaData );
m_xContext, metaData );
LogUtils.DEBUG( "Classloader finished..." );
}
catch (MalformedURLException mfe )
......
......@@ -195,7 +195,8 @@ class ScriptImpl implements XScript
ClassLoader cl = null;
URL sourceUrl = null;
try {
cl = ClassLoaderFactory.getURLClassLoader( metaData );
cl = ClassLoaderFactory.getURLClassLoader(
m_xContext, metaData );
sourceUrl = metaData.getSourceURL();
}
catch ( java.net.MalformedURLException mfu )
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment