diff --git a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/internal/serverfactory/ServerInstanceWrapper.java b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/internal/serverfactory/ServerInstanceWrapper.java index 0ca0f7eae90..9e126ec4d67 100644 --- a/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/internal/serverfactory/ServerInstanceWrapper.java +++ b/jetty-osgi/jetty-osgi-boot/src/main/java/org/eclipse/jetty/osgi/boot/internal/serverfactory/ServerInstanceWrapper.java @@ -18,7 +18,7 @@ package org.eclipse.jetty.osgi.boot.internal.serverfactory; -import java.io.File; +import java.io.InputStream; import java.net.URL; import java.util.ArrayList; import java.util.Collection; @@ -51,9 +51,9 @@ import org.eclipse.jetty.osgi.boot.utils.TldBundleDiscoverer; import org.eclipse.jetty.osgi.boot.utils.Util; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.handler.ContextHandlerCollection; +import org.eclipse.jetty.util.StringUtil; import org.eclipse.jetty.util.log.Log; import org.eclipse.jetty.util.log.Logger; -import org.eclipse.jetty.util.resource.Resource; import org.eclipse.jetty.xml.XmlConfiguration; /** @@ -142,16 +142,10 @@ public class ServerInstanceWrapper for (URL jettyConfiguration : jettyConfigurations) { - try(Resource r = Resource.newResource(jettyConfiguration)) + try(InputStream in = jettyConfiguration.openStream()) { // Execute a Jetty configuration file - if (!r.exists()) - { - LOG.warn("File does not exist "+r); - throw new IllegalStateException("No such jetty server config file: "+r); - } - - XmlConfiguration config = new XmlConfiguration(r.getURI().toURL()); + XmlConfiguration config = new XmlConfiguration(in); config.getIdMap().putAll(id_map); config.getProperties().putAll(properties); @@ -247,13 +241,11 @@ public class ServerInstanceWrapper ClassLoader contextCl = Thread.currentThread().getContextClassLoader(); try { + List sharedURLs = getManagedJettySharedLibFolderUrls(props); + // passing this bundle's classloader as the context classloader // makes sure there is access to all the jetty's bundles - ClassLoader libExtClassLoader = null; - String sharedURLs = (String) props.get(OSGiServerConstants.MANAGED_JETTY_SHARED_LIB_FOLDER_URLS); - - List shared = sharedURLs != null ? extractFiles(sharedURLs) : null; - libExtClassLoader = LibExtClassLoaderHelper.createLibExtClassLoader(shared, null,JettyBootstrapActivator.class.getClassLoader()); + ClassLoader libExtClassLoader = LibExtClassLoaderHelper.createLibExtClassLoader(null, sharedURLs, JettyBootstrapActivator.class.getClassLoader()); if (LOG.isDebugEnabled()) LOG.debug("LibExtClassLoader = "+libExtClassLoader); @@ -313,7 +305,7 @@ public class ServerInstanceWrapper Thread.currentThread().setContextClassLoader(contextCl); } } - + /* ------------------------------------------------------------ */ public void stop() { @@ -431,20 +423,26 @@ public class ServerInstanceWrapper } } } - - - - - /* ------------------------------------------------------------ */ + /** - * Get the folders that might contain jars for the legacy J2EE shared - * libraries + * Get the Jetty Shared Lib Folder URLs in a form that is suitable for + * {@link LibExtClassLoaderHelper} to use. + * + * @param props the properties to look for the configuration in + * @return the list of URLs found, or null if none found */ - private List extractFiles(String propertyValue) + private List getManagedJettySharedLibFolderUrls(Dictionary props) { - StringTokenizer tokenizer = new StringTokenizer(propertyValue, ",;", false); - List files = new ArrayList<>(); + String sharedURLs = (String) props.get(OSGiServerConstants.MANAGED_JETTY_SHARED_LIB_FOLDER_URLS); + if (StringUtil.isBlank(sharedURLs)) + { + return null; + } + + List libURLs = new ArrayList<>(); + + StringTokenizer tokenizer = new StringTokenizer(sharedURLs, ",;", false); while (tokenizer.hasMoreTokens()) { String tok = tokenizer.nextToken(); @@ -454,12 +452,12 @@ public class ServerInstanceWrapper url = BundleFileLocatorHelperFactory.getFactory().getHelper().getFileURL(url); if (url.getProtocol().equals("file")) { - Resource res = Resource.newResource(url); - File folder = res.getFile(); - if (folder != null) - { - files.add(folder); - } + libURLs.add(new URL("jar:" + url.toExternalForm() + "!/")); + } + else + { + if (LOG.isDebugEnabled()) + LOG.debug("Unrecognized Jetty Shared Lib URL: " + url); } } catch (Throwable mfe) @@ -467,7 +465,6 @@ public class ServerInstanceWrapper LOG.warn(mfe); } } - return files; + return libURLs; } - } diff --git a/jetty-util/src/test/java/org/eclipse/jetty/util/resource/FileSystemResourceTest.java b/jetty-util/src/test/java/org/eclipse/jetty/util/resource/FileSystemResourceTest.java index c48da4aba06..d208a6815ad 100644 --- a/jetty-util/src/test/java/org/eclipse/jetty/util/resource/FileSystemResourceTest.java +++ b/jetty-util/src/test/java/org/eclipse/jetty/util/resource/FileSystemResourceTest.java @@ -91,6 +91,29 @@ public class FileSystemResourceTest { _class=test; } + + public Resource newResource(URL url) throws Exception + { + try + { + return _class.getConstructor(URL.class).newInstance(url); + } + catch(InvocationTargetException e) + { + try + { + throw e.getTargetException(); + } + catch(Exception|Error ex) + { + throw ex; + } + catch(Throwable th) + { + throw new Error(th); + } + } + } public Resource newResource(URI uri) throws Exception { @@ -226,6 +249,31 @@ public class FileSystemResourceTest assumeFalse("Unknown OS type",false); } } + + @Test + public void testNewResource_WithSpace() throws Exception + { + Path dir = testdir.getPath().normalize().toRealPath(); + + Path baseDir = dir.resolve("base with spaces"); + FS.ensureDirExists(baseDir.toFile()); + + Path subdir = baseDir.resolve("sub"); + FS.ensureDirExists(subdir.toFile()); + + URL baseUrl = baseDir.toUri().toURL(); + + assertThat("url.protocol", baseUrl.getProtocol(), is("file")); + + try (Resource base = newResource(baseUrl)) + { + Resource sub = base.addPath("sub"); + assertThat("sub/.isDirectory",sub.isDirectory(),is(true)); + + Resource tmp = sub.addPath("/tmp"); + assertThat("No root",tmp.exists(),is(false)); + } + } @Test public void testAddPath() throws Exception diff --git a/jetty-util/src/test/java/org/eclipse/jetty/util/resource/ResourceTest.java b/jetty-util/src/test/java/org/eclipse/jetty/util/resource/ResourceTest.java index 56b4f3668da..e4845db9ccb 100644 --- a/jetty-util/src/test/java/org/eclipse/jetty/util/resource/ResourceTest.java +++ b/jetty-util/src/test/java/org/eclipse/jetty/util/resource/ResourceTest.java @@ -28,6 +28,7 @@ import java.io.File; import java.io.InputStream; import java.net.URI; import java.net.URL; +import java.nio.file.Path; import java.util.ArrayList; import java.util.Collection; @@ -193,8 +194,9 @@ public class ResourceTest public static Collection data() throws Exception { UseCases cases = new UseCases("src/test/resources/"); - - File testDir = MavenTestingUtils.getTargetTestingDir(ResourceTest.class.getName()); + + Path targetPath = MavenTestingUtils.getTargetPath(); + File testDir = targetPath.resolve("ResourceTest with spaces").toFile(); FS.ensureEmpty(testDir); File tmpFile = new File(testDir, "test.tmp"); FS.touch(tmpFile);