better dev-environment detection and osgi error reporting
Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/45820728 Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/45820728 Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/45820728 Branch: refs/heads/master Commit: 45820728671c18e183e0e296a197fc5d46305d0a Parents: 689f051 Author: Alex Heneveld <alex.henev...@cloudsoftcorp.com> Authored: Fri Feb 6 17:56:38 2015 +0000 Committer: Alex Heneveld <alex.henev...@cloudsoftcorp.com> Committed: Fri Feb 6 22:12:14 2015 +0000 ---------------------------------------------------------------------- .../src/main/java/brooklyn/BrooklynVersion.java | 11 ++++------- .../brooklyn/management/ha/OsgiManager.java | 20 ++++++++++++++++---- 2 files changed, 20 insertions(+), 11 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/45820728/core/src/main/java/brooklyn/BrooklynVersion.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/brooklyn/BrooklynVersion.java b/core/src/main/java/brooklyn/BrooklynVersion.java index 3e7645a..0cdf375 100644 --- a/core/src/main/java/brooklyn/BrooklynVersion.java +++ b/core/src/main/java/brooklyn/BrooklynVersion.java @@ -197,20 +197,17 @@ public class BrooklynVersion { private static boolean computeIsDevelopmentEnvironment() { Enumeration<URL> paths; try { - paths = BrooklynVersion.class.getClassLoader().getResources(MANIFEST_PATH); + paths = BrooklynVersion.class.getClassLoader().getResources("brooklyn/BrooklynVersion.class"); } catch (IOException e) { // shouldn't happen throw Exceptions.propagate(e); } while (paths.hasMoreElements()) { URL u = paths.nextElement(); - if (u.getPath().endsWith("core/target/classes/META-INF/MANIFEST.MF")) { + if (u.getPath().endsWith("core/target/classes/brooklyn/BrooklynVersion.class")) { try { - ManifestHelper mh = Osgis.ManifestHelper.forManifest(u.openStream()); - if (BROOKLYN_CORE_SYMBOLIC_NAME.equals(mh.getSymbolicName())) { - log.debug("Brooklyn debug environment detected; core manifest is at: "+u); - return true; - } + log.debug("Brooklyn debug environment detected; BrooklynVersion class is at: "+u); + return true; } catch (Exception e) { Exceptions.propagateIfFatal(e); log.warn("Error reading manifest to determine whether this is a development environment: "+e, e); http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/45820728/core/src/main/java/brooklyn/management/ha/OsgiManager.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/brooklyn/management/ha/OsgiManager.java b/core/src/main/java/brooklyn/management/ha/OsgiManager.java index 260f5ff..d699da3 100644 --- a/core/src/main/java/brooklyn/management/ha/OsgiManager.java +++ b/core/src/main/java/brooklyn/management/ha/OsgiManager.java @@ -23,6 +23,7 @@ import java.net.URL; import java.util.Arrays; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.concurrent.Callable; import java.util.concurrent.atomic.AtomicReference; @@ -39,6 +40,7 @@ import brooklyn.config.BrooklynServerPaths; import brooklyn.config.ConfigKey; import brooklyn.management.ManagementContext; import brooklyn.util.collections.MutableMap; +import brooklyn.util.collections.MutableSet; import brooklyn.util.exceptions.Exceptions; import brooklyn.util.guava.Maybe; import brooklyn.util.os.Os; @@ -46,6 +48,7 @@ import brooklyn.util.os.Os.DeletionResult; import brooklyn.util.osgi.Osgis; import brooklyn.util.osgi.Osgis.BundleFinder; import brooklyn.util.repeat.Repeater; +import brooklyn.util.text.Strings; import brooklyn.util.time.Duration; import com.google.common.base.Throwables; @@ -187,6 +190,7 @@ public class OsgiManager { } public <T> Maybe<Class<T>> tryResolveClass(String type, Iterable<CatalogBundle> catalogBundles) { Map<CatalogBundle,Throwable> bundleProblems = MutableMap.of(); + Set<String> extraMessages = MutableSet.of(); for (CatalogBundle catalogBundle: catalogBundles) { try { Maybe<Bundle> bundle = findBundle(catalogBundle); @@ -216,8 +220,14 @@ public class OsgiManager { Throwable cause = e.getCause(); if (cause != null && cause.getMessage().contains("Unresolved constraint in bundle")) { - log.warn("Unresolved constraint resolving OSGi bundle "+catalogBundle+" to load "+type+": "+cause.getMessage()+ - (BrooklynVersion.isDevelopmentEnvironment() ? " (may be due to IDE / dev env; try a maven build)" : "")); + if (BrooklynVersion.INSTANCE.getVersionFromOsgiManifest()==null) { + extraMessages.add("No brooklyn-core OSGi manifest available. OSGi will not work."); + } + if (BrooklynVersion.isDevelopmentEnvironment()) { + extraMessages.add("Your development environment may not have created necessary files. Doing a maven build then retrying may fix the issue."); + } + if (!extraMessages.isEmpty()) log.warn(Strings.join(extraMessages, " ")); + log.warn("Unresolved constraint resolving OSGi bundle "+catalogBundle+" to load "+type+": "+cause.getMessage()); if (log.isDebugEnabled()) log.debug("Trace for OSGi resolution failure", e); } } @@ -227,9 +237,11 @@ public class OsgiManager { if (error instanceof ClassNotFoundException && error.getCause()!=null && error.getCause().getMessage()!=null) { error = Exceptions.collapseIncludingAllCausalMessages(error); } - return Maybe.absent("Unable to resolve class "+type+" in "+Iterables.getOnlyElement(bundleProblems.keySet()), error); + return Maybe.absent("Unable to resolve class "+type+" in "+Iterables.getOnlyElement(bundleProblems.keySet()) + + (extraMessages.isEmpty() ? "" : " ("+Strings.join(extraMessages, " ")+")"), error); } else { - return Maybe.absent(Exceptions.create("Unable to resolve class "+type+": "+bundleProblems, bundleProblems.values())); + return Maybe.absent(Exceptions.create("Unable to resolve class "+type+": "+bundleProblems + + (extraMessages.isEmpty() ? "" : " ("+Strings.join(extraMessages, " ")+")"), bundleProblems.values())); } }