diff options
author | rfeng <rfeng@13f79535-47bb-0310-9956-ffa450edef68> | 2009-02-06 22:22:48 +0000 |
---|---|---|
committer | rfeng <rfeng@13f79535-47bb-0310-9956-ffa450edef68> | 2009-02-06 22:22:48 +0000 |
commit | d3b1e2da46bc38544b5d0e93d3998c884c6d0684 (patch) | |
tree | babcbf242a994aae4943fbae5a3e63d745dda816 /java/sca | |
parent | 9140002a094c467bde17281ade514183d138b1b8 (diff) |
Improve the error analysis for osgi resolution
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@741759 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'java/sca')
2 files changed, 106 insertions, 25 deletions
diff --git a/java/sca/tools/maven/maven-eclipse-compiler/src/main/java/org/apache/tuscany/sca/tools/maven/compiler/JavaCompiler.java b/java/sca/tools/maven/maven-eclipse-compiler/src/main/java/org/apache/tuscany/sca/tools/maven/compiler/JavaCompiler.java index e2a9143b43..f628a38e95 100644 --- a/java/sca/tools/maven/maven-eclipse-compiler/src/main/java/org/apache/tuscany/sca/tools/maven/compiler/JavaCompiler.java +++ b/java/sca/tools/maven/maven-eclipse-compiler/src/main/java/org/apache/tuscany/sca/tools/maven/compiler/JavaCompiler.java @@ -193,8 +193,10 @@ public class JavaCompiler extends AbstractCompiler { stateController.assertResolved(b); getLogger().info("OSGi bundle is resolved: " + b.getSymbolicName()); } catch (BundleException e) { - // getLogger().error(stateController.getAllErrors().toString()); - getLogger().error(e.getMessage()); + stateController.analyzeErrors(b); + if(getLogger().isDebugEnabled()) { + getLogger().debug(stateController.reportErrors(b)); + } // FIXME: For now, only a warning is reported // throw new CompilerException(e.getMessage(), e); } diff --git a/java/sca/tools/maven/maven-eclipse-compiler/src/main/java/org/apache/tuscany/sca/tools/maven/compiler/osgi/BundleResolver.java b/java/sca/tools/maven/maven-eclipse-compiler/src/main/java/org/apache/tuscany/sca/tools/maven/compiler/osgi/BundleResolver.java index 202e6d9a1b..06f26f7e65 100644 --- a/java/sca/tools/maven/maven-eclipse-compiler/src/main/java/org/apache/tuscany/sca/tools/maven/compiler/osgi/BundleResolver.java +++ b/java/sca/tools/maven/maven-eclipse-compiler/src/main/java/org/apache/tuscany/sca/tools/maven/compiler/osgi/BundleResolver.java @@ -18,6 +18,12 @@ */ package org.apache.tuscany.sca.tools.maven.compiler.osgi; +import static org.eclipse.osgi.service.resolver.ResolverError.IMPORT_PACKAGE_USES_CONFLICT; +import static org.eclipse.osgi.service.resolver.ResolverError.MISSING_FRAGMENT_HOST; +import static org.eclipse.osgi.service.resolver.ResolverError.MISSING_IMPORT_PACKAGE; +import static org.eclipse.osgi.service.resolver.ResolverError.MISSING_REQUIRE_BUNDLE; +import static org.eclipse.osgi.service.resolver.ResolverError.REQUIRE_BUNDLE_USES_CONFLICT; + import java.io.File; import java.io.IOException; import java.net.URL; @@ -25,6 +31,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Dictionary; import java.util.HashMap; +import java.util.HashSet; import java.util.Iterator; import java.util.LinkedHashSet; import java.util.List; @@ -202,13 +209,14 @@ public class BundleResolver { StringBuilder sb = new StringBuilder("Resolved OSGi state\n"); for (BundleDescription bundle : state.getBundles()) { if (!bundle.isResolved()) { - sb.append("NOT "); + sb.append("[X] "); + } else { + sb.append("[V] "); } - sb.append("RESOLVED "); - sb.append(bundle.toString()).append(" : ").append(bundle.getLocation()); - sb.append('\n'); + sb.append(bundle).append(": (").append(bundle.getLocation()); + sb.append(")\n"); for (ResolverError error : state.getResolverErrors(bundle)) { - sb.append('\t').append(error.toString()).append('\n'); + sb.append(" ").append(error.toString()).append('\n'); } } logger.debug(sb.toString()); @@ -245,6 +253,74 @@ public class BundleResolver { } } + private void logError(BundleDescription bundle, int level, Object object) { + StringBuffer msg = new StringBuffer(); + for (int i = 0; i < level; i++) { + msg.append("--"); + } + msg.append("> [").append(bundle.getSymbolicName()).append("] "); + msg.append(object); + logger.error(msg.toString()); + } + + public void analyzeErrors(BundleDescription bundle) { + analyzeErrors(bundle, new HashSet<BundleDescription>(), 1); + } + + private void analyzeErrors(BundleDescription bundle, Set<BundleDescription> bundles, int level) { + if (bundles.contains(bundle)) { + return; + } + bundles.add(bundle); + ResolverError[] errors = state.getResolverErrors(bundle); + for (ResolverError error : errors) { + logError(bundle, level, error); + VersionConstraint constraint = error.getUnsatisfiedConstraint(); + switch (error.getType()) { + case MISSING_IMPORT_PACKAGE: + ImportPackageSpecification pkgSpec = (ImportPackageSpecification)constraint; + for (BundleDescription b : getBundles()) { + for (ExportPackageDescription pkg : b.getExportPackages()) { + if (pkg.getName().equals(pkgSpec.getName())) { + if (pkgSpec.getVersionRange().isIncluded(pkg.getVersion())) { + if (!pkg.getExporter().isResolved()) { + logError(b, level, "Bundle unresolved: " + pkg); + analyzeErrors(pkg.getExporter(), bundles, level + 1); + } + } else { + logError(b, level, "Version mismatch: " + pkgSpec + " " + pkg); + } + } + } + } + break; + case MISSING_REQUIRE_BUNDLE: + case MISSING_FRAGMENT_HOST: + // BundleSpecification bundleSpec = (BundleSpecification)constraint; + for (BundleDescription b : getBundles()) { + if (b == bundle) { + continue; + } + if (b.getSymbolicName().equals(constraint.getName())) { + if (constraint.getVersionRange().isIncluded(b.getVersion())) { + // There must be something wrong in the bundle + analyzeErrors(b, bundles, level); + } else { + logError(bundle, level, "Version mismatch: " + constraint + " " + b); + } + } + } + break; + case IMPORT_PACKAGE_USES_CONFLICT: + case REQUIRE_BUNDLE_USES_CONFLICT: + default: + logger.error(reportErrors(bundle)); + break; + } + } + + } + public Set<ResolverError> getAllErrors() { BundleDescription[] bundles = state.getBundles(); Set<ResolverError> errors = new LinkedHashSet<ResolverError>(); @@ -356,26 +432,29 @@ public class BundleResolver { public void assertResolved(BundleDescription desc) throws BundleException { if (!desc.isResolved()) { - StringBuffer msg = new StringBuffer(); - msg.append("Bundle ").append(desc.getSymbolicName()).append(" cannot be resolved: \n"); - BundleDescription[] bundles = state.getBundles(); - int index = 0; - for (BundleDescription b : bundles) { - if (b.isResolved()) { - continue; - } - ResolverError[] errors = state.getResolverErrors(b); - if (errors.length > 0) { - msg.append("[").append(index++).append("] ").append(b.getSymbolicName()).append("\n"); - } - for (int i = 0; i < errors.length; i++) { - ResolverError error = errors[i]; - msg.append(error).append("\n"); - } - } + throw new BundleException("Bundle cannot be resolved: " + desc); + } + } - throw new BundleException(msg.toString()); + public String reportErrors(BundleDescription desc) { + StringBuffer msg = new StringBuffer(); + msg.append("Bundle ").append(desc.getSymbolicName()).append(" cannot be resolved: \n"); + BundleDescription[] bundles = state.getBundles(); + int index = 0; + for (BundleDescription b : bundles) { + if (b.isResolved()) { + continue; + } + ResolverError[] errors = state.getResolverErrors(b); + if (errors.length > 0) { + msg.append(" ").append("[").append(index++).append("] ").append(b.getSymbolicName()).append("\n"); + } + for (int i = 0; i < errors.length; i++) { + ResolverError error = errors[i]; + msg.append(" -->").append(error).append("\n"); + } } + return msg.toString(); } public String getManifestAttribute(BundleDescription desc, String attr) { |