diff options
author | gjoranv <gv@verizonmedia.com> | 2021-04-13 12:28:42 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-04-13 12:28:42 +0200 |
commit | c752d3e4bcc1946358ccdee716f4141bf87748df (patch) | |
tree | bf3ee4c16006437ac79b893cc09e1e05c8714339 /container-core/src/main/java/com/yahoo/container/di/componentgraph/core/Exceptions.java | |
parent | 86097c6b1e4a59cef5b9dfcdec021213520b51ac (diff) | |
parent | bbff5a9bb8854d7100b4981af9aa226d74ae0227 (diff) |
Merge pull request #17380 from vespa-engine/gjoranv/merge-di-into-core_2
Gjoranv/merge di into core 2 [run-systemtest]
Diffstat (limited to 'container-core/src/main/java/com/yahoo/container/di/componentgraph/core/Exceptions.java')
-rw-r--r-- | container-core/src/main/java/com/yahoo/container/di/componentgraph/core/Exceptions.java | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/container-core/src/main/java/com/yahoo/container/di/componentgraph/core/Exceptions.java b/container-core/src/main/java/com/yahoo/container/di/componentgraph/core/Exceptions.java new file mode 100644 index 00000000000..b0d9d1f3921 --- /dev/null +++ b/container-core/src/main/java/com/yahoo/container/di/componentgraph/core/Exceptions.java @@ -0,0 +1,47 @@ +// Copyright 2018 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.container.di.componentgraph.core; + +import java.util.Arrays; + +class Exceptions { + + static <E extends Throwable> E removeStackTrace(E exception) { + if (preserveStackTrace()) { + return exception; + } else { + exception.setStackTrace(new StackTraceElement[0]); + return exception; + } + } + + static boolean preserveStackTrace() { + String preserve = System.getProperty("jdisc.container.preserveStackTrace"); + return (preserve != null && !preserve.isEmpty()); + } + + static Throwable cutStackTraceAtConstructor(Throwable throwable, StackTraceElement marker) { + if (throwable != null && !preserveStackTrace()) { + StackTraceElement[] stackTrace = throwable.getStackTrace(); + int upTo = stackTrace.length - 1; + + // take until ComponentNode is reached + while (upTo >= 0 && !stackTrace[upTo].getClassName().equals(ComponentNode.class.getName())) { + upTo--; + } + + // then drop until <init> is reached + while (upTo >= 0 && !stackTrace[upTo].getMethodName().equals("<init>")) { + upTo--; + } + if (upTo < 0) { + throwable.setStackTrace(new StackTraceElement[0]); + } else { + throwable.setStackTrace(Arrays.copyOfRange(stackTrace, 0, upTo)); + } + + cutStackTraceAtConstructor(throwable.getCause(), marker); + } + return throwable; + } + +} |