diff options
author | John Ross | 2013-05-29 17:10:24 +0000 |
---|---|---|
committer | John Ross | 2013-05-29 17:10:24 +0000 |
commit | be05c94424e00a3170d61f22e51de7d6d55e923c (patch) | |
tree | 0bb4eda55e53832ae85e5849285fea6f7cbacddc | |
parent | 726404ea68b0a8c078e4c654b269e7d1aadf3823 (diff) | |
download | rt.equinox.framework-be05c94424e00a3170d61f22e51de7d6d55e923c.tar.gz rt.equinox.framework-be05c94424e00a3170d61f22e51de7d6d55e923c.tar.xz rt.equinox.framework-be05c94424e00a3170d61f22e51de7d6d55e923c.zip |
Bug 409314 - Wrong ClassLoader.getResources with IBM JDKsR4_3I20130605-2000I20130604-2000I20130603-2000I20130602-2000I20130601-1500I20130531-2000I20130530-1430I20130529-2000
Revert "Bug 375783 - DefaultClassLoader.getResources() ALWAYS delegates to parent Classloader"
This reverts commit 0d5c40d55fff4174d33ec45c039837dcafa934a1.
3 files changed, 49 insertions, 56 deletions
diff --git a/bundles/org.eclipse.osgi/core/framework/org/eclipse/osgi/framework/internal/core/BundleHost.java b/bundles/org.eclipse.osgi/core/framework/org/eclipse/osgi/framework/internal/core/BundleHost.java index 312e1d069..cfc55b0a3 100644 --- a/bundles/org.eclipse.osgi/core/framework/org/eclipse/osgi/framework/internal/core/BundleHost.java +++ b/bundles/org.eclipse.osgi/core/framework/org/eclipse/osgi/framework/internal/core/BundleHost.java @@ -287,7 +287,7 @@ public class BundleHost extends AbstractBundle { if (loader == null) result = bundledata.findLocalResources(name); else - result = loader.findResources(name); + result = loader.getResources(name); if (result != null && result.hasMoreElements()) return result; return null; diff --git a/bundles/org.eclipse.osgi/core/framework/org/eclipse/osgi/internal/loader/BundleLoader.java b/bundles/org.eclipse.osgi/core/framework/org/eclipse/osgi/internal/loader/BundleLoader.java index 2d377dd50..15359c76d 100644 --- a/bundles/org.eclipse.osgi/core/framework/org/eclipse/osgi/internal/loader/BundleLoader.java +++ b/bundles/org.eclipse.osgi/core/framework/org/eclipse/osgi/internal/loader/BundleLoader.java @@ -574,6 +574,10 @@ public class BundleLoader implements ClassLoaderDelegate { * Finds the resource for a bundle. This method is used for delegation by the bundle's classloader. */ public URL findResource(String name) { + return findResource(name, true); + } + + URL findResource(String name, boolean checkParent) { if ((name.length() > 1) && (name.charAt(0) == '/')) /* if name has a leading slash */ name = name.substring(1); /* remove leading slash before search */ String pkgName = getResourcePackageName(name); @@ -581,7 +585,7 @@ public class BundleLoader implements ClassLoaderDelegate { ClassLoader parentCL = getParentClassLoader(); // follow the OSGi delegation model // First check the parent classloader for system resources, if it is a java resource. - if (parentCL != null) { + if (checkParent && parentCL != null) { if (pkgName.startsWith(JAVA_PACKAGE)) // 1) if startsWith "java." delegate to parent and terminate search // we never delegate java resource requests past the parent @@ -641,9 +645,9 @@ public class BundleLoader implements ClassLoaderDelegate { result = policy.doBuddyResourceLoading(name); if (result != null) return result; - // hack to support backwards compatibility for bootdelegation + // hack to support backwards compatibiility for bootdelegation // or last resort; do class context trick to work around VM bugs - if (parentCL != null && !bootDelegation && (bundle.getFramework().compatibiltyBootDelegation || isRequestFromVM())) + if (parentCL != null && !bootDelegation && ((checkParent && bundle.getFramework().compatibiltyBootDelegation) || isRequestFromVM())) // we don't need to continue if the resource is not found here return parentCL.getResource(name); return result; @@ -657,58 +661,41 @@ public class BundleLoader implements ClassLoaderDelegate { if ((name.length() > 1) && (name.charAt(0) == '/')) /* if name has a leading slash */ name = name.substring(1); /* remove leading slash before search */ String pkgName = getResourcePackageName(name); - Enumeration<URL> result = Collections.enumeration(Collections.<URL> emptyList()); - boolean bootDelegation = false; - ClassLoader parentCL = getParentClassLoader(); - // follow the OSGi delegation model - // First check the parent classloader for system resources, if it is a java resource. - if (parentCL != null) { - if (pkgName.startsWith(JAVA_PACKAGE)) - // 1) if startsWith "java." delegate to parent and terminate search - // we never delegate java resource requests past the parent - return parentCL.getResources(name); - else if (bundle.getFramework().isBootDelegationPackage(pkgName)) { - // 2) if part of the bootdelegation list then delegate to parent and continue - result = compoundEnumerations(result, parentCL.getResources(name)); - bootDelegation = true; - } - } + Enumeration<URL> result = null; try { - Enumeration<URL> hookResources = searchHooks(name, PRE_RESOURCES); - if (hookResources != null) { - return compoundEnumerations(result, hookResources); - } + result = searchHooks(name, PRE_RESOURCES); } catch (ClassNotFoundException e) { // will not happen } catch (FileNotFoundException e) { - return result; + return null; } - + if (result != null) + return result; + // start at step 3 because of the comment above about ClassLoader#getResources // 3) search the imported packages PackageSource source = findImportedSource(pkgName, null); if (source != null) // 3) found import source terminate search at the source - return compoundEnumerations(result, source.getResources(name)); + return source.getResources(name); // 4) search the required bundles source = findRequiredSource(pkgName, null); if (source != null) // 4) attempt to load from source but continue on failure - result = compoundEnumerations(result, source.getResources(name)); + result = source.getResources(name); // 5) search the local bundle // compound the required source results with the local ones Enumeration<URL> localResults = findLocalResources(name); result = compoundEnumerations(result, localResults); // 6) attempt to find a dynamic import source; only do this if a required source was not found - if (source == null && !result.hasMoreElements()) { + if (result == null && source == null) { source = findDynamicSource(pkgName); if (source != null) - return compoundEnumerations(result, source.getResources(name)); + return source.getResources(name); } - if (!result.hasMoreElements()) + if (result == null) try { - Enumeration<URL> hookResources = searchHooks(name, POST_RESOURCES); - result = compoundEnumerations(result, hookResources); + result = searchHooks(name, POST_RESOURCES); } catch (ClassNotFoundException e) { // will not happen } catch (FileNotFoundException e) { @@ -718,13 +705,6 @@ public class BundleLoader implements ClassLoaderDelegate { Enumeration<URL> buddyResult = policy.doBuddyResourcesLoading(name); result = compoundEnumerations(result, buddyResult); } - // hack to support backwards compatibility for bootdelegation - // or last resort; do class context trick to work around VM bugs - if (!result.hasMoreElements()) { - if (parentCL != null && !bootDelegation && (bundle.getFramework().compatibiltyBootDelegation || isRequestFromVM())) - // we don't need to continue if the resource is not found here - return parentCL.getResources(name); - } return result; } @@ -794,6 +774,27 @@ public class BundleLoader implements ClassLoaderDelegate { return result; } + /* + * This method is used by Bundle.getResources to do proper parent delegation. + */ + public Enumeration<URL> getResources(String name) throws IOException { + if ((name.length() > 1) && (name.charAt(0) == '/')) /* if name has a leading slash */ + name = name.substring(1); /* remove leading slash before search */ + String pkgName = getResourcePackageName(name); + // follow the OSGi delegation model + // First check the parent classloader for system resources, if it is a java resource. + Enumeration<URL> result = null; + if (pkgName.startsWith(JAVA_PACKAGE) || bundle.getFramework().isBootDelegationPackage(pkgName)) { + // 1) if startsWith "java." delegate to parent and terminate search + // 2) if part of the bootdelegation list then delegate to parent and continue of failure + ClassLoader parentCL = getParentClassLoader(); + result = parentCL == null ? null : parentCL.getResources(name); + if (pkgName.startsWith(JAVA_PACKAGE)) + return result; + } + return compoundEnumerations(result, findResources(name)); + } + public static <E> Enumeration<E> compoundEnumerations(Enumeration<E> list1, Enumeration<E> list2) { if (list2 == null || !list2.hasMoreElements()) return list1; diff --git a/bundles/org.eclipse.osgi/defaultAdaptor/src/org/eclipse/osgi/internal/baseadaptor/DefaultClassLoader.java b/bundles/org.eclipse.osgi/defaultAdaptor/src/org/eclipse/osgi/internal/baseadaptor/DefaultClassLoader.java index 7e2e4f848..6d252fd95 100644 --- a/bundles/org.eclipse.osgi/defaultAdaptor/src/org/eclipse/osgi/internal/baseadaptor/DefaultClassLoader.java +++ b/bundles/org.eclipse.osgi/defaultAdaptor/src/org/eclipse/osgi/internal/baseadaptor/DefaultClassLoader.java @@ -152,24 +152,16 @@ public class DefaultClassLoader extends ClassLoader implements ParallelClassLoad } /** - * Gets resources for the bundle. First delegate.findResources(name) is - * called. The delegate will query the system class loader, bundle imports, - * bundle local resources, bundle hosts and fragments. The delegate will - * call BundleClassLoader.findLocalResources(name) to find a resource local - * to this bundle. - * @param name The resource path to get. - * @return The Enumeration of the resource URLs. + * Finds all resources with the specified name. This method must call + * delegate.findResources(name) to find all the resources. + * @param name The resource path to find. + * @return An Enumeration of all resources found or null if the resource. + * @throws IOException */ - public Enumeration<URL> getResources(String name) throws IOException { - if (Debug.DEBUG_LOADER) { - Debug.println("BundleClassLoader[" + delegate + "].getResources(" + name + ")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - } + protected Enumeration<URL> findResources(String name) throws IOException { Enumeration<URL> result = delegate.findResources(name); - if (Debug.DEBUG_LOADER) { - if (result == null || !result.hasMoreElements()) { - Debug.println("BundleClassLoader[" + delegate + "].getResources(" + name + ") failed."); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - } - } + if (result == null) + return EMPTY_ENUMERATION; return result; } |