TracingBroker: collapse ellipses
[controller.git] / opendaylight / md-sal / mdsal-trace / dom-impl / src / main / java / org / opendaylight / controller / md / sal / trace / dom / impl / TracingBroker.java
index 2150e28905a8cfbee60116324f1e6cb3aa11b652..2aa7457ee2a6bd0ce5b4350ea3fe0fdb95164d8d 100644 (file)
@@ -391,7 +391,7 @@ public class TracingBroker implements TracingDOMDataBroker {
         }
         entries.forEach(entry -> {
             ps.println("    " + entry.getNumberAddedNotRemoved() + "x TransactionChains opened but not closed here:");
-            entry.getStackTraceElements().forEach(line -> ps.println("      " + line));
+            printStackTraceElements(ps, "      ", entry.getStackTraceElements());
             @SuppressWarnings("resource")
             TracingTransactionChain txChain = (TracingTransactionChain) entry
                 .getExampleCloseTracked().getRealCloseTracked();
@@ -413,10 +413,36 @@ public class TracingBroker implements TracingDOMDataBroker {
         entries.forEach(entry -> {
             ps.println(indent + "  " + entry.getNumberAddedNotRemoved()
                 + "x transactions opened here, which are not closed:");
-            entry.getStackTraceElements().forEach(line -> ps.println(indent + "    " + line));
+            printStackTraceElements(ps, indent + "    ", entry.getStackTraceElements());
         });
         if (!entries.isEmpty()) {
             ps.println();
         }
     }
+
+    private void printStackTraceElements(PrintStream ps, String indent, List<StackTraceElement> stackTraceElements) {
+        boolean ellipsis = false;
+        for (final StackTraceElement stackTraceElement : stackTraceElements) {
+            if (isStackTraceElementInteresting(stackTraceElement)) {
+                ps.println(indent + stackTraceElement);
+                ellipsis = false;
+            } else if (!ellipsis) {
+                ps.println(indent + "(...)");
+                ellipsis = true;
+            }
+        }
+    }
+
+    private boolean isStackTraceElementInteresting(StackTraceElement element) {
+        final String className = element.getClassName();
+        return !className.startsWith(getClass().getPackage().getName())
+            && !className.startsWith(CloseTracked.class.getPackage().getName())
+            && !className.startsWith("Proxy")
+            && !className.startsWith("akka")
+            && !className.startsWith("scala")
+            && !className.startsWith("sun.reflect")
+            && !className.startsWith("java.lang.reflect")
+            && !className.startsWith("org.apache.aries.blueprint")
+            && !className.startsWith("org.osgi.util.tracker");
+    }
 }