Try to improve class loading error diagnostic messages.


git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@885967 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/framework/src/main/java/org/apache/felix/framework/ModuleImpl.java b/framework/src/main/java/org/apache/felix/framework/ModuleImpl.java
index e602603..2355fbe 100644
--- a/framework/src/main/java/org/apache/felix/framework/ModuleImpl.java
+++ b/framework/src/main/java/org/apache/felix/framework/ModuleImpl.java
@@ -2003,8 +2003,8 @@
             return null;
         }
 
-        // First, get the bundle ID of the module doing the class loader.
-        long impId = module.getBundle().getBundleId();
+        // First, get the bundle string of the module doing the class loader.
+        String importer = module.getBundle().toString();
 
         // Next, check to see if the module imports the package.
         IWire[] wires = module.getWires();
@@ -2013,22 +2013,22 @@
             if (wires[i].getCapability().getNamespace().equals(ICapability.PACKAGE_NAMESPACE) &&
                 wires[i].getCapability().getProperties().get(ICapability.PACKAGE_PROPERTY).equals(pkgName))
             {
-                long expId = wires[i].getExporter().getBundle().getBundleId();
+                String exporter = wires[i].getExporter().getBundle().toString();
 
                 StringBuffer sb = new StringBuffer("*** Package '");
                 sb.append(pkgName);
                 sb.append("' is imported by bundle ");
-                sb.append(impId);
+                sb.append(importer);
                 sb.append(" from bundle ");
-                sb.append(expId);
+                sb.append(exporter);
                 sb.append(", but the exported package from bundle ");
-                sb.append(expId);
+                sb.append(exporter);
                 sb.append(" does not contain the requested class '");
                 sb.append(name);
                 sb.append("'. Please verify that the class name is correct in the importing bundle ");
-                sb.append(impId);
+                sb.append(importer);
                 sb.append(" and/or that the exported package is correctly bundled in ");
-                sb.append(expId);
+                sb.append(exporter);
                 sb.append(". ***");
 
                 return sb.toString();
@@ -2097,73 +2097,63 @@
         }
 */
         // Next, check to see if the package is dynamically imported by the module.
-/* TODO: RESOLVER: Need to fix this too.
-        IRequirement[] dynamics = module.getDefinition().getDynamicRequirements();
-        for (int dynIdx = 0; dynIdx < dynamics.length; dynIdx++)
+        IRequirement pkgReq = Resolver.findAllowedDynamicImport(module, pkgName);
+        if (pkgReq != null)
         {
-            IRequirement target = createDynamicRequirement(dynamics[dynIdx], pkgName);
-            if (target != null)
+            // Try to see if there is an exporter available.
+            List exports =
+                resolver.getResolvedCandidates(pkgReq);
+            exports = (exports.size() == 0)
+                ? resolver.getUnresolvedCandidates(pkgReq)
+                : exports;
+
+            // An exporter might be available, but it may have attributes
+            // that do not match the importer's required attributes, so
+            // check that case by simply looking for an exporter of the
+            // desired package without any attributes.
+            if (exports.size() == 0)
             {
-                // Try to see if there is an exporter available.
-                PackageSource[] exporters = getResolvedCandidates(target);
-                exporters = (exporters.length == 0)
-                    ? getUnresolvedCandidates(target) : exporters;
-
-                // An exporter might be available, but it may have attributes
-                // that do not match the importer's required attributes, so
-                // check that case by simply looking for an exporter of the
-                // desired package without any attributes.
-                if (exporters.length == 0)
+                try
                 {
-                    try
-                    {
-                        IRequirement pkgReq = new Requirement(
-                            ICapability.PACKAGE_NAMESPACE, "(package=" + pkgName + ")");
-                        exporters = getResolvedCandidates(pkgReq);
-                        exporters = (exporters.length == 0)
-                            ? getUnresolvedCandidates(pkgReq) : exporters;
-                    }
-                    catch (InvalidSyntaxException ex)
-                    {
-                        // This should never happen.
-                    }
+                    IRequirement req = new Requirement(
+                        ICapability.PACKAGE_NAMESPACE, "(package=" + pkgName + ")");
+                    exports = resolver.getResolvedCandidates(req);
+                    exports = (exports.size() == 0)
+                        ? resolver.getUnresolvedCandidates(req)
+                        : exports;
                 }
-
-                long expId = (exporters.length == 0)
-                    ? -1 : Util.getBundleIdFromModuleId(exporters[0].m_module.getId());
-
-                StringBuffer sb = new StringBuffer("*** Class '");
-                sb.append(name);
-                sb.append("' was not found, but this is likely normal since package '");
-                sb.append(pkgName);
-                sb.append("' is dynamically imported by bundle ");
-                sb.append(impId);
-                sb.append(".");
-                if (exporters.length > 0)
+                catch (InvalidSyntaxException ex)
                 {
-                    try
-                    {
-                        if (!target.isSatisfied(
-                            Util.getSatisfyingCapability(exporters[0].m_module,
-                                new Requirement(ICapability.PACKAGE_NAMESPACE, "(package=" + pkgName + ")"))))
-                        {
-                            sb.append(" However, bundle ");
-                            sb.append(expId);
-                            sb.append(" does export this package with attributes that do not match.");
-                        }
-                    }
-                    catch (InvalidSyntaxException ex)
-                    {
-                        // This should never happen.
-                    }
+                    // This should never happen.
                 }
-                sb.append(" ***");
-
-                return sb.toString();
             }
+
+            String exporter = (exports.size() == 0)
+                ? null : ((ICapability) exports.get(0)).getModule().getBundle().toString();
+
+            StringBuffer sb = new StringBuffer("*** Class '");
+            sb.append(name);
+            sb.append("' was not found, but this is likely normal since package '");
+            sb.append(pkgName);
+            sb.append("' is dynamically imported by bundle ");
+            sb.append(importer);
+            sb.append(".");
+            if (exports.size() > 0)
+            {
+                if (!pkgReq.isSatisfied((ICapability) exports.get(0)))
+                {
+                    sb.append(" However, bundle ");
+                    sb.append(exporter);
+                    sb.append(" does export this package with attributes that do not match.");
+                }
+            }
+            sb.append(" ***");
+
+            return sb.toString();
         }
-*/
-        IRequirement pkgReq = null;
+
+        // Next, check to see if there are any exporters for the package at all.
+        pkgReq = null;
         try
         {
             pkgReq = new Requirement(ICapability.PACKAGE_NAMESPACE, "(package=" + pkgName + ")");
@@ -2194,23 +2184,23 @@
                 // Ignore
             }
 
-            long expId = ((ICapability) exports.get(0)).getModule().getBundle().getBundleId();
+            String exporter = ((ICapability) exports.get(0)).getModule().getBundle().toString();
 
             StringBuffer sb = new StringBuffer("*** Class '");
             sb.append(name);
             sb.append("' was not found because bundle ");
-            sb.append(impId);
+            sb.append(importer);
             sb.append(" does not import '");
             sb.append(pkgName);
             sb.append("' even though bundle ");
-            sb.append(expId);
+            sb.append(exporter);
             sb.append(" does export it.");
             if (classpath)
             {
                 sb.append(" Additionally, the class is also available from the system class loader. There are two fixes: 1) Add an import for '");
                 sb.append(pkgName);
                 sb.append("' to bundle ");
-                sb.append(impId);
+                sb.append(importer);
                 sb.append("; imports are necessary for each class directly touched by bundle code or indirectly touched, such as super classes if their methods are used. ");
                 sb.append("2) Add package '");
                 sb.append(pkgName);
@@ -2223,7 +2213,7 @@
                 sb.append(" To resolve this issue, add an import for '");
                 sb.append(pkgName);
                 sb.append("' to bundle ");
-                sb.append(impId);
+                sb.append(importer);
                 sb.append(".");
             }
             sb.append(" ***");
@@ -2240,7 +2230,7 @@
             StringBuffer sb = new StringBuffer("*** Package '");
             sb.append(pkgName);
             sb.append("' is not imported by bundle ");
-            sb.append(impId);
+            sb.append(importer);
             sb.append(", nor is there any bundle that exports package '");
             sb.append(pkgName);
             sb.append("'. However, the class '");
@@ -2250,7 +2240,7 @@
             sb.append("' to the '");
             sb.append(Constants.FRAMEWORK_SYSTEMPACKAGES_EXTRA);
             sb.append("' property and modify bundle ");
-            sb.append(impId);
+            sb.append(importer);
             sb.append(" to import this package; this causes the system bundle to export class path packages. 2) Add package '");
             sb.append(pkgName);
             sb.append("' to the '");
@@ -2270,7 +2260,7 @@
         StringBuffer sb = new StringBuffer("*** Class '");
         sb.append(name);
         sb.append("' was not found. Bundle ");
-        sb.append(impId);
+        sb.append(importer);
         sb.append(" does not import package '");
         sb.append(pkgName);
         sb.append("', nor is the package exported by any other bundle or available from the system class loader.");