You are viewing a plain text version of this content. The canonical link for it is here.
Posted to xbean-scm@geronimo.apache.org by ga...@apache.org on 2011/06/08 07:59:12 UTC
svn commit: r1133254 - in
/geronimo/xbean/trunk/xbean-bundleutils/src/main/java/org/apache/xbean/osgi/bundle/util:
BundleUtils.java DelegatingBundle.java
Author: gawor
Date: Wed Jun 8 05:59:12 2011
New Revision: 1133254
URL: http://svn.apache.org/viewvc?rev=1133254&view=rev
Log:
XBEAN-177: No need to delegate classloading if a wire is established
Modified:
geronimo/xbean/trunk/xbean-bundleutils/src/main/java/org/apache/xbean/osgi/bundle/util/BundleUtils.java
geronimo/xbean/trunk/xbean-bundleutils/src/main/java/org/apache/xbean/osgi/bundle/util/DelegatingBundle.java
Modified: geronimo/xbean/trunk/xbean-bundleutils/src/main/java/org/apache/xbean/osgi/bundle/util/BundleUtils.java
URL: http://svn.apache.org/viewvc/geronimo/xbean/trunk/xbean-bundleutils/src/main/java/org/apache/xbean/osgi/bundle/util/BundleUtils.java?rev=1133254&r1=1133253&r2=1133254&view=diff
==============================================================================
--- geronimo/xbean/trunk/xbean-bundleutils/src/main/java/org/apache/xbean/osgi/bundle/util/BundleUtils.java (original)
+++ geronimo/xbean/trunk/xbean-bundleutils/src/main/java/org/apache/xbean/osgi/bundle/util/BundleUtils.java Wed Jun 8 05:59:12 2011
@@ -238,7 +238,7 @@ public class BundleUtils {
return wiredBundles;
}
- private static Bundle getWiredBundle(Bundle bundle, ExportedPackage[] exports) {
+ static Bundle getWiredBundle(Bundle bundle, ExportedPackage[] exports) {
if (exports != null) {
for (ExportedPackage exportedPackage : exports) {
Bundle[] importingBundles = exportedPackage.getImportingBundles();
Modified: geronimo/xbean/trunk/xbean-bundleutils/src/main/java/org/apache/xbean/osgi/bundle/util/DelegatingBundle.java
URL: http://svn.apache.org/viewvc/geronimo/xbean/trunk/xbean-bundleutils/src/main/java/org/apache/xbean/osgi/bundle/util/DelegatingBundle.java?rev=1133254&r1=1133253&r2=1133254&view=diff
==============================================================================
--- geronimo/xbean/trunk/xbean-bundleutils/src/main/java/org/apache/xbean/osgi/bundle/util/DelegatingBundle.java (original)
+++ geronimo/xbean/trunk/xbean-bundleutils/src/main/java/org/apache/xbean/osgi/bundle/util/DelegatingBundle.java Wed Jun 8 05:59:12 2011
@@ -35,6 +35,8 @@ import org.osgi.framework.BundleContext;
import org.osgi.framework.BundleException;
import org.osgi.framework.ServiceReference;
import org.osgi.framework.Version;
+import org.osgi.service.packageadmin.ExportedPackage;
+import org.osgi.service.packageadmin.PackageAdmin;
/**
* Bundle that delegates ClassLoader operations to a collection of {@link Bundle} objects.
@@ -66,12 +68,40 @@ public class DelegatingBundle implements
try {
return bundle.loadClass(name);
} catch (ClassNotFoundException ex) {
- // ignore
+ int index = name.lastIndexOf('.');
+ if (index > 0) {
+ /*
+ * We got CNFE and if we are wired to a bundle that exports the
+ * given package then there is no hope of loading the class.
+ */
+ String packageName = name.substring(0, index);
+ if (isWired(bundle, packageName)) {
+ throw ex;
+ } else {
+ // ignore - try to load with next bundle
+ }
+ } else {
+ // no package name
+ throw ex;
+ }
}
}
throw new ClassNotFoundException(name);
}
+ private boolean isWired(Bundle importingBundle, String packageName) {
+ BundleContext context = bundle.getBundleContext();
+ ServiceReference reference = context.getServiceReference(PackageAdmin.class.getName());
+ PackageAdmin packageAdmin = (PackageAdmin) context.getService(reference);
+ try {
+ ExportedPackage[] packages = packageAdmin.getExportedPackages(packageName);
+ Bundle exportingBundle = BundleUtils.getWiredBundle(importingBundle, packages);
+ return (exportingBundle != null);
+ } finally {
+ context.ungetService(reference);
+ }
+ }
+
public URL getResource(String name) {
URL resource = null;
for (Bundle bundle : bundles) {