summaryrefslogtreecommitdiffstats
path: root/java/sca
diff options
context:
space:
mode:
authorrfeng <rfeng@13f79535-47bb-0310-9956-ffa450edef68>2009-02-06 22:22:48 +0000
committerrfeng <rfeng@13f79535-47bb-0310-9956-ffa450edef68>2009-02-06 22:22:48 +0000
commitd3b1e2da46bc38544b5d0e93d3998c884c6d0684 (patch)
treebabcbf242a994aae4943fbae5a3e63d745dda816 /java/sca
parent9140002a094c467bde17281ade514183d138b1b8 (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')
-rw-r--r--java/sca/tools/maven/maven-eclipse-compiler/src/main/java/org/apache/tuscany/sca/tools/maven/compiler/JavaCompiler.java6
-rw-r--r--java/sca/tools/maven/maven-eclipse-compiler/src/main/java/org/apache/tuscany/sca/tools/maven/compiler/osgi/BundleResolver.java125
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) {