better error messages and warnings around catalog item failures many caused by misleading impl of propagate(msg, err), deprecate that for a version to let us fix
Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/f344430e Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/f344430e Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/f344430e Branch: refs/heads/master Commit: f344430e46b55065e1b95bcf1a297f3395afed2a Parents: d7ebb6b Author: Alex Heneveld <[email protected]> Authored: Wed Jun 7 23:40:09 2017 +0100 Committer: Alex Heneveld <[email protected]> Committed: Thu Jul 6 15:01:56 2017 +0100 ---------------------------------------------------------------------- .../core/catalog/internal/CatalogBundleLoader.java | 2 +- .../brooklyn/core/catalog/internal/CatalogDo.java | 2 +- .../catalog/internal/CatalogInitialization.java | 16 ++++++++++------ .../core/catalog/internal/CatalogUtils.java | 2 +- .../mgmt/persist/FileBasedStoreObjectAccessor.java | 8 ++++---- .../brooklyn/core/mgmt/rebind/RebindIteration.java | 10 +++++----- .../brooklyn/core/objs/proxy/InternalFactory.java | 2 +- .../apache/brooklyn/util/core/ResourceUtils.java | 2 +- .../brooklyn/util/core/osgi/BundleMaker.java | 10 +++++----- .../persist/deserializingClassRenames.properties | 2 ++ .../brooklyn/location/jclouds/JcloudsLocation.java | 4 ++-- .../main/java/org/apache/brooklyn/cli/Main.java | 2 +- .../brooklyn/util/exceptions/Exceptions.java | 17 +++++++++++++++-- .../brooklyn/util/exceptions/ExceptionsTest.java | 8 ++++---- 14 files changed, 53 insertions(+), 34 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/f344430e/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogBundleLoader.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogBundleLoader.java b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogBundleLoader.java index 90bc628..e55617a 100644 --- a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogBundleLoader.java +++ b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogBundleLoader.java @@ -163,7 +163,7 @@ public class CatalogBundleLoader { try (final InputStream ins = bom.openStream()) { return Streams.readFullyString(ins); } catch (IOException e) { - throw Exceptions.propagate("Error loading Catalog BOM from " + bom, e); + throw Exceptions.propagateAnnotated("Error loading Catalog BOM from " + bom, e); } } http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/f344430e/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogDo.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogDo.java b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogDo.java index 4852929..39cc8d2 100644 --- a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogDo.java +++ b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogDo.java @@ -137,7 +137,7 @@ public class CatalogDo { } catch (Exception e) { Exceptions.propagateIfFatal(e); if (failOnLoadError) { - Exceptions.propagate(e); + Exceptions.propagateAnnotated("Loading bundles for catalog item " + entry.getCatalogItemId() + " failed", e); } else { log.error("Loading bundles for catalog item " + entry + " failed: " + e.getMessage(), e); } http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/f344430e/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogInitialization.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogInitialization.java b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogInitialization.java index 45e7e7a..f906344 100644 --- a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogInitialization.java +++ b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogInitialization.java @@ -34,6 +34,7 @@ import org.apache.brooklyn.util.core.ResourceUtils; import org.apache.brooklyn.util.core.flags.TypeCoercions; import org.apache.brooklyn.util.exceptions.Exceptions; import org.apache.brooklyn.util.exceptions.FatalRuntimeException; +import org.apache.brooklyn.util.exceptions.PropagatedRuntimeException; import org.apache.brooklyn.util.exceptions.RuntimeInterruptedException; import org.apache.brooklyn.util.guava.Maybe; import org.apache.brooklyn.util.javalang.JavaClassNames; @@ -394,15 +395,18 @@ public class CatalogInitialization implements ManagementContextInjectable { if (throwable instanceof RuntimeInterruptedException) throw (RuntimeInterruptedException) throwable; - String throwableText = Exceptions.collapseText(throwable); - log.error("Error loading catalog item '"+details+"': "+throwableText); - log.debug("Trace for error loading catalog item '"+details+"': "+throwableText, throwable); + if (details instanceof CatalogItem) { + if (((CatalogItem<?,?>)details).getCatalogItemId() != null) { + details = ((CatalogItem<?,?>)details).getCatalogItemId(); + } + } + PropagatedRuntimeException wrap = new PropagatedRuntimeException("Error loading catalog item "+details, throwable); + log.debug("Trace for: "+wrap, wrap); - // TODO give more detail when adding - ((ManagementContextInternal)getManagementContext()).errors().add(throwable); + ((ManagementContextInternal)getManagementContext()).errors().add(wrap); if (isStartingUp && failOnStartupErrors) { - throw new FatalRuntimeException("Unable to load catalog item '"+details+"': "+throwableText, throwable); + throw new FatalRuntimeException("Unable to load catalog item "+details, wrap); } } http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/f344430e/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogUtils.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogUtils.java b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogUtils.java index 81cbbcf..7fa3631 100644 --- a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogUtils.java +++ b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogUtils.java @@ -396,7 +396,7 @@ public class CatalogUtils { if (!didSomething) { // TODO review what to do here - log.warn("Can't find catalog item " + itemId); + log.warn("Can't find catalog item " + itemId+"; ignoring, but a search path may be incomplete and other errors may follow"); } } http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/f344430e/core/src/main/java/org/apache/brooklyn/core/mgmt/persist/FileBasedStoreObjectAccessor.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/persist/FileBasedStoreObjectAccessor.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/persist/FileBasedStoreObjectAccessor.java index 2028c43..a8d7cf1 100644 --- a/core/src/main/java/org/apache/brooklyn/core/mgmt/persist/FileBasedStoreObjectAccessor.java +++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/persist/FileBasedStoreObjectAccessor.java @@ -58,7 +58,7 @@ public class FileBasedStoreObjectAccessor implements PersistenceObjectStore.Stor if (!exists()) return null; return Files.asCharSource(file, Charsets.UTF_8).read(); } catch (IOException e) { - throw Exceptions.propagate("Problem reading String contents of file "+file, e); + throw Exceptions.propagateAnnotated("Problem reading String contents of file "+file, e); } } @@ -68,7 +68,7 @@ public class FileBasedStoreObjectAccessor implements PersistenceObjectStore.Stor if (!exists()) return null; return Files.asByteSource(file).read(); } catch (IOException e) { - throw Exceptions.propagate("Problem reading bytes of file "+file, e); + throw Exceptions.propagateAnnotated("Problem reading bytes of file "+file, e); } } @@ -90,7 +90,7 @@ public class FileBasedStoreObjectAccessor implements PersistenceObjectStore.Stor Streams.copyClose(bytes.openStream(), new FileOutputStream(tmpFile)); FileBasedObjectStore.moveFile(tmpFile, file); } catch (IOException e) { - throw Exceptions.propagate("Problem writing data to file "+file+" (via temporary file "+tmpFile+")", e); + throw Exceptions.propagateAnnotated("Problem writing data to file "+file+" (via temporary file "+tmpFile+")", e); } catch (InterruptedException e) { throw Exceptions.propagate(e); } @@ -105,7 +105,7 @@ public class FileBasedStoreObjectAccessor implements PersistenceObjectStore.Stor Files.append(val, file, Charsets.UTF_8); } catch (IOException e) { - throw Exceptions.propagate("Problem appending to file "+file, e); + throw Exceptions.propagateAnnotated("Problem appending to file "+file, e); } } http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/f344430e/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindIteration.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindIteration.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindIteration.java index 6ee3dc7..0bde0d1 100644 --- a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindIteration.java +++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindIteration.java @@ -1063,7 +1063,7 @@ public abstract class RebindIteration { reboundSearchPath.add(fixedSearchItemId); } else { LOG.warn("Unable to load catalog item "+ searchItemId - +" for search path of "+contextSuchAsId + " (" + bType.getSimpleName()+"); attempting load nevertheless"); + + " for search path of "+contextSuchAsId + " (" + bType.getSimpleName()+"); attempting to load "+jType+" nevertheless"); } } } @@ -1091,7 +1091,7 @@ public abstract class RebindIteration { return new LoadedClass<T>(loader.loadClass(jType, bType), transformedCatalogItemId, reboundSearchPath); } catch (Exception e) { Exceptions.propagateIfFatal(e); - LOG.warn("Unable to load "+jType+" using loader; will try reflections"); + LOG.warn("Unable to load class "+jType+" needed for "+catalogItemId+" for "+contextSuchAsId+", via "+transformedCatalogItemId+" loader (will try reflections)"); } } else { LOG.warn("Unable to load catalog item "+catalogItemId+" ("+bType+") for " + contextSuchAsId + @@ -1103,12 +1103,12 @@ public abstract class RebindIteration { return new LoadedClass<T>((Class<T>)loadClass(jType), catalogItemId, reboundSearchPath); } catch (Exception e) { Exceptions.propagateIfFatal(e); - LOG.warn("Unable to load "+jType+" using reflections; will try standard context"); + LOG.warn("Unable to load class "+jType+" needed for "+catalogItemId+" for "+contextSuchAsId+", via reflections (may try others, will throw if fails)"); } if (catalogItemId != null) { - throw new IllegalStateException("Unable to load catalog item " + catalogItemId + " for " + - contextSuchAsId + ", or load class from classpath"); + throw new IllegalStateException("Unable to load "+jType+" for catalog item " + catalogItemId + " for " + contextSuchAsId); + } else if (BrooklynFeatureEnablement.isEnabled(FEATURE_BACKWARDS_COMPATIBILITY_INFER_CATALOG_ITEM_ON_REBIND)) { //Try loading from whichever catalog bundle succeeds. BrooklynCatalog catalog = managementContext.getCatalog(); http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/f344430e/core/src/main/java/org/apache/brooklyn/core/objs/proxy/InternalFactory.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/core/objs/proxy/InternalFactory.java b/core/src/main/java/org/apache/brooklyn/core/objs/proxy/InternalFactory.java index 4af0900..fec97f2 100644 --- a/core/src/main/java/org/apache/brooklyn/core/objs/proxy/InternalFactory.java +++ b/core/src/main/java/org/apache/brooklyn/core/objs/proxy/InternalFactory.java @@ -121,7 +121,7 @@ public class InternalFactory { return special.newInstance().create(managementContext, clazz, spec); } catch (Exception e) { Exceptions.propagateIfFatal(e); - throw Exceptions.propagate("Unable to create "+clazz+" "+spec+" using special "+special, e); + throw Exceptions.propagateAnnotated("Unable to create "+clazz+" "+spec+" using special "+special, e); } } http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/f344430e/core/src/main/java/org/apache/brooklyn/util/core/ResourceUtils.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/util/core/ResourceUtils.java b/core/src/main/java/org/apache/brooklyn/util/core/ResourceUtils.java index 813bae2..88bb4ad 100644 --- a/core/src/main/java/org/apache/brooklyn/util/core/ResourceUtils.java +++ b/core/src/main/java/org/apache/brooklyn/util/core/ResourceUtils.java @@ -293,7 +293,7 @@ public class ResourceUtils { throw new IOException("'"+orig+"' not found on classpath or filesystem"); } catch (Exception e) { if (context!=null) { - throw Exceptions.propagate("Error getting resource '"+url+"' for "+context, e); + throw Exceptions.propagateAnnotated("Error getting resource '"+url+"' for "+context, e); } else { throw Exceptions.propagate(e); } http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/f344430e/core/src/main/java/org/apache/brooklyn/util/core/osgi/BundleMaker.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/util/core/osgi/BundleMaker.java b/core/src/main/java/org/apache/brooklyn/util/core/osgi/BundleMaker.java index 37aa5a1..9116c0e 100644 --- a/core/src/main/java/org/apache/brooklyn/util/core/osgi/BundleMaker.java +++ b/core/src/main/java/org/apache/brooklyn/util/core/osgi/BundleMaker.java @@ -114,7 +114,7 @@ public class BundleMaker { return f; } catch (Exception e) { - throw Exceptions.propagate("Error creating ZIP from classpath spec "+path, e); + throw Exceptions.propagateAnnotated("Error creating ZIP from classpath spec "+path, e); } finally { Streams.closeQuietly(zout); @@ -136,7 +136,7 @@ public class BundleMaker { jf = new JarFile(f); return jf.getManifest(); } catch (IOException e) { - throw Exceptions.propagate("Unable to read "+f+" when looking for manifest", e); + throw Exceptions.propagateAnnotated("Unable to read "+f+" when looking for manifest", e); } finally { Streams.closeQuietly(jf); } @@ -164,7 +164,7 @@ public class BundleMaker { zout = new JarOutputStream(new FileOutputStream(f2), mf); writeZipEntriesFromFile(zout, f, Predicates.not(Predicates.equalTo(MANIFEST_PATH))); } catch (IOException e) { - throw Exceptions.propagate("Unable to read "+f+" when looking for manifest", e); + throw Exceptions.propagateAnnotated("Unable to read "+f+" when looking for manifest", e); } finally { Streams.closeQuietly(zf); Streams.closeQuietly(zout); @@ -226,7 +226,7 @@ public class BundleMaker { return f2; } catch (IOException e) { - throw Exceptions.propagate("Unable to read "+f+" when looking for manifest", e); + throw Exceptions.propagateAnnotated("Unable to read "+f+" when looking for manifest", e); } finally { Streams.closeQuietly(zf); Streams.closeQuietly(zout); @@ -285,7 +285,7 @@ public class BundleMaker { return b; } catch (Exception e) { - throw Exceptions.propagate("Error starting bundle from "+f, e); + throw Exceptions.propagateAnnotated("Error starting bundle from "+f, e); } } http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/f344430e/core/src/main/resources/org/apache/brooklyn/core/mgmt/persist/deserializingClassRenames.properties ---------------------------------------------------------------------- diff --git a/core/src/main/resources/org/apache/brooklyn/core/mgmt/persist/deserializingClassRenames.properties b/core/src/main/resources/org/apache/brooklyn/core/mgmt/persist/deserializingClassRenames.properties index 8a6a7a4..c0dc264 100644 --- a/core/src/main/resources/org/apache/brooklyn/core/mgmt/persist/deserializingClassRenames.properties +++ b/core/src/main/resources/org/apache/brooklyn/core/mgmt/persist/deserializingClassRenames.properties @@ -1450,3 +1450,5 @@ brooklyn.networking.vclouddirector.PortForwardingConfig org.apache.brooklyn.feed.ssh.SshFeed$SshPollIdentifier : org.apache.brooklyn.feed.AbstractCommandFeed$CommandPollIdentifier org.apache.brooklyn.feed.ssh.SshPollConfig$CombiningEnvSupplier : org.apache.brooklyn.feed.CommandPollConfig$CombiningEnvSupplier + +com.usharesoft.cloudsoft.SoftwareFromStack : com.usharesoft.cloudsoft.entities-from-uforge:com.usharesoft.cloudsoft.SoftwareFromStack http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/f344430e/locations/jclouds/src/main/java/org/apache/brooklyn/location/jclouds/JcloudsLocation.java ---------------------------------------------------------------------- diff --git a/locations/jclouds/src/main/java/org/apache/brooklyn/location/jclouds/JcloudsLocation.java b/locations/jclouds/src/main/java/org/apache/brooklyn/location/jclouds/JcloudsLocation.java index c0d419c..e975520 100644 --- a/locations/jclouds/src/main/java/org/apache/brooklyn/location/jclouds/JcloudsLocation.java +++ b/locations/jclouds/src/main/java/org/apache/brooklyn/location/jclouds/JcloudsLocation.java @@ -2392,10 +2392,10 @@ public class JcloudsLocation extends AbstractCloudMachineProvisioningLocation im try { return pollForFirstReachableHostAndPortPredicate = predicateType.newInstance(); } catch (IllegalAccessException | InstantiationException newInstanceException) { - throw Exceptions.propagate("Failed to instantiate " + predicateType, newInstanceException); + throw Exceptions.propagateAnnotated("Failed to instantiate " + predicateType, newInstanceException); } } catch (InvocationTargetException | InstantiationException e) { - throw Exceptions.propagate("Failed to instantiate " + predicateType + " with Map constructor", e); + throw Exceptions.propagateAnnotated("Failed to instantiate " + predicateType + " with Map constructor", e); } } } http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/f344430e/server-cli/src/main/java/org/apache/brooklyn/cli/Main.java ---------------------------------------------------------------------- diff --git a/server-cli/src/main/java/org/apache/brooklyn/cli/Main.java b/server-cli/src/main/java/org/apache/brooklyn/cli/Main.java index f68f142..606a2a1 100644 --- a/server-cli/src/main/java/org/apache/brooklyn/cli/Main.java +++ b/server-cli/src/main/java/org/apache/brooklyn/cli/Main.java @@ -433,7 +433,7 @@ public class Main extends AbstractMain { try { populateCatalog(catInit.getManagementContext().getCatalog()); } catch (Throwable e) { - catInit.handleException(e, "overridden main class populate catalog"); + catInit.handleException(e, "in main class populate catalog override"); } // Force load of catalog (so web console is up to date) http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/f344430e/utils/common/src/main/java/org/apache/brooklyn/util/exceptions/Exceptions.java ---------------------------------------------------------------------- diff --git a/utils/common/src/main/java/org/apache/brooklyn/util/exceptions/Exceptions.java b/utils/common/src/main/java/org/apache/brooklyn/util/exceptions/Exceptions.java index 5487072..82fcce7 100644 --- a/utils/common/src/main/java/org/apache/brooklyn/util/exceptions/Exceptions.java +++ b/utils/common/src/main/java/org/apache/brooklyn/util/exceptions/Exceptions.java @@ -130,17 +130,30 @@ public class Exceptions { } /** + * Convenience for {@link #propagateAnnotateIfWrapping(String, Throwable)}. + * + * @deprecated since 0.12.0 behaviour will change (default should be to always wrap and annotate); + * for now users should review and switch to either + * {@link #propagateAnnotated(String, Throwable)} or {@link #propagateAnnotateIfWrapping(String, Throwable)} as appropriate. + */ + @Deprecated + public static RuntimeException propagate(String msg, Throwable throwable) { + return propagate(msg, throwable, false); + } + + /** * See {@link #propagate(Throwable)}. * <p> * The given message is included <b>only</b> if the given {@link Throwable} * needs to be wrapped; otherwise the message is not used. * To always include the message, use {@link #propagateAnnotated(String, Throwable)}. */ - public static RuntimeException propagate(String msg, Throwable throwable) { + public static RuntimeException propagateAnnotateIfWrapping(String msg, Throwable throwable) { return propagate(msg, throwable, false); } - /** As {@link #propagate(String, Throwable)} but always re-wraps including the given message. */ + /** As {@link #propagate(String)} but always re-wraps including the given message. + * See {@link #propagateAnnotateIfWrapping(String, Throwable)} if the message is optional. */ public static RuntimeException propagateAnnotated(String msg, Throwable throwable) { return propagate(msg, throwable, true); } http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/f344430e/utils/common/src/test/java/org/apache/brooklyn/util/exceptions/ExceptionsTest.java ---------------------------------------------------------------------- diff --git a/utils/common/src/test/java/org/apache/brooklyn/util/exceptions/ExceptionsTest.java b/utils/common/src/test/java/org/apache/brooklyn/util/exceptions/ExceptionsTest.java index 272d3f6..345db93 100644 --- a/utils/common/src/test/java/org/apache/brooklyn/util/exceptions/ExceptionsTest.java +++ b/utils/common/src/test/java/org/apache/brooklyn/util/exceptions/ExceptionsTest.java @@ -65,7 +65,7 @@ public class ExceptionsTest { String extraMsg = "my message"; Exception tothrow = new Exception("simulated"); try { - throw Exceptions.propagate(extraMsg, tothrow); + throw Exceptions.propagateAnnotateIfWrapping(extraMsg, tothrow); } catch (RuntimeException e) { assertEquals(e.getMessage(), "my message"); assertEquals(e.getCause(), tothrow); @@ -76,7 +76,7 @@ public class ExceptionsTest { public void testPropagateRuntimeExceptionIgnoresMessage() throws Exception { NullPointerException tothrow = new NullPointerException("simulated"); try { - throw Exceptions.propagate("my message", tothrow); + throw Exceptions.propagateAnnotateIfWrapping("my message", tothrow); } catch (NullPointerException e) { assertEquals(e, tothrow); } @@ -257,14 +257,14 @@ public class ExceptionsTest { @Test public void testPropagateWithAnnotationNotExplicitIncludedWhenWrapped() throws Exception { Throwable t = new Throwable("test"); - try { Exceptions.propagate("important", t); } catch (Throwable t2) { t = t2; } + try { Exceptions.propagateAnnotateIfWrapping("important", t); } catch (Throwable t2) { t = t2; } Assert.assertEquals(Exceptions.collapseText(t), "important: test"); } @Test public void testPropagateWithAnnotationNotExplicitIgnoredWhenNotWrapped() throws Exception { Throwable t = new RuntimeException("test"); - try { Exceptions.propagate("ignore", t); } catch (Throwable t2) { t = t2; } + try { Exceptions.propagateAnnotateIfWrapping("ignore", t); } catch (Throwable t2) { t = t2; } Assert.assertEquals(Exceptions.collapseText(t), "test"); }
