diff --git a/bundles/org.eclipse.equinox.common.tests/src/org/eclipse/core/runtime/tests/FileLocatorTest.java b/bundles/org.eclipse.equinox.common.tests/src/org/eclipse/core/runtime/tests/FileLocatorTest.java index c585836e0db..d0f3830710e 100644 --- a/bundles/org.eclipse.equinox.common.tests/src/org/eclipse/core/runtime/tests/FileLocatorTest.java +++ b/bundles/org.eclipse.equinox.common.tests/src/org/eclipse/core/runtime/tests/FileLocatorTest.java @@ -16,6 +16,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; import java.io.File; @@ -103,8 +104,9 @@ public void testFileLocatorGetBundleFile01() throws BundleException, IOException Bundle bundle = context.installBundle("reference:" + FileLocator.toFileURL(url).toExternalForm()); BundleTestingHelper.refreshPackages(context, new Bundle[] { bundle }); - File file1 = FileLocator.getBundleFile(bundle); + File file1 = FileLocator.getBundleFileLocation(bundle).get(); assertNotNull(file1); + assertSame(file1, FileLocator.getBundleFile(bundle)); URL fileURL = FileLocator .toFileURL(context.getBundle().getEntry("Plugin_Testing/fileLocator/testFileLocatorGetRootFile")); @@ -123,8 +125,9 @@ public void testFileLocatorGetBundleFile02() throws BundleException, IOException Bundle bundle = context.installBundle("reference:" + FileLocator.toFileURL(url).toExternalForm()); BundleTestingHelper.refreshPackages(context, new Bundle[] { bundle }); - File file1 = FileLocator.getBundleFile(bundle); + File file1 = FileLocator.getBundleFileLocation(bundle).get(); assertNotNull(file1); + assertSame(file1, FileLocator.getBundleFile(bundle)); URL fileURL = FileLocator .toFileURL(context.getBundle().getEntry("Plugin_Testing/fileLocator/testFileLocatorGetRootFile.jar")); diff --git a/bundles/org.eclipse.equinox.common/META-INF/MANIFEST.MF b/bundles/org.eclipse.equinox.common/META-INF/MANIFEST.MF index 0f8c6f81728..41003de49d3 100644 --- a/bundles/org.eclipse.equinox.common/META-INF/MANIFEST.MF +++ b/bundles/org.eclipse.equinox.common/META-INF/MANIFEST.MF @@ -19,18 +19,7 @@ Export-Package: org.eclipse.core.internal.boot;x-friends:="org.eclipse.core.reso org.eclipse.equinox.events;version="1.0.0" Bundle-Vendor: %providerName Bundle-Activator: org.eclipse.core.internal.runtime.Activator -Import-Package: org.eclipse.equinox.log;version="[1.0,2.0)", - org.eclipse.osgi.framework.log;version="[1.1, 2.0)", - org.eclipse.osgi.service.datalocation, - org.eclipse.osgi.service.debug, - org.eclipse.osgi.service.localization, - org.eclipse.osgi.service.urlconversion, - org.eclipse.osgi.util, - org.osgi.framework, - org.osgi.service.log;version="[1.3.0, 2.0)", - org.osgi.service.packageadmin, - org.osgi.service.url, - org.osgi.util.tracker +Require-Bundle: org.eclipse.osgi;bundle-version="[3.17.200,4.0.0)" Bundle-RequiredExecutionEnvironment: JavaSE-11 Bundle-ActivationPolicy: lazy Automatic-Module-Name: org.eclipse.equinox.common diff --git a/bundles/org.eclipse.equinox.common/src/org/eclipse/core/runtime/FileLocator.java b/bundles/org.eclipse.equinox.common/src/org/eclipse/core/runtime/FileLocator.java index 9d7795e786b..bb2cacbd6ae 100644 --- a/bundles/org.eclipse.equinox.common/src/org/eclipse/core/runtime/FileLocator.java +++ b/bundles/org.eclipse.equinox.common/src/org/eclipse/core/runtime/FileLocator.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2006, 2018 IBM Corporation and others. + * Copyright (c) 2006, 2022 IBM Corporation and others. * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 @@ -12,12 +12,14 @@ * IBM Corporation - initial API and implementation * Sergey Prigogin (Google) - use parameterized types (bug 442021) * Lars Vogel - Bug 483464 + * Hannes Wellmann - Bug 577574 - Speed-up and simplify getBundleFile() and add getBundleFileLocation *******************************************************************************/ package org.eclipse.core.runtime; import java.io.*; import java.net.URL; import java.util.Map; +import java.util.Optional; import org.eclipse.core.internal.runtime.Activator; import org.eclipse.core.internal.runtime.FindSupport; import org.eclipse.osgi.service.urlconversion.URLConverter; @@ -284,9 +286,9 @@ public static URL resolve(URL url) throws IOException { } /** - * Returns a file for the contents of the specified bundle. Depending - * on how the bundle is installed the returned file may be a directory or a jar file - * containing the bundle content. + * Returns a file for the contents of the specified bundle. Depending on how the + * bundle is installed the returned file may be a directory or a jar file + * containing the bundle content. * * @param bundle the bundle * @return a file with the contents of the bundle @@ -295,19 +297,26 @@ public static URL resolve(URL url) throws IOException { * @since org.eclipse.equinox.common 3.4 */ public static File getBundleFile(Bundle bundle) throws IOException { - URL rootEntry = bundle.getEntry("/"); //$NON-NLS-1$ - rootEntry = resolve(rootEntry); - if ("file".equals(rootEntry.getProtocol())) //$NON-NLS-1$ - return new File(rootEntry.getPath()); - if ("jar".equals(rootEntry.getProtocol())) { //$NON-NLS-1$ - String path = rootEntry.getPath(); - if (path.startsWith("file:")) { //$NON-NLS-1$ - // strip off the file: and the !/ - path = path.substring(5, path.length() - 2); - return new File(path); - } - } - throw new IOException("Unknown protocol"); //$NON-NLS-1$ + return getBundleFileLocation(bundle) + .orElseThrow(() -> new IOException("Unable to locate the bundle file: " + bundle)); //$NON-NLS-1$ + } + + /** + * Returns an {@code Optional} {@link File}, that (if present) describes the + * bundle's root location on the file system. + *

+ * Depending on how the bundle is installed the returned file may be a directory + * or a jar file containing the bundle content. In case the location cannot be + * determined the returned {@code Optional} is empty, which is for example + * usually the case for {@code CONNECT} bundles. + *

+ * + * @param bundle the bundle + * @return the optional file to the location of the bundle's root + * @since 3.16 + */ + public static Optional getBundleFileLocation(Bundle bundle) { + return Optional.ofNullable(bundle.adapt(File.class)); } } \ No newline at end of file