Full Code of irockel/tda for AI

main 3e8c8554b950 cached
144 files
1.8 MB
489.2k tokens
1210 symbols
1 requests
Download .txt
Showing preview only (1,948K chars total). Download the full file or copy to clipboard to get everything.
Repository: irockel/tda
Branch: main
Commit: 3e8c8554b950
Files: 144
Total size: 1.8 MB

Directory structure:
gitextract_2wl47vax/

├── .github/
│   ├── copilot-instructions.md
│   └── workflows/
│       ├── build.yml
│       ├── pages.yml
│       └── release.yml
├── .gitignore
├── CHANGELOG.md
├── LICENSE
├── README.md
├── docs/
│   └── index.html
├── pom.xml
├── renovate.json
├── tda/
│   ├── dependency-reduced-pom.xml
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── de/
│       │   │       └── grimmfrost/
│       │   │           └── tda/
│       │   │               ├── CustomCategoriesDialog.java
│       │   │               ├── EditCustomCategoryDialog.java
│       │   │               ├── EditFilterDialog.java
│       │   │               ├── FilterDialog.java
│       │   │               ├── HelpOverviewDialog.java
│       │   │               ├── InfoDialog.java
│       │   │               ├── LongThreadDialog.java
│       │   │               ├── MainMenu.java
│       │   │               ├── PreferencesDialog.java
│       │   │               ├── SearchDialog.java
│       │   │               ├── TDA.java
│       │   │               ├── filter/
│       │   │               │   ├── Filter.java
│       │   │               │   └── FilterChecker.java
│       │   │               ├── jconsole/
│       │   │               │   ├── MBeanDumper.java
│       │   │               │   └── TDAPlugin.java
│       │   │               ├── mcp/
│       │   │               │   ├── HeadlessAnalysisProvider.java
│       │   │               │   └── MCPServer.java
│       │   │               ├── model/
│       │   │               │   ├── AbstractCategory.java
│       │   │               │   ├── AbstractInfo.java
│       │   │               │   ├── Category.java
│       │   │               │   ├── CustomCategory.java
│       │   │               │   ├── DumpStore.java
│       │   │               │   ├── HeapInfo.java
│       │   │               │   ├── HistogramInfo.java
│       │   │               │   ├── LogFileContent.java
│       │   │               │   ├── Logfile.java
│       │   │               │   ├── MonitorMap.java
│       │   │               │   ├── TableCategory.java
│       │   │               │   ├── ThreadDumpInfo.java
│       │   │               │   ├── ThreadInfo.java
│       │   │               │   └── TreeCategory.java
│       │   │               ├── parser/
│       │   │               │   ├── AbstractDumpParser.java
│       │   │               │   ├── Analyzer.java
│       │   │               │   ├── DumpParser.java
│       │   │               │   ├── DumpParserFactory.java
│       │   │               │   ├── JCmdJSONParser.java
│       │   │               │   ├── SunJDKParser.java
│       │   │               │   └── WrappedSunJDKParser.java
│       │   │               └── utils/
│       │   │                   ├── AppInfo.java
│       │   │                   ├── Browser.java
│       │   │                   ├── ColoredTable.java
│       │   │                   ├── DateMatcher.java
│       │   │                   ├── HistogramTableModel.java
│       │   │                   ├── IconFactory.java
│       │   │                   ├── LogManager.java
│       │   │                   ├── MonitorComparator.java
│       │   │                   ├── MonitorsTableModel.java
│       │   │                   ├── PrefManager.java
│       │   │                   ├── ResourceManager.java
│       │   │                   ├── StatusBar.java
│       │   │                   ├── SwingWorker.java
│       │   │                   ├── TableSorter.java
│       │   │                   ├── ThreadsTableModel.java
│       │   │                   ├── ThreadsTableSelectionModel.java
│       │   │                   ├── TipOfDay.java
│       │   │                   ├── TreeRenderer.java
│       │   │                   ├── ViewScrollPane.java
│       │   │                   └── jedit/
│       │   │                       ├── DefaultInputHandler.java
│       │   │                       ├── InputHandler.java
│       │   │                       ├── JEditTextArea.java
│       │   │                       ├── KeywordMap.java
│       │   │                       ├── PopupMenu.java
│       │   │                       ├── SyntaxDocument.java
│       │   │                       ├── SyntaxStyle.java
│       │   │                       ├── SyntaxUtilities.java
│       │   │                       ├── TextAreaDefaults.java
│       │   │                       ├── TextAreaPainter.java
│       │   │                       ├── TextUtilities.java
│       │   │                       ├── Token.java
│       │   │                       └── TokenMarker.java
│       │   └── resources/
│       │       ├── META-INF/
│       │       │   └── services/
│       │       │       └── com.sun.tools.jconsole.JConsolePlugin
│       │       ├── de/
│       │       │   └── grimmfrost/
│       │       │       └── tda/
│       │       │           ├── doc/
│       │       │           │   ├── COPYING
│       │       │           │   ├── README
│       │       │           │   ├── stylesheet.css
│       │       │           │   ├── tips.properties
│       │       │           │   └── welcome.html
│       │       │           ├── locale.properties
│       │       │           └── version.properties
│       │       └── icons/
│       │           ├── splash.xcf
│       │           ├── tda-logo.xcf
│       │           └── welcome-logo.xcf
│       └── test/
│           ├── java/
│           │   └── de/
│           │       └── grimmfrost/
│           │           └── tda/
│           │               ├── mcp/
│           │               │   └── HeadlessAnalysisProviderTest.java
│           │               ├── model/
│           │               │   └── TableCategoryTest.java
│           │               ├── parser/
│           │               │   ├── DumpParserFactoryTest.java
│           │               │   ├── JCmdJSONParserTest.java
│           │               │   └── SunJDKParserTest.java
│           │               └── utils/
│           │                   └── LogManagerTest.java
│           └── resources/
│               ├── carrier_stuck.log
│               ├── hpdump.log
│               ├── intellij_dump.json
│               ├── java11dump.log
│               ├── java21dump.log
│               ├── java21dump_utf16.log
│               ├── java8dump.log
│               ├── jdk11_long_running.log
│               ├── jstack_dump.log
│               ├── test.log
│               ├── test64bit.log
│               ├── testwithhistogram.log
│               ├── urlthread.log
│               └── visualvmremote.log
├── tda-macos-binary/
│   ├── pom.xml
│   └── src/
│       └── main/
│           └── resources/
│               └── TDA.icns
├── visualvm-lib-component/
│   ├── manifest.mf
│   ├── pom.xml
│   └── src/
│       └── main/
│           └── resources/
│               └── net/
│                   └── java/
│                       └── dev/
│                           └── tda/
│                               └── Bundle.properties
├── visualvm-logfile-component/
│   ├── manifest.mf
│   ├── pom.xml
│   └── src/
│       └── main/
│           ├── java/
│           │   └── net/
│           │       └── java/
│           │           └── dev/
│           │               └── tda/
│           │                   └── visualvm/
│           │                       └── logfile/
│           │                           ├── AddLogfileAction.java
│           │                           ├── Install.java
│           │                           ├── LogPanel.java
│           │                           ├── Logfile.java
│           │                           ├── LogfileCategory.java
│           │                           ├── LogfileDataSource.java
│           │                           ├── LogfileDescriptor.java
│           │                           ├── LogfileDescriptorProvider.java
│           │                           ├── LogfileDumpView.java
│           │                           ├── LogfileDumpViewProvider.java
│           │                           ├── LogfileProvider.java
│           │                           └── LogfileSupport.java
│           └── resources/
│               └── net/
│                   └── java/
│                       └── dev/
│                           └── tda/
│                               └── visualvm/
│                                   └── logfile/
│                                       ├── Bundle.properties
│                                       └── layer.xml
└── visualvm-module/
    ├── manifest.mf
    ├── pom.xml
    └── src/
        └── main/
            ├── java/
            │   └── net/
            │       └── java/
            │           └── dev/
            │               └── tda/
            │                   └── visualvm/
            │                       ├── Install.java
            │                       ├── TDAView.java
            │                       ├── TDAViewProvider.java
            │                       ├── VisualvmOptionsCategory.java
            │                       └── VisualvmOptionsPanelController.java
            └── resources/
                └── net/
                    └── java/
                        └── dev/
                            └── tda/
                                └── visualvm/
                                    ├── Bundle.properties
                                    └── layer.xml

================================================
FILE CONTENTS
================================================

================================================
FILE: .github/copilot-instructions.md
================================================
# Copilot Review Instructions: TDA - Thread Dump Analyzer

You are reviewing **TDA (Thread Dump Analyzer)**, a Java-based desktop application using **Swing**. TDA is designed to parse and visualize complex Java thread dumps to identify deadlocks, resource contention, and performance bottlenecks.

## Core Technical Principles

### 1. Concurrency & Swing (EDT)
- **Responsiveness:** Ensure that long-running parsing or analysis tasks are NEVER executed on the Event Dispatch Thread (EDT). Use `SwingWorker` or an equivalent background execution mechanism.
- **UI Updates:** Ensure all updates to Swing components are wrapped in `SwingUtilities.invokeLater` if triggered from background threads.

### 2. Memory & Performance
- **Large Files:** Thread dumps can be massive (hundreds of MBs). Prefer streaming and incremental parsing over loading entire files into memory.
- **Object Lifecycle:** Watch for memory leaks in listeners and static collections, especially when opening and closing multiple dump files.

### 3. Parsing Logic (The Core)
- **Accuracy:** The parsing logic for thread states (RUNNABLE, BLOCKED, WAITING) must strictly follow JVM specifications.
- **Robustness:** Handle malformed or truncated thread dumps gracefully without crashing the UI. Provide meaningful error messages to the user.

### 4. Swing UI Best Practices
- **Look & Feel:** Maintain consistency with existing UI components.
- **Layouts:** Prefer `MigLayout` or `GridBagLayout` for complex forms to ensure resizability. Avoid absolute positioning.
- **Accessibility:** Ensure components have appropriate tooltips and mnemonic keys where applicable.

## Review Focus Areas
- **Deadlock Detection:** Double-check the logic that identifies circular dependencies in monitor locks.
- **Regex Performance:** Ensure that regular expressions used for log parsing are optimized and protected against Catastrophic Backtracking.
- **Clean Code:** Enforce Java 11+ coding standards (or the specific version TDA uses), focusing on readability and modularity.

## Communication Style
- Be concise and technical.
- If suggesting a change, explain the impact on performance or thread safety.
- Use code snippets for refactoring suggestions.

================================================
FILE: .github/workflows/build.yml
================================================
name: Java CI with Maven

on:
  push:
    branches: [ "*" ]
    paths-ignore:
      - 'README.md'
      - 'CHANGELOG.md'
      - 'renovate.json'
      - 'docs/**'
      - 'tda-main-screen.png'
  pull_request:
    branches: [ "*" ]
    paths-ignore:
      - 'README.md'
      - 'CHANGELOG.md'
      - 'renovate.json'
      - 'docs/**'
      - 'tda-main-screen.png'

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
    
    - name: Set up JDK 17
      uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5
      with:
        java-version: '17'
        distribution: 'temurin'
        cache: maven
        
    - name: Build with Maven
      run: mvn -B package --file pom.xml


================================================
FILE: .github/workflows/pages.yml
================================================
name: Deploy GitHub Pages

on:
  push:
    branches: [ "main" ]
    paths:
      - 'docs/**'
  workflow_dispatch:

permissions:
  contents: read
  pages: write
  id-token: write

concurrency:
  group: "pages"
  cancel-in-progress: false

jobs:
  deploy:
    environment:
      name: github-pages
      url: ${{ steps.deployment.outputs.page_url }}
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
      - name: Setup Pages
        uses: actions/configure-pages@v6
      - name: Upload artifact
        uses: actions/upload-pages-artifact@v4
        with:
          path: './docs'
      - name: Deploy to GitHub Pages
        id: deployment
        uses: actions/deploy-pages@v5


================================================
FILE: .github/workflows/release.yml
================================================
name: Release

on:
  push:
    tags:
      - '[0-9]+.[0-9]+*'

jobs:
  build-macos:
    name: Build macOS Binary
    runs-on: macos-latest
    permissions:
      contents: write

    steps:
      - name: Checkout code
        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6

      - name: Set up JDK 17
        uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5
        with:
          java-version: '17'
          distribution: 'temurin'
          cache: 'maven'

      - name: Build macOS Binary
        run: |
          mvn clean package -Prelease -DskipTests -pl tda,tda-macos-binary -am

      - name: Upload macOS Binary to Release
        uses: softprops/action-gh-release@153bb8e04406b158c6c84fc1615b65b24149a1fe # v2
        with:
          draft: true
          files: |
            tda-macos-binary/target/dist/*.dmg
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

  build-linux:
    name: Build and Release
    runs-on: ubuntu-latest
    permissions:
      contents: write

    steps:
      - name: Checkout code
        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6

      - name: Set up JDK 17
        uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5
        with:
          java-version: '17'
          distribution: 'temurin'
          cache: 'maven'

      - name: Build with Maven
        run: mvn clean package -DskipTests

      - name: Create Release
        id: create_release
        uses: softprops/action-gh-release@153bb8e04406b158c6c84fc1615b65b24149a1fe # v2
        with:
          draft: true
          files: |
            tda/target/tda-*.jar
            visualvm-lib-component/target/*.nbm
            visualvm-logfile-component/target/*.nbm
            visualvm-module/target/*.nbm
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}


================================================
FILE: .gitignore
================================================
target/
*.class
*.jar
*.war
*.ear

# IntelliJ IDEA
.idea/
*.iml
*.iws
*.ipr
out/

# NetBeans (just in case some remain or are recreated)
nbproject/private/
build/
nbbuild/
dist/
nbdist/
nbactions.xml
nb-configuration.xml

# Eclipse
.settings/
.classpath
.project
.metadata/

# MacOS
.DS_Store

# Temporary files
.output.txt

================================================
FILE: CHANGELOG.md
================================================
# Changelog

All notable changes to TDA (Thread Dump Analyzer) will be documented in this file.

## [3.0]
### Features
- Introduced logging for easier debugging in MCP mode, added red dot in UI mode if error occurred with tooltip to check logfile.
- Experimental support for JSON based jmap thread dumps.
- Support for SMR parsing in thread dumps (Java 11+)
- Detect stuck Carrier Threads used by Virtual Threads in Java 21+ thread dumps.
- Extended MCP Server for fetching pinned Carrier Threads.
- Added a method to the MCP Server to enable the Agent to fetch a list of threads which are running in native code, including library information if available.
- Reworked the thread dump summary to provide information in a more compact way.
- MacOS Binary is now provided.
- Use FlatLaf for a modern look and feel.

### Bugfixes
- Fixed address range parsing in thread titles for newer JVMs.
- Fixed missing `protocolVersion` in MCP, which broke the Cursor Integration.

## [2.6]
### Features
- TDA now is compiled with JDK 11, it requires Java 11 or higher to run, but still supports thread dumps from older JDKs.
- Fixed issue #23: fixed long running thread detection with Java 11+.
- The whole build now is based on maven, no more Netbeans needed for building.
- Biggest new feature: include a mcp server for thread dump parsing from AI Agents.

## [2.5]
### Features
- Added support for Java Virtual Threads (Project Loom) introduced in Java 19+
- Can parse and analyze thread dumps containing virtual threads
- Provides insights into virtual thread states and carrier thread relationships
- Identifies virtual thread pinning issues
- Updated parsing to handle Java 21 thread dump format

## [2.4]
- Compiled using JDK 1.8 so Source Level now is 1.8
- Fixed #20: updated tda visual vm plugin to Visual VM 2.0
- Fixed #21: fixed parsing of jdk 11 thread dumps.
- Fixed colors for dark UIs
- `tda.sh` can now be called from everywhere

## [2.3]
- Fixed locked main screen after closing a dialog using (x)
- Use System Toolbar on MacOS.
- Fixed crash in filters and categories.
- Fixed missing "Add Logfile" Link in VisualVM if running on Windows.
- Don't do any L&F changes if in plugin mode (JConsole or VisualVM)
- Fixed broken init of native FileChooser Dialog.
- Fixed crash while exiting the app.
- Fixed font size problem in VisualVM plugin.
- Removed obsolete Forum Link.

## [2.2]
- Added Drag and Drop of logfiles (GitHub Issue 1)
- Use native File Dialog (GitHub Issue 1)
- Fixed parsing of Java 8 Thread Dumps (GitHub Issue 6)
- Fixed Crash in logfile parsing (Github Issue 2)
- Fixed dumping of blocked threads in jconsole plugin.
- Fixed issue TDA-31: class cast exception in predefined categories fallback.
- Fixed issue TDA-35: improved unix shell script.

## [2.1]
- Implemented Issue 9: now parked threads using java.lang.concurrent are recognized.
- Fixed Issue 26: no more lost filters in categories. Thanks to Robert Whitehurst.
- Fixed Issue 27: Improved memory footprint, now parsed thread dump use about 20% less memory.
- Fixed Issue 29: Closing of log files now works on windows.
- Fixed Issue 30: Opening from welcome page now works on windows.
- Fixed HTML if JDK 5.x is used.
- Small Adjustments and Fixes.

## [2.0]
- Added last line parsed to the error message if an error occurs during parsing.
- Fixed Issue 22, check for null if diffing dumps.
- Fixed Issue 23, fixed parsing of remote VisualVM Dumps.
- Fixes Issue 24, fixed parsing of monitors in VisualVM Dumps.
- Bugfixing.

## [1.6]
- Tool now is available as VisualVM plugin.
- Skip broken thread dumps.
- Custom Thread Categories.
- New Welcome Screen.
- Small Adjustments to support SAP JVM Dumps (slightly modified from SUN Dumps).
- Small Adjustments to support HP JVM Dumps (slightly modified from SUN Dumps).
- Icons of monitors with high contention now have a red background (issue 13).
- Multiple Selection of Threads (issue 11).
- Stack line count is now also set in long running thread result (issue 19).
- Read heap information from Sun JDK 1.6 Dumps and display them.
- Thread Dumps or logfiles can be pasted from clipboard (issue 20).
- Internationalisation (only english available so far, not finished yet).
- Extended Help, now uses javahelp.
- Bugfixing.

## [1.5]
- Added new filter rule "stack line count greater as".
- Added clipboard operation in logfile view.
- Enhanced Monitor View, added expand all nodes and sort by thread count to popup.
- Added View operations for root tree.
- Added Drag and Drop for new files to open.
- Threads are now displayed in a table, the thread ids and native ids are transferred from hexadecimal to decimal.
- Date parsing for Sun JDK 1.6 time stamps is added as default regex.
- Bugfixed and reworked long running thread detection.
- Extended Help Overview.
- Bugfixing.

## [1.4]
- Added jconsole plugin support, TDA can now be used as jconsole plugin.
- Added ability to request thread dumps via JMX if running as jconsole plugin.
- JMX Dumps can be saved into logfile for later offline usage.
- Session now can be stored to disk (and loaded again).
- Extended help overview.
- Major code cleanup.
- Improved memory footprint.
- Added splash-screen (JDK 1.6 only).
- Bugfixing.

## [1.3]
- Full logfile is added as node (loaded up to specified size).
- Added Thread Dump navigation into logfile.
- Improved Deadlock analysis, additional hints concerning deadlocks found be JVM.
- Fixed Issue 5.
- Added toolbar (can be switched off).
- Improved GTK Display for recent JDKs.
- Bugfixing.

## [1.2]
- Improved Dump navigation.
- Added context sensitive information about dumps.
- Added jstack support.
- Refactored Monitor-Display (threads now are only displayed once).
- Bugfixing.

## [1.1]
- Ability to filter the threads display to be able to ignore e.g. idle threads.
- Improved gui layout for better navigation (three pane view instead of two).
- Added 1.5 and 1.6 parsing of thread dumps.
- Opened Logfiles can be closed now.
- Reworked help.
- Links in help now open in external browser.
- Added Forum link to help menu.
- Improved GUI with better native Integration.
- Added Webstart Deployment for easy installation.
- Some font hacks to use GTK as native L&F on Linux and JDK 1.6.
- Bugfixing.

## [1.0]
- Ability to open more than one logfile at a time.
- History of recent opened files.
- Multiple regex for date parsing in settings (but only one active).
- Bugfixing.


================================================
FILE: LICENSE
================================================
                  GNU LESSER GENERAL PUBLIC LICENSE
                       Version 2.1, February 1999

 Copyright (C) 1991, 1999 Free Software Foundation, Inc.
 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.

(This is the first released version of the Lesser GPL.  It also counts
 as the successor of the GNU Library Public License, version 2, hence
 the version number 2.1.)

                            Preamble

  The licenses for most software are designed to take away your
freedom to share and change it.  By contrast, the GNU General Public
Licenses are intended to guarantee your freedom to share and change
free software--to make sure the software is free for all its users.

  This license, the Lesser General Public License, applies to some
specially designated software packages--typically libraries--of the
Free Software Foundation and other authors who decide to use it.  You
can use it too, but we suggest you first think carefully about whether
this license or the ordinary General Public License is the better
strategy to use in any particular case, based on the explanations below.

  When we speak of free software, we are referring to freedom of use,
not price.  Our General Public Licenses are designed to make sure that
you have the freedom to distribute copies of free software (and charge
for this service if you wish); that you receive source code or can get
it if you want it; that you can change the software and use pieces of
it in new free programs; and that you are informed that you can do
these things.

  To protect your rights, we need to make restrictions that forbid
distributors to deny you these rights or to ask you to surrender these
rights.  These restrictions translate to certain responsibilities for
you if you distribute copies of the library or if you modify it.

  For example, if you distribute copies of the library, whether gratis
or for a fee, you must give the recipients all the rights that we gave
you.  You must make sure that they, too, receive or can get the source
code.  If you link other code with the library, you must provide
complete object files to the recipients, so that they can relink them
with the library after making changes to the library and recompiling
it.  And you must show them these terms so they know their rights.

  We protect your rights with a two-step method: (1) we copyright the
library, and (2) we offer you this license, which gives you legal
permission to copy, distribute and/or modify the library.

  To protect each distributor, we want to make it very clear that
there is no warranty for the free library.  Also, if the library is
modified by someone else and passed on, the recipients should know
that what they have is not the original version, so that the original
author's reputation will not be affected by problems that might be
introduced by others.

  Finally, software patents pose a constant threat to the existence of
any free program.  We wish to make sure that a company cannot
effectively restrict the users of a free program by obtaining a
restrictive license from a patent holder.  Therefore, we insist that
any patent license obtained for a version of the library must be
consistent with the full freedom of use specified in this license.

  Most GNU software, including some libraries, is covered by the
ordinary GNU General Public License.  This license, the GNU Lesser
General Public License, applies to certain designated libraries, and
is quite different from the ordinary General Public License.  We use
this license for certain libraries in order to permit linking those
libraries into non-free programs.

  When a program is linked with a library, whether statically or using
a shared library, the combination of the two is legally speaking a
combined work, a derivative of the original library.  The ordinary
General Public License therefore permits such linking only if the
entire combination fits its criteria of freedom.  The Lesser General
Public License permits more lax criteria for linking other code with
the library.

  We call this license the "Lesser" General Public License because it
does Less to protect the user's freedom than the ordinary General
Public License.  It also provides other free software developers Less
of an advantage over competing non-free programs.  These disadvantages
are the reason we use the ordinary General Public License for many
libraries.  However, the Lesser license provides advantages in certain
special circumstances.

  For example, on rare occasions, there may be a special need to
encourage the widest possible use of a certain library, so that it becomes
a de-facto standard.  To achieve this, non-free programs must be
allowed to use the library.  A more frequent case is that a free
library does the same job as widely used non-free libraries.  In this
case, there is little to gain by limiting the free library to free
software only, so we use the Lesser General Public License.

  In other cases, permission to use a particular library in non-free
programs enables a greater number of people to use a large body of
free software.  For example, permission to use the GNU C Library in
non-free programs enables many more people to use the whole GNU
operating system, as well as its variant, the GNU/Linux operating
system.

  Although the Lesser General Public License is Less protective of the
users' freedom, it does ensure that the user of a program that is
linked with the Library has the freedom and the wherewithal to run
that program using a modified version of the Library.

  The precise terms and conditions for copying, distribution and
modification follow.  Pay close attention to the difference between a
"work based on the library" and a "work that uses the library".  The
former contains code derived from the library, whereas the latter must
be combined with the library in order to run.

                  GNU LESSER GENERAL PUBLIC LICENSE
   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

  0. This License Agreement applies to any software library or other
program which contains a notice placed by the copyright holder or
other authorized party saying it may be distributed under the terms of
this Lesser General Public License (also called "this License").
Each licensee is addressed as "you".

  A "library" means a collection of software functions and/or data
prepared so as to be conveniently linked with application programs
(which use some of those functions and data) to form executables.

  The "Library", below, refers to any such software library or work
which has been distributed under these terms.  A "work based on the
Library" means either the Library or any derivative work under
copyright law: that is to say, a work containing the Library or a
portion of it, either verbatim or with modifications and/or translated
straightforwardly into another language.  (Hereinafter, translation is
included without limitation in the term "modification".)

  "Source code" for a work means the preferred form of the work for
making modifications to it.  For a library, complete source code means
all the source code for all modules it contains, plus any associated
interface definition files, plus the scripts used to control compilation
and installation of the library.

  Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope.  The act of
running a program using the Library is not restricted, and output from
such a program is covered only if its contents constitute a work based
on the Library (independent of the use of the Library in a tool for
writing it).  Whether that is true depends on what the Library does
and what the program that uses the Library does.

  1. You may copy and distribute verbatim copies of the Library's
complete source code as you receive it, in any medium, provided that
you conspicuously and appropriately publish on each copy an
appropriate copyright notice and disclaimer of warranty; keep intact
all the notices that refer to this License and to the absence of any
warranty; and distribute a copy of this License along with the
Library.

  You may charge a fee for the physical act of transferring a copy,
and you may at your option offer warranty protection in exchange for a
fee.

  2. You may modify your copy or copies of the Library or any portion
of it, thus forming a work based on the Library, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:

    a) The modified work must itself be a software library.

    b) You must cause the files modified to carry prominent notices
    stating that you changed the files and the date of any change.

    c) You must cause the whole of the work to be licensed at no
    charge to all third parties under the terms of this License.

    d) If a facility in the modified Library refers to a function or a
    table of data to be supplied by an application program that uses
    the facility, other than as an argument passed when the facility
    is invoked, then you must make a good faith effort to ensure that,
    in the event an application does not supply such function or
    table, the facility still operates, and performs whatever part of
    its purpose remains meaningful.

    (For example, a function in a library to compute square roots has
    a purpose that is entirely well-defined independent of the
    application.  Therefore, Subsection 2d requires that any
    application-supplied function or table used by this function must
    be optional: if the application does not supply it, the square
    root function must still compute square roots.)

These requirements apply to the modified work as a whole.  If
identifiable sections of that work are not derived from the Library,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works.  But when you
distribute the same sections as part of a whole which is a work based
on the Library, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote
it.

Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Library.

In addition, mere aggregation of another work not based on the Library
with the Library (or with a work based on the Library) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.

  3. You may opt to apply the terms of the ordinary GNU General Public
License instead of this License to a given copy of the Library.  To do
this, you must alter all the notices that refer to this License, so
that they refer to the ordinary GNU General Public License, version 2,
instead of to this License.  (If a newer version than version 2 of the
ordinary GNU General Public License has appeared, then you can specify
that version instead if you wish.)  Do not make any other change in
these notices.

  Once this change is made in a given copy, it is irreversible for
that copy, so the ordinary GNU General Public License applies to all
subsequent copies and derivative works made from that copy.

  This option is useful when you wish to copy part of the code of
the Library into a program that is not a library.

  4. You may copy and distribute the Library (or a portion or
derivative of it, under Section 2) in object code or executable form
under the terms of Sections 1 and 2 above provided that you accompany
it with the complete corresponding machine-readable source code, which
must be distributed under the terms of Sections 1 and 2 above on a
medium customarily used for software interchange.

  If distribution of object code is made by offering access to copy
from a designated place, then offering equivalent access to copy the
source code from the same place satisfies the requirement to
distribute the source code, even though third parties are not
compelled to copy the source along with the object code.

  5. A program that contains no derivative of any portion of the
Library, but is designed to work with the Library by being compiled or
linked with it, is called a "work that uses the Library".  Such a
work, in isolation, is not a derivative work of the Library, and
therefore falls outside the scope of this License.

  However, linking a "work that uses the Library" with the Library
creates an executable that is a derivative of the Library (because it
contains portions of the Library), rather than a "work that uses the
library".  The executable is therefore covered by this License.
Section 6 states terms for distribution of such executables.

  When a "work that uses the Library" uses material from a header file
that is part of the Library, the object code for the work may be a
derivative work of the Library even though the source code is not.
Whether this is true is especially significant if the work can be
linked without the Library, or if the work is itself a library.  The
threshold for this to be true is not precisely defined by law.

  If such an object file uses only numerical parameters, data
structure layouts and accessors, and small macros and small inline
functions (ten lines or less in length), then the use of the object
file is unrestricted, regardless of whether it is legally a derivative
work.  (Executables containing this object code plus portions of the
Library will still fall under Section 6.)

  Otherwise, if the work is a derivative of the Library, you may
distribute the object code for the work under the terms of Section 6.
Any executables containing that work also fall under Section 6,
whether or not they are linked directly with the Library itself.

  6. As an exception to the Sections above, you may also combine or
link a "work that uses the Library" with the Library to produce a
work containing portions of the Library, and distribute that work
under terms of your choice, provided that the terms permit
modification of the work for the customer's own use and reverse
engineering for debugging such modifications.

  You must give prominent notice with each copy of the work that the
Library is used in it and that the Library and its use are covered by
this License.  You must supply a copy of this License.  If the work
during execution displays copyright notices, you must include the
copyright notice for the Library among them, as well as a reference
directing the user to the copy of this License.  Also, you must do one
of these things:

    a) Accompany the work with the complete corresponding
    machine-readable source code for the Library including whatever
    changes were used in the work (which must be distributed under
    Sections 1 and 2 above); and, if the work is an executable linked
    with the Library, with the complete machine-readable "work that
    uses the Library", as object code and/or source code, so that the
    user can modify the Library and then relink to produce a modified
    executable containing the modified Library.  (It is understood
    that the user who changes the contents of definitions files in the
    Library will not necessarily be able to recompile the application
    to use the modified definitions.)

    b) Use a suitable shared library mechanism for linking with the
    Library.  A suitable mechanism is one that (1) uses at run time a
    copy of the library already present on the user's computer system,
    rather than copying library functions into the executable, and (2)
    will operate properly with a modified version of the library, if
    the user installs one, as long as the modified version is
    interface-compatible with the version that the work was made with.

    c) Accompany the work with a written offer, valid for at
    least three years, to give the same user the materials
    specified in Subsection 6a, above, for a charge no more
    than the cost of performing this distribution.

    d) If distribution of the work is made by offering access to copy
    from a designated place, offer equivalent access to copy the above
    specified materials from the same place.

    e) Verify that the user has already received a copy of these
    materials or that you have already sent this user a copy.

  For an executable, the required form of the "work that uses the
Library" must include any data and utility programs needed for
reproducing the executable from it.  However, as a special exception,
the materials to be distributed need not include anything that is
normally distributed (in either source or binary form) with the major
components (compiler, kernel, and so on) of the operating system on
which the executable runs, unless that component itself accompanies
the executable.

  It may happen that this requirement contradicts the license
restrictions of other proprietary libraries that do not normally
accompany the operating system.  Such a contradiction means you cannot
use both them and the Library together in an executable that you
distribute.

  7. You may place library facilities that are a work based on the
Library side-by-side in a single library together with other library
facilities not covered by this License, and distribute such a combined
library, provided that the separate distribution of the work based on
the Library and of the other library facilities is otherwise
permitted, and provided that you do these two things:

    a) Accompany the combined library with a copy of the same work
    based on the Library, uncombined with any other library
    facilities.  This must be distributed under the terms of the
    Sections above.

    b) Give prominent notice with the combined library of the fact
    that part of it is a work based on the Library, and explaining
    where to find the accompanying uncombined form of the same work.

  8. You may not copy, modify, sublicense, link with, or distribute
the Library except as expressly provided under this License.  Any
attempt otherwise to copy, modify, sublicense, link with, or
distribute the Library is void, and will automatically terminate your
rights under this License.  However, parties who have received copies,
or rights, from you under this License will not have their licenses
terminated so long as such parties remain in full compliance.

  9. You are not required to accept this License, since you have not
signed it.  However, nothing else grants you permission to modify or
distribute the Library or its derivative works.  These actions are
prohibited by law if you do not accept this License.  Therefore, by
modifying or distributing the Library (or any work based on the
Library), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Library or works based on it.

  10. Each time you redistribute the Library (or any work based on the
Library), the recipient automatically receives a license from the
original licensor to copy, distribute, link with or modify the Library
subject to these terms and conditions.  You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties with
this License.

  11. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License.  If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Library at all.  For example, if a patent
license would not permit royalty-free redistribution of the Library by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Library.

If any portion of this section is held invalid or unenforceable under any
particular circumstance, the balance of the section is intended to apply,
and the section as a whole is intended to apply in other circumstances.

It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system which is
implemented by public license practices.  Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.

This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.

  12. If the distribution and/or use of the Library is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Library under this License may add
an explicit geographical distribution limitation excluding those countries,
so that distribution is permitted only in or among countries not thus
excluded.  In such case, this License incorporates the limitation as if
written in the body of this License.

  13. The Free Software Foundation may publish revised and/or new
versions of the Lesser General Public License from time to time.
Such new versions will be similar in spirit to the present version,
but may differ in detail to address new problems or concerns.

Each version is given a distinguishing version number.  If the Library
specifies a version number of this License which applies to it and
"any later version", you have the option of following the terms and
conditions either of that version or of any later version published by
the Free Software Foundation.  If the Library does not specify a
license version number, you may choose any version ever published by
the Free Software Foundation.

  14. If you wish to incorporate parts of the Library into other free
programs whose distribution conditions are incompatible with these,
write to the author to ask for permission.  For software which is
copyrighted by the Free Software Foundation, write to the Free
Software Foundation; we sometimes make exceptions for this.  Our
decision will be guided by the two goals of preserving the free status
of all derivatives of our free software and of promoting the sharing
and reuse of software generally.

                            NO WARRANTY

  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
DAMAGES.

                     END OF TERMS AND CONDITIONS

           How to Apply These Terms to Your New Libraries

  If you develop a new library, and you want it to be of the greatest
possible use to the public, we recommend making it free software that
everyone can redistribute and change.  You can do so by permitting
redistribution under these terms (or, alternatively, under the terms of the
ordinary General Public License).

  To apply these terms, attach the following notices to the library.  It is
safest to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least the
"copyright" line and a pointer to where the full notice is found.

    {description}
    Copyright (C) {year} {fullname}

    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Lesser General Public
    License as published by the Free Software Foundation; either
    version 2.1 of the License, or (at your option) any later version.

    This library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public
    License along with this library; if not, write to the Free Software
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301
    USA

Also add information on how to contact you by electronic and paper mail.

You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the library, if
necessary.  Here is a sample; alter the names:

  Yoyodyne, Inc., hereby disclaims all copyright interest in the
  library `Frob' (a library for tweaking knobs) written by James Random
  Hacker.

  {signature of Ty Coon}, 1 April 1990
  Ty Coon, President of Vice

That's all there is to it!


================================================
FILE: README.md
================================================
[![Java CI with Maven](https://github.com/irockel/tda/actions/workflows/build.yml/badge.svg)](https://github.com/irockel/tda/actions/workflows/build.yml)
[![Renovate](https://img.shields.io/badge/renovate-enabled-brightgreen.svg)](https://github.com/irockel/tda/issues?q=is%3Aissue+is%3Aopen+label%3Adependencies)
[![Dependencies](https://img.shields.io/librariesio/github/irockel/tda)](https://libraries.io/github/irockel/tda)
[![License](https://img.shields.io/github/license/irockel/tda)](LICENSE)

# TDA - Thread Dump Analyzer

> [!IMPORTANT]
> **2026-01-30 - TDA 3.0 is now available!** 🚀
> This major release brings significant enhancements:
> *   **Extended MCP Server**: Now with **Carrier Thread Pinning** detection and support for **SMR (Safe Memory Relocation)** parsing.
> *   **Modernized UI**: Completely refreshed look and feel using **FlatLaf**.
> *   **Usability Improvements**: Fixed several long-standing issues, including improved split-pane management and faster parsing.
> *   **Native macOS Support**: Now providing a dedicated macOS binary.
> *   **Logging**: Especially for troubleshooting in MCP Mode.

TDA (Thread Dump Analyzer) for Java is a powerful yet lightweight Swing GUI and **MCP Server** for analyzing Thread Dumps and Heap 
Information generated by the Java VM. It is designed to assist in diagnosing performance issues, deadlocks, and 
memory problems in Java applications. With its MCP capabilities, TDA can be seamlessly integrated into AI-powered 
development workflows.

TDA supports Java 1.4.x through Java 21+, including specialized support for **Virtual Threads** (Java 19+) and **JSON-based thread dumps** 
(Java 21+, experimental).

## 📋 Table of Contents
- [🚀 Key Features](#-key-features)
- [📦 Installation](#-installation)
  - [1. Self-contained JAR](#1-self-contained-jar)
  - [2. VisualVM Plugin](#2-visualvm-plugin)
  - [3. macOS Binary (DMG)](#3-macos-binary-dmg)
- [🛠 Usage Modes](#-usage-modes)
  - [1. Standalone Application](#1-standalone-application)
  - [2. JConsole Plugin](#2-jconsole-plugin)
  - [3. VisualVM Plugin](#3-visualvm-plugin-1)
  - [4. JSON-based Thread Dumps (Experimental)](#4-json-based-thread-dumps-experimental)
  - [5. MCP Server (Headless Analysis)](#5-mcp-server-headless-analysis)
- [🏗 Building from Source](#-building-from-source)
- [🛠️ Troubleshooting](#-troubleshooting)
- [📜 Changelog](CHANGELOG.md)
- [📜 License](LICENSE)

## 🚀 Key Features

*   **Comprehensive Thread Dump Parsing**: Parse multiple thread dumps from log files and display them in an intuitive tree structure.
*   **Virtual Threads Support**: Analyze virtual thread states, pinning issues, and carrier thread relationships.
*   **Statistical Analysis**: Detailed statistics about thread states, monitors, and waiting/locking threads.
*   **Long-Running Thread Detection**: Identify threads that persist across multiple dumps, helping find "hung" or inefficient code.
*   **Deadlock Detection**: Automatic identification of deadlocks with detailed monitor information.
*   **JSON-based Thread Dumps**: Support for parsing JSON-formatted thread dumps created with `jcmd <pid> Thread.dump_to_file -format=json <file>`.
    *Note: JSON dumps currently provide basic information (name, tid, stack trace) but lack details like thread states or native IDs. For comprehensive analysis, textual dumps are recommended.*
*   **Class Histogram Analysis**: Integrated analysis of heap objects (via `-XX:+PrintClassHistogram`).
*   **Flexible Filtering & Categorization**: Use custom filters and categories to manage large numbers of threads.
*   **Model Context Protocol (MCP) Support**: Headless analysis mode for integration with AI tools like Cursor, Junie, or Claude Desktop.
*   **Session Management**: Save and reopen analysis sessions.

---

## 📦 Installation

TDA can be installed or used in several ways:

### 1. Self-contained JAR
The simplest way to use TDA is to download the `tda.jar` from the **Releases** page. Since it's a self-contained JAR, you can run it directly on any system with Java installed.

### 2. VisualVM Plugin
TDA is available as a plugin for VisualVM. You can install it directly from the **VisualVM Plugin Center** (Tools -> Plugins). 
This integrates TDA's analysis capabilities directly into your VisualVM environment. The last available version in the plugin center is 2.4. 
For installing the recent version, download the three nbm files from the Releases page and install them manually in the VisualVM plugins settings.

### 3. macOS Binary (DMG)
TDA provides a native macOS DMG package for easier installation. This package includes its own Java runtime, so no separate Java installation is required to run it.

#### Installation (Unsigned Binary)
Since the DMG is currently unsigned, macOS will block it by default with a warning that the "developer cannot be verified". To install and run TDA:

1.  Download the `TDA-<version>.dmg` from the Releases page.
2.  Open the DMG and drag **TDA.app** to your **Applications** folder.
3.  **Right-click** (or Control-click) on `TDA.app` in your Applications folder and select **Open**.
4.  A dialog will appear asking if you are sure you want to open it. Click **Open**. 
5.  After this first launch, you can open TDA normally from Launchpad or Spotlight.

If this fails, you might need to confirm the installation from the system settings. For this just follow the instructions after clicking on the '?' Icon on the upper right corner of the error dialog.

---

## 🛠 Usage Modes

TDA can be used in four different ways to suit your environment:

### 1. Standalone Application
The most common way to use TDA for offline analysis of production log files. (See **[Installation](#1-self-contained-jar)** for how to get the JAR).

**How to run:**
```bash
java -Xmx512m -jar tda.jar
```
Once opened, you can add log files containing thread dumps. TDA will parse them and display them in the tree view. If you
have several or big log files, you might need to adjust the memory allocation by increasing the `-Xmx` flag.

<div style="text-align: center;"><img src="./tda-main-screen.png" alt="TDA Main Screen" width="600"></div>

#### Important Features:
*   **Thread Dump Tree**: Navigate through all detected dumps in a log file.
*   **Regular Expression for Timestamps**: Since thread dumps often lack timestamps, you can provide a regex to correlate dumps with log entries.
*   **Find Long Running Threads**: Compare consecutive dumps to see which threads haven't moved.
*   **Filters & Categories**: Group threads by name or state to reduce noise.
*   **Monitors & Deadlocks**: Detailed view of monitor usage and automatic deadlock detection.

### 2. JConsole Plugin
Analyze a running application directly within JConsole. This is particularly useful for production environments where 
you need to quickly inspect the state of a live system. The plugin is part of the standalone jar, which needs to be downloaded for this.

**How to use:**
Start JConsole with the TDA plugin:
```bash
jconsole -pluginpath tda.jar
```
A new "Thread Dumps" tab will appear. From here, you can:
*   **Request Thread Dumps**: Generate fresh dumps directly from the connected JVM.
*   **Analyze in Real-time**: Use all of TDA's parsing and analysis features on the live data.

### 3. VisualVM Plugin
TDA is also available as a plugin for VisualVM. You can install it directly from the **VisualVM Plugin Center**. 
It provides the same powerful analysis tools integrated into your VisualVM workflow. (See **[Installation](#2-visualvm-plugin)** for details).

### 4. JSON-based Thread Dumps (Experimental)
Newer JDK versions allow generating thread dumps in JSON format using:
```bash
jcmd <pid> Thread.dump_to_file -format=json <file>
```
TDA can parse these files, but please note that the information provided in the JSON format is currently more basic than the traditional textual output. For example, it often lacks detailed thread states (like `MONITOR_WAIT` vs `WAITING`) or native thread IDs (`nid`). 

**Recommendation:** For in-depth analysis of deadlocks, monitor contention, or specific thread states, the **textual thread dump format is still preferred**.

### 5. MCP Server (Headless Analysis)
For integration with AI tools (like Cursor, Junie, or Claude Desktop) or automated pipelines, 
TDA can run as a **Model Context Protocol (MCP)** server. This allows for headless analysis of thread dumps using 
AI assistance. You need to download the standalone jar for this.

There's also an [articel on dev.to](https://dev.to/irockel/stop-reading-raw-stacktraces-ai-powered-java-thread-dump-analysis-with-mcp-4673) about how to use TDA as an MCP server.

#### How to run:
```bash
java -Djava.awt.headless=true -jar tda.jar --mcp
```

#### Integration Example (Junie/Cursor):
```json
{
  "mcpServers": {
    "tda": {
      "command": "java",
      "args": ["-Djava.awt.headless=true", "-jar", "path/to/tda.jar", "--mcp"]
    }
  }
}
```

#### Available Tools

The MCP server exposes the following tools:

| Tool                | Arguments                 | Description                                                                                    |
|:--------------------|:--------------------------|:-----------------------------------------------------------------------------------------------|
| `parse_log`         | `path` (string, required) | Parses a log file containing Java thread dumps. This must be the first action for a log file.  |
| `get_summary`       | None                      | Returns a summary of all parsed thread dumps (index, name, timestamp, thread/deadlock counts). |
| `check_deadlocks`   | None                      | Checks for and returns information about any deadlocks detected in the parsed thread dumps.    |
| `find_long_running` | None                      | Identifies threads that remain in the same state/stack trace across consecutive dumps.         |
| `analyze_virtual_threads` | None                  | Detects virtual threads where the carrier thread is stuck in application code.                |
| `get_native_threads` | `dump_index` (int, required) | Returns a list of all threads in a native method for a specific thread dump.                   |
| `get_zombie_threads` | None                      | Returns a list of zombie threads (unresolved SMR addresses) with timestamps and dump names. |
| `clear`             | None                      | Resets the server state and clears the internal thread store for a new log file.               |

#### 🤖 AI Agent Configuration (Cursor / Junie)

To ensure that AI agents use TDA efficiently and don't attempt to read large log files directly (which is slow and expensive), you should configure a **System Prompt**.

##### Global Configuration (Recommended):
Instead of project-wise rules, you can configure these instructions globally:

*   **Cursor**: Go to **Settings** -> **General** -> **Rules for AI** and add the recommended system prompt there.
*   **Junie**: Create or edit the file `~/.junie/instructions.md` and add the recommended system prompt.

##### Project-wise Configuration:
If you prefer project-specific rules:

*   **Cursor**: Add the recommended system prompt to your `.cursorrules` file in the project root.
*   **Junie**: Add the recommended system prompt to your `.junie/instructions.md` file in the project root.

##### Recommended System Prompt:
```markdown
When you encounter a log file that appears to contain Java thread dumps:
1. DO NOT try to read or "cat" the entire file if it's large.
2. Use the `tda-analyzer` MCP toolset.
3. First, call `parse_log(path="...")` to initialize the analysis.
4. Use `get_summary()`, `check_deadlocks()`, `find_long_running()`, `analyze_virtual_threads()`, `get_native_threads()`, and `get_zombie_threads()` to perform the analysis.
5. Provide your insights based on the structured data returned by these tools rather than the raw log text.
```
This configuration makes the analysis much faster and significantly reduces token usage.

---

## 🏗 Building from Source

TDA is built using Maven. It requires **Java 11** or higher to build and run.

```bash
mvn clean package
```
This will build all components:
*   The standalone TDA JAR (in `tda/target/tda-x.x.jar`).
*   The VisualVM plugins as NBM files (in the `target/` directory of each `visualvm-*` module).

To build the macOS DMG package, use the `release` profile (requires macOS and JDK 17+):

```bash
mvn clean package -Prelease
```

The resulting standalone JAR will also be located in the `tda/target/` directory.

---

## 🛠️ Troubleshooting

If you encounter issues while using TDA, check the following sections for guidance.

### 1. Logging
TDA maintains a centralized log file to help diagnose issues. If something isn't working as expected, the log file is the first place to look.

#### Log File Locations
*   **macOS**: `~/Library/Logs/TDA/tda.log`
*   **Windows**: `%LOCALAPPDATA%\TDA\Logs\tda.log`
*   **Linux/Unix**: `~/.tda/logs/tda.log`

#### Error Indicators (UI Mode)
In standalone or plugin mode, TDA will display a **red dot** in the status bar (next to the memory indicator) if a critical error has occurred. Hover over the dot to see a tooltip reminding you to check the log file.

### 2. MCP Server Specifics
Running TDA as a headless MCP server has specific requirements:

*   **Headless Environment**: Ensure you pass `-Djava.awt.headless=true` when running the JAR. TDA is a Swing-based application, and the MCP mode must bypass UI initialization.
*   **Std-in/Std-out Pollution**: The MCP protocol communicates via `stdin` and `stdout`. Avoid using any commands or scripts that print additional information to `stdout`, as this will corrupt the JSON-RPC stream and cause the AI client to lose connection.
*   **Absolute Paths**: When calling `parse_log`, always use **absolute paths** for the log file. The working directory of the MCP server might not be what you expect depending on how your AI client (e.g., Claude Desktop) launches it.
*   **Permissions**: Ensure the user running the AI client has read permissions for the log files being analyzed.

### 3. Memory Management
Thread dumps from large production systems can be hundreds of megabytes. 

*   **OutOfMemoryErrors**: If TDA crashes or fails to parse a large file, increase the heap size using the `-Xmx` flag:
    ```bash
    java -Xmx2g -jar tda.jar
    ```
*   **Max Logfile Size**: TDA has a safety limit for log file sizes. You can adjust this in the **Preferences** dialog (UI mode) or by manually editing the configuration if necessary.

---

## 📜 License
TDA is licensed under the **Lesser GNU General Public License (LGPL)**.

---
*For more detailed information, please refer to the source code. The wiki has been removed because it was outdated.*



================================================
FILE: docs/index.html
================================================
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>TDA - Java Thread Dump Analyzer | Free Open Source Tool</title>
    <meta name="description" content="TDA (Thread Dump Analyzer) is a powerful, free, and open-source tool for parsing and analyzing Java thread dumps. Identify deadlocks, performance bottlenecks, and monitor contention with ease.">
    <meta name="keywords" content="Java, Thread Dump, Analyzer, TDA, Deadlock Detection, Performance Tuning, JVM, VisualVM Plugin, JConsole Plugin, MCP Server, Open Source">
    
    <!-- Open Graph / Facebook -->
    <meta property="og:type" content="website">
    <meta property="og:url" content="https://irockel.github.io/tda/">
    <meta property="og:title" content="TDA - Java Thread Dump Analyzer">
    <meta property="og:description" content="Analyze Java thread dumps effortlessly. Detect deadlocks and performance issues with TDA, the free open-source analyzer.">
    <meta property="og:image" content="https://irockel.github.io/tda/tda-main-screen.png">

    <!-- Twitter -->
    <meta property="twitter:card" content="summary_large_image">
    <meta property="twitter:url" content="https://irockel.github.io/tda/">
    <meta property="twitter:title" content="TDA - Java Thread Dump Analyzer">
    <meta property="twitter:description" content="Analyze Java thread dumps effortlessly. Detect deadlocks and performance issues with TDA, the free open-source analyzer.">
    <meta property="twitter:image" content="https://irockel.github.io/tda/tda-main-screen.png">

    <link rel="canonical" href="https://irockel.github.io/tda/">
    <script src="https://cdn.tailwindcss.com"></script>
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/7.0.1/css/all.min.css">
    <!-- GitHub Buttons -->
    <script async defer src="https://buttons.github.io/buttons.js"></script>
    <style>
        @import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;600;700&display=swap');
        body { font-family: 'Inter', sans-serif; }
        .gradient-bg { background: linear-gradient(135deg, #1e293b 0%, #0f172a 100%); }
    </style>
</head>
<body class="bg-slate-50 text-slate-900">

    <header class="relative text-white pb-20 pt-10 overflow-hidden">
        <!-- Background Image with Overlay -->
        <div class="absolute inset-0 z-0">
            <img src="welcome.png" alt="TDA Welcome Screen Background" class="w-full h-full object-cover">
            <div class="absolute inset-0 bg-slate-900/80"></div>
        </div>

        <nav class="relative z-10 container mx-auto px-6 flex justify-between items-center mb-16">
            <div class="flex items-center space-x-3">
                <img src="TDA.png" alt="TDA - Java Thread Dump Analyzer Logo" class="w-10 h-10 shadow-lg rounded-lg">
                <span class="text-2xl font-bold tracking-tight">TDA</span>
            </div>
            <div class="hidden md:flex space-x-8 items-center">
                <a href="#features" class="hover:text-blue-400 transition">Features</a>
                <a href="https://github.com/irockel/tda#readme" class="hover:text-blue-400 transition">Documentation</a>
                <a href="#download" class="hover:text-blue-400 transition">Download</a>
                <a href="https://github.com/irockel/tda" class="bg-blue-600 hover:bg-blue-700 px-5 py-2 rounded-full font-semibold transition flex items-center">
                    <i class="fab fa-github mr-2"></i> GitHub
                </a>
            </div>
        </nav>

        <div class="relative z-10 container mx-auto px-6 text-center">
            <h1 class="text-4xl md:text-6xl font-extrabold mb-6 leading-tight">
                Analyze Java Thread Dumps <br><span class="text-blue-400">with Ease</span>
            </h1>
            <p class="text-xl text-slate-300 mb-6 max-w-2xl mx-auto">
                TDA (Thread Dump Analyzer) is a powerful tool for parsing and analyzing Java thread dumps, helping you identify performance bottlenecks and deadlocks in seconds.
            </p>
            <!-- TDA 3.0 Announcement Box -->
            <div class="mb-12 inline-block bg-blue-600/30 backdrop-blur-md border border-blue-400/50 rounded-2xl p-6 text-left max-w-3xl mx-auto shadow-2xl">
                <div class="flex items-center mb-4">
                    <span class="bg-blue-500 text-white text-xs font-black px-3 py-1 rounded-full uppercase tracking-wider mr-3">New Release</span>
                    <h2 class="text-2xl font-bold text-white">TDA 3.0 is here! 🚀</h2>
                </div>
                <p class="text-blue-100 mb-4 font-medium">
                    This major update modernizes the TDA experience and brings powerful new analysis capabilities to both the GUI and the MCP server.
                </p>
                <ul class="grid grid-cols-1 md:grid-cols-2 gap-x-6 gap-y-2 text-sm text-slate-200">
                    <li class="flex items-start"><i class="fas fa-check-circle text-blue-400 mt-1 mr-2"></i> <span><b>Carrier Thread Pinning</b> detection in MCP</span></li>
                    <li class="flex items-start"><i class="fas fa-check-circle text-blue-400 mt-1 mr-2"></i> <span><b>SMR (Safe Memory Reclamation)</b> parsing (also in MCP)</span></li>
                    <li class="flex items-start"><i class="fas fa-check-circle text-blue-400 mt-1 mr-2"></i> <span><b>Native Stack Information in MCP</b> parsing</span></li>
                    <li class="flex items-start"><i class="fas fa-check-circle text-blue-400 mt-1 mr-2"></i> <span>Modern UI with <b>FlatLaf</b></span></li>
                    <li class="flex items-start"><i class="fas fa-check-circle text-blue-400 mt-1 mr-2"></i> <span>Improved split-pane & usability fixes</span></li>
                    <li class="flex items-start"><i class="fas fa-check-circle text-blue-400 mt-1 mr-2"></i> <span>Logging for Troubleshooting in MCP Mode</span></li>
                </ul>
            </div>

            <div class="mb-10">
                <span class="inline-flex items-center px-4 py-1.5 rounded-full text-sm font-bold bg-blue-500/20 text-blue-300 border border-blue-500/30">
                    <i class="fas fa-unlock-alt mr-2"></i> Free & Open Source
                </span>
            </div>
            <div class="flex flex-col sm:flex-row justify-center items-center space-y-4 sm:space-y-0 sm:space-x-4">
                <a href="#download" class="bg-blue-600 hover:bg-blue-700 text-white px-8 py-4 rounded-xl font-bold text-lg transition shadow-xl">
                    Get TDA Now
                </a>
                <a href="https://github.com/irockel/tda" class="bg-slate-800 hover:bg-slate-700 text-white px-8 py-4 rounded-xl font-bold text-lg transition border border-slate-700">
                    View Repository
                </a>
            </div>
            <!-- Mobile/Secondary Buttons -->
            <div class="mt-8 flex justify-center items-center space-x-4">
                <div class="flex items-center h-[28px]">
                    <a class="github-button" href="https://github.com/irockel/tda" data-color-scheme="no-preference: dark; light: dark; dark: dark;" data-icon="octicon-star" data-size="large" data-show-count="true" aria-label="Star irockel/tda on GitHub">Star</a>
                </div>
                <div class="flex items-center h-[28px] -translate-y-[3px]">
                    <a href="https://github.com/irockel/tda/releases/latest" class="flex items-center">
                        <img src="https://img.shields.io/github/downloads/irockel/tda/total?color=2563eb&label=downloads&logo=github&style=for-the-badge" alt="GitHub downloads" class="h-[26px]">
                    </a>
                </div>
            </div>
        </div>
    </header>

    <!-- Main Content -->
    <main class="container mx-auto px-6 mt-8">
        <!-- Features -->
        <section id="features" class="mb-24 pt-8">
            <h2 class="text-3xl font-bold text-center mb-16">Why use TDA?</h2>
            <div class="grid md:grid-cols-2 lg:grid-cols-4 gap-12">
                <div class="bg-white p-8 rounded-2xl shadow-sm border border-slate-100 hover:shadow-md transition">
                    <div class="w-12 h-12 bg-blue-100 text-blue-600 rounded-lg flex items-center justify-center mb-6">
                        <i class="fas fa-search text-xl"></i>
                    </div>
                    <h3 class="text-xl font-bold mb-4">Deep Parsing</h3>
                    <p class="text-slate-600">Automatically parses standard thread dumps, including those from Oracle/Sun HotSpot and IBM JVMs.</p>
                </div>
                <div class="bg-white p-8 rounded-2xl shadow-sm border border-slate-100 hover:shadow-md transition">
                    <div class="w-12 h-12 bg-green-100 text-green-600 rounded-lg flex items-center justify-center mb-6">
                        <i class="fas fa-skull-crossbones text-xl"></i>
                    </div>
                    <h3 class="text-xl font-bold mb-4">Deadlock Detection</h3>
                    <p class="text-slate-600">Quickly identifies circular dependencies and locking issues that cause application freezes.</p>
                </div>
                <div class="bg-white p-8 rounded-2xl shadow-sm border border-slate-100 hover:shadow-md transition">
                    <div class="w-12 h-12 bg-purple-100 text-purple-600 rounded-lg flex items-center justify-center mb-6">
                        <i class="fas fa-clock text-xl"></i>
                    </div>
                    <h3 class="text-xl font-bold mb-4">Historical Diff</h3>
                    <p class="text-slate-600">Compare multiple dumps to see thread movement over time and find long-running operations.</p>
                </div>
                <div class="bg-white p-8 rounded-2xl shadow-sm border border-slate-100 hover:shadow-md transition">
                    <div class="w-12 h-12 bg-orange-100 text-orange-600 rounded-lg flex items-center justify-center mb-6">
                        <i class="fas fa-robot text-xl"></i>
                    </div>
                    <h3 class="text-xl font-bold mb-4">AI-Ready MCP Server</h3>
                    <p class="text-slate-600">Integrate with AI agents like Cursor or Claude via the Model Context Protocol for automated analysis.</p>
                </div>
            </div>
        </section>

        <!-- Screenshot -->
        <div class="bg-white rounded-2xl shadow-sm p-2 md:p-4 mb-20 overflow-hidden border border-slate-200">
            <img src="tda-main-screen.png" alt="TDA Main Application Screen showing thread dump analysis" class="rounded-xl w-full h-auto">
        </div>

        <!-- Usage Modes -->
        <section class="mb-24 bg-slate-100 -mx-6 px-6 py-20 rounded-3xl">
            <div class="max-w-4xl mx-auto">
                <h2 class="text-3xl font-bold text-center mb-12">Flexible Usage</h2>
                <div class="space-y-6">
                    <div class="flex items-start space-x-4 bg-white p-6 rounded-xl shadow-sm">
                        <div class="text-blue-600 mt-1"><i class="fas fa-check-circle"></i></div>
                        <div>
                            <h4 class="font-bold">Standalone App</h4>
                            <p class="text-slate-600">Run TDA as a local application for offline analysis of log files.</p>
                        </div>
                    </div>
                    <div class="flex items-start space-x-4 bg-white p-6 rounded-xl shadow-sm">
                        <div class="text-blue-600 mt-1"><i class="fas fa-check-circle"></i></div>
                        <div>
                            <h4 class="font-bold">VisualVM Plugin</h4>
                            <p class="text-slate-600">Integrate directly into your VisualVM workflow for seamless analysis.</p>
                        </div>
                    </div>
                    <div class="flex items-start space-x-4 bg-white p-6 rounded-xl shadow-sm">
                        <div class="text-blue-600 mt-1"><i class="fas fa-check-circle"></i></div>
                        <div>
                            <h4 class="font-bold">JConsole Plugin</h4>
                            <p class="text-slate-600">Analyze running applications in real-time within JConsole.</p>
                        </div>
                    </div>
                    <div class="flex items-start space-x-4 bg-white p-6 rounded-xl shadow-sm">
                        <div class="text-blue-600 mt-1"><i class="fas fa-check-circle"></i></div>
                        <div>
                            <h4 class="font-bold">MCP Server (Headless)</h4>
                            <p class="text-slate-600">Run TDA as a Model Context Protocol server for AI-powered, headless analysis in your terminal or IDE.</p>
                        </div>
                    </div>
                </div>

                <!-- Documentation Hint -->
                <div class="mt-16 bg-blue-50 border border-blue-100 rounded-2xl p-8 text-center">
                    <h3 class="text-xl font-bold mb-4">Need more details?</h3>
                    <p class="text-slate-600 mb-6">
                        Complete documentation, including installation guides, usage examples, and advanced configuration, is available in the project's README.
                    </p>
                    <a href="https://github.com/irockel/tda#readme" class="inline-flex items-center text-blue-600 font-semibold hover:text-blue-700 transition">
                        <i class="fas fa-book-open mr-2"></i> Read the Documentation on GitHub
                    </a>
                </div>
            </div>
        </section>

        <!-- Download Section -->
        <section id="download" class="mb-24 text-center">
            <h2 class="text-3xl font-bold mb-6">Download Latest Version</h2>
            <p class="text-slate-600 mb-12 max-w-xl mx-auto">TDA is available for multiple platforms. Download the one that fits your needs.</p>
            
            <div class="grid md:grid-cols-3 gap-8">
                <!-- JAR -->
                <div class="bg-white p-8 rounded-2xl shadow-lg border-2 border-blue-500 flex flex-col items-center scale-105 relative">
                    <span class="absolute top-0 right-0 bg-blue-500 text-white text-xs px-3 py-1 rounded-bl-lg rounded-tr-xl font-bold uppercase tracking-wider">Recommended</span>
                    <i class="fas fa-file-code text-4xl text-blue-600 mb-4"></i>
                    <h3 class="text-xl font-bold mb-2">Java self-contained JAR</h3>
                    <p class="text-sm text-slate-500 mb-6">Requires Java installed, run with java -jar</p>
                    <a href="https://github.com/irockel/tda/releases/latest" class="w-full bg-blue-600 text-white py-3 rounded-lg font-semibold hover:bg-blue-700 transition">
                        Download JAR
                    </a>
                </div>
                <!-- macOS -->
                <div class="bg-white p-8 rounded-2xl shadow-lg border-2 border-slate-100 flex flex-col items-center">
                    <i class="fab fa-apple text-4xl text-slate-900 mb-4"></i>
                    <h3 class="text-xl font-bold mb-2">macOS App</h3>
                    <p class="text-sm text-slate-500 mb-6">Native DMG with bundled JRE</p>
                    <a href="https://github.com/irockel/tda/releases/latest" class="w-full bg-slate-900 text-white py-3 rounded-lg font-semibold hover:bg-slate-800 transition">
                        Download DMG
                    </a>
                </div>
                <!-- Plugins -->
                <div class="bg-white p-8 rounded-2xl shadow-lg border-2 border-slate-100 flex flex-col items-center">
                    <i class="fas fa-plug text-4xl text-purple-600 mb-4"></i>
                    <h3 class="text-xl font-bold mb-2">IDE Plugins</h3>
                    <p class="text-sm text-slate-500 mb-6">VisualVM & JConsole</p>
                    <a href="https://github.com/irockel/tda/releases/latest" class="w-full bg-slate-900 text-white py-3 rounded-lg font-semibold hover:bg-slate-800 transition">
                        Get Plugins
                    </a>
                </div>
            </div>
        </section>
    </main>

    <!-- Footer -->
    <footer class="bg-slate-900 text-slate-400 py-12">
        <div class="container mx-auto px-6 flex flex-col md:flex-row justify-between items-center">
            <div class="flex items-center space-x-3 mb-6 md:mb-0">
                <img src="TDA.png" alt="TDA - Java Thread Dump Analyzer Icon" class="w-6 h-6 grayscale opacity-50">
                <span class="text-white font-bold tracking-tight">TDA</span>
            </div>
            <div class="text-sm">
                &copy; 2006-2026 Ingo Rockel. Released under the GNU Lesser General Public License (LGPL) 2.1.<br>
                Built with <a href="https://tailwindcss.com" class="hover:text-white transition">Tailwind CSS</a> and <a href="https://fontawesome.com" class="hover:text-white transition">Font Awesome</a>.
            </div>
            <div class="flex space-x-6 mt-6 md:mt-0 text-xl">
                <a href="https://github.com/irockel/tda" class="hover:text-white transition"><i class="fab fa-github"></i></a>
            </div>
        </div>
    </footer>

</body>
</html>


================================================
FILE: pom.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>de.grimmfrost.tda</groupId>
    <artifactId>tda-parent</artifactId>
    <version>3.0</version>
    <packaging>pom</packaging>

    <name>TDA Parent</name>

    <modules>
        <module>tda</module>
        <module>visualvm-lib-component</module>
        <module>visualvm-logfile-component</module>
        <module>visualvm-module</module>
    </modules>

    <profiles>
        <profile>
            <id>release</id>
            <modules>
                <module>tda-macos-binary</module>
            </modules>
        </profile>
    </profiles>

    <repositories>
        <repository>
            <id>netbeans</id>
            <name>NetBeans Repository</name>
            <url>https://repo.maven.apache.org/maven2/</url>
        </repository>
    </repositories>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.release>11</maven.compiler.release>
        <visualvm.version>2.2</visualvm.version>
        <netbeans.version>RELEASE290</netbeans.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>de.grimmfrost.tda</groupId>
                <artifactId>tda</artifactId>
                <version>${project.version}</version>
            </dependency>
            <dependency>
                <groupId>de.grimmfrost.tda</groupId>
                <artifactId>visualvm-lib-component</artifactId>
                <version>${project.version}</version>
            </dependency>
            <dependency>
                <groupId>de.grimmfrost.tda</groupId>
                <artifactId>visualvm-logfile-component</artifactId>
                <version>${project.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.apache.netbeans.utilities</groupId>
                    <artifactId>nbm-maven-plugin</artifactId>
                    <version>14.4</version>
                    <extensions>true</extensions>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-jar-plugin</artifactId>
                    <version>3.5.0</version>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-resources-plugin</artifactId>
                    <version>3.5.0</version>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.15.0</version>
                    <configuration>
                        <compilerArgs>
                            <arg>-proc:none</arg>
                        </compilerArgs>
                    </configuration>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-install-plugin</artifactId>
                    <version>3.1.4</version>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-deploy-plugin</artifactId>
                    <version>3.1.4</version>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>
</project>


================================================
FILE: renovate.json
================================================
{
  "$schema": "https://docs.renovatebot.com/renovate-schema.json",
  "extends": [
    "config:recommended",
    ":separateMajorReleases"
  ],
  "dependencyDashboard": true,
  "packageRules": [
    {
      "description": "Pin digests for custom GitHub Actions, but not official ones",
      "matchManagers": ["github-actions"],
      "excludePackagePatterns": ["^actions/"],
      "pinDigests": true
    },
    {
      "description": "Group minor und patch Updates",
      "matchUpdateTypes": ["minor", "patch"],
      "groupName": "non-major dependencies",
      "schedule": ["before 8am on monday"]
    },
    {
      "description": "Major Updates in isolated PRs",
      "matchUpdateTypes": ["major"],
      "labels": ["major-update", "manual-review"]
    }
  ],
  "vulnerabilityAlerts": {
    "labels": ["security"],
    "assignees": ["irockel"]
  },
  "timezone": "Europe/Berlin"
}


================================================
FILE: tda/dependency-reduced-pom.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <parent>
    <artifactId>tda-parent</artifactId>
    <groupId>de.grimmfrost.tda</groupId>
    <version>3.0</version>
  </parent>
  <modelVersion>4.0.0</modelVersion>
  <artifactId>tda</artifactId>
  <name>TDA</name>
  <description>Thread Dump Analysis Tool</description>
  <build>
    <resources>
      <resource>
        <filtering>true</filtering>
        <directory>src/main/resources</directory>
        <includes>
          <include>**/version.properties</include>
        </includes>
      </resource>
      <resource>
        <directory>src/main/resources</directory>
        <excludes>
          <exclude>**/version.properties</exclude>
        </excludes>
      </resource>
    </resources>
    <plugins>
      <plugin>
        <artifactId>maven-dependency-plugin</artifactId>
        <version>3.10.0</version>
        <executions>
          <execution>
            <id>unpack-licenses</id>
            <phase>prepare-package</phase>
            <goals>
              <goal>unpack</goal>
            </goals>
            <configuration>
              <artifactItems>
                <artifactItem>
                  <groupId>com.formdev</groupId>
                  <artifactId>flatlaf</artifactId>
                  <version>3.7.1</version>
                  <type>jar</type>
                  <includes>META-INF/LICENSE</includes>
                  <outputDirectory>${project.build.directory}/licenses/flatlaf</outputDirectory>
                </artifactItem>
                <artifactItem>
                  <groupId>com.formdev</groupId>
                  <artifactId>flatlaf-extras</artifactId>
                  <version>3.7.1</version>
                  <type>jar</type>
                  <includes>META-INF/LICENSE</includes>
                  <outputDirectory>${project.build.directory}/licenses/flatlaf-extras</outputDirectory>
                </artifactItem>
                <artifactItem>
                  <groupId>com.github.weisj</groupId>
                  <artifactId>jsvg</artifactId>
                  <version>2.0.0</version>
                  <type>jar</type>
                  <includes>META-INF/LICENSE</includes>
                  <outputDirectory>${project.build.directory}/licenses/jsvg</outputDirectory>
                </artifactItem>
              </artifactItems>
            </configuration>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <artifactId>maven-antrun-plugin</artifactId>
        <version>3.2.0</version>
        <executions>
          <execution>
            <id>rename-licenses</id>
            <phase>prepare-package</phase>
            <goals>
              <goal>run</goal>
            </goals>
            <configuration>
              <target>
                <copy />
                <copy />
                <copy />
              </target>
            </configuration>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.15.0</version>
        <configuration>
          <compilerArgs>
            <arg>--add-modules</arg>
            <arg>jdk.jconsole</arg>
            <arg>-proc:none</arg>
          </compilerArgs>
        </configuration>
      </plugin>
      <plugin>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>3.5.5</version>
        <configuration>
          <systemPropertyVariables>
            <java.awt.headless>true</java.awt.headless>
          </systemPropertyVariables>
        </configuration>
      </plugin>
      <plugin>
        <artifactId>maven-jar-plugin</artifactId>
        <version>3.5.0</version>
        <configuration>
          <archive>
            <manifest>
              <mainClass>de.grimmfrost.tda.TDA</mainClass>
              <addClasspath>true</addClasspath>
              <classpathPrefix>lib/</classpathPrefix>
            </manifest>
            <manifestEntries>
              <SplashScreen-Image>de/grimmfrost/tda/icons/splash.png</SplashScreen-Image>
            </manifestEntries>
          </archive>
        </configuration>
      </plugin>
      <plugin>
        <artifactId>maven-shade-plugin</artifactId>
        <version>3.6.2</version>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
            <configuration>
              <transformers>
                <transformer>
                  <mainClass>de.grimmfrost.tda.TDA</mainClass>
                </transformer>
              </transformers>
              <filters>
                <filter>
                  <artifact>*:*</artifact>
                  <excludes>
                    <exclude>module-info.class</exclude>
                    <exclude>META-INF/MANIFEST.MF</exclude>
                    <exclude>META-INF/*.SF</exclude>
                    <exclude>META-INF/*.DSA</exclude>
                    <exclude>META-INF/*.RSA</exclude>
                    <exclude>META-INF/LICENSE</exclude>
                  </excludes>
                </filter>
              </filters>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  <dependencies>
    <dependency>
      <groupId>org.junit.jupiter</groupId>
      <artifactId>junit-jupiter</artifactId>
      <version>6.0.3</version>
      <scope>test</scope>
      <exclusions>
        <exclusion>
          <artifactId>junit-jupiter-api</artifactId>
          <groupId>org.junit.jupiter</groupId>
        </exclusion>
        <exclusion>
          <artifactId>junit-jupiter-params</artifactId>
          <groupId>org.junit.jupiter</groupId>
        </exclusion>
        <exclusion>
          <artifactId>junit-jupiter-engine</artifactId>
          <groupId>org.junit.jupiter</groupId>
        </exclusion>
      </exclusions>
    </dependency>
  </dependencies>
  <properties>
    <maven.compiler.release>11</maven.compiler.release>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
</project>


================================================
FILE: tda/pom.xml
================================================
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <parent>
    <groupId>de.grimmfrost.tda</groupId>
    <artifactId>tda-parent</artifactId>
    <version>3.0</version>
  </parent>

  <artifactId>tda</artifactId>
  <packaging>jar</packaging>

  <name>TDA</name>
  <description>Thread Dump Analysis Tool</description>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.release>11</maven.compiler.release>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.swinglabs</groupId>
      <artifactId>swingx</artifactId>
      <version>1.6.1</version>
    </dependency>
    <!-- jconsole.jar is part of the JDK, but in modern JDKs it might be different. 
         For compatibility with the original project which used a local jar, 
         we might need to see if it's available in central or use a system scope if necessary.
         Actually, it's often available as part of the JDK.
    -->
    <dependency>
      <groupId>com.formdev</groupId>
      <artifactId>flatlaf</artifactId>
      <version>3.7.1</version>
    </dependency>
    <dependency>
      <groupId>com.formdev</groupId>
      <artifactId>flatlaf-extras</artifactId>
      <version>3.7.1</version>
    </dependency>
    <dependency>
      <groupId>com.google.code.gson</groupId>
      <artifactId>gson</artifactId>
      <version>2.13.2</version>
    </dependency>
    <dependency>
      <groupId>org.junit.jupiter</groupId>
      <artifactId>junit-jupiter</artifactId>
      <version>6.0.3</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <resources>
      <resource>
        <directory>src/main/resources</directory>
        <filtering>true</filtering>
        <includes>
          <include>**/version.properties</include>
        </includes>
      </resource>
      <resource>
        <directory>src/main/resources</directory>
        <filtering>false</filtering>
        <excludes>
          <exclude>**/version.properties</exclude>
        </excludes>
      </resource>
    </resources>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <version>3.10.0</version>
        <executions>
          <execution>
            <id>unpack-licenses</id>
            <phase>prepare-package</phase>
            <goals>
              <goal>unpack</goal>
            </goals>
            <configuration>
              <artifactItems>
                <artifactItem>
                  <groupId>com.formdev</groupId>
                  <artifactId>flatlaf</artifactId>
                  <version>3.7.1</version>
                  <type>jar</type>
                  <includes>META-INF/LICENSE</includes>
                  <outputDirectory>${project.build.directory}/licenses/flatlaf</outputDirectory>
                </artifactItem>
                <artifactItem>
                  <groupId>com.formdev</groupId>
                  <artifactId>flatlaf-extras</artifactId>
                  <version>3.7.1</version>
                  <type>jar</type>
                  <includes>META-INF/LICENSE</includes>
                  <outputDirectory>${project.build.directory}/licenses/flatlaf-extras</outputDirectory>
                </artifactItem>
                <artifactItem>
                  <groupId>com.github.weisj</groupId>
                  <artifactId>jsvg</artifactId>
                  <version>2.0.0</version>
                  <type>jar</type>
                  <includes>META-INF/LICENSE</includes>
                  <outputDirectory>${project.build.directory}/licenses/jsvg</outputDirectory>
                </artifactItem>
              </artifactItems>
            </configuration>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-antrun-plugin</artifactId>
        <version>3.2.0</version>
        <executions>
          <execution>
            <id>rename-licenses</id>
            <phase>prepare-package</phase>
            <goals>
              <goal>run</goal>
            </goals>
            <configuration>
              <target>
                <copy file="${project.build.directory}/licenses/flatlaf/META-INF/LICENSE" tofile="${project.build.outputDirectory}/META-INF/LICENSE_flatlaf" />
                <copy file="${project.build.directory}/licenses/flatlaf-extras/META-INF/LICENSE" tofile="${project.build.outputDirectory}/META-INF/LICENSE_flatlaf-extras" />
                <copy file="${project.build.directory}/licenses/jsvg/META-INF/LICENSE" tofile="${project.build.outputDirectory}/META-INF/LICENSE_jsvg" />
              </target>
            </configuration>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.15.0</version>
        <configuration>
          <compilerArgs>
            <arg>--add-modules</arg>
            <arg>jdk.jconsole</arg>
            <arg>-proc:none</arg>
          </compilerArgs>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>3.5.5</version>
        <configuration>
          <systemPropertyVariables>
            <java.awt.headless>true</java.awt.headless>
          </systemPropertyVariables>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>3.5.0</version>
        <configuration>
          <archive>
            <manifest>
              <mainClass>de.grimmfrost.tda.TDA</mainClass>
              <addClasspath>true</addClasspath>
              <classpathPrefix>lib/</classpathPrefix>
            </manifest>
            <manifestEntries>
              <SplashScreen-Image>de/grimmfrost/tda/icons/splash.png</SplashScreen-Image>
            </manifestEntries>
          </archive>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>3.6.2</version>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
            <configuration>
              <transformers>
                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                  <mainClass>de.grimmfrost.tda.TDA</mainClass>
                </transformer>
              </transformers>
              <filters>
                <filter>
                  <artifact>*:*</artifact>
                  <excludes>
                    <exclude>module-info.class</exclude>
                    <exclude>META-INF/MANIFEST.MF</exclude>
                    <exclude>META-INF/*.SF</exclude>
                    <exclude>META-INF/*.DSA</exclude>
                    <exclude>META-INF/*.RSA</exclude>
                    <exclude>META-INF/LICENSE</exclude>
                  </excludes>
                </filter>
              </filters>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  <profiles>
  </profiles>
</project>


================================================
FILE: tda/src/main/java/de/grimmfrost/tda/CustomCategoriesDialog.java
================================================
/*
 * CustomCategoriesDialog.java
 *
 * This file is part of TDA - Thread Dump Analysis Tool.
 *
 * TDA is free software; you can redistribute it and/or modify
 * it under the terms of the Lesser GNU General Public License as published by
 * the Free Software Foundation; either version 2.1 of the License, or
 * (at your option) any later version.
 *
 * TDA is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * Lesser GNU General Public License for more details.
 *
 * You should have received a copy of the Lesser GNU General Public License
 * along with TDA; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 *
 * $Id: CustomCategoriesDialog.java,v 1.4 2008-04-30 09:03:33 irockel Exp $
 */
package de.grimmfrost.tda;

import de.grimmfrost.tda.utils.PrefManager;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.Box;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

/**
 *
 * @author irockel
 */
public class CustomCategoriesDialog extends JDialog {
    private CategoriesPanel categoriesPanel;
    private JPanel buttonPanel;
    private JButton closeButton;
    private Frame frame;
    
    /**
     * Creates a new instance of PreferencesDialog
     */
    public CustomCategoriesDialog(Frame owner) {
        super(owner, "Custom Categories");
        try {
            setIconImage(TDA.createImageIcon("CustomCat.png").getImage());
        } catch (NoSuchMethodError nsme) {
        // ignore, for 1.4 backward compatibility
        }

        frame = owner;
        getContentPane().setLayout(new BorderLayout());
        initPanel();  
    }
    
    private void initPanel() {
        categoriesPanel = new CategoriesPanel((JFrame) this.getOwner());
        getContentPane().add(categoriesPanel,BorderLayout.CENTER);
        closeButton = new JButton("Close");
        buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
        buttonPanel.add(closeButton);
        getContentPane().add(buttonPanel, BorderLayout.SOUTH);
        
        closeButton.addActionListener( new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                categoriesPanel.saveSettings();
                dispose();
            }
        });
        reset();
    }
    
    public void reset() {
        getRootPane().setDefaultButton(closeButton);
    }
    
    public static class CategoriesPanel extends JPanel implements ActionListener, ListSelectionListener  {
        JButton addButton = null;
        JButton removeButton = null;
        JButton editButton = null;
        
        JPanel buttonFlow = null;
        
        JList categoriesList = null;
        
        JScrollPane scrollPane = null;
        
        Frame owner = null; 
        
        public CategoriesPanel(Frame owner) {
            this.owner = owner;
            setLayout(new BorderLayout());
            
            buttonFlow = new JPanel(new FlowLayout(FlowLayout.RIGHT));
            add(Box.createVerticalStrut(5), BorderLayout.NORTH);
            add(Box.createHorizontalStrut(5),BorderLayout.WEST);
            JPanel innerButtonPanel = new JPanel(new GridLayout(3, 1, 5, 5));
            
            innerButtonPanel.add(addButton = new JButton("Add"));
            innerButtonPanel.add(removeButton = new JButton("Remove"));
            innerButtonPanel.add(editButton = new JButton("Edit"));
            removeButton.setEnabled(false);
            editButton.setEnabled(false);
            
            addButton.addActionListener(this);
            removeButton.addActionListener(this);
            editButton.addActionListener(this);
            
            buttonFlow.add(innerButtonPanel);
            
            add(buttonFlow,BorderLayout.EAST);
            setPreferredSize(new Dimension(380, 290));
            
            //createList();
            categoriesList = new JList(PrefManager.get().getCategories());            
            scrollPane = new JScrollPane(categoriesList);
            categoriesList.addListSelectionListener(this);
            
            add(scrollPane,BorderLayout.CENTER);
            
        }
        
        public void createList() {
            int selectedIndex = -1;
            if(categoriesList != null) {
               selectedIndex = categoriesList.getSelectedIndex();
            }
            
            if(selectedIndex > -1) {
                categoriesList.setSelectedIndex(selectedIndex);
            }
        }
        
        public void actionPerformed(ActionEvent e) {
            String cmd = e.getActionCommand();
            
            if ("Add".equals(cmd)) {
                createCategoryDialog("Add Category", true, -1);
            } else if("Edit".equals(cmd)) {
                createCategoryDialog("Edit Category", false, categoriesList.getSelectedIndex());
            } else if("Remove".equals(cmd)) {
                removeCategory();
            }
        }
        
        private void removeCategory() {
            if(JOptionPane.showConfirmDialog(null, "Are you sure, you want to remove the selected category?", "Confirm Remove",  
                    JOptionPane.YES_NO_OPTION) == 0) {
                ((DefaultListModel) categoriesList.getModel()).removeElementAt(categoriesList.getSelectedIndex());
            }
        }
        
        private void createCategoryDialog(String title, boolean isAdd, int selectedIndex) {
            EditCustomCategoryDialog fDiag = new EditCustomCategoryDialog(owner, title, categoriesList, isAdd);
            fDiag.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            
            if(owner != null) {
                owner.setEnabled(false);
            }
            
            //Display the window.
            fDiag.reset();
            fDiag.pack();
            fDiag.setLocationRelativeTo(owner);
            fDiag.setVisible(true);
        }
        
        public void valueChanged(ListSelectionEvent e) {
            if(categoriesList.getSelectedIndex() >= 0) {
                removeButton.setEnabled(true);
                editButton.setEnabled(true);
            } else {
                removeButton.setEnabled(false);
                editButton.setEnabled(false);
            }
        }
        
        public void saveSettings() {
            PrefManager.get().setCategories((DefaultListModel) categoriesList.getModel());
        }
    }
        
    //Must be called from the event-dispatching thread.
    public void resetFocus() {
    }    

}


================================================
FILE: tda/src/main/java/de/grimmfrost/tda/EditCustomCategoryDialog.java
================================================
/*
 * EditCustomCategoryDialog.java
 *
 * This file is part of TDA - Thread Dump Analysis Tool.
 *
 * TDA is free software; you can redistribute it and/or modify
 * it under the terms of the Lesser GNU General Public License as published by
 * the Free Software Foundation; either version 2.1 of the License, or
 * (at your option) any later version.
 *
 * TDA is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * Lesser GNU General Public License for more details.
 *
 * You should have received a copy of the Lesser GNU General Public License
 * along with TDA; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 *
 * $Id: EditCustomCategoryDialog.java,v 1.3 2008-04-30 09:03:33 irockel Exp $
 */
package de.grimmfrost.tda;

import de.grimmfrost.tda.filter.Filter;
import de.grimmfrost.tda.model.CustomCategory;
import de.grimmfrost.tda.utils.PrefManager;
import de.grimmfrost.tda.utils.ResourceManager;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

/**
 * dialog for editing filters.
 * @author irockel
 */
public class EditCustomCategoryDialog extends JDialog {
    private SettingsPanel settingsPanel;
    private JPanel buttonPanel;
    private JButton okButton;
    private JButton cancelButton;
    private Frame frame;
    private JList catList;
    private boolean isAdd = false;
    
    /**
     * Creates a new instance of PreferencesDialog
     */
    public EditCustomCategoryDialog(Frame owner, String frameTitle, JList catList, boolean isAdd) {
        super(owner, frameTitle, true);
        try {
            setIconImage(TDA.createImageIcon("Filters.png").getImage());
        } catch (NoSuchMethodError nsme) {
            // ignore, for 1.4 backward compatibility
        }
        
        this.isAdd = isAdd;
        this.catList = catList;
        frame = owner;
        getContentPane().setLayout(new BorderLayout());
        initPanel();
    }

    private void initPanel() {
        settingsPanel = new SettingsPanel(!isAdd ? (CustomCategory) catList.getSelectedValue() : null);
        getContentPane().add(settingsPanel,BorderLayout.CENTER);
        okButton = new JButton(ResourceManager.translate("ok.button"));
        cancelButton = new JButton(ResourceManager.translate("cancel.button"));
        buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
        buttonPanel.add(okButton);
        buttonPanel.add(cancelButton);
        getContentPane().add(buttonPanel, BorderLayout.SOUTH);
        
        okButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if(!isAdd) {
                    CustomCategory cat = (CustomCategory) catList.getModel().getElementAt(catList.getSelectedIndex());
                    applyCat(cat);
                    // reset to fire change event.
                    ((DefaultListModel) catList.getModel()).setElementAt(cat, catList.getSelectedIndex());
                    
                } else {
                    CustomCategory cat = new CustomCategory(settingsPanel.name.getText());
                    applyCat(cat);
                    addToList(cat);
                }
                dispose();
            }
        });
        
        cancelButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                dispose();
            }
        });
        reset();
    }
    
    /**
     * apply settings to category
     * @param cat the category
     */
    private void applyCat(CustomCategory cat) {
        cat.setName(settingsPanel.name.getText());
        DefaultListModel dlm = ((DefaultListModel) settingsPanel.catFilters.getModel());
        cat.resetFilters();
        for(int i = 0; i < dlm.getSize(); i++) {
            cat.addToFilters((Filter) dlm.elementAt(i));
        }
    }
    
    private void addToList(CustomCategory cat) {
        DefaultListModel dlm = ((DefaultListModel) catList.getModel());
        
        dlm.ensureCapacity(dlm.getSize() +1);
        dlm.addElement(cat);
        catList.ensureIndexIsVisible(dlm.getSize());
    }
                    
    public void reset() {
        getRootPane().setDefaultButton(okButton);
    }
    
    class SettingsPanel extends JPanel implements ListSelectionListener, ActionListener {
        JList catFilters = null;
        JList filterList = null;

        JTextField name = null;
        
        JButton addButton = null;
        JButton removeButton = null;
        
        JScrollPane catPane = null;
        JScrollPane filterPane = null;
        
        public SettingsPanel(CustomCategory presetCat) {
            setLayout(new BorderLayout());
            
            add(createNamePanel(), BorderLayout.NORTH);
            add(createSelectionPanel(), BorderLayout.CENTER);
            if (presetCat != null) {
                fillCatData(presetCat);
            }    
        }
        
        /**
         * fill the dialog with the preset filter data.
         */
        private void fillCatData(CustomCategory presetCategory) {
            name.setText(presetCategory.getName());
            DefaultListModel dlm = (DefaultListModel) filterList.getModel();
            for(int i = 0; i < dlm.getSize(); i++) {
                if(presetCategory.hasInFilters(((Filter) dlm.elementAt(i)).getName())) {
                    moveFilter(filterList, catFilters, i);
                    
                    // fix index.
                    i--;
                }
            }
        }
        
        private JPanel createSelectionPanel() {
            GridBagLayout gridbag = new GridBagLayout();
            GridBagConstraints c = new GridBagConstraints();
            
            JPanel innerPanel = new JPanel(gridbag);
            catFilters = new JList();
            catFilters.setModel(new DefaultListModel());
            filterList = new JList(PrefManager.get().getFilters());
            
            catFilters.addListSelectionListener(this);
            filterList.addListSelectionListener(this);
            
            // layouting dialog
            
            // info row
            c.insets = new Insets(5, 5, 5, 5);
            JLabel info = new JLabel(ResourceManager.translate("customcategory.catfilter.label"));
            gridbag.setConstraints(info, c);
            innerPanel.add(info);            
            
            info = new JLabel(" ");
            gridbag.setConstraints(info, c);
            innerPanel.add(info);
            
            info = new JLabel(ResourceManager.translate("customcategory.availfilter.label"));
            c.gridwidth = GridBagConstraints.REMAINDER;
            gridbag.setConstraints(info, c);
            innerPanel.add(info);
            
            // list row
            
            // cat list
            c.weightx = 1.0;
            c.weighty = 1.0;
            c.fill = GridBagConstraints.BOTH;
            c.gridwidth = 1;
            catPane = new JScrollPane(catFilters);
            
            gridbag.setConstraints(catPane, c);
            innerPanel.add(catPane);

            // buttons
            JPanel innerButtonPanel = new JPanel(new GridLayout(2, 1, 5, 5));
            innerButtonPanel.add(addButton = new JButton(ResourceManager.translate("customcategory.add.button")));
            innerButtonPanel.add(removeButton = new JButton(ResourceManager.translate("customcategory.remove.button")));
            addButton.setEnabled(false);
            removeButton.setEnabled(false);
            addButton.addActionListener(this);
            removeButton.addActionListener(this);
            
            c.weightx = 0.0;
            c.weighty = 0.0;
            c.fill = GridBagConstraints.NONE;
            gridbag.setConstraints(innerButtonPanel, c);
            innerPanel.add(innerButtonPanel);
            
            // filter list
            c.weightx = 1.0;
            c.weighty = 1.0;
            c.insets = new Insets(5, 5, 5, 5);
            c.fill = GridBagConstraints.BOTH;
            filterPane = new JScrollPane(filterList);
            gridbag.setConstraints(filterPane, c);
            innerPanel.add(filterPane);
            
            return(innerPanel);

        }
        
        private JPanel createNamePanel() {
            JPanel panel = new JPanel(new BorderLayout());
            name = new JTextField(30);
            JPanel innerPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
            innerPanel.add(new JLabel(ResourceManager.translate("customcategory.name.label")));
            innerPanel.add(name);
            panel.add(innerPanel, BorderLayout.CENTER);
            return(panel);
        }
        
        public void valueChanged(ListSelectionEvent e) {
            if(filterList.getSelectedIndex() >= 0) {
                addButton.setEnabled(true);
            } else {
                addButton.setEnabled(false);
            }
            
            if(catFilters.getSelectedIndex() >= 0) {
                removeButton.setEnabled(true);
            } else {
                removeButton.setEnabled(false);
            }
        }

        public void actionPerformed(ActionEvent e) {
            String cmd = e.getActionCommand();
            
            if (ResourceManager.translate("customcategory.add.button").equals(cmd)) {
                moveFilter(filterList, catFilters, filterList.getSelectedIndex());
            } else if(ResourceManager.translate("customcategory.remove.button").equals(cmd)) {
                moveFilter(catFilters, filterList, catFilters.getSelectedIndex());
            }
        }
        
        private void moveFilter(JList fromList, JList toList, int selectedItem) {
            Filter filter = (Filter) ((DefaultListModel) fromList.getModel()).getElementAt(selectedItem);
            ((DefaultListModel) fromList.getModel()).removeElementAt(selectedItem);
            
            DefaultListModel dlm = ((DefaultListModel) toList.getModel());

            dlm.ensureCapacity(dlm.getSize() + 1);
            dlm.addElement(filter);
            toList.ensureIndexIsVisible(dlm.getSize());
        }
        
    }
    
}



================================================
FILE: tda/src/main/java/de/grimmfrost/tda/EditFilterDialog.java
================================================
/*
 * EditFilterDialog.java
 *
 * This file is part of TDA - Thread Dump Analysis Tool.
 *
 * TDA is free software; you can redistribute it and/or modify
 * it under the terms of the Lesser GNU General Public License as published by
 * the Free Software Foundation; either version 2.1 of the License, or
 * (at your option) any later version.
 *
 * TDA is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * Lesser GNU General Public License for more details.
 *
 * You should have received a copy of the Lesser GNU General Public License
 * along with TDA; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 *
 * $Id: EditFilterDialog.java,v 1.12 2008-04-30 09:03:33 irockel Exp $
 */

package de.grimmfrost.tda;

import de.grimmfrost.tda.filter.Filter;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JTextField;

/**
 * dialog for editing filters.
 * @author irockel
 */
public class EditFilterDialog extends JDialog {
    private SettingsPanel settingsPanel;
    private JPanel buttonPanel;
    private JButton okButton;
    private JButton cancelButton;
    private Frame frame;
    private JList filterList;
    private boolean isAdd = false;
    
    /**
     * Creates a new instance of PreferencesDialog
     */
    public EditFilterDialog(Frame owner, String frameTitle, JList filterList, boolean isAdd) {
        super(owner, frameTitle, true);
        try {
            setIconImage(TDA.createImageIcon("Filters.png").getImage());
        } catch (NoSuchMethodError nsme) {
            // ignore, for 1.4 backward compatibility
        }
        
        this.isAdd = isAdd;
        this.filterList = filterList;
        frame = owner;
        getContentPane().setLayout(new BorderLayout());
        initPanel();
    }

    private void initPanel() {
        settingsPanel = new SettingsPanel(!isAdd ? (Filter) filterList.getSelectedValue() : null);
        getContentPane().add(settingsPanel,BorderLayout.CENTER);
        okButton = new JButton("Ok");
        cancelButton = new JButton("Cancel");
        buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
        buttonPanel.add(okButton);
        buttonPanel.add(cancelButton);
        getContentPane().add(buttonPanel, BorderLayout.SOUTH);
        
        okButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if(frame != null) {
                    frame.setEnabled(true);
                }
                if(!isAdd) {
                    Filter filter = (Filter) filterList.getModel().getElementAt(filterList.getSelectedIndex());
                    applyFilter(filter);
                    // reset to fire change event.
                    ((DefaultListModel) filterList.getModel()).setElementAt(filter, filterList.getSelectedIndex());
                    
                } else {
                    Filter filter = new Filter();
                    applyFilter(filter);
                    addToList(filter);
                }
                dispose();
            }
        });
        
        cancelButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if(frame != null) {
                    frame.setEnabled(true);
                }
                dispose();
            }
        });
        reset();
    }
    
    private void applyFilter(Filter filter) {
        filter.setName(settingsPanel.filterName.getText());
        filter.setFilterExpression(settingsPanel.regEx.getText());
        filter.setFilterRule(settingsPanel.filterRule.getSelectedIndex());
        filter.setGeneralFilter(true);
        filter.setExclusionFilter(settingsPanel.isExclusionFilter.isSelected());
        filter.setEnabled(settingsPanel.isEnabled.isSelected());
    }
    
    private void addToList(Filter filter) {
        DefaultListModel dlm = ((DefaultListModel) filterList.getModel());
        
        dlm.ensureCapacity(dlm.getSize() +1);
        dlm.addElement(filter);
        filterList.ensureIndexIsVisible(dlm.getSize());
    }
                    
    public void reset() {
        getRootPane().setDefaultButton(okButton);
    }
    
    class SettingsPanel extends JPanel {
        JTextField filterName = null;
        JTextField regEx = null;
        JCheckBox isExclusionFilter = null;
        JCheckBox isEnabled = null;
        JComboBox filterRule = null;
        
        public SettingsPanel(Filter presetFilter) {
            setLayout(new BorderLayout());
            FlowLayout fl = new FlowLayout(FlowLayout.RIGHT);
            JPanel innerSettingsPanel = new JPanel(fl);
            
            filterName = new JTextField(30);
            innerSettingsPanel.add(new JLabel("Filter Name"));
            innerSettingsPanel.add(filterName);
            add(innerSettingsPanel, BorderLayout.NORTH);
            
            innerSettingsPanel = new JPanel(fl);
            regEx = new JTextField(30);
            innerSettingsPanel.add(new JLabel("Match Expression"));
            innerSettingsPanel.add(regEx);
            add(innerSettingsPanel, BorderLayout.CENTER);
            
            innerSettingsPanel = new JPanel(new BorderLayout());
            JPanel innerInnerSettingsPanel = new JPanel(fl);
            innerInnerSettingsPanel.add(new JLabel("Filter rule"));
            innerInnerSettingsPanel.add(filterRule = new JComboBox(new String[] {"has in title", "matches title", "has in stack",
               "matches stack", "waiting on", "waiting for", "locking", "sleeping", "stack line count >"}));
            innerSettingsPanel.add(innerInnerSettingsPanel, BorderLayout.NORTH);
            
            innerInnerSettingsPanel = new JPanel(fl);
            innerInnerSettingsPanel.add(new JLabel("Filter is a exclusion filter"));
            innerInnerSettingsPanel.add(isExclusionFilter = new JCheckBox());
            innerSettingsPanel.add(innerInnerSettingsPanel, BorderLayout.CENTER);
            
            innerInnerSettingsPanel = new JPanel(fl);
            innerInnerSettingsPanel.add(new JLabel("Is Filter enabled in default categories"));
            innerInnerSettingsPanel.add(isEnabled = new JCheckBox());
            innerSettingsPanel.add(innerInnerSettingsPanel, BorderLayout.SOUTH);
            
            add(innerSettingsPanel, BorderLayout.SOUTH);
            
            if(presetFilter != null) {
                fillFilterData(presetFilter);
            }
            
        }
        
        /**
         * fill the dialog with the preset filter data.
         */
        private void fillFilterData(Filter presetFilter) {
            filterName.setText(presetFilter.getName());
            regEx.setText(presetFilter.getFilterExpression());
            filterRule.setSelectedIndex(presetFilter.getFilterRule());
            isExclusionFilter.setSelected(presetFilter.isExclusionFilter());
            isEnabled.setSelected(presetFilter.isEnabled());
        }

        /**
         * return the set up data as filter
         * @return filte with filled in data.
         */
        public Filter getAsFilter() {
            Filter newFilter = new Filter(filterName.getText(),
                    regEx.getText(), filterRule.getSelectedIndex(), true, 
                    isExclusionFilter.isSelected(), isEnabled.isSelected());
            return newFilter;
        }
    }
}



================================================
FILE: tda/src/main/java/de/grimmfrost/tda/FilterDialog.java
================================================
/*
 * FilterDialog.java
 *
 * This file is part of TDA - Thread Dump Analysis Tool.
 *
 * TDA is free software; you can redistribute it and/or modify
 * it under the terms of the Lesser GNU General Public License as published by
 * the Free Software Foundation; either version 2.1 of the License, or
 * (at your option) any later version.
 *
 * TDA is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * Lesser GNU General Public License for more details.
 *
 * You should have received a copy of the Lesser GNU General Public License
 * along with TDA; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 *
 * $Id: FilterDialog.java,v 1.12 2008-04-30 09:03:33 irockel Exp $
 */
package de.grimmfrost.tda;

import de.grimmfrost.tda.utils.PrefManager;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.Box;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

/**
 * overview of all available filters
 * @author irockel
 */
public class FilterDialog extends JDialog {

    private FilterPanel filterPanel;
    private JPanel buttonPanel;
    private JButton closeButton;
    private Frame frame;

    /**
     * Creates a new instance of PreferencesDialog
     */
    public FilterDialog(Frame owner) {
        super(owner, "Filter Settings", true);
        try {
            setIconImage(TDA.createImageIcon("Filters.png").getImage());
        } catch (NoSuchMethodError nsme) {
            // ignore, for 1.4 backward compatibility
        }

        frame = owner;
        getContentPane().setLayout(new BorderLayout());
        initPanel();
    }

    private void initPanel() {
        filterPanel = new FilterPanel((JFrame) this.getOwner());
        getContentPane().add(filterPanel, BorderLayout.CENTER);
        closeButton = new JButton("Close");
        buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
        buttonPanel.add(closeButton);
        //buttonPanel.add(cancelButton);
        getContentPane().add(buttonPanel, BorderLayout.SOUTH);

        closeButton.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                filterPanel.saveSettings();
                dispose();
            }
        });
        reset();
    }

    public void reset() {
        getRootPane().setDefaultButton(closeButton);
    }

    public static class FilterPanel extends JPanel implements ActionListener, ListSelectionListener {

        JButton addButton = null;
        JButton removeButton = null;
        JButton editButton = null;
        JPanel buttonFlow = null;
        JList filterList = null;
        JScrollPane scrollPane = null;
        Frame owner = null;

        public FilterPanel(Frame owner) {
            this.owner = owner;
            setLayout(new BorderLayout());

            buttonFlow = new JPanel(new FlowLayout(FlowLayout.RIGHT));
            add(Box.createVerticalStrut(5), BorderLayout.NORTH);
            add(Box.createHorizontalStrut(5), BorderLayout.WEST);
            JPanel innerButtonPanel = new JPanel(new GridLayout(3, 1, 5, 5));

            innerButtonPanel.add(addButton = new JButton("Add"));
            innerButtonPanel.add(removeButton = new JButton("Remove"));
            innerButtonPanel.add(editButton = new JButton("Edit"));
            removeButton.setEnabled(false);
            editButton.setEnabled(false);

            addButton.addActionListener(this);
            removeButton.addActionListener(this);
            editButton.addActionListener(this);

            buttonFlow.add(innerButtonPanel);

            add(buttonFlow, BorderLayout.EAST);
            setPreferredSize(new Dimension(380, 290));

            //createList();
            filterList = new JList(PrefManager.get().getFilters());
            scrollPane = new JScrollPane(filterList);
            filterList.addListSelectionListener(this);

            add(scrollPane, BorderLayout.CENTER);

        }

        public void createList() {
            int selectedIndex = -1;
            if (filterList != null) {
                selectedIndex = filterList.getSelectedIndex();
            }

            if (selectedIndex > -1) {
                filterList.setSelectedIndex(selectedIndex);
            }
        }

        public void actionPerformed(ActionEvent e) {
            String cmd = e.getActionCommand();

            if ("Add".equals(cmd)) {
                createFilterDialog("Add Filter", true, -1);
            } else if ("Edit".equals(cmd)) {
                createFilterDialog("Edit Filter", false, filterList.getSelectedIndex());
            } else if ("Remove".equals(cmd)) {
                removeFilter();
            }
        }

        private void removeFilter() {
            if (JOptionPane.showConfirmDialog(null, "Are you sure, you want to remove the selected filter?", "Confirm Remove",
                    JOptionPane.YES_NO_OPTION) == 0) {
                ((DefaultListModel) filterList.getModel()).removeElementAt(filterList.getSelectedIndex());
            }
        }

        private void createFilterDialog(String title, boolean isAdd, int selectedIndex) {
            EditFilterDialog fDiag = new EditFilterDialog(owner, title, filterList, isAdd);
            fDiag.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

            //Display the window.
            fDiag.reset();
            fDiag.pack();
            fDiag.setLocationRelativeTo(owner);
            fDiag.setVisible(true);
        }

        public void valueChanged(ListSelectionEvent e) {
            if (filterList.getSelectedIndex() >= 0) {
                removeButton.setEnabled(true);
                editButton.setEnabled(true);
            } else {
                removeButton.setEnabled(false);
                editButton.setEnabled(false);
            }
        }
        
        public void saveSettings() {
            PrefManager.get().setFilters((DefaultListModel) filterList.getModel());
        }
    }

    //Must be called from the event-dispatching thread.
    public void resetFocus() {
    }
}


================================================
FILE: tda/src/main/java/de/grimmfrost/tda/HelpOverviewDialog.java
================================================
/*
 * HelpOverviewDialog.java
 *
 * This file is part of TDA - Thread Dump Analysis Tool.
 *
 * TDA is free software; you can redistribute it and/or modify
 * it under the terms of the Lesser GNU General Public License as published by
 * the Free Software Foundation; either version 2.1 of the License, or
 * (at your option) any later version.
 *
 * TDA is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * Lesser GNU General Public License for more details.
 *
 * You should have received a copy of the Lesser GNU General Public License
 * along with TDA; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 *
 * $Id: HelpOverviewDialog.java,v 1.11 2008-01-20 12:00:40 irockel Exp $
 */

package de.grimmfrost.tda;

import de.grimmfrost.tda.utils.Browser;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.event.HyperlinkEvent;
import javax.swing.event.HyperlinkListener;

/**
 *
 * @author irockel
 */
public class HelpOverviewDialog extends JDialog {
    private JEditorPane htmlView;
    private JPanel buttonPanel;
    private JButton closeButton;
    
    private String file;
    
    /** 
     * Creates a new instance of HelpOverviewDialog 
     */
    public HelpOverviewDialog(JFrame owner, String title, String file, Image icon) {
        super(owner, title, true);
        setFile(file);
        if(icon != null) {
            try {
                this.setIconImage(icon);
            } catch (NoSuchMethodError nsme) {
            // ignore, for 1.4 backward compatibility
            }
        }
        getContentPane().setLayout(new BorderLayout());
        initPanel();
        setLocationRelativeTo(owner);
    }
        
    private void initPanel() {
        try {
            URL tutURL = HelpOverviewDialog.class.getResource(getFile());
            htmlView = new JEditorPane(tutURL);
            htmlView.setForeground(Color.BLACK);
        } catch (MalformedURLException ex) {
            ex.printStackTrace();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        
        htmlView.addHyperlinkListener(
                new HyperlinkListener() {
            public void hyperlinkUpdate(HyperlinkEvent evt) {
                // if a link was clicked
                if(evt.getEventType()==HyperlinkEvent.EventType.ACTIVATED) {
                    try {
                        if(evt.getURL().toString().indexOf("#") >= 0) {
                            // show internal anchors in editor pane.
                            htmlView.setPage(evt.getURL());
                        } else {
                            // launch a browser with the appropriate URL
                            Browser.open(evt.getURL().toString());
                        }
                    } catch(InterruptedException e) {
                        System.out.println("Error launching external browser.");
                    } catch(IOException e) {
                        System.out.println("I/O error launching external browser." + e.getMessage());
                        e.printStackTrace();
                    }
                }
            }
        });
        
        JScrollPane scrollPane = new JScrollPane(htmlView);
        htmlView.setEditable(false);
        htmlView.setPreferredSize(new Dimension(780, 600));
        htmlView.setCaretPosition(0);
        getContentPane().add(scrollPane, BorderLayout.CENTER);
        closeButton = new JButton("Close");
        buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
        buttonPanel.add(closeButton);
        getContentPane().add(buttonPanel, BorderLayout.SOUTH);
        
        closeButton.addActionListener( new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                dispose();
            }
        });
        getRootPane().setDefaultButton(closeButton);
    }
        
    //Must be called from the event-dispatching thread.
    public void resetFocus() {
        //searchField.requestFocusInWindow();
    }

    private String getFile() {
        return(file);
    }
    
    private void setFile(String value) {
        file = value;
    }    
}


================================================
FILE: tda/src/main/java/de/grimmfrost/tda/InfoDialog.java
================================================
/*
 * PreferencesDialog.java
 *
 * This file is part of TDA - Thread Dump Analysis Tool.
 *
 * TDA is free software; you can redistribute it and/or modify
 * it under the terms of the Lesser GNU General Public License as published by
 * the Free Software Foundation; either version 2.1 of the License, or
 * (at your option) any later version.
 *
 * TDA is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * Lesser GNU General Public License for more details.
 *
 * You should have received a copy of the Lesser GNU General Public License
 * along with TDA; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 *
 */

package de.grimmfrost.tda;

import de.grimmfrost.tda.utils.AppInfo;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

/**
 * display copyright notice.
 * @author irockel
 */
public class InfoDialog extends JDialog {
    
    /**
     * Creates a new instance of PreferencesDialog
     */
    public InfoDialog(JFrame owner) {
        super(owner, "About TDA", true);  
        BorderLayout layout = new BorderLayout();
        layout.setHgap(30);
        getContentPane().setLayout(layout);
        initPanel();        
    }
    
    private void initPanel() {
        BorderLayout upperLayout = new BorderLayout();
        upperLayout.setVgap(10);
        upperLayout.setHgap(10);
        JPanel upperPane = new JPanel(upperLayout);
        upperPane.add(new JLabel(TDA.createImageIcon("splash.png")), BorderLayout.CENTER);
        upperPane.add(new JLabel(" "), BorderLayout.EAST);
        upperPane.add(new JLabel(" "), BorderLayout.WEST);
        upperPane.add(new JLabel(""), BorderLayout.NORTH);
        upperPane.add(new JLabel(""), BorderLayout.SOUTH);
        getContentPane().add(upperPane, BorderLayout.NORTH);
        
        String info = "<html><body>" +
                "<h3>" + AppInfo.getAppInfo() + " v" + AppInfo.getVersion() + "</h3>" +
                "<p><i>Java Version: " + System.getProperty("java.version") + "<br><br>" +
                "(C) 2006-2026 by Ingo Rockel &lt;ingo.rockel@gmail.com&gt;,<br><br>" +
                "Icons used are based on Benno System Icons by Benno Meyer.<br>" +
                "Welcome screen uses icons from NuoveXT2 icon set by Alexandre Moore.<br>" +
                "Contains classes from JEdit for logfile display.</i></p><br>" +
                "<p>TDA is free software; you can redistribute it and/or modify it under<br>" +
                "the terms of the Lesser GNU General Public License as published by<br>" +
                "the Free Software Foundation; either version 2.1 of the License, or<br>" +
                "(at your option) any later version.</p><br>" +
                "TDA is distributed in the hope that it will be useful, but WITHOUT ANY<br>" +
                "WARRANTY; without even the implied warranty of MERCHANTABILITY or <br>" +
                "FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU General Public<br>" +
                "License for more details.</p><br>" +
                "<p>This distribution includes 3rd-party libraries: <b>FlatLaf</b>, <b>FlatLaf-Extras</b>, and <b>JSVG</b>.<br> " +
                "Their licenses can be found in the <code>META-INF/</code> directory of the jar file.</p><br>";
        
        javax.swing.JEditorPane infoPane = new javax.swing.JEditorPane("text/html", info);
        infoPane.setEditable(false);
        infoPane.setBackground(getContentPane().getBackground());
        infoPane.setCaretPosition(0);
        
        javax.swing.JScrollPane scrollPane = new javax.swing.JScrollPane(infoPane);
        scrollPane.setBorder(null);
        
        getContentPane().add(scrollPane, BorderLayout.CENTER);
        getContentPane().add(new javax.swing.JLabel("  "), BorderLayout.EAST);
        getContentPane().add(new javax.swing.JLabel("  "), BorderLayout.WEST);
        JButton okButton = new JButton("Close");
        okButton.addActionListener( new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                dispose();
            }
        });
        JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
        buttonPanel.add(okButton);
        getContentPane().add(buttonPanel, BorderLayout.SOUTH);        
    }    
}


================================================
FILE: tda/src/main/java/de/grimmfrost/tda/LongThreadDialog.java
================================================
/*
 * LongThreadDialog.java
 *
 * This file is part of TDA - Thread Dump Analysis Tool.
 *
 * TDA is free software; you can redistribute it and/or modify
 * it under the terms of the Lesser GNU General Public License as published by
 * the Free Software Foundation; either version 2.1 of the License, or
 * (at your option) any later version.
 *
 * TDA is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * Lesser GNU General Public License for more details.
 *
 * TDA should have received a copy of the Lesser GNU General Public License
 * along with Foobar; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 *
 * $Id: LongThreadDialog.java,v 1.10 2008-02-14 14:36:08 irockel Exp $
 */

package de.grimmfrost.tda;

import de.grimmfrost.tda.model.Logfile;

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Map;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.JTextField;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreePath;

/**
 * long running thread detection dialog.
 * 
 * @author irockel
 */
public class LongThreadDialog extends JDialog {
    private JTabbedPane prefsPane;
    private SettingsPanel settingsPanel;
    private JPanel buttonPanel;
    private JButton okButton;
    private JButton cancelButton;
    private TDA backRef;
    private TreePath[] dumps;
    private DefaultMutableTreeNode top;
    private Map threadDumps;
    
    /** 
     * Creates a new instance of PreferencesDialog 
     */
    public LongThreadDialog(TDA owner, TreePath[] dumps, DefaultMutableTreeNode top, Map threadDumps) {        
        super(TDA.frame, "Detect long running Threads", true);
        backRef = owner;
        this.dumps = dumps;
        this.threadDumps = threadDumps;
        this.top = top;
        this.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        getContentPane().setLayout(new BorderLayout());
        initPanel();
        setLocationRelativeTo(owner);
    }
    
    private void initPanel() {
        prefsPane = new JTabbedPane();
        settingsPanel = new SettingsPanel();
        prefsPane.addTab("Settings", settingsPanel);        
        getContentPane().add(prefsPane,BorderLayout.CENTER);
        okButton = new JButton("Start Detection");
        cancelButton = new JButton("Cancel");
        buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
        buttonPanel.add(okButton);
        buttonPanel.add(cancelButton);
        getContentPane().add(buttonPanel, BorderLayout.SOUTH);
        
        okButton.addActionListener( new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                int divider = 0;
                if(backRef.isThreadDisplay()) {
                    divider = backRef.topSplitPane.getDividerLocation();
                }

                ((Logfile) top.getUserObject()).getUsedParser().findLongRunningThreads(top, threadDumps, dumps, Integer.parseInt(settingsPanel.minOccurenceField.getText()), settingsPanel.threadRegExField.getText());
                backRef.createTree();
                backRef.tree.expandRow(1);

                backRef.getRootPane().revalidate();
                if(divider > 0) {
                    backRef.topSplitPane.setDividerLocation(divider);
                }
                dispose();
            }
        });
        
        cancelButton.addActionListener( new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                dispose();
            }
        });
        reset();        
    }
    
    public void reset() {
        getRootPane().setDefaultButton(okButton);
    }
    
    class SettingsPanel extends JPanel {
        JTextField minOccurenceField;
        JTextField threadRegExField;
        
        public SettingsPanel() {
            setLayout(new BorderLayout());
            
            JPanel layoutPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));            
            layoutPanel.add(new JLabel("Minimum occurence of a thread"));
            minOccurenceField = new JTextField(3);
            minOccurenceField.setText(String.valueOf(dumps.length));
            layoutPanel.add(minOccurenceField);
            add(layoutPanel, BorderLayout.NORTH);
            
            layoutPanel = new JPanel(new BorderLayout());
            layoutPanel.add(new JLabel("Regular Expression thread identifier matches"), BorderLayout.NORTH);
            threadRegExField = new JTextField(30);
            layoutPanel.add(threadRegExField, BorderLayout.CENTER);
            add(layoutPanel, BorderLayout.CENTER);
            
            layoutPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
            JLabel example = new JLabel("<html><body>Example is <b>\"AJPRequestHandler(.*)</b>");
            example.setFont(new Font("SansSerif", Font.PLAIN, 10));
            layoutPanel.add(example);
            add(layoutPanel, BorderLayout.SOUTH);
        }
    }
    
    /**
     * Must be called from the event-dispatching thread.
     */
    public void resetFocus() {
    }
    
}


================================================
FILE: tda/src/main/java/de/grimmfrost/tda/MainMenu.java
================================================
/*
 * MainMenu.java
 *
 * This file is part of TDA - Thread Dump Analysis Tool.
 *
 * TDA is free software; you can redistribute it and/or modify
 * it under the terms of the Lesser GNU General Public License as published by
 * the Free Software Foundation; either version 2.1 of the License, or
 * (at your option) any later version.
 *
 * TDA is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * Lesser GNU General Public License for more details.
 *
 * TDA should have received a copy of the Lesser GNU General Public License
 * along with Foobar; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 *
 * $Id: MainMenu.java,v 1.38 2008-09-18 14:44:10 irockel Exp $
 */

package de.grimmfrost.tda;

import de.grimmfrost.tda.utils.PrefManager;
import de.grimmfrost.tda.utils.ResourceManager;
import java.awt.event.ActionEvent;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import javax.swing.JButton;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JToolBar;
import javax.swing.KeyStroke;

/**
 * provides instances of the main menu (though there is typically only one).
 *
 * @author irockel
 */
public class MainMenu extends JMenuBar {
    
    private JMenuItem closeMenuItem;
    private JMenuItem longMenuItem;
    private JMenuItem recentFilesMenu;
    private JMenuItem recentSessionsMenu;
    private JMenuItem closeAllMenuItem;
    private JMenuItem expandAllMenuItem;
    private JMenuItem collapseAllMenuItem;
    
    private TDA listener;
    private JToolBar toolBar;
    private JButton closeToolBarButton;
    private JMenuItem saveSessionMenuItem;
    private JButton findLRThreadsButton;
    private JButton expandButton;
    private JButton collapseButton;



    /** 
     * Creates a new instance of the MainMenu 
     */
    public MainMenu(TDA listener) {
        this.listener = listener;
        createMenuBar();
    }
    
    /**
     * get the close file menu item
     */
    public JMenuItem getCloseMenuItem() {
        return(closeMenuItem);
    }
    
    /**
     * get the close file menu item
     */
    public JButton getCloseToolBarButton() {
        return(closeToolBarButton);
    }
    
    /**
     * get the close file menu item
     */
    public JButton getExpandButton() {
        return(expandButton);
    }
    
    /**
     * get the close file menu item
     */
    public JButton getCollapseButton() {
        return(collapseButton);
    }
    
    /**
     * get the close file menu item
     */
    public JButton getFindLRThreadsToolBarButton() {
        return(findLRThreadsButton);
    }
    
    /**
     * get the close all file menu item
     */
    public JMenuItem getCloseAllMenuItem() {
        return(closeAllMenuItem);
    }
    
    public JMenuItem getLongMenuItem() {
        return(longMenuItem);
    }
    
    /**
     * get the close all file menu item
     */
    public JMenuItem getExpandAllMenuItem() {
        return(expandAllMenuItem);
    }
    
    public JMenuItem getCollapseAllMenuItem() {
        return(collapseAllMenuItem);
    }

    public JMenuItem getSaveSessionMenuItem() {
        return(saveSessionMenuItem);
    }
    
    /**
     * create the top level menu bar
     */
    private void createMenuBar() {
        add(createFileMenu());
        add(createViewMenu());
        add(createToolsMenu());
        add(createHelpMenu());
    }
    
    private JMenu createFileMenu() {
        JMenuItem menuItem;
        JMenu menu;
        //Build the first menu.
        menu = new JMenu(ResourceManager.translate("file.menu"));
        menu.setMnemonic(KeyStroke.getKeyStroke(ResourceManager.translate("file.menu.mnem")).getKeyCode());
        menu.getAccessibleContext().setAccessibleDescription(ResourceManager.translate("file.menu.description"));
        menu.addMenuListener(listener);
        
        //a group of JMenuItems
        menuItem = new JMenuItem(ResourceManager.translate("file.open"),
                KeyStroke.getKeyStroke(ResourceManager.translate("file.open.mnem")).getKeyCode());
        menuItem.setAccelerator(KeyStroke.getKeyStroke(
                ResourceManager.translate("file.open.accel")));
        menuItem.getAccessibleContext().setAccessibleDescription(
                ResourceManager.translate("file.open.description"));
        menuItem.addActionListener(listener);
        menu.add(menuItem);
        
        closeMenuItem = new JMenuItem(ResourceManager.translate("file.close"),
                KeyStroke.getKeyStroke(ResourceManager.translate("file.close.mnem")).getKeyCode());
        closeMenuItem.getAccessibleContext().setAccessibleDescription(
                ResourceManager.translate("file.open.description"));
        closeMenuItem.addActionListener(listener);
        closeMenuItem.setEnabled(false);
        menu.add(closeMenuItem);
        
        closeAllMenuItem = new JMenuItem(ResourceManager.translate("file.closeall"),
                KeyStroke.getKeyStroke(ResourceManager.translate("file.closeall.mnem")).getKeyCode());
        closeAllMenuItem.getAccessibleContext().setAccessibleDescription(
                ResourceManager.translate("file.closeall.description"));
        closeAllMenuItem.addActionListener(listener);
        closeAllMenuItem.setEnabled(false);
        menu.add(closeAllMenuItem);
        
        createRecentFileMenu();
        menu.add(recentFilesMenu);
        
        menu.addSeparator();
        menuItem = new JMenuItem(ResourceManager.translate("file.getfromclipboard"),
                KeyStroke.getKeyStroke(ResourceManager.translate("file.getfromclipboard.mnem")).getKeyCode());
        menuItem.getAccessibleContext().setAccessibleDescription(
                ResourceManager.translate("file.getfromclipboard.description"));
        menuItem.setAccelerator(KeyStroke.getKeyStroke(
                ResourceManager.translate("file.getfromclipboard.accel")));        
        menuItem.addActionListener(listener);
        menu.add(menuItem);
        menu.addSeparator();
        saveSessionMenuItem = new JMenuItem(ResourceManager.translate("file.savesession"),
                KeyStroke.getKeyStroke(ResourceManager.translate("file.savesession.mnem")).getKeyCode());
        saveSessionMenuItem.getAccessibleContext().setAccessibleDescription(
                ResourceManager.translate("file.savesession.description"));
        saveSessionMenuItem.addActionListener(listener);
        menu.add(saveSessionMenuItem);
        saveSessionMenuItem.setEnabled(false);
        
        menuItem = new JMenuItem(ResourceManager.translate("file.opensession"),
                KeyStroke.getKeyStroke(ResourceManager.translate("file.opensession.mnem")).getKeyCode());
        menuItem.getAccessibleContext().setAccessibleDescription(
                ResourceManager.translate("file.opensession.description"));
        menuItem.addActionListener(listener);
        menu.add(menuItem);
        
        createRecentSessionsMenu();
        menu.add(recentSessionsMenu);
        
        if (!System.getProperty("os.name").contains("Mac")) {
            menu.addSeparator();

            menuItem = new JMenuItem(ResourceManager.translate("file.exit"),
                    KeyStroke.getKeyStroke(ResourceManager.translate("file.exit.mnem")).getKeyCode());
            menuItem.setAccelerator(KeyStroke.getKeyStroke(
                    ResourceManager.translate("file.exit.accel")));
            menuItem.getAccessibleContext().setAccessibleDescription(
                    ResourceManager.translate("file.exit.description"));
            menuItem.addActionListener(listener);
            menu.add(menuItem);
        }
        
        return(menu);
        
    }

    /**
     * Build tools menu in the menu bar.
     */
    private JMenu createViewMenu() {
        JMenuItem menuItem;
        JMenu menu;
        menu = new JMenu(ResourceManager.translate("view.menu"));
        menu.setMnemonic(KeyStroke.getKeyStroke(ResourceManager.translate("view.menu.mnem")).getKeyCode());
        menu.getAccessibleContext().setAccessibleDescription(ResourceManager.translate("view.menu.description"));
        add(menu);
        
        expandAllMenuItem = new JMenuItem(ResourceManager.translate("view.expand"),
                KeyStroke.getKeyStroke(ResourceManager.translate("view.expand.mnem")).getKeyCode());
        expandAllMenuItem.setAccelerator(KeyStroke.getKeyStroke(
                ResourceManager.translate("view.expand.accel")));
        expandAllMenuItem.getAccessibleContext().setAccessibleDescription(
                ResourceManager.translate("view.expand.description"));
        expandAllMenuItem.addActionListener(listener);
        expandAllMenuItem.setEnabled(false);
        menu.add(expandAllMenuItem);

        collapseAllMenuItem = new JMenuItem(ResourceManager.translate("view.collapse"),
                KeyStroke.getKeyStroke(ResourceManager.translate("view.collapse.mnem")).getKeyCode());
        collapseAllMenuItem.setAccelerator(KeyStroke.getKeyStroke(
                ResourceManager.translate("view.collapse.accel")));
        collapseAllMenuItem.getAccessibleContext().setAccessibleDescription(
                ResourceManager.translate("view.collapse.description"));
        collapseAllMenuItem.setEnabled(false);
        collapseAllMenuItem.addActionListener(listener);
        menu.add(collapseAllMenuItem);
                
        menu.addSeparator();
        menuItem = new JCheckBoxMenuItem(ResourceManager.translate("view.showtoolbar"), PrefManager.get().getShowToolbar());
        menuItem.setMnemonic(KeyStroke.getKeyStroke(ResourceManager.translate("view.showtoolbar.mnem")).getKeyCode());
        menuItem.addActionListener(listener);
        menu.add(menuItem);
        
        return(menu);
    }
    
    /**
     * Build tools menu in the menu bar.
     */
    private JMenu createToolsMenu() {
        JMenuItem menuItem;
        JMenu menu;
        menu = new JMenu(ResourceManager.translate("tools.menu"));
        menu.setMnemonic(KeyStroke.getKeyStroke(ResourceManager.translate("tools.menu.mnem")).getKeyCode());
        menu.getAccessibleContext().setAccessibleDescription(ResourceManager.translate("tools.menu.description"));
        add(menu);
        
        longMenuItem = new JMenuItem(ResourceManager.translate("tools.longrunning"),
                KeyStroke.getKeyStroke(ResourceManager.translate("tools.longrunning.mnem")).getKeyCode());
        longMenuItem.setAccelerator(KeyStroke.getKeyStroke(
                KeyEvent.VK_L, InputEvent.ALT_MASK));
        longMenuItem.getAccessibleContext().setAccessibleDescription(
                "Find long running threads...");
        longMenuItem.addActionListener(listener);
        longMenuItem.setEnabled(false);
        menu.add(longMenuItem);
        menu.addSeparator();

        menuItem = new JMenuItem("Filters",
                KeyEvent.VK_F);
        menuItem.setAccelerator(KeyStroke.getKeyStroke(
                KeyEvent.VK_F, InputEvent.ALT_MASK));
        menuItem.getAccessibleContext().setAccessibleDescription(
                "Setup Filter");
        menuItem.addActionListener(listener);
        menu.add(menuItem);
        
        menuItem = new JMenuItem("Categories",
                KeyEvent.VK_F);
        menuItem.setAccelerator(KeyStroke.getKeyStroke(
                KeyEvent.VK_G, InputEvent.ALT_MASK));
        menuItem.getAccessibleContext().setAccessibleDescription(
                "Setup Categories");
        menuItem.addActionListener(listener);
        menu.add(menuItem);
        
        menu.addSeparator();

        menuItem = new JMenuItem(ResourceManager.translate("file.preferences"),
                KeyStroke.getKeyStroke(ResourceManager.translate("file.preferences.mnem")).getKeyCode());
        menuItem.getAccessibleContext().setAccessibleDescription(
                ResourceManager.translate("file.preferences.description"));
        menuItem.addActionListener(listener);
        menu.add(menuItem);
        
        return(menu);
    }
    
    /**
     * Build help menu in the menu bar.
     */
    private JMenu createHelpMenu() {
        JMenuItem menuItem;
        JMenu menu;
        menu = new JMenu(ResourceManager.translate("help.menu"));
        menu.setMnemonic(KeyStroke.getKeyStroke(ResourceManager.translate("help.menu.mnem")).getKeyCode());
        menu.getAccessibleContext().setAccessibleDescription(
                ResourceManager.translate("help.menu.description"));
                
        menuItem = new JMenuItem("Release Notes",null);
        menuItem.getAccessibleContext().setAccessibleDescription(
                "Release Notes");
        menuItem.addActionListener(listener);
        menu.add(menuItem);
        menuItem = new JMenuItem("License",null);
        menuItem.getAccessibleContext().setAccessibleDescription(
                "TDA Distribution License");
        menuItem.addActionListener(listener);
        menu.add(menuItem);
        menu.addSeparator();
        menuItem = new JMenuItem("About TDA",
                KeyEvent.VK_A);
        menuItem.getAccessibleContext().setAccessibleDescription(
                "About Thread Dump Analyzer");
        menuItem.addActionListener(listener);
        menu.add(menuItem);
        
        return(menu);
    }
    
    /**
     * create the menu for opening recently selected files.
     */
    private void createRecentFileMenu() {
        String[] recentFiles = PrefManager.get().getRecentFiles();
        
        recentFilesMenu = new JMenu(ResourceManager.translate("file.recentfiles"));
        recentFilesMenu.setMnemonic(KeyStroke.getKeyStroke(ResourceManager.translate("file.recentfiles.mnem")).getKeyCode());
        if(recentFiles.length > 1) {
            for(int i = 1; i < recentFiles.length; i++) {
                if(!recentFiles[i].isEmpty()) {
                    JMenuItem item = new JMenuItem(recentFiles[i]);
                    ((JMenu) recentFilesMenu).add(item);
                    item.addActionListener(listener);
                }
            }
        } else {
            recentFilesMenu.setEnabled(false);
        }
    }
    
    /**
     * create the menu for opening recently selected files.
     */
    private void createRecentSessionsMenu() {
        String[] recentFiles = PrefManager.get().getRecentSessions();
        
        recentSessionsMenu = new JMenu(ResourceManager.translate("file.recentsessions"));
        recentSessionsMenu.setMnemonic(KeyStroke.getKeyStroke(ResourceManager.translate("file.recentsessions.mnem")).getKeyCode());
        if(recentFiles.length > 1) {
            
            for(int i = 1; i < recentFiles.length; i++) {
                if(!recentFiles[i].isEmpty()) {
                    JMenuItem item = new JMenuItem(recentFiles[i]);
                    ((JMenu) recentSessionsMenu).add(item);
                    item.addActionListener(listener);
                }
            }
        } else {
            recentSessionsMenu.setEnabled(false);
        }
    }

    /**
     * creates and returns a toolbar for the main menu with most
     * important entries.
     * @return toolbar instance, is created on demand.
     */
    public JToolBar getToolBar() {
        if(toolBar == null) {
            createToolBar();
        }
        return toolBar;
    }
    
    /**
     * create a toolbar showing the most important main menu entries.
     */
    private void createToolBar() {
        toolBar = new JToolBar("TDA Toolbar");
        if(listener.runningAsJConsolePlugin || listener.runningAsVisualVMPlugin) {
            toolBar.add(createToolBarButton("Request a Thread Dump", "FileOpen.png"));
            toolBar.setFloatable(false);
        } else {
            toolBar.add(createToolBarButton("Open Logfile", "FileOpen.png"));
            closeToolBarButton = createToolBarButton("Close selected Logfile", "CloseFile.png");
            closeToolBarButton.setEnabled(false);
            toolBar.add(closeToolBarButton);
        }
        toolBar.addSeparator();
        toolBar.add(createToolBarButton("Preferences", "Preferences.png"));
        toolBar.addSeparator();
        expandButton = createToolBarButton("Expand all nodes", "Expanded.png");
        expandButton.setEnabled(false);
        toolBar.add(expandButton);
        collapseButton = createToolBarButton("Collapse all nodes", "Collapsed.png");
        collapseButton.setEnabled(false);
        toolBar.add(collapseButton);
        toolBar.addSeparator();
        findLRThreadsButton = createToolBarButton("Find long running threads", "FindLRThreads.png");
        findLRThreadsButton.setEnabled(false);
        toolBar.add(findLRThreadsButton);
        
        toolBar.add(createToolBarButton("Filters", "Filters.png"));
        toolBar.add(createToolBarButton("Custom Categories", "CustomCat.png"));
        toolBar.addSeparator();
    }
    
    /**
     * create a toolbar button with tooltip and given icon.
     * @param text tooltip text
     * @param fileName filename for the icon to load
     * @return toolbar button
     */
    private JButton createToolBarButton(String text, String fileName) {
        JButton toolbarButton = new JButton(TDA.createImageIcon(fileName));
        if(text != null) {
            toolbarButton.setToolTipText(text);
        }
        toolbarButton.addActionListener(listener);
        toolbarButton.setFocusable(false);
        return(toolbarButton);
    }
}


================================================
FILE: tda/src/main/java/de/grimmfrost/tda/PreferencesDialog.java
================================================
/*
 * PreferencesDialog.java
 *
 * This file is part of TDA - Thread Dump Analysis Tool.
 *
 * TDA is free software; you can redistribute it and/or modify
 * it under the terms of the Lesser GNU General Public License as published by
 * the Free Software Foundation; either version 2.1 of the License, or
 * (at your option) any later version.
 *
 * TDA is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * Lesser GNU General Public License for more details.
 *
 * You should have received a copy of the Lesser GNU General Public License
 * along with TDA; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 *
 * $Id: PreferencesDialog.java,v 1.22 2008-04-30 09:03:33 irockel Exp $
 */

package de.grimmfrost.tda;

import de.grimmfrost.tda.utils.PrefManager;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Objects;
import javax.swing.BoxLayout;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.JTextField;

/**
 * Displays a dialog for setting some preferences for using tda. These
 * are persisted using java.util.prefs package.
 * @author irockel
 */
public class PreferencesDialog extends JDialog {
    private JTabbedPane prefsPane;
    private GeneralPanel generalPanel;
    private RegExPanel regExPanel;
    private JButton okButton;
    private final Frame frame;
    
    /**
     * Creates a new instance of PreferencesDialog
     */
    public PreferencesDialog(Frame owner) {
        super(owner, "Preferences", true);
        this.setIconImage(TDA.createImageIcon("Preferences.png").getImage());

        frame = owner;
        getContentPane().setLayout(new BorderLayout());
        initPanel();        
    }
    
    public JTabbedPane getPane() {
        return(prefsPane);
    }
    
    private void initPanel() {
        prefsPane = new JTabbedPane();
        generalPanel = new GeneralPanel();
        regExPanel = new RegExPanel();
        prefsPane.addTab("General", generalPanel);
        prefsPane.addTab("Date Parsing", regExPanel);
        getContentPane().add(prefsPane,BorderLayout.CENTER);
        
        // only add buttons if there is an owner frame
        // otherwise we are running in visualvm
        if(frame != null) {
            okButton = new JButton("Ok");
            JButton cancelButton = new JButton("Cancel");
            JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
            buttonPanel.add(okButton);
            buttonPanel.add(cancelButton);
            getContentPane().add(buttonPanel, BorderLayout.SOUTH);

            okButton.addActionListener(e -> saveSettings());

            cancelButton.addActionListener(e -> dispose());
        }
        reset();
    }
    
    public void reset() {
        getRootPane().setDefaultButton(okButton);
        loadSettings();
    }
    
    public void loadSettings() {
        generalPanel.forceLoggcLoading.setSelected(PrefManager.get().getForceLoggcLoading());
        generalPanel.maxLinesField.setText(String.valueOf(PrefManager.get().getMaxRows()));
        generalPanel.bufferField.setText(String.valueOf(PrefManager.get().getStreamResetBuffer()));
        generalPanel.showHotspotClasses.setSelected(PrefManager.get().getShowHotspotClasses());
        generalPanel.maxLogfileSizeField.setText(String.valueOf(PrefManager.get().getMaxLogfileSize()));
        
        DefaultComboBoxModel<String> boxModel = new DefaultComboBoxModel<>();
        String[] regexs = PrefManager.get().getDateParsingRegexs();
        for (String regex : regexs) {
            boxModel.addElement(regex);
        }
        regExPanel.dateParsingRegexs.setModel(boxModel);
        regExPanel.dateParsingRegexs.setSelectedItem(PrefManager.get().getDateParsingRegex());
        
        regExPanel.isJDK16DefaultParsing.setSelected(PrefManager.get().getJDK16DefaultParsing());
        regExPanel.isMillisTimeStamp.setSelected(PrefManager.get().getMillisTimeStamp());
    }
    
    public void saveSettings() {
        PrefManager.get().setForceLoggcLoading(generalPanel.forceLoggcLoading.isSelected());
        PrefManager.get().setMaxRows(Integer.parseInt(generalPanel.maxLinesField.getText()));
        PrefManager.get().setStreamResetBuffer(Integer.parseInt(generalPanel.bufferField.getText()));
        PrefManager.get().setShowHotspotClasses(generalPanel.showHotspotClasses.isSelected());
        PrefManager.get().setDateParsingRegex((String) regExPanel.dateParsingRegexs.getSelectedItem());
        PrefManager.get().setDateParsingRegexs(regExPanel.dateParsingRegexs.getModel());
        PrefManager.get().setMillisTimeStamp(regExPanel.isMillisTimeStamp.isSelected());
        PrefManager.get().setJDK16DefaultParsing(regExPanel.isJDK16DefaultParsing.isSelected());
        PrefManager.get().setMaxLogfileSize(Integer.parseInt(generalPanel.maxLogfileSizeField.getText()));
        dispose();
    }
    
    static class GeneralPanel extends JPanel {
        JTextField maxLinesField;
        JTextField bufferField;
        JTextField maxLogfileSizeField;
        JCheckBox forceLoggcLoading;
        JCheckBox showHotspotClasses;

        public GeneralPanel() {
            setLayout(new FlowLayout(FlowLayout.RIGHT));
            JPanel innerPanel = new JPanel();
            innerPanel.setLayout(new BoxLayout(innerPanel, BoxLayout.Y_AXIS));
                        
            JPanel layoutPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
            layoutPanel.add(new JLabel("Maximum amount of lines to check for\n class histogram or possible deadlock informations"));
            maxLinesField = new JTextField(3);
            layoutPanel.add(maxLinesField);
            innerPanel.add(layoutPanel);
            
            layoutPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
            layoutPanel.add(new JLabel("Stream Reset Buffer Size (in bytes)"));
            bufferField = new JTextField(10);
            layoutPanel.add(bufferField);
            bufferField.setHorizontalAlignment(JTextField.RIGHT);
            innerPanel.add(layoutPanel);
            
            layoutPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
            layoutPanel.add(new JLabel("Force Open Loggc Option even if class histograms were found in general logfile"));
            forceLoggcLoading = new JCheckBox();
            layoutPanel.add(forceLoggcLoading);
            innerPanel.add(layoutPanel);
            
            layoutPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
            layoutPanel.add(new JLabel("Maximum logfile size in kbytes to display\n full logfile (set to 0 for unlimited size)"));
            maxLogfileSizeField = new JTextField(10);
            maxLogfileSizeField.setHorizontalAlignment(JTextField.RIGHT);
            layoutPanel.add(maxLogfileSizeField);
            innerPanel.add(layoutPanel);
            
            
            layoutPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
            layoutPanel.add(new JLabel("Show internal hotspot classes in class histograms"));
            showHotspotClasses = new JCheckBox();
            layoutPanel.add(showHotspotClasses);
            innerPanel.add(layoutPanel);

            // add preferences to parent panel.
            add(innerPanel);
        }
    }
    
    public static class RegExPanel extends JPanel implements ActionListener {
        JComboBox<String> dateParsingRegexs;
        JCheckBox isMillisTimeStamp;
        JCheckBox isJDK16DefaultParsing;
        JButton clearButton;
        String lastSelectedItem = null;
        
        RegExPanel() {
            setLayout(new BorderLayout());
            JPanel layoutPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
            
            layoutPanel.add(new JLabel("Regular Expression for parsing timestamps in logs files"));
            dateParsingRegexs = new JComboBox<>();
            dateParsingRegexs.setEditable(true);
            dateParsingRegexs.addActionListener(this);
            layoutPanel.add(dateParsingRegexs);
            clearButton = new JButton("Clear");
            clearButton.addActionListener(this);
            layoutPanel.add(clearButton);
            
            add(layoutPanel,BorderLayout.CENTER);
            
            JPanel lowerPanel = new JPanel(new BorderLayout());
            layoutPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
            isMillisTimeStamp = new JCheckBox();
            layoutPanel.add(new JLabel("Parsed timestamp is a long representing msecs since 1970"));
            layoutPanel.add(isMillisTimeStamp);
            lowerPanel.add(layoutPanel,BorderLayout.NORTH);
            
            layoutPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
            isJDK16DefaultParsing = new JCheckBox();
            layoutPanel.add(new JLabel("Perform Parsing for Default Thread Dump Timestamps of current JDKs."));
            layoutPanel.add(isJDK16DefaultParsing);
            lowerPanel.add(layoutPanel,BorderLayout.CENTER);
            add(lowerPanel, BorderLayout.SOUTH);
        }
        
        public void actionPerformed(ActionEvent e) {
            if(e.getSource() == dateParsingRegexs) {
                if((lastSelectedItem == null) || !Objects.equals(dateParsingRegexs.getSelectedItem(), lastSelectedItem)) {
                    dateParsingRegexs.addItem((String) dateParsingRegexs.getSelectedItem());
                    lastSelectedItem = (String) dateParsingRegexs.getSelectedItem();
                }
            } else if (e.getSource() == clearButton) {
                dateParsingRegexs.setModel(new DefaultComboBoxModel<>());
            }
        }
    }
    
    //Must be called from the event-dispatching thread.
    public void resetFocus() {
    }
    
    
}


================================================
FILE: tda/src/main/java/de/grimmfrost/tda/SearchDialog.java
================================================
/*
 * SearchDialog.java
 *
 * This file is part of TDA - Thread Dump Analysis Tool.
 *
 * TDA is free software; you can redistribute it and/or modify
 * it under the terms of the Lesser GNU General Public License as published by
 * the Free Software Foundation; either version 2.1 of the License, or
 * (at your option) any later version.
 *
 * TDA is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * Lesser GNU General Public License for more details.
 *
 * You should have received a copy of the Lesser GNU General Public License
 * along with TDA; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 *
 * $Id: SearchDialog.java,v 1.10 2008-01-09 09:31:35 irockel Exp $
 */

package de.grimmfrost.tda;

import de.grimmfrost.tda.utils.TableSorter;
import de.grimmfrost.tda.utils.ThreadsTableModel;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.text.Position;
import javax.swing.tree.TreePath;

/**
 *
 * @author irockel
 */
public class SearchDialog extends JDialog
        implements ActionListener {
    
    private static String SEARCH = "search";
    private static String CANCEL = "cancel";
        
    private JTextField searchField;
    
    private JComponent searchComp;
        
    public SearchDialog(JFrame owner, JComponent comp) {
        super(owner, "Search this category... ", true);
        setLayout(new FlowLayout(FlowLayout.LEFT));
        
        //Create everything.
        searchField = new JTextField(10);
        searchField.setActionCommand(SEARCH);
        searchField.addActionListener(this);
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        
        JLabel label = new JLabel("Enter search string: ");
        label.setLabelFor(searchField);
        
        searchComp = comp;
        
        JComponent buttonPane = createButtonPanel();
        
        //Lay out everything.
        JPanel textPane = new JPanel(new FlowLayout(FlowLayout.TRAILING));
        textPane.add(label);
        textPane.add(searchField);
        
        add(textPane);
        add(buttonPane);
    }
    
    protected JComponent createButtonPanel() {
        JPanel p = new JPanel(new GridLayout(0,1));
        JButton searchButton = new JButton("Search");
        
        searchButton.setActionCommand(SEARCH);
        searchButton.addActionListener(this);
        
        p.add(searchButton);
        
        return p;
    }
    
    public void actionPerformed(ActionEvent e) {
        String cmd = e.getActionCommand();
        
        if (SEARCH.equals(cmd)) {            
            if(searchComp instanceof JTree) {
                TreePath searchPath = ((JTree) searchComp).getNextMatch(searchField.getText(), 0, Position.Bias.Forward);

                if (searchPath != null) {
                    ((JTree) searchComp).setSelectionPath(searchPath);
                    Rectangle view = ((JTree) searchComp).getPathBounds(searchPath);
                    ((JViewport) searchComp.getParent()).scrollRectToVisible(view);
                    dispose();
                    searchComp.requestFocusInWindow();
                } else {
                    JOptionPane.showMessageDialog(getOwner(),
                            searchField.getText() + " not found!",
                            "Search Error",
                            JOptionPane.ERROR_MESSAGE);
                    resetFocus();
                }
            } else if (searchComp instanceof JTable) {
                ThreadsTableModel ttm = (ThreadsTableModel) ((TableSorter) ((JTable) searchComp).getModel()).getTableModel();
                int row = ttm.searchRowWithName(((JTable) searchComp).getSelectedRow(), searchField.getText());
                ((JTable) searchComp).getSelectionModel().setSelectionInterval(row, row);
            }
        }
    }
    
    //Must be called from the event-dispatching thread.
    protected void resetFocus() {
        searchField.requestFocusInWindow();
    }
    
    public void reset() {
    }

}


================================================
FILE: tda/src/main/java/de/grimmfrost/tda/TDA.java
================================================
/**
 * Thread Dump Analysis Tool, parses Thread Dump input and displays it as tree
 * <p>
 * This file is part of TDA - Thread Dump Analysis Tool.
 * <p>
 * TDA is free software; you can redistribute it and/or modify
 * it under the terms of the Lesser GNU General Public License as published by
 * the Free Software Foundation; either version 2.1 of the License, or
 * (at your option) any later version.
 * <p>
 * TDA is distributed in the hope that it will be useful,h
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * Lesser GNU General Public License for more details.
 * <p>
 * TDA should have received a copy of the Lesser GNU General Public License
 * along with Foobar; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 *
 */
package de.grimmfrost.tda;

import com.formdev.flatlaf.FlatLightLaf;
import de.grimmfrost.tda.jconsole.MBeanDumper;
import de.grimmfrost.tda.model.*;
import de.grimmfrost.tda.parser.DumpParser;
import de.grimmfrost.tda.parser.DumpParserFactory;
import de.grimmfrost.tda.utils.AppInfo;
import de.grimmfrost.tda.utils.Browser;
import de.grimmfrost.tda.utils.HistogramTableModel;
import de.grimmfrost.tda.utils.MonitorComparator;
import de.grimmfrost.tda.utils.PrefManager;
import de.grimmfrost.tda.utils.StatusBar;
import de.grimmfrost.tda.utils.SwingWorker;
import de.grimmfrost.tda.utils.TableSorter;
import de.grimmfrost.tda.utils.ThreadsTableModel;
import de.grimmfrost.tda.utils.ThreadsTableSelectionModel;
import de.grimmfrost.tda.utils.TipOfDay;
import de.grimmfrost.tda.utils.TreeRenderer;
import de.grimmfrost.tda.utils.ViewScrollPane;
import de.grimmfrost.tda.utils.jedit.JEditTextArea;
import de.grimmfrost.tda.utils.jedit.PopupMenu;

import de.grimmfrost.tda.utils.LogManager;

import java.awt.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.dnd.*;
import java.io.FileNotFoundException;
import java.util.*;
import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSplitPane;
import javax.swing.SwingUtilities;
import javax.swing.JTree;
import javax.swing.event.HyperlinkEvent;
import javax.swing.event.HyperlinkListener;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.MenuEvent;
import javax.swing.event.MenuListener;
import javax.swing.text.Position;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreeSelectionModel;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import java.io.IOException;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowAdapter;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.text.NumberFormat;
import java.util.List;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JComponent;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPopupMenu;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.KeyStroke;
import javax.swing.ProgressMonitorInputStream;
import javax.swing.event.CaretEvent;
import javax.swing.event.CaretListener;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.ListSelectionListener;
import javax.swing.filechooser.FileFilter;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;

/**
 * main class of the Thread Dump Analyzer. Start using static main method.
 *
 * @author irockel
 */
public class TDA extends JPanel implements ListSelectionListener, TreeSelectionListener, ActionListener, MenuListener {
    private static final Logger LOGGER = LogManager.getLogger(TDA.class);
    private static FileDialog fc;
    private static JFileChooser sessionFc;
    private static final int DIVIDER_SIZE = 4;
    protected static JFrame frame;

    private static String dumpFile;

    private static int fontSizeModifier = 0;

    private JEditorPane htmlPane;
    private JEditTextArea jeditPane;
    protected JTree tree;
    protected DefaultTreeModel treeModel;
    private JSplitPane splitPane;
    protected JSplitPane topSplitPane;
    private DumpStore dumpStore;
    private Vector<DefaultMutableTreeNode> topNodes;
    private ViewScrollPane htmlView;
    private ViewScrollPane tableView;
    private ViewScrollPane dumpView;
    private JTextField filter;
    private JCheckBox checkCase;
    private PreferencesDialog prefsDialog;
    private FilterDialog filterDialog;
    private CustomCategoriesDialog categoriesDialog;
    private JTable histogramTable;
    private JMenuItem showDumpMenuItem;
    boolean runningAsJConsolePlugin;
    boolean runningAsVisualVMPlugin;
    private DefaultMutableTreeNode logFile;
    private MBeanDumper mBeanDumper;
    private MainMenu pluginMainMenu;
    private boolean isFoundClassHistogram = false;
    private DropTarget dt = null;
    private DropTarget hdt = null;
    private int dumpCounter;


    private StatusBar statusBar;

    private SearchDialog searchDialog;

    /**
     * constructor (needs to be public for plugin)
     */
    public TDA(boolean setLF) {
        super(new BorderLayout());

        if (setLF) {
            // init L&F
            setupLookAndFeel();
        }
    }

    /**
     * constructor (needs to be public for plugin)
     */
    public TDA(boolean setLF, MBeanDumper mBeanDumper) {
        this(setLF);

        this.mBeanDumper = mBeanDumper;
    }

    public TDA(boolean setLF, String dumpFile) {
        this(setLF);
        TDA.dumpFile = dumpFile;
    }

    /**
     * initializes tda panel
     * @param asJConsolePlugin specifies if tda is running as jconsole plugin
     * @param asVisualVMPlugin specifies if tda is running as visualvm plugin
     */
    public void init(boolean asJConsolePlugin, boolean asVisualVMPlugin) {
        // init everything
        tree = new JTree();
        addTreeListener(tree);
        runningAsJConsolePlugin = asJConsolePlugin;
        runningAsVisualVMPlugin = asVisualVMPlugin;

        //Create the HTML viewing pane.
        if (!this.runningAsVisualVMPlugin && !this.runningAsJConsolePlugin) {
            InputStream is = TDA.class.getResourceAsStream("doc/welcome.html");

            htmlPane = new JEditorPane();
            String welcomeText = parseWelcomeURL(is);
            htmlPane.setContentType("text/html");
            htmlPane.setText(welcomeText);
        } else if (asJConsolePlugin) {
            htmlPane = new JEditorPane("text/html", "<html><body bgcolor=\"ffffff\"><i>Press Button above to request a thread dump.</i></body></html>");
        } else {
            htmlPane = new JEditorPane("text/html", "<html><body bgcolor=\"ffffff\"></body></html>");
        }
        htmlPane.setEditable(false);

        if (!asJConsolePlugin && !asVisualVMPlugin) {
            hdt = new DropTarget(htmlPane, new FileDropTargetListener());
        }

        JEditorPane emptyPane = new JEditorPane("text/html", "");
        emptyPane.setEditable(false);

        htmlPane.addHyperlinkListener(
                new HyperlinkListener() {
                    public void hyperlinkUpdate(HyperlinkEvent evt) {
                        // if a link was clicked
                        if (evt.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
                            if (evt.getDescription().startsWith("monitor")) {
                                navigateToMonitor(evt.getDescription());
                            } else if (evt.getDescription().startsWith("dump")) {
                                navigateToDump();
                            } else if (evt.getDescription().startsWith("wait")) {
                                navigateToChild("Threads waiting");
                            } else if (evt.getDescription().startsWith("sleep")) {
                                navigateToChild("Threads sleeping");
                            } else if (evt.getDescription().startsWith("dead")) {
                                navigateToChild("Deadlocks");
                            } else if (evt.getDescription().startsWith("threaddump")) {
                                addMXBeanDump();
                            } else if (evt.getDescription().startsWith("openlogfile") && !evt.getDescription().endsWith("//")) {
                                File[] files = {new File(evt.getDescription().substring(14))};
                                openFiles(files, false);
                            } else if (evt.getDescription().startsWith("openlogfile")) {
                                chooseFile();
                            } else if (evt.getDescription().startsWith("opensession") && !evt.getDescription().endsWith("//")) {
                                File file = new File(evt.getDescription().substring(14));
                                openSession(file, true);
                            } else if (evt.getDescription().startsWith("opensession")) {
                                openSession();
                            } else if (evt.getDescription().startsWith("preferences")) {
                                showPreferencesDialog();
                            } else if (evt.getDescription().startsWith("filters")) {
                                showFilterDialog();
                            } else if (evt.getDescription().startsWith("categories")) {
                                showCategoriesDialog();
                            } else if (evt.getURL() != null) {
                                try {
                                    // launch a browser with the appropriate URL
                                    Browser.open(evt.getURL().toString());
                                } catch (InterruptedException e) {
                                    System.out.println("Error launching external browser.");
                                } catch (IOException e) {
                                    System.out.println("I/O error launching external browser." + e.getMessage());
                                    e.printStackTrace();
                                }
                            }
                        }
                    }

                });

        htmlView = new ViewScrollPane(htmlPane, runningAsVisualVMPlugin);
        ViewScrollPane emptyView = new ViewScrollPane(emptyPane, runningAsVisualVMPlugin);

        // create the top split pane
        topSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
        topSplitPane.setLeftComponent(emptyView);
        topSplitPane.setDividerSize(DIVIDER_SIZE);
        topSplitPane.setContinuousLayout(true);
        topSplitPane.setResizeWeight(0.2);

        //Add the scroll panes to a split pane.
        splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
        splitPane.setBottomComponent(htmlView);
        splitPane.setTopComponent(topSplitPane);
        splitPane.setDividerSize(DIVIDER_SIZE);
        splitPane.setContinuousLayout(true);
        splitPane.setResizeWeight(0.5);

        splitPane.setForeground(Color.red);

        if (this.runningAsVisualVMPlugin) {
            setOpaque(true);
            setBackground(Color.WHITE);
            setBorder(BorderFactory.createEmptyBorder(6, 0, 3, 0));
            topSplitPane.setBorder(BorderFactory.createEmptyBorder());
            topSplitPane.setOpaque(false);
            topSplitPane.setBackground(Color.WHITE);
            htmlPane.setBorder(BorderFactory.createEmptyBorder());
            htmlPane.setOpaque(false);
            htmlPane.setBackground(Color.WHITE);
            splitPane.setBorder(BorderFactory.createEmptyBorder());
            splitPane.setOpaque(false);
            splitPane.setBackground(Color.WHITE);
        }

        Dimension minimumSize = new Dimension(200, 50);
        htmlView.setMinimumSize(minimumSize);
        emptyView.setMinimumSize(minimumSize);

        //Add the split pane to this panel.
        add(htmlView, BorderLayout.CENTER);

        statusBar = new StatusBar(!(asJConsolePlugin || asVisualVMPlugin));
        add(statusBar, BorderLayout.SOUTH);

        firstFile = true;
        setFileOpen(false);

        if (!runningAsVisualVMPlugin) {
            setShowToolbar(PrefManager.get().getShowToolbar());
        }

        if (firstFile && runningAsVisualVMPlugin) {
            // init filechooser
            fc = new FileDialog(getFrame());
            fc.setMultipleMode(true);
            try {
                fc.setDirectory(PrefManager.get().getSelectedPath().getCanonicalPath());
            } catch (IOException ioe) {
                // ignore
            }
        }

        if (!runningAsJConsolePlugin && !runningAsVisualVMPlugin) {
            new DropTarget(htmlPane, DnDConstants.ACTION_REFERENCE | DnDConstants.ACTION_LINK, getDropTargetListener());
        }
    }

    private DropTargetListener getDropTargetListener() {
        return new DropTargetListener() {
            public void dragEnter(DropTargetDragEvent event) {
            }

            public void dragOver(DropTargetDragEvent event) {
            }

            public void dropActionChanged(DropTargetDragEvent event) {
            }

            public void dragExit(DropTargetEvent event) {
            }

            public void drop(DropTargetDropEvent event) {
                try {
                    event.acceptDrop(DnDConstants.ACTION_REFERENCE);
                    Transferable transfer = event.getTransferable();
                    File[] files = getAcceptedFiles(transfer);
                    if (null != files && files.length != 0) {
                        openFiles(files, false);
                        event.getDropTargetContext().dropComplete(true);
                    }
                } catch (InvalidDnDOperationException ex) {
                    // ignore
                }
            }
        };
    }

    private File[] getAcceptedFiles(Transferable transferable) {
        try {
            if (!transferable.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
                return null;
            }

            List filelist = (List) transferable.getTransferData(DataFlavor.javaFileListFlavor);
            List acceptedFiles = new ArrayList();
            File[] files = (File[]) filelist.toArray(new File[0]);
            for (int i = 0; i < files.length; i++) {
                if (!files[i].isDirectory()) {
                    acceptedFiles.add(files[i]);
                }
            }
            return (File[]) acceptedFiles.toArray(new File[0]);
        } catch (IOException ex) {
            return null;
        } catch (UnsupportedFlavorException ex) {
            return null;
        }
    }

    private void getLogfileFromClipboard() {
        Transferable t = Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null);
        String text = null;

        try {
            if (t != null && t.isDataFlavorSupported(DataFlavor.stringFlavor)) {
                text = (String) t.getTransferData(DataFlavor.stringFlavor);
            }
        } catch (UnsupportedFlavorException ex) {
            LOGGER.log(Level.SEVERE, "Unsupported flavor for clipboard data", ex);
        } catch (IOException ex) {
            LOGGER.log(Level.SEVERE, "IO error reading clipboard data", ex);
        }

        if (text != null) {
            if (topNodes == null) {
                initDumpDisplay(text);
            } else {
                addDumpStream(new ByteArrayInputStream(text.getBytes()), "Clipboard at " + new Date(System.currentTimeMillis()), false);
                addToLogfile(text);
                if (this.getRootPane() != null) {
                    this.getRootPane().revalidate();
                }
                displayContent(null);
            }

            if (!this.runningAsVisualVMPlugin) {
                getMainMenu().getFindLRThreadsToolBarButton().setEnabled(true);
                getMainMenu().getExpandButton().setEnabled(true);
                getMainMenu().getCollapseButton().setEnabled(true);
            }
        }
    }

    private String parseWelcomeURL(InputStream is) {
        BufferedReader br = null;
        String resultString = null;

        StringBuffer result = new StringBuffer();

        try {
            br = new BufferedReader(new InputStreamReader(is));
            while (br.ready()) {
                result.append(br.readLine());
                result.append("\n");
            }
            resultString = result.toString();
            resultString = resultString.replaceFirst("./important.png", TDA.class.getResource("doc/important.png").toString());
            resultString = resultString.replaceFirst("./fileopen.png", TDA.class.getResource("doc/fileopen.png").toString());
            resultString = resultString.replaceFirst("./settings.png", TDA.class.getResource("doc/settings.png").toString());
            resultString = resultString.replaceFirst("./help.png", TDA.class.getResource("doc/help.png").toString());
            resultString = resultString.replaceFirst("<!-- ##tipofday## -->", TipOfDay.getTipOfDay());

            String[] recentFiles = PrefManager.get().getRecentFiles();
            List<String> existingFiles = new ArrayList<>();
            for (String recentFile : recentFiles) {
                if (recentFile.trim().length() > 0) {
                    if (new File(recentFile).exists()) {
                        existingFiles.add(recentFile);
                    }
                }
            }
            if (existingFiles.size() != recentFiles.length) {
                PrefManager.get().setRecentFiles(existingFiles.toArray(new String[0]));
            }
            resultString = resultString.replaceFirst("<!-- ##recentlogfiles## -->", getAsTable("openlogfile://", existingFiles.toArray(new String[0])));

            String[] recentSessions = PrefManager.get().getRecentSessions();
            List<String> existingSessions = new ArrayList<>();
            for (String recentSession : recentSessions) {
                if (recentSession.trim().length() > 0) {
                    if (new File(recentSession).exists()) {
                        existingSessions.add(recentSession);
                    }
                }
            }
            if (existingSessions.size() != recentSessions.length) {
                PrefManager.get().setRecentSessions(existingSessions.toArray(new String[0]));
            }
            resultString = resultString.replaceFirst("<!-- ##recentsessions## -->", getAsTable("opensession://", existingSessions.toArray(new String[0])));
        } catch (IllegalArgumentException ex) {
            // hack to prevent crashing of the app because off unparsed replacer.
            LOGGER.log(Level.SEVERE, "Failed to parse welcome page replacers", ex);
        } catch (IOException ex) {
            LOGGER.log(Level.SEVERE, "IO error reading welcome page", ex);
        } finally {
            try {
                if (br != null) {
                    br.close();
                    is.close();
                }
            } catch (IOException ex) {
                LOGGER.log(Level.SEVERE, "Error closing stream", ex);
            }
        }
        // remove unparsed replacers.
        resultString = resultString.replaceFirst("<!-- ##tipofday## -->", "");
        resultString = resultString.replaceFirst("<!-- ##recentlogfiles## -->", "");
        resultString = resultString.replaceFirst("<!-- ##recentsessions## -->", "");
        return (resultString);
    }

    /**
     * convert the given elements into a href-table to be included into the
     * welcome page. Only last four elements are taken.
     * @param prefix link prefix to use
     * @param elements list of elements.
     * @return given elements as table.
     */
    private String getAsTable(String prefix, String[] elements) {
        StringBuffer result = new StringBuffer();
        int from = elements.length > 4 ? elements.length - 4 : 0;

        for (int i = from; i < elements.length; i++) {
            if (elements[i].trim().length() > 0) {
                // remove backslashes as they confuse the html display.
                String elem = elements[i].replaceAll("\\\\", "/");
                result.append("<tr><td width=\"20px\"></td><td><a href=\"");
                result.append(prefix);
                result.append(elem);
                result.append("\">");
                result.append(cutLink(elem, 80));
                result.append("</a></td></tr>\n");
            }
        }

        return (result.toString());
    }

    /**
     * cut the given link string to the specified length + three dots.
     * @param link
     * @param len
     * @return cut link or original link if link.length() <= len
     */
    private String cutLink(String link, int len) {
        if (link.length() > len) {
            String cut = link.substring(0, len / 2) +
                    "..." + link.substring(link.length() - (len / 2));
            return (cut);
        }

        return (link);
    }

    /**
     * request jmx dump
     */
    public LogFileContent addMXBeanDump() {
        String dump = mBeanDumper.threadDump();
        String locks = mBeanDumper.findDeadlock();

        // if deadlocks were found, append them to dump output.
        if (locks != null && !"".equals(locks)) {
            dump += "\n" + locks;
        }
        //System.out.println(dump);
        if (topNodes == null) {
            initDumpDisplay(null);
        }
        addDumpStream(new ByteArrayInputStream(dump.getBytes()), "Logfile", false);
        dumpCounter++;
        LogFileContent lfc = addToLogfile(dump);

        if (this.getRootPane() != null) {
            this.getRootPane().revalidate();
        }
        tree.setShowsRootHandles(false);
        displayContent(null);

        if (!this.runningAsVisualVMPlugin) {
            getMainMenu().getFindLRThreadsToolBarButton().setEnabled(true);
            getMainMenu().getExpandButton().setEnabled(true);
            getMainMenu().getCollapseButton().setEnabled(true);
        }
        return (lfc);
    }

    private LogFileContent addToLogfile(String dump) {
        ((LogFileContent) logFile.getUserObject()).appendToContentBuffer(dump);
        return (((LogFileContent) logFile.getUserObject()));
    }

    /**
     * create file filter for session files.
     * @return file filter instance.
     */
    private static FileFilter getSessionFilter() {
        FileFilter filter = new FileFilter() {

            public boolean accept(File arg0) {
                return (arg0 != null && (arg0.isDirectory() || arg0.getName().endsWith("tsf")));
            }

            public String getDescription() {
                return ("TDA Session Files");
            }

        };
        return (filter);
    }

    /**
     * initializes session file chooser, if not already done.
     */
    private static void initSessionFc() {

        sessionFc = new JFileChooser();
        sessionFc.setMultiSelectionEnabled(true);
        sessionFc.setCurrentDirectory(PrefManager.get().getSelectedPath());
        if ((PrefManager.get().getPreferredSizeFileChooser().height > 0)) {
            sessionFc.setPreferredSize(PrefManager.get().getPreferredSizeFileChooser());
        }
        sessionFc.setFileFilter(getSessionFilter());

        sessionFc.setSelectedFile(null);
    }

    /**
     * expand all dump nodes in the root tree
     * @param expand true=expand, false=collapse.
     */
    public void expandAllDumpNodes(boolean expand) {
        TreeNode root = (TreeNode) tree.getModel().getRoot();
        expandAll(tree, new TreePath(root), expand);
    }

    /**
     * expand all nodes of the currently selected category, only works for tree categories.
     */
    private void expandAllCatNodes(boolean expand) {
        DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();
        JTree catTree = (JTree) ((TreeCategory) node.getUserObject()).getCatComponent(this);
        if (expand) {
            for (int i = 0; i < catTree.getRowCount(); i++) {
                catTree.expandRow(i);
            }
        } else {
            for (int i = 0; i < catTree.getRowCount(); i++) {
                catTree.collapseRow(i);
            }
        }
    }

    /**
     * sort monitors by thread amount
     */
    private void sortCatByThreads() {
        DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();
        ((TreeCategory) node.getUserObject()).sort(new MonitorComparator());
        displayCategory(node.getUserObject());
    }

    /**
     * expand or collapse all nodes of the specified tree
     * @param parent the parent to start with
     * @param expand expand=true, collapse=false
     */
    private void expandAll(JTree catTree, TreePath parent, boolean expand) {
        // Traverse children
        TreeNode node = (TreeNode) parent.getLastPathComponent();
        if (node.getChildCount() >= 0) {
            for (Enumeration e = node.children(); e.hasMoreElements(); ) {
                TreeNode n = (TreeNode) e.nextElement();
                TreePath path = parent.pathByAddingChild(n);
                expandAll(catTree, path, expand);
            }
        }

        if (parent.getPathCount() > 1) {
            // Expansion or collapse must be done bottom-up
            if (expand) {
                catTree.expandPath(parent);
            } else {
                catTree.collapsePath(parent);
            }
        }
    }

    private void saveSession() {
        initSessionFc();
        int returnVal = sessionFc.showSaveDialog(this.getRootPane());
        sessionFc.setPreferredSize(sessionFc.getSize());

        PrefManager.get().setPreferredSizeFileChooser(sessionFc.getSize());

        if (returnVal == JFileChooser.APPROVE_OPTION) {
            File file = sessionFc.getSelectedFile();
            // check if file has a suffix
            if (file.getName().indexOf(".") < 0) {
                file = new File(file.getAbsolutePath() + ".tsf");
            }
          
Download .txt
gitextract_2wl47vax/

├── .github/
│   ├── copilot-instructions.md
│   └── workflows/
│       ├── build.yml
│       ├── pages.yml
│       └── release.yml
├── .gitignore
├── CHANGELOG.md
├── LICENSE
├── README.md
├── docs/
│   └── index.html
├── pom.xml
├── renovate.json
├── tda/
│   ├── dependency-reduced-pom.xml
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── de/
│       │   │       └── grimmfrost/
│       │   │           └── tda/
│       │   │               ├── CustomCategoriesDialog.java
│       │   │               ├── EditCustomCategoryDialog.java
│       │   │               ├── EditFilterDialog.java
│       │   │               ├── FilterDialog.java
│       │   │               ├── HelpOverviewDialog.java
│       │   │               ├── InfoDialog.java
│       │   │               ├── LongThreadDialog.java
│       │   │               ├── MainMenu.java
│       │   │               ├── PreferencesDialog.java
│       │   │               ├── SearchDialog.java
│       │   │               ├── TDA.java
│       │   │               ├── filter/
│       │   │               │   ├── Filter.java
│       │   │               │   └── FilterChecker.java
│       │   │               ├── jconsole/
│       │   │               │   ├── MBeanDumper.java
│       │   │               │   └── TDAPlugin.java
│       │   │               ├── mcp/
│       │   │               │   ├── HeadlessAnalysisProvider.java
│       │   │               │   └── MCPServer.java
│       │   │               ├── model/
│       │   │               │   ├── AbstractCategory.java
│       │   │               │   ├── AbstractInfo.java
│       │   │               │   ├── Category.java
│       │   │               │   ├── CustomCategory.java
│       │   │               │   ├── DumpStore.java
│       │   │               │   ├── HeapInfo.java
│       │   │               │   ├── HistogramInfo.java
│       │   │               │   ├── LogFileContent.java
│       │   │               │   ├── Logfile.java
│       │   │               │   ├── MonitorMap.java
│       │   │               │   ├── TableCategory.java
│       │   │               │   ├── ThreadDumpInfo.java
│       │   │               │   ├── ThreadInfo.java
│       │   │               │   └── TreeCategory.java
│       │   │               ├── parser/
│       │   │               │   ├── AbstractDumpParser.java
│       │   │               │   ├── Analyzer.java
│       │   │               │   ├── DumpParser.java
│       │   │               │   ├── DumpParserFactory.java
│       │   │               │   ├── JCmdJSONParser.java
│       │   │               │   ├── SunJDKParser.java
│       │   │               │   └── WrappedSunJDKParser.java
│       │   │               └── utils/
│       │   │                   ├── AppInfo.java
│       │   │                   ├── Browser.java
│       │   │                   ├── ColoredTable.java
│       │   │                   ├── DateMatcher.java
│       │   │                   ├── HistogramTableModel.java
│       │   │                   ├── IconFactory.java
│       │   │                   ├── LogManager.java
│       │   │                   ├── MonitorComparator.java
│       │   │                   ├── MonitorsTableModel.java
│       │   │                   ├── PrefManager.java
│       │   │                   ├── ResourceManager.java
│       │   │                   ├── StatusBar.java
│       │   │                   ├── SwingWorker.java
│       │   │                   ├── TableSorter.java
│       │   │                   ├── ThreadsTableModel.java
│       │   │                   ├── ThreadsTableSelectionModel.java
│       │   │                   ├── TipOfDay.java
│       │   │                   ├── TreeRenderer.java
│       │   │                   ├── ViewScrollPane.java
│       │   │                   └── jedit/
│       │   │                       ├── DefaultInputHandler.java
│       │   │                       ├── InputHandler.java
│       │   │                       ├── JEditTextArea.java
│       │   │                       ├── KeywordMap.java
│       │   │                       ├── PopupMenu.java
│       │   │                       ├── SyntaxDocument.java
│       │   │                       ├── SyntaxStyle.java
│       │   │                       ├── SyntaxUtilities.java
│       │   │                       ├── TextAreaDefaults.java
│       │   │                       ├── TextAreaPainter.java
│       │   │                       ├── TextUtilities.java
│       │   │                       ├── Token.java
│       │   │                       └── TokenMarker.java
│       │   └── resources/
│       │       ├── META-INF/
│       │       │   └── services/
│       │       │       └── com.sun.tools.jconsole.JConsolePlugin
│       │       ├── de/
│       │       │   └── grimmfrost/
│       │       │       └── tda/
│       │       │           ├── doc/
│       │       │           │   ├── COPYING
│       │       │           │   ├── README
│       │       │           │   ├── stylesheet.css
│       │       │           │   ├── tips.properties
│       │       │           │   └── welcome.html
│       │       │           ├── locale.properties
│       │       │           └── version.properties
│       │       └── icons/
│       │           ├── splash.xcf
│       │           ├── tda-logo.xcf
│       │           └── welcome-logo.xcf
│       └── test/
│           ├── java/
│           │   └── de/
│           │       └── grimmfrost/
│           │           └── tda/
│           │               ├── mcp/
│           │               │   └── HeadlessAnalysisProviderTest.java
│           │               ├── model/
│           │               │   └── TableCategoryTest.java
│           │               ├── parser/
│           │               │   ├── DumpParserFactoryTest.java
│           │               │   ├── JCmdJSONParserTest.java
│           │               │   └── SunJDKParserTest.java
│           │               └── utils/
│           │                   └── LogManagerTest.java
│           └── resources/
│               ├── carrier_stuck.log
│               ├── hpdump.log
│               ├── intellij_dump.json
│               ├── java11dump.log
│               ├── java21dump.log
│               ├── java21dump_utf16.log
│               ├── java8dump.log
│               ├── jdk11_long_running.log
│               ├── jstack_dump.log
│               ├── test.log
│               ├── test64bit.log
│               ├── testwithhistogram.log
│               ├── urlthread.log
│               └── visualvmremote.log
├── tda-macos-binary/
│   ├── pom.xml
│   └── src/
│       └── main/
│           └── resources/
│               └── TDA.icns
├── visualvm-lib-component/
│   ├── manifest.mf
│   ├── pom.xml
│   └── src/
│       └── main/
│           └── resources/
│               └── net/
│                   └── java/
│                       └── dev/
│                           └── tda/
│                               └── Bundle.properties
├── visualvm-logfile-component/
│   ├── manifest.mf
│   ├── pom.xml
│   └── src/
│       └── main/
│           ├── java/
│           │   └── net/
│           │       └── java/
│           │           └── dev/
│           │               └── tda/
│           │                   └── visualvm/
│           │                       └── logfile/
│           │                           ├── AddLogfileAction.java
│           │                           ├── Install.java
│           │                           ├── LogPanel.java
│           │                           ├── Logfile.java
│           │                           ├── LogfileCategory.java
│           │                           ├── LogfileDataSource.java
│           │                           ├── LogfileDescriptor.java
│           │                           ├── LogfileDescriptorProvider.java
│           │                           ├── LogfileDumpView.java
│           │                           ├── LogfileDumpViewProvider.java
│           │                           ├── LogfileProvider.java
│           │                           └── LogfileSupport.java
│           └── resources/
│               └── net/
│                   └── java/
│                       └── dev/
│                           └── tda/
│                               └── visualvm/
│                                   └── logfile/
│                                       ├── Bundle.properties
│                                       └── layer.xml
└── visualvm-module/
    ├── manifest.mf
    ├── pom.xml
    └── src/
        └── main/
            ├── java/
            │   └── net/
            │       └── java/
            │           └── dev/
            │               └── tda/
            │                   └── visualvm/
            │                       ├── Install.java
            │                       ├── TDAView.java
            │                       ├── TDAViewProvider.java
            │                       ├── VisualvmOptionsCategory.java
            │                       └── VisualvmOptionsPanelController.java
            └── resources/
                └── net/
                    └── java/
                        └── dev/
                            └── tda/
                                └── visualvm/
                                    ├── Bundle.properties
                                    └── layer.xml
Download .txt
SYMBOL INDEX (1210 symbols across 93 files)

FILE: tda/src/main/java/de/grimmfrost/tda/CustomCategoriesDialog.java
  class CustomCategoriesDialog (line 48) | public class CustomCategoriesDialog extends JDialog {
    method CustomCategoriesDialog (line 57) | public CustomCategoriesDialog(Frame owner) {
    method initPanel (line 70) | private void initPanel() {
    method reset (line 87) | public void reset() {
    class CategoriesPanel (line 91) | public static class CategoriesPanel extends JPanel implements ActionLi...
      method CategoriesPanel (line 104) | public CategoriesPanel(Frame owner) {
      method createList (line 137) | public void createList() {
      method actionPerformed (line 148) | public void actionPerformed(ActionEvent e) {
      method removeCategory (line 160) | private void removeCategory() {
      method createCategoryDialog (line 167) | private void createCategoryDialog(String title, boolean isAdd, int s...
      method valueChanged (line 182) | public void valueChanged(ListSelectionEvent e) {
      method saveSettings (line 192) | public void saveSettings() {
    method resetFocus (line 198) | public void resetFocus() {

FILE: tda/src/main/java/de/grimmfrost/tda/EditCustomCategoryDialog.java
  class EditCustomCategoryDialog (line 52) | public class EditCustomCategoryDialog extends JDialog {
    method EditCustomCategoryDialog (line 64) | public EditCustomCategoryDialog(Frame owner, String frameTitle, JList ...
    method initPanel (line 79) | private void initPanel() {
    method applyCat (line 118) | private void applyCat(CustomCategory cat) {
    method addToList (line 127) | private void addToList(CustomCategory cat) {
    method reset (line 135) | public void reset() {
    class SettingsPanel (line 139) | class SettingsPanel extends JPanel implements ListSelectionListener, A...
      method SettingsPanel (line 151) | public SettingsPanel(CustomCategory presetCat) {
      method fillCatData (line 164) | private void fillCatData(CustomCategory presetCategory) {
      method createSelectionPanel (line 177) | private JPanel createSelectionPanel() {
      method createNamePanel (line 246) | private JPanel createNamePanel() {
      method valueChanged (line 256) | public void valueChanged(ListSelectionEvent e) {
      method actionPerformed (line 270) | public void actionPerformed(ActionEvent e) {
      method moveFilter (line 280) | private void moveFilter(JList fromList, JList toList, int selectedIt...

FILE: tda/src/main/java/de/grimmfrost/tda/EditFilterDialog.java
  class EditFilterDialog (line 45) | public class EditFilterDialog extends JDialog {
    method EditFilterDialog (line 57) | public EditFilterDialog(Frame owner, String frameTitle, JList filterLi...
    method initPanel (line 72) | private void initPanel() {
    method applyFilter (line 113) | private void applyFilter(Filter filter) {
    method addToList (line 122) | private void addToList(Filter filter) {
    method reset (line 130) | public void reset() {
    class SettingsPanel (line 134) | class SettingsPanel extends JPanel {
      method SettingsPanel (line 141) | public SettingsPanel(Filter presetFilter) {
      method fillFilterData (line 185) | private void fillFilterData(Filter presetFilter) {
      method getAsFilter (line 197) | public Filter getAsFilter() {

FILE: tda/src/main/java/de/grimmfrost/tda/FilterDialog.java
  class FilterDialog (line 48) | public class FilterDialog extends JDialog {
    method FilterDialog (line 58) | public FilterDialog(Frame owner) {
    method initPanel (line 71) | private void initPanel() {
    method reset (line 90) | public void reset() {
    class FilterPanel (line 94) | public static class FilterPanel extends JPanel implements ActionListen...
      method FilterPanel (line 104) | public FilterPanel(Frame owner) {
      method createList (line 137) | public void createList() {
      method actionPerformed (line 148) | public void actionPerformed(ActionEvent e) {
      method removeFilter (line 160) | private void removeFilter() {
      method createFilterDialog (line 167) | private void createFilterDialog(String title, boolean isAdd, int sel...
      method valueChanged (line 178) | public void valueChanged(ListSelectionEvent e) {
      method saveSettings (line 188) | public void saveSettings() {
    method resetFocus (line 194) | public void resetFocus() {

FILE: tda/src/main/java/de/grimmfrost/tda/HelpOverviewDialog.java
  class HelpOverviewDialog (line 49) | public class HelpOverviewDialog extends JDialog {
    method HelpOverviewDialog (line 59) | public HelpOverviewDialog(JFrame owner, String title, String file, Ima...
    method initPanel (line 74) | private void initPanel() {
    method resetFocus (line 127) | public void resetFocus() {
    method getFile (line 131) | private String getFile() {
    method setFile (line 135) | private void setFile(String value) {

FILE: tda/src/main/java/de/grimmfrost/tda/InfoDialog.java
  class InfoDialog (line 39) | public class InfoDialog extends JDialog {
    method InfoDialog (line 44) | public InfoDialog(JFrame owner) {
    method initPanel (line 52) | private void initPanel() {

FILE: tda/src/main/java/de/grimmfrost/tda/LongThreadDialog.java
  class LongThreadDialog (line 47) | public class LongThreadDialog extends JDialog {
    method LongThreadDialog (line 61) | public LongThreadDialog(TDA owner, TreePath[] dumps, DefaultMutableTre...
    method initPanel (line 73) | private void initPanel() {
    method reset (line 112) | public void reset() {
    class SettingsPanel (line 116) | class SettingsPanel extends JPanel {
      method SettingsPanel (line 120) | public SettingsPanel() {
    method resetFocus (line 147) | public void resetFocus() {

FILE: tda/src/main/java/de/grimmfrost/tda/MainMenu.java
  class MainMenu (line 43) | public class MainMenu extends JMenuBar {
    method MainMenu (line 66) | public MainMenu(TDA listener) {
    method getCloseMenuItem (line 74) | public JMenuItem getCloseMenuItem() {
    method getCloseToolBarButton (line 81) | public JButton getCloseToolBarButton() {
    method getExpandButton (line 88) | public JButton getExpandButton() {
    method getCollapseButton (line 95) | public JButton getCollapseButton() {
    method getFindLRThreadsToolBarButton (line 102) | public JButton getFindLRThreadsToolBarButton() {
    method getCloseAllMenuItem (line 109) | public JMenuItem getCloseAllMenuItem() {
    method getLongMenuItem (line 113) | public JMenuItem getLongMenuItem() {
    method getExpandAllMenuItem (line 120) | public JMenuItem getExpandAllMenuItem() {
    method getCollapseAllMenuItem (line 124) | public JMenuItem getCollapseAllMenuItem() {
    method getSaveSessionMenuItem (line 128) | public JMenuItem getSaveSessionMenuItem() {
    method createMenuBar (line 135) | private void createMenuBar() {
    method createFileMenu (line 142) | private JMenu createFileMenu() {
    method createViewMenu (line 228) | private JMenu createViewMenu() {
    method createToolsMenu (line 268) | private JMenu createToolsMenu() {
    method createHelpMenu (line 320) | private JMenu createHelpMenu() {
    method createRecentFileMenu (line 352) | private void createRecentFileMenu() {
    method createRecentSessionsMenu (line 373) | private void createRecentSessionsMenu() {
    method getToolBar (line 397) | public JToolBar getToolBar() {
    method createToolBar (line 407) | private void createToolBar() {
    method createToolBarButton (line 443) | private JButton createToolBarButton(String text, String fileName) {

FILE: tda/src/main/java/de/grimmfrost/tda/PreferencesDialog.java
  class PreferencesDialog (line 48) | public class PreferencesDialog extends JDialog {
    method PreferencesDialog (line 58) | public PreferencesDialog(Frame owner) {
    method getPane (line 67) | public JTabbedPane getPane() {
    method initPanel (line 71) | private void initPanel() {
    method reset (line 96) | public void reset() {
    method loadSettings (line 101) | public void loadSettings() {
    method saveSettings (line 120) | public void saveSettings() {
    class GeneralPanel (line 133) | static class GeneralPanel extends JPanel {
      method GeneralPanel (line 140) | public GeneralPanel() {
    class RegExPanel (line 183) | public static class RegExPanel extends JPanel implements ActionListener {
      method RegExPanel (line 190) | RegExPanel() {
      method actionPerformed (line 220) | public void actionPerformed(ActionEvent e) {
    method resetFocus (line 233) | public void resetFocus() {

FILE: tda/src/main/java/de/grimmfrost/tda/SearchDialog.java
  class SearchDialog (line 37) | public class SearchDialog extends JDialog
    method SearchDialog (line 47) | public SearchDialog(JFrame owner, JComponent comp) {
    method createButtonPanel (line 73) | protected JComponent createButtonPanel() {
    method actionPerformed (line 85) | public void actionPerformed(ActionEvent e) {
    method resetFocus (line 114) | protected void resetFocus() {
    method reset (line 118) | public void reset() {

FILE: tda/src/main/java/de/grimmfrost/tda/TDA.java
  class TDA (line 124) | public class TDA extends JPanel implements ListSelectionListener, TreeSe...
    method TDA (line 171) | public TDA(boolean setLF) {
    method TDA (line 183) | public TDA(boolean setLF, MBeanDumper mBeanDumper) {
    method TDA (line 189) | public TDA(boolean setLF, String dumpFile) {
    method init (line 199) | public void init(boolean asJConsolePlugin, boolean asVisualVMPlugin) {
    method getDropTargetListener (line 345) | private DropTargetListener getDropTargetListener() {
    method getAcceptedFiles (line 375) | private File[] getAcceptedFiles(Transferable transferable) {
    method getLogfileFromClipboard (line 397) | private void getLogfileFromClipboard() {
    method parseWelcomeURL (line 431) | private String parseWelcomeURL(InputStream is) {
    method getAsTable (line 506) | private String getAsTable(String prefix, String[] elements) {
    method cutLink (line 532) | private String cutLink(String link, int len) {
    method addMXBeanDump (line 545) | public LogFileContent addMXBeanDump() {
    method addToLogfile (line 575) | private LogFileContent addToLogfile(String dump) {
    method getSessionFilter (line 584) | private static FileFilter getSessionFilter() {
    method initSessionFc (line 602) | private static void initSessionFc() {
    method expandAllDumpNodes (line 619) | public void expandAllDumpNodes(boolean expand) {
    method expandAllCatNodes (line 627) | private void expandAllCatNodes(boolean expand) {
    method sortCatByThreads (line 644) | private void sortCatByThreads() {
    method expandAll (line 655) | private void expandAll(JTree catTree, TreePath parent, boolean expand) {
    method saveSession (line 676) | private void saveSession() {
    method openSession (line 720) | private void openSession() {
    method openSession (line 740) | private void openSession(File file, boolean isRecent) {
    method loadSession (line 754) | private void loadSession(File file, boolean isRecent) throws IOExcepti...
    method setShowToolbar (line 793) | private void setShowToolbar(boolean state) {
    method setupLookAndFeel (line 807) | private void setupLookAndFeel() {
    method initDumpDisplay (line 820) | public void initDumpDisplay(String content) {
    method addDumpFile (line 869) | private void addDumpFile() {
    method addDumpFile (line 876) | public void addDumpFile(String filePath) {
    method isLogfileSizeOk (line 882) | private boolean isLogfileSizeOk(String fileName) {
    method addDumpFiles (line 896) | private void addDumpFiles(String[] files) {
    method addDumpStream (line 909) | private void addDumpStream(InputStream inputStream, String file, boole...
    method createTree (line 965) | protected void createTree() {
    method addTreeListener (line 1020) | private void addTreeListener(JTree tree) {
    method setThreadDisplay (line 1065) | private void setThreadDisplay(boolean value) {
    method isThreadDisplay (line 1069) | public boolean isThreadDisplay() {
    method valueChanged (line 1076) | public void valueChanged(TreeSelectionEvent e) {
    method valueChanged (line 1112) | public void valueChanged(ListSelectionEvent e) {
    method displayThreadInfo (line 1126) | private void displayThreadInfo(Object nodeInfo) {
    method appendThreadInfo (line 1132) | private void appendThreadInfo(StringBuffer sb, Object nodeInfo) {
    method displayThreadDumpInfo (line 1146) | private void displayThreadDumpInfo(Object nodeInfo) {
    method displayLogFile (line 1151) | private void displayLogFile() {
    method displayLogFileContent (line 1162) | private void displayLogFileContent(Object nodeInfo) {
    method initJeditView (line 1191) | private void initJeditView() {
    method displayCategory (line 1204) | private void displayCategory(Object nodeInfo) {
    method displayContent (line 1252) | private void displayContent(String text) {
    method displayTable (line 1275) | private void displayTable(HistogramTableModel htm) {
    class FilterListener (line 1343) | private class FilterListener implements CaretListener {
      method FilterListener (line 1347) | FilterListener(HistogramTableModel htm) {
      method caretUpdate (line 1351) | public void caretUpdate(CaretEvent event) {
    class CheckCaseListener (line 1359) | private class CheckCaseListener implements ChangeListener {
      method CheckCaseListener (line 1362) | CheckCaseListener(HistogramTableModel htm) {
      method stateChanged (line 1366) | public void stateChanged(ChangeEvent e) {
    method addThreadDumps (line 1372) | private void addThreadDumps(DefaultMutableTreeNode top, InputStream du...
    method navigateToDumpInLogfile (line 1409) | private void navigateToDumpInLogfile() {
    method navigateToMonitor (line 1447) | private void navigateToMonitor(String monitorLink) {
    method navigateToDump (line 1498) | private void navigateToDump() {
    method navigateToChild (line 1508) | private void navigateToChild(String startsWith) {
    method getMainMenu (line 1529) | protected MainMenu getMainMenu() {
    method createPopupMenu (line 1540) | public void createPopupMenu() {
    method getCatPopupMenu (line 1612) | private PopupListener getCatPopupMenu() {
    method getMonitorsPopupMenu (line 1635) | private PopupListener getMonitorsPopupMenu() {
    class PopupListener (line 1664) | class PopupListener extends MouseAdapter {
      method PopupListener (line 1667) | PopupListener(JPopupMenu popupMenu) {
      method mousePressed (line 1671) | public void mousePressed(MouseEvent e) {
      method mouseReleased (line 1675) | public void mouseReleased(MouseEvent e) {
      method maybeShowPopup (line 1679) | private void maybeShowPopup(MouseEvent e) {
    method actionPerformed (line 1693) | public void actionPerformed(ActionEvent e) {
    method showInfo (line 1803) | private void showInfo() {
    method showInfoFile (line 1818) | private void showInfoFile(String title, String file, String icon) {
    method getFrame (line 1828) | private JFrame getFrame() {
    method showPreferencesDialog (line 1837) | private void showPreferencesDialog() {
    method showFilterDialog (line 1851) | public void showFilterDialog() {
    method showCategoriesDialog (line 1869) | private void showCategoriesDialog() {
    method saveLogFile (line 1892) | public void saveLogFile() {
    method chooseFile (line 1943) | private void chooseFile() {
    method openFiles (line 1964) | private void openFiles(File[] files, boolean isRecent) {
    method createImageIcon (line 1994) | public static ImageIcon createImageIcon(String path) {
    method getDumpRootNode (line 2009) | private DefaultMutableTreeNode getDumpRootNode(DefaultMutableTreeNode ...
    method getDumpRootNode (line 2023) | private DefaultMutableTreeNode getDumpRootNode(String dumpName, Defaul...
    method parseLoggcLogfile (line 2050) | private void parseLoggcLogfile() {
    method closeCurrentDump (line 2066) | private void closeCurrentDump() {
    method disableMainMenu (line 2109) | private void disableMainMenu() {
    method closeAllDumps (line 2125) | private void closeAllDumps() {
    method resetMainPanel (line 2145) | private void resetMainPanel() {
    method checkNameFromNode (line 2162) | private boolean checkNameFromNode(DefaultMutableTreeNode node, String ...
    method checkNameFromNode (line 2174) | private boolean checkNameFromNode(DefaultMutableTreeNode node, int sta...
    method openLoggcFile (line 2193) | private void openLoggcFile() {
    method findLongRunningThreads (line 2239) | private void findLongRunningThreads() {
    method getRootNodeLevel (line 2263) | private int getRootNodeLevel() {
    method setRootNodeLevel (line 2267) | private void setRootNodeLevel(int value) {
    method fetchTop (line 2271) | private DefaultMutableTreeNode fetchTop(TreePath pathToRoot) {
    method saveState (line 2278) | private void saveState() {
    method isFileOpen (line 2293) | private boolean isFileOpen() {
    method setFileOpen (line 2297) | private void setFileOpen(boolean value) {
    method createAndShowGUI (line 2306) | private static void createAndShowGUI() {
    method showSearchDialog (line 2372) | private void showSearchDialog() {
    method main (line 2396) | public static void main(String[] args) {
    method menuSelected (line 2420) | public void menuSelected(MenuEvent e) {
    method menuDeselected (line 2429) | public void menuDeselected(MenuEvent e) {
    method menuCanceled (line 2433) | public void menuCanceled(MenuEvent e) {
    method getFontSizeModifier (line 2437) | public static String getFontSizeModifier(int add) {
    class FileDropTargetListener (line 2448) | private class FileDropTargetListener extends DropTargetAdapter {
      method drop (line 2450) | public void drop(DropTargetDropEvent dtde) {

FILE: tda/src/main/java/de/grimmfrost/tda/filter/Filter.java
  class Filter (line 33) | public class Filter {
    method Filter (line 93) | public Filter() {
    method Filter (line 102) | public Filter(String name, String regEx, int fr, boolean gf, boolean e...
    method setName (line 114) | public void setName(String value) {
    method getName (line 121) | public String getName() {
    method getFilterExpression (line 128) | public String getFilterExpression() {
    method setFilterExpression (line 132) | public void setFilterExpression(String regEx) {
    method getFilterExpressionPattern (line 141) | public Pattern getFilterExpressionPattern() {
    method setGeneralFilter (line 152) | public void setGeneralFilter(boolean value) {
    method isGeneralFilter (line 159) | public boolean isGeneralFilter() {
    method setExclusionFilter (line 166) | public void setExclusionFilter(boolean value) {
    method isExclusionFilter (line 173) | public boolean isExclusionFilter() {
    method getFilterRule (line 177) | public int getFilterRule() {
    method setFilterRule (line 181) | public void setFilterRule(int filterRule) {
    method isEnabled (line 185) | public boolean isEnabled() {
    method setEnabled (line 189) | public void setEnabled(boolean enabled) {
    method matches (line 193) | public boolean matches(ThreadInfo ti) {
    method matches (line 197) | public boolean matches(ThreadInfo ti, boolean forceEnabled) {
    method checkLine (line 242) | private boolean checkLine(ThreadInfo ti, String contains, char beginCh...
    method toString (line 251) | public String toString() {

FILE: tda/src/main/java/de/grimmfrost/tda/filter/FilterChecker.java
  class FilterChecker (line 35) | public class FilterChecker {
    method FilterChecker (line 46) | public FilterChecker(Map checkFilters) {
    method getFilterChecker (line 53) | public static FilterChecker getFilterChecker() {
    method setGeneralFilters (line 61) | private static void setGeneralFilters() {
    method addToFilters (line 75) | public void addToFilters(Filter filter) {
    method check (line 87) | public boolean check(ThreadInfo ti) {
    method recheck (line 97) | public boolean recheck(ThreadInfo ti) {

FILE: tda/src/main/java/de/grimmfrost/tda/jconsole/MBeanDumper.java
  class MBeanDumper (line 49) | public class MBeanDumper {
    method MBeanDumper (line 67) | public MBeanDumper(MBeanServerConnection server) throws IOException {
    method setDumpPrefix (line 80) | private void setDumpPrefix() {
    method threadDump (line 95) | public String threadDump() {
    method getDumpDate (line 145) | private String getDumpDate() {
    method dumpThreadInfo (line 150) | private void dumpThreadInfo(StringBuilder dump) {
    method dumpThreadInfoWithLocks (line 165) | private void dumpThreadInfoWithLocks(StringBuilder dump) {
    method printThreadInfo (line 182) | private void printThreadInfo(ThreadInfo ti, StringBuilder dump) {
    method printThread (line 204) | private void printThread(ThreadInfo ti, StringBuilder dump) {
    method printMonitorInfo (line 231) | private void printMonitorInfo(ThreadInfo ti, MonitorInfo[] monitors, S...
    method printLockInfo (line 243) | private void printLockInfo(LockInfo[] locks, StringBuilder dump) {
    method findDeadlock (line 258) | public String findDeadlock() {
    method parseMBeanInfo (line 296) | private void parseMBeanInfo() throws IOException {
    method setMBeanServerConnection (line 345) | void setMBeanServerConnection(MBeanServerConnection mbs) {

FILE: tda/src/main/java/de/grimmfrost/tda/jconsole/TDAPlugin.java
  class TDAPlugin (line 39) | public class TDAPlugin extends JConsolePlugin implements PropertyChangeL...
    method TDAPlugin (line 45) | public TDAPlugin() {
    method getTabs (line 53) | public synchronized Map getTabs() {
    method newSwingWorker (line 74) | public SwingWorker newSwingWorker() {
    class Worker (line 81) | class Worker extends SwingWorker {
      method Worker (line 83) | Worker(TDA tda) {
      method done (line 87) | protected void done() {
      method doInBackground (line 91) | protected Object doInBackground() throws Exception {
    method propertyChange (line 101) | public void propertyChange(PropertyChangeEvent ev) {

FILE: tda/src/main/java/de/grimmfrost/tda/mcp/HeadlessAnalysisProvider.java
  class HeadlessAnalysisProvider (line 22) | public class HeadlessAnalysisProvider {
    method parseLogFile (line 28) | public void parseLogFile(String filePath) throws IOException {
    method getDumpsSummary (line 49) | public List<Map<String, Object>> getDumpsSummary() {
    method checkForDeadlocks (line 68) | public List<String> checkForDeadlocks() {
    method findLongRunningThreads (line 82) | public List<String> findLongRunningThreads() {
    method analyzeVirtualThreads (line 123) | public List<String> analyzeVirtualThreads() {
    method getNativeThreads (line 150) | public List<Map<String, String>> getNativeThreads(int dumpIndex) {
    method getZombieThreads (line 165) | public List<Map<String, String>> getZombieThreads() {
    method collectNativeThreads (line 183) | private void collectNativeThreads(Category cat, List<Map<String, Strin...
    method clear (line 216) | public void clear() {

FILE: tda/src/main/java/de/grimmfrost/tda/mcp/MCPServer.java
  class MCPServer (line 15) | public class MCPServer {
    method main (line 20) | public static void main(String[] args) {
    method requestHasId (line 62) | private static boolean requestHasId(String line) {
    method getId (line 70) | private static int getId(String line) {
    method handleInitialize (line 74) | private static void handleInitialize(JsonObject request) {
    method handleListTools (line 88) | private static void handleListTools(JsonObject request) {
    method createTool (line 112) | private static JsonObject createTool(String name, String description, ...
    method createProperty (line 123) | private static JsonObject createProperty(String name, String type, Str...
    method handleCallTool (line 132) | private static void handleCallTool(JsonObject request) throws IOExcept...
    method handleGenericRequest (line 150) | private static Object handleGenericRequest(String method, JsonObject p...
    method sendResponse (line 178) | private static void sendResponse(int id, Object result) {
    method sendError (line 186) | private static void sendError(int id, String message) {

FILE: tda/src/main/java/de/grimmfrost/tda/model/AbstractCategory.java
  class AbstractCategory (line 35) | public abstract class AbstractCategory extends AbstractInfo implements C...
    method sort (line 53) | public void sort(Comparator nodeComp) {
    method getIcon (line 73) | public Icon getIcon() {
    method setIconID (line 77) | public void setIconID(int iconID) {
    method howManyFiltered (line 86) | public int howManyFiltered() {
    method getNodeCount (line 90) | public int getNodeCount() {
    method showing (line 94) | public int showing() {
    method toString (line 98) | public String toString() {
    method addToCatNodes (line 105) | public void addToCatNodes(DefaultMutableTreeNode node) {
    method getNodeAt (line 117) | public DefaultMutableTreeNode getNodeAt(int index) {
    method setLastView (line 121) | public void setLastView(JScrollPane view) {
    method getLastView (line 129) | public JScrollPane getLastView() {
    method getLastUpdated (line 137) | protected long getLastUpdated() {
    method setLastUpdated (line 141) | protected void setLastUpdated() {
    method filterNodes (line 145) | protected DefaultMutableTreeNode filterNodes(DefaultMutableTreeNode ro...
    method getFilterChecker (line 160) | public FilterChecker getFilterChecker() {
    method setFilterChecker (line 167) | protected void setFilterChecker(FilterChecker filterChecker) {
    method isFilterEnabled (line 171) | protected boolean isFilterEnabled() {
    method setFilterEnabled (line 175) | protected void setFilterEnabled(boolean filterEnabled) {
    method getRootNode (line 179) | protected DefaultMutableTreeNode getRootNode() {
    method setRootNode (line 183) | protected void setRootNode(DefaultMutableTreeNode rootNode) {
    method getFilteredRootNode (line 187) | protected DefaultMutableTreeNode getFilteredRootNode() {
    method setFilteredRootNode (line 191) | protected void setFilteredRootNode(DefaultMutableTreeNode filteredRoot...
    method setInfo (line 195) | public void setInfo(String info) {
    method getInfo (line 199) | public String getInfo() {

FILE: tda/src/main/java/de/grimmfrost/tda/model/AbstractInfo.java
  class AbstractInfo (line 32) | public abstract class AbstractInfo implements Serializable {
    method getName (line 39) | public String getName() {
    method setName (line 47) | public void setName(String name) {

FILE: tda/src/main/java/de/grimmfrost/tda/model/Category.java
  type Category (line 34) | public interface Category {
    method addToCatNodes (line 39) | void addToCatNodes(DefaultMutableTreeNode node);
    method getNodeAt (line 46) | public DefaultMutableTreeNode getNodeAt(int index);
    method getCatComponent (line 51) | JComponent getCatComponent(EventListener listener);
    method getCurrentlySelectedUserObject (line 57) | ThreadInfo getCurrentlySelectedUserObject();
    method getFilterChecker (line 59) | FilterChecker getFilterChecker();
    method getIcon (line 61) | Icon getIcon();
    method getLastView (line 67) | JScrollPane getLastView();
    method getName (line 69) | String getName();
    method getNodeCount (line 71) | int getNodeCount();
    method howManyFiltered (line 76) | int howManyFiltered();
    method setLastView (line 78) | void setLastView(JScrollPane view);
    method setName (line 80) | void setName(String value);
    method showing (line 82) | int showing();
    method sort (line 88) | void sort(Comparator nodeComp);
    method setInfo (line 90) | void setInfo(String info);
    method getInfo (line 92) | String getInfo();

FILE: tda/src/main/java/de/grimmfrost/tda/model/CustomCategory.java
  class CustomCategory (line 33) | public class CustomCategory {
    method CustomCategory (line 38) | public CustomCategory(String name) {
    method getName (line 42) | public String getName() {
    method setName (line 46) | public void setName(String name) {
    method iterOfFilters (line 54) | public Iterator iterOfFilters() {
    method addToFilters (line 62) | public void addToFilters(Filter filter) {
    method hasInFilters (line 75) | public boolean hasInFilters(String name) {
    method resetFilters (line 82) | public void resetFilters() {
    method toString (line 86) | public String toString() {

FILE: tda/src/main/java/de/grimmfrost/tda/model/DumpStore.java
  class DumpStore (line 33) | public class DumpStore implements Serializable {
    method DumpStore (line 40) | public DumpStore() {
    method addFileToDumpFiles (line 48) | public void addFileToDumpFiles(String key, Map threadDumpsInFile) {
    method getFromDumpFiles (line 61) | public Map getFromDumpFiles(String key) {
    method iterOfDumpFilesKeys (line 68) | public Iterator iterOfDumpFilesKeys() {

FILE: tda/src/main/java/de/grimmfrost/tda/model/HeapInfo.java
  class HeapInfo (line 32) | public class HeapInfo {
    method HeapInfo (line 35) | public HeapInfo(String value) {
    method getHeapInfo (line 42) | public String getHeapInfo() {
    method setHeapInfo (line 49) | public void setHeapInfo(String heapInfo) {
    method toString (line 53) | public String toString() {

FILE: tda/src/main/java/de/grimmfrost/tda/model/HistogramInfo.java
  class HistogramInfo (line 30) | public class HistogramInfo {
    method HistogramInfo (line 34) | public HistogramInfo(String name, Object content) {
    method toString (line 39) | public String toString() {

FILE: tda/src/main/java/de/grimmfrost/tda/model/LogFileContent.java
  class LogFileContent (line 35) | public class LogFileContent extends AbstractInfo implements Serializable {
    method LogFileContent (line 49) | public LogFileContent(String logFile) {
    method getLogfile (line 53) | public String getLogfile() {
    method setLogFile (line 57) | public void setLogFile(String value) {
    method toString (line 61) | public String toString() {
    method getContent (line 70) | public String getContent() {
    method appendToContentBuffer (line 86) | public void appendToContentBuffer(String append) {
    method readContent (line 101) | private void readContent() {

FILE: tda/src/main/java/de/grimmfrost/tda/model/Logfile.java
  class Logfile (line 31) | public class Logfile extends AbstractInfo {
    method Logfile (line 38) | public Logfile(String value) {
    method getContent (line 46) | public Object getContent() {
    method toString (line 50) | public String toString() {
    method getUsedParser (line 58) | public DumpParser getUsedParser() {
    method setUsedParser (line 67) | public void setUsedParser(DumpParser parser) {

FILE: tda/src/main/java/de/grimmfrost/tda/model/MonitorMap.java
  class MonitorMap (line 35) | public class MonitorMap implements Serializable {
    method MonitorMap (line 58) | public MonitorMap() {
    method addToMonitorMap (line 61) | public void addToMonitorMap(String key, Map[] objectSet) {
    method hasInMonitorMap (line 69) | public boolean hasInMonitorMap(String key) {
    method getFromMonitorMap (line 73) | public Map[] getFromMonitorMap(String key) {
    method addWaitToMonitor (line 77) | public void addWaitToMonitor(String key, String waitThread, String thr...
    method addLockToMonitor (line 81) | public void addLockToMonitor(String key, String lockThread, String thr...
    method addSleepToMonitor (line 85) | public void addSleepToMonitor(String key, String sleepThread, String t...
    method addToMonitorValue (line 89) | private void addToMonitorValue(String key, int pos, String threadTitle...
    method parseAndAddThread (line 105) | public void parseAndAddThread(String line, String threadTitle, String ...
    method iterOfKeys (line 131) | public Iterator iterOfKeys() {
    method size (line 135) | public int size() {

FILE: tda/src/main/java/de/grimmfrost/tda/model/TableCategory.java
  class TableCategory (line 41) | public class TableCategory extends AbstractCategory {
    method TableCategory (line 47) | public TableCategory(String name, int iconID) {
    method TableCategory (line 54) | public TableCategory(String name, int iconID, boolean filtering) {
    method getCatComponent (line 63) | public JComponent getCatComponent(EventListener listener) {
    method setupTable (line 99) | private void setupTable(TableModel tm, EventListener listener) {
    method getCurrentlySelectedUserObject (line 132) | public ThreadInfo getCurrentlySelectedUserObject() {

FILE: tda/src/main/java/de/grimmfrost/tda/model/ThreadDumpInfo.java
  class ThreadDumpInfo (line 33) | public class ThreadDumpInfo extends AbstractInfo {
    method ThreadDumpInfo (line 55) | public ThreadDumpInfo(String name, int lineCount) {
    method getLogLine (line 65) | public int getLogLine() {
    method setLogLine (line 73) | public void setLogLine(int logLine) {
    method getStartTime (line 83) | public String getStartTime() {
    method setStartTime (line 91) | public void setStartTime(String startTime) {
    method getOverview (line 99) | public String getOverview() {
    method createOverview (line 109) | private void createOverview() {
    method getMonitorInfo (line 332) | public static String getMonitorInfo(int locks, int waits, int sleeps ) {
    method addMonitorStatRow (line 377) | private static void addMonitorStatRow(StringBuilder sb, String label, ...
    method areALotOfWaiting (line 389) | public static boolean areALotOfWaiting(int waits) {
    method setOverview (line 397) | public void setOverview(String overview) {
    method getWaitingThreads (line 401) | public Category getWaitingThreads() {
    method setWaitingThreads (line 405) | public void setWaitingThreads(Category waitingThreads) {
    method getSleepingThreads (line 409) | public Category getSleepingThreads() {
    method setSleepingThreads (line 413) | public void setSleepingThreads(Category sleepingThreads) {
    method getLockingThreads (line 417) | public Category getLockingThreads() {
    method setLockingThreads (line 421) | public void setLockingThreads(Category lockingThreads) {
    method getMonitors (line 425) | public Category getMonitors() {
    method setMonitors (line 429) | public void setMonitors(Category monitors) {
    method getVirtualThreads (line 433) | public Category getVirtualThreads() {
    method setVirtualThreads (line 437) | public void setVirtualThreads(Category virtualThreads) {
    method getBlockingMonitors (line 441) | public Category getBlockingMonitors() {
    method setBlockingMonitors (line 445) | public void setBlockingMonitors(Category blockingMonitors) {
    method getMonitorsWithoutLocks (line 449) | public Category getMonitorsWithoutLocks() {
    method setMonitorsWithoutLocks (line 453) | public void setMonitorsWithoutLocks(Category monitorsWithoutLocks) {
    method getThreads (line 457) | public Category getThreads() {
    method setThreads (line 461) | public void setThreads(Category threads) {
    method getDeadlocks (line 465) | public Category getDeadlocks() {
    method setDeadlocks (line 469) | public void setDeadlocks(Category deadlocks) {
    method getDumpAnalyzer (line 473) | private Analyzer getDumpAnalyzer() {
    method setDumpAnalyzer (line 480) | private void setDumpAnalyzer(Analyzer dumpAnalyzer) {
    method getOverallThreadsWaitingWithoutLocksCount (line 484) | public int getOverallThreadsWaitingWithoutLocksCount() {
    method setOverallThreadsWaitingWithoutLocksCount (line 488) | public void setOverallThreadsWaitingWithoutLocksCount(int overallThrea...
    method addToCustomCategories (line 496) | public void addToCustomCategories(Category cat) {
    method getHeapInfo (line 505) | public HeapInfo getHeapInfo() {
    method setHeapInfo (line 513) | public void setHeapInfo(HeapInfo value) {
    method getSmrInfo (line 521) | public String getSmrInfo() {
    method setSmrInfo (line 529) | public void setSmrInfo(String smrInfo) {
    method getUnresolvedSmrAddresses (line 537) | public java.util.List<String> getUnresolvedSmrAddresses() {
    method toString (line 549) | public String toString() {

FILE: tda/src/main/java/de/grimmfrost/tda/model/ThreadInfo.java
  class ThreadInfo (line 30) | public class ThreadInfo extends AbstractInfo {
    method ThreadInfo (line 38) | public ThreadInfo(String name, String info, String content, int stackL...
    method toString (line 46) | public String toString() {
    method getContent (line 50) | public String getContent() {
    method setContent (line 54) | public void setContent(String content) {
    method getInfo (line 58) | public String getInfo() {
    method setInfo (line 62) | public void setInfo(String info) {
    method getStackLines (line 66) | public int getStackLines() {
    method setStackLines (line 70) | public void setStackLines(int stackLines) {
    method getTokens (line 74) | public String[] getTokens() {
    method setALotOfWaiting (line 78) | public void setALotOfWaiting(boolean b) {
    method areALotOfWaiting (line 82) | public boolean areALotOfWaiting() {
    method setChildCount (line 86) | public void setChildCount(int childCount) {
    method getChildCount (line 90) | public int getChildCount() {

FILE: tda/src/main/java/de/grimmfrost/tda/model/TreeCategory.java
  class TreeCategory (line 41) | public class TreeCategory extends AbstractCategory implements Serializab...
    method TreeCategory (line 47) | public TreeCategory(String name, int iconID) {
    method TreeCategory (line 54) | public TreeCategory(String name, int iconID, boolean filtering) {
    method getCatComponent (line 63) | public JComponent getCatComponent(EventListener listener) {
    method getCurrentlySelectedUserObject (line 93) | public ThreadInfo getCurrentlySelectedUserObject() {
    method getFilteredCatTree (line 98) | private JTree getFilteredCatTree() {
    method setFilteredCatTree (line 102) | private void setFilteredCatTree(JTree filteredCatTree) {
    method sort (line 109) | public void sort(Comparator nodeComp) {

FILE: tda/src/main/java/de/grimmfrost/tda/parser/AbstractDumpParser.java
  class AbstractDumpParser (line 45) | public abstract class AbstractDumpParser implements DumpParser {
    method AbstractDumpParser (line 54) | protected AbstractDumpParser(BufferedReader bis, DateMatcher dm) {
    method getDumpStringFromTreePath (line 67) | protected String getDumpStringFromTreePath(TreePath path) {
    method findLongRunningThreads (line 84) | public void findLongRunningThreads(DefaultMutableTreeNode root, Map du...
    method mergeDumps (line 96) | public void mergeDumps(DefaultMutableTreeNode root, Map dumpStore, Tre...
    method diffDumps (line 100) | protected void diffDumps(String prefix, DefaultMutableTreeNode root, M...
    method countLines (line 174) | private int countLines(String input) {
    method getStatInfo (line 193) | private String getStatInfo(Vector keys, String prefix, int minOccurenc...
    method fixMonitorLinks (line 232) | private String fixMonitorLinks(String fixString, String dumpName) {
    method createNode (line 247) | protected void createNode(DefaultMutableTreeNode top, String title, St...
    method addToCategory (line 263) | protected void addToCategory(DefaultMutableTreeNode category, String t...
    method getBis (line 278) | protected BufferedReader getBis() {
    method getThreadTokens (line 286) | protected abstract String[] getThreadTokens(String title);
    method setBis (line 292) | protected void setBis(BufferedReader bis) {
    method setDumpHistogramCounter (line 306) | public void setDumpHistogramCounter(int value) {
    method copyNode (line 316) | protected DefaultMutableTreeNode copyNode(DefaultMutableTreeNode node) {
    method getNextDumpForHistogram (line 329) | protected DefaultMutableTreeNode getNextDumpForHistogram(DefaultMutabl...
    method close (line 347) | public void close() throws IOException {
    method getMarkSize (line 358) | protected int getMarkSize() {
    method setMarkSize (line 366) | protected void setMarkSize(int markSize) {
    method getMaxCheckLines (line 375) | protected int getMaxCheckLines() {
    method setMaxCheckLines (line 379) | public void setMaxCheckLines(int maxCheckLines) {
    method isMillisTimeStamp (line 386) | public boolean isMillisTimeStamp() {
    method setMillisTimeStamp (line 390) | public void setMillisTimeStamp(boolean millisTimeStamp) {
    method getDm (line 394) | public DateMatcher getDm() {
    method setDm (line 398) | public void setDm(DateMatcher dm) {
    method addCustomCategories (line 407) | public void addCustomCategories(DefaultMutableTreeNode threadDump) {

FILE: tda/src/main/java/de/grimmfrost/tda/parser/Analyzer.java
  class Analyzer (line 36) | public class Analyzer implements Serializable {
    method Analyzer (line 43) | public Analyzer(ThreadDumpInfo tdi) {
    method analyzeDump (line 52) | public String analyzeDump() {

FILE: tda/src/main/java/de/grimmfrost/tda/parser/DumpParser.java
  type DumpParser (line 37) | public interface DumpParser {
    method hasMoreDumps (line 38) | public boolean hasMoreDumps();
    method parseNext (line 40) | public MutableTreeNode parseNext();
    method close (line 42) | public void close() throws IOException;
    method findLongRunningThreads (line 44) | public void findLongRunningThreads(DefaultMutableTreeNode root, Map<St...
    method mergeDumps (line 46) | public void mergeDumps(DefaultMutableTreeNode root, Map<String, Map<St...
    method isFoundClassHistograms (line 48) | public boolean isFoundClassHistograms();
    method parseLoggcFile (line 50) | public void parseLoggcFile(InputStream loggcFileStream, DefaultMutable...
    method setDumpHistogramCounter (line 52) | public void setDumpHistogramCounter(int value);

FILE: tda/src/main/java/de/grimmfrost/tda/parser/DumpParserFactory.java
  class DumpParserFactory (line 43) | public class DumpParserFactory {
    method DumpParserFactory (line 50) | private DumpParserFactory() {
    method get (line 57) | public static DumpParserFactory get() {
    method getDumpParserForLogfile (line 74) | public DumpParser getDumpParserForLogfile(InputStream dumpFileStream, ...
    method detectCharset (line 131) | private Charset detectCharset(BufferedInputStream bis) throws IOExcept...

FILE: tda/src/main/java/de/grimmfrost/tda/parser/JCmdJSONParser.java
  class JCmdJSONParser (line 25) | public class JCmdJSONParser extends AbstractDumpParser {
    method JCmdJSONParser (line 33) | public JCmdJSONParser(BufferedReader bis, Map<String, Map<String, Stri...
    method hasMoreDumps (line 38) | @Override
    method parseNext (line 43) | @Override
    method getThreadTokens (line 112) | @Override
    method isFoundClassHistograms (line 140) | @Override
    method parseLoggcFile (line 145) | @Override
    method setDumpHistogramCounter (line 149) | @Override
    method checkForSupportedThreadDump (line 153) | public static boolean checkForSupportedThreadDump(String logLine) {

FILE: tda/src/main/java/de/grimmfrost/tda/parser/SunJDKParser.java
  class SunJDKParser (line 54) | public class SunJDKParser extends AbstractDumpParser {
    method SunJDKParser (line 67) | public SunJDKParser(BufferedReader bis, Map<String, Map<String, String...
    method hasMoreDumps (line 79) | public boolean hasMoreDumps() {
    method isFoundClassHistograms (line 87) | public boolean isFoundClassHistograms() {
    method normalizeTitle (line 91) | private String normalizeTitle(String title) {
    method parseNext (line 106) | public MutableTreeNode parseNext() {
    method linkifyMonitor (line 523) | private String linkifyMonitor(String line) {
    method linkifyDeadlockInfo (line 546) | private String linkifyDeadlockInfo(String line) {
    method checkForClassHistogram (line 567) | private boolean checkForClassHistogram(DefaultMutableTreeNode threadDu...
    method addHistogramToDump (line 577) | private void addHistogramToDump(DefaultMutableTreeNode threadDump, His...
    method parseNextClassHistogram (line 594) | private HistogramTableModel parseNextClassHistogram(BufferedReader bis...
    method checkThreadDumpStatData (line 662) | private boolean checkThreadDumpStatData(ThreadDumpInfo tdi) throws IOE...
    method checkForDeadlocks (line 703) | private int checkForDeadlocks(DefaultMutableTreeNode threadDump) throw...
    method dumpMonitors (line 798) | private int[] dumpMonitors(DefaultMutableTreeNode catMonitors, Default...
    method renormalizeThreadDepth (line 854) | private void renormalizeThreadDepth(DefaultMutableTreeNode threadNode1) {
    method renormalizeMonitorDepth (line 863) | private void renormalizeMonitorDepth(DefaultMutableTreeNode monitorNod...
    method checkForDuplicateThreadItem (line 885) | private boolean checkForDuplicateThreadItem(Map directChildMap, Defaul...
    method fillBlockingThreadMaps (line 906) | private int fillBlockingThreadMaps(MonitorMap mmap, Map directChildMap) {
    method getLockingThread (line 944) | private String getLockingThread(Map[] threads) {
    method parseLoggcFile (line 965) | public void parseLoggcFile(InputStream loggcFileStream, DefaultMutable...
    method getThreadTokens (line 996) | public String[] getThreadTokens(String name) {
    method checkForSupportedThreadDump (line 1116) | public static boolean checkForSupportedThreadDump(String logLine) {
    method getNextLine (line 1120) | protected String getNextLine() throws IOException {

FILE: tda/src/main/java/de/grimmfrost/tda/parser/WrappedSunJDKParser.java
  class WrappedSunJDKParser (line 29) | public class WrappedSunJDKParser extends SunJDKParser {
    method WrappedSunJDKParser (line 35) | public WrappedSunJDKParser(BufferedReader bis, Map<String, Map<String,...
    method checkForSupportedThreadDump (line 47) | public static boolean checkForSupportedThreadDump(String logLine) {
    method getNextLine (line 52) | protected String getNextLine() throws IOException {

FILE: tda/src/main/java/de/grimmfrost/tda/utils/AppInfo.java
  class AppInfo (line 30) | public class AppInfo {
    method getStatusBarInfo (line 54) | public static String getStatusBarInfo() {
    method getAppInfo (line 58) | public static String getAppInfo() {
    method getVersion (line 62) | public static String getVersion() {
    method getCopyright (line 66) | public static String getCopyright() {

FILE: tda/src/main/java/de/grimmfrost/tda/utils/Browser.java
  class Browser (line 23) | public class Browser {
    method open (line 31) | public static void open(String url) throws InterruptedException, IOExc...
    method maybeFixupURLForWindows (line 100) | private static String maybeFixupURLForWindows(String url) {
    method fixupURLForWindows (line 115) | private static String fixupURLForWindows(String url) {
    method isWindows (line 126) | public static boolean isWindows() {

FILE: tda/src/main/java/de/grimmfrost/tda/utils/ColoredTable.java
  class ColoredTable (line 40) | public class ColoredTable extends JTable {
    method ColoredTable (line 45) | public ColoredTable() {
    method ColoredTable (line 49) | public ColoredTable(TableModel tm) {
    method ColoredTable (line 53) | public ColoredTable(Object[][] data, Object[] columns) {
    method ColoredTable (line 57) | public ColoredTable(int rows, int columns) {
    method getCellRenderer (line 66) | public TableCellRenderer getCellRenderer(int row, int column) {

FILE: tda/src/main/java/de/grimmfrost/tda/utils/DateMatcher.java
  class DateMatcher (line 33) | public class DateMatcher {
    method DateMatcher (line 40) | public DateMatcher() {
    method getRegexPattern (line 53) | public Pattern getRegexPattern() {
    method setRegexPattern (line 57) | public void setRegexPattern(Pattern regexPattern) {
    method isPatternError (line 61) | public boolean isPatternError() {
    method setPatternError (line 65) | public void setPatternError(boolean patternError) {
    method checkForDateMatch (line 69) | public Matcher checkForDateMatch(String line) {
    method getLastMatch (line 96) | public Matcher getLastMatch() {
    method resetLastMatch (line 100) | public void resetLastMatch() {
    method showErrorPane (line 104) | private void showErrorPane(String message) {
    method isDefaultMatches (line 118) | public boolean isDefaultMatches() {
    method setDefaultMatches (line 122) | private void setDefaultMatches(boolean defaultMatches) {

FILE: tda/src/main/java/de/grimmfrost/tda/utils/HistogramTableModel.java
  class HistogramTableModel (line 34) | public class HistogramTableModel extends AbstractTableModel {
    method HistogramTableModel (line 62) | public HistogramTableModel() {
    method addEntry (line 65) | public void addEntry(String className, int instanceCount, int bytes) {
    method getValueAt (line 69) | public Object getValueAt(int rowIndex, int columnIndex) {
    method getValueAt (line 77) | private Object getValueAt(Vector elements, int rowIndex, int columnInd...
    method getColumnName (line 92) | public String getColumnName(int col) {
    method getRowCount (line 96) | public int getRowCount() {
    method getColumnCount (line 104) | public int getColumnCount() {
    method getColumnClass (line 108) | public Class getColumnClass(int c) {
    method setOOM (line 112) | private void setOOM(boolean value) {
    method isOOM (line 116) | public boolean isOOM() {
    method setBytes (line 120) | public void setBytes(long value) {
    method getBytes (line 124) | public long getBytes() {
    method setInstances (line 128) | public void setInstances(long value) {
    method getInstances (line 132) | public long getInstances() {
    method setIncomplete (line 136) | public void setIncomplete(boolean value) {
    method isIncomplete (line 140) | public boolean isIncomplete() {
    method setFilter (line 149) | public void setFilter(String value) {
    method isNotHotspotClass (line 177) | private boolean isNotHotspotClass(String className) {
    method setShowHotspotClasses (line 182) | public void setShowHotspotClasses(boolean value) {
    method isShowHotspotClasses (line 189) | private boolean isShowHotspotClasses() {
    method getFilter (line 193) | public String getFilter() {
    method setIgnoreCase (line 197) | public void setIgnoreCase(boolean value) {
    method isIgnoreCase (line 205) | public boolean isIgnoreCase() {
    class Entry (line 209) | public class Entry {
      method Entry (line 214) | public Entry(String className, int instanceCount, int bytes) {
      method parseClassName (line 224) | private String parseClassName(String className) {

FILE: tda/src/main/java/de/grimmfrost/tda/utils/IconFactory.java
  class IconFactory (line 31) | public class IconFactory {
    method get (line 55) | public static IconFactory get() {
    method IconFactory (line 63) | private IconFactory() {
    method getIconFor (line 67) | public Icon getIconFor(int index) {

FILE: tda/src/main/java/de/grimmfrost/tda/utils/LogManager.java
  class LogManager (line 15) | public class LogManager {
    class ErrorHandler (line 20) | private static class ErrorHandler extends Handler {
      method publish (line 21) | @Override
      method flush (line 33) | @Override
      method close (line 36) | @Override
    method init (line 43) | public static synchronized void init() {
    class CompactFormatter (line 105) | static class CompactFormatter extends Formatter {
      method format (line 108) | @Override
      method formatLevel (line 135) | private String formatLevel(Level level) {
      method getSimpleClassName (line 146) | private String getSimpleClassName(String className) {
    method getLogFilePath (line 156) | public static String getLogFilePath() {
    method getLogDirectory (line 160) | private static String getLogDirectory() {
    method getLogger (line 178) | public static Logger getLogger(Class<?> clazz) {

FILE: tda/src/main/java/de/grimmfrost/tda/utils/MonitorComparator.java
  class MonitorComparator (line 37) | public class MonitorComparator implements Comparator {
    method compare (line 45) | public int compare(Object arg0, Object arg1) {

FILE: tda/src/main/java/de/grimmfrost/tda/utils/MonitorsTableModel.java
  class MonitorsTableModel (line 14) | public class MonitorsTableModel {//extends AbstractTreeTableModel {
    method getColumnCount (line 16) | public int getColumnCount() {
    method getValueAt (line 20) | public Object getValueAt(Object arg0, int arg1) {
    method getChild (line 24) | public Object getChild(Object parent, int index) {
    method getChildCount (line 28) | public int getChildCount(Object parent) {
    method getIndexOfChild (line 32) | public int getIndexOfChild(Object parent, Object child) {

FILE: tda/src/main/java/de/grimmfrost/tda/utils/PrefManager.java
  class PrefManager (line 48) | public class PrefManager {
    method PrefManager (line 60) | private PrefManager() {
    method get (line 64) | public static PrefManager get() {
    method getMaxLogfileSize (line 68) | public long getMaxLogfileSize() {
    method getWindowState (line 72) | public int getWindowState() {
    method setWindowState (line 76) | public void setWindowState(int windowState) {
    method getSelectedPath (line 80) | public File getSelectedPath() {
    method setSelectedPath (line 84) | public void setSelectedPath(File directory) {
    method getPreferredSize (line 88) | public Dimension getPreferredSize() {
    method setPreferredSize (line 93) | public void setPreferredSize(Dimension size) {
    method getPreferredSizeFileChooser (line 98) | public Dimension getPreferredSizeFileChooser() {
    method setPreferredSizeFileChooser (line 103) | public void setPreferredSizeFileChooser(Dimension size) {
    method setMaxLogfileSize (line 108) | public void setMaxLogfileSize(int size) {
    method getWindowPos (line 112) | public Point getWindowPos() {
    method setWindowPos (line 118) | public void setWindowPos(int x, int y) {
    method getMaxRows (line 123) | public int getMaxRows() {
    method setMaxRows (line 127) | public void setMaxRows(int rows) {
    method getStreamResetBuffer (line 132) | public int getStreamResetBuffer() {
    method setStreamResetBuffer (line 136) | public void setStreamResetBuffer(int buffer) {
    method getForceLoggcLoading (line 140) | public boolean getForceLoggcLoading() {
    method setForceLoggcLoading (line 144) | public void setForceLoggcLoading(boolean force) {
    method getJDK16DefaultParsing (line 148) | public boolean getJDK16DefaultParsing() {
    method setJDK16DefaultParsing (line 152) | public void setJDK16DefaultParsing(boolean defaultParsing) {
    method getShowToolbar (line 156) | public boolean getShowToolbar() {
    method setShowToolbar (line 160) | public void setShowToolbar(boolean state) {
    method getDateParsingRegex (line 164) | public String getDateParsingRegex() {
    method setDateParsingRegex (line 168) | public void setDateParsingRegex(String dateRegex) {
    method getDateParsingRegexs (line 176) | public String[] getDateParsingRegexs() {
    method setDateParsingRegexs (line 184) | public void setDateParsingRegexs(ListModel regexs) {
    method regexsToString (line 188) | private String regexsToString(ListModel regexs) {
    method addToRecentFiles (line 199) | public void addToRecentFiles(String file) {
    method setRecentFiles (line 218) | public void setRecentFiles(String[] files) {
    method getRecentFiles (line 229) | public String[] getRecentFiles() {
    method addToRecentSessions (line 233) | public void addToRecentSessions(String file) {
    method setRecentSessions (line 252) | public void setRecentSessions(String[] files) {
    method getRecentSessions (line 263) | public String[] getRecentSessions() {
    method setUseGTKLF (line 267) | public void setUseGTKLF(boolean value) {
    method isUseGTKLF (line 271) | public boolean isUseGTKLF() {
    method setMillisTimeStamp (line 275) | public void setMillisTimeStamp(boolean value) {
    method getMillisTimeStamp (line 279) | public boolean getMillisTimeStamp() {
    method setShowHotspotClasses (line 283) | public void setShowHotspotClasses(boolean value) {
    method getShowHotspotClasses (line 287) | public boolean getShowHotspotClasses() {
    method getFilters (line 296) | public ListModel getFilters() {
    method getCachedFilters (line 333) | private DefaultListModel getCachedFilters() {
    method setFilterCache (line 347) | private void setFilterCache(DefaultListModel filters) {
    method getCategories (line 364) | public ListModel getCategories() {
    method getCachedCategories (line 410) | private DefaultListModel getCachedCategories() {
    method setCategoryCache (line 425) | private void setCategoryCache(DefaultListModel categories) {
    method getFromFilters (line 438) | private Filter getFromFilters(String key) {
    method getPredefinedFilters (line 453) | private DefaultListModel getPredefinedFilters() {
    method setFilters (line 463) | public void setFilters(DefaultListModel filters) {
    method setCategories (line 491) | public void setCategories(DefaultListModel categories) {
    method getFiltersLastChanged (line 519) | public long getFiltersLastChanged(){
    method setFilterLastChanged (line 523) | private void setFilterLastChanged() {
    method flush (line 527) | public void flush() {
    method hasInRecentFiles (line 538) | private boolean hasInRecentFiles(String file, String[] currentFiles) {

FILE: tda/src/main/java/de/grimmfrost/tda/utils/ResourceManager.java
  class ResourceManager (line 14) | public class ResourceManager {
    method translate (line 17) | public static String translate(String key) {

FILE: tda/src/main/java/de/grimmfrost/tda/utils/StatusBar.java
  class StatusBar (line 41) | public class StatusBar extends JPanel {
    method StatusBar (line 51) | public StatusBar(boolean showMemory) {
    method getInstance (line 84) | public static StatusBar getInstance() {
    method showErrorIndicator (line 91) | public void showErrorIndicator() {
    method setInfoText (line 101) | public void setInfoText(String text) {
    method createInfoPanel (line 105) | private JPanel createInfoPanel() {
    method createMemoryStatus (line 119) | private JPanel createMemoryStatus() {
  class RedDotIcon (line 138) | class RedDotIcon implements Icon {
    method getIconHeight (line 139) | public int getIconHeight() {
    method getIconWidth (line 143) | public int getIconWidth() {
    method paintIcon (line 147) | public void paintIcon(Component c, Graphics g, int x, int y) {
  class MemoryStatusUpdater (line 157) | class MemoryStatusUpdater implements Runnable {
    method MemoryStatusUpdater (line 163) | public MemoryStatusUpdater(JProgressBar memStatus) {
    method run (line 169) | public void run() {
  class AngledLinesWindowsCornerIcon (line 192) | class AngledLinesWindowsCornerIcon implements Icon {
    method getIconHeight (line 200) | public int getIconHeight() {
    method getIconWidth (line 204) | public int getIconWidth() {
    method paintIcon (line 208) | public void paintIcon(Component c, Graphics g, int x, int y) {

FILE: tda/src/main/java/de/grimmfrost/tda/utils/SwingWorker.java
  class SwingWorker (line 40) | public abstract class SwingWorker {
    class ThreadVar (line 47) | private static class ThreadVar {
      method ThreadVar (line 49) | ThreadVar(Thread t) { thread = t; }
      method get (line 50) | synchronized Thread get() { return thread; }
      method clear (line 51) | synchronized void clear() { thread = null; }
    method getValue (line 60) | protected synchronized Object getValue() {
    method setValue (line 67) | private synchronized void setValue(Object x) {
    method construct (line 74) | public abstract Object construct();
    method finished (line 80) | public void finished() {
    method interrupt (line 87) | public void interrupt() {
    method get (line 102) | public Object get() {
    method SwingWorker (line 123) | public SwingWorker() {
    method start (line 148) | public void start() {

FILE: tda/src/main/java/de/grimmfrost/tda/utils/TableSorter.java
  class TableSorter (line 74) | public class TableSorter extends AbstractTableModel {
    method compare (line 84) | public int compare(Object o1, Object o2) {
    method compare (line 89) | public int compare(Object o1, Object o2) {
    method TableSorter (line 103) | public TableSorter() {
    method TableSorter (line 108) | public TableSorter(TableModel tableModel) {
    method TableSorter (line 113) | public TableSorter(TableModel tableModel, JTableHeader tableHeader) {
    method clearSortingState (line 119) | private void clearSortingState() {
    method getTableModel (line 124) | public TableModel getTableModel() {
    method setTableModel (line 128) | public void setTableModel(TableModel tableModel) {
    method getTableHeader (line 142) | public JTableHeader getTableHeader() {
    method setTableHeader (line 146) | public void setTableHeader(JTableHeader tableHeader) {
    method isSorting (line 162) | public boolean isSorting() {
    method getDirective (line 166) | private Directive getDirective(int column) {
    method getSortingStatus (line 176) | public int getSortingStatus(int column) {
    method sortingStatusChanged (line 180) | private void sortingStatusChanged() {
    method setSortingStatus (line 188) | public void setSortingStatus(int column, int status) {
    method getHeaderRendererIcon (line 199) | protected Icon getHeaderRendererIcon(int column, int size) {
    method cancelSorting (line 207) | private void cancelSorting() {
    method setColumnComparator (line 212) | public void setColumnComparator(Class type, Comparator comparator) {
    method getComparator (line 220) | protected Comparator getComparator(int column) {
    method getViewToModel (line 232) | private Row[] getViewToModel() {
    method modelIndex (line 247) | public int modelIndex(int viewIndex) {
    method getModelToView (line 251) | private int[] getModelToView() {
    method getRowCount (line 264) | public int getRowCount() {
    method getColumnCount (line 268) | public int getColumnCount() {
    method getColumnName (line 272) | public String getColumnName(int column) {
    method getColumnClass (line 276) | public Class getColumnClass(int column) {
    method isCellEditable (line 280) | public boolean isCellEditable(int row, int column) {
    method getValueAt (line 284) | public Object getValueAt(int row, int column) {
    method setValueAt (line 288) | public void setValueAt(Object aValue, int row, int column) {
    class Row (line 294) | private class Row implements Comparable {
      method Row (line 297) | public Row(int index) {
      method compareTo (line 301) | public int compareTo(Object o) {
    class TableModelHandler (line 330) | private class TableModelHandler implements TableModelListener {
      method tableChanged (line 331) | public void tableChanged(TableModelEvent e) {
    class MouseHandler (line 385) | private class MouseHandler extends MouseAdapter {
      method mouseClicked (line 386) | public void mouseClicked(MouseEvent e) {
    class Arrow (line 405) | private static class Arrow implements Icon {
      method Arrow (line 410) | public Arrow(boolean descending, int size, int priority) {
      method paintIcon (line 416) | public void paintIcon(Component c, Graphics g, int x, int y) {
      method getIconWidth (line 449) | public int getIconWidth() {
      method getIconHeight (line 453) | public int getIconHeight() {
    class SortableHeaderRenderer (line 458) | private class SortableHeaderRenderer implements TableCellRenderer {
      method SortableHeaderRenderer (line 461) | public SortableHeaderRenderer(TableCellRenderer tableCellRenderer) {
      method getTableCellRendererComponent (line 465) | public Component getTableCellRendererComponent(JTable table,
    class Directive (line 483) | private static class Directive {
      method Directive (line 487) | public Directive(int column, int direction) {

FILE: tda/src/main/java/de/grimmfrost/tda/utils/ThreadsTableModel.java
  class ThreadsTableModel (line 35) | public class ThreadsTableModel extends AbstractTableModel {
    method ThreadsTableModel (line 45) | public ThreadsTableModel(DefaultMutableTreeNode rootNode) {
    method getColumnName (line 64) | public String getColumnName(int col) {
    method getRowCount (line 68) | public int getRowCount() {
    method getColumnCount (line 72) | public int getColumnCount() {
    method getValueAt (line 76) | public Object getValueAt(int rowIndex, int columnIndex) {
    method getInfoObjectAtRow (line 119) | public ThreadInfo getInfoObjectAtRow(int rowIndex) {
    method getColumnClass (line 126) | public Class getColumnClass(int columnIndex) {
    method searchRowWithName (line 141) | public int searchRowWithName(int startRow, String name) {

FILE: tda/src/main/java/de/grimmfrost/tda/utils/ThreadsTableSelectionModel.java
  class ThreadsTableSelectionModel (line 15) | public class ThreadsTableSelectionModel extends DefaultListSelectionModel {
    method ThreadsTableSelectionModel (line 18) | public ThreadsTableSelectionModel(JTable table) {
    method getTable (line 23) | public JTable getTable() {

FILE: tda/src/main/java/de/grimmfrost/tda/utils/TipOfDay.java
  class TipOfDay (line 34) | public class TipOfDay {
    method getTipOfDay (line 39) | public static String getTipOfDay() {
    method loadTips (line 46) | private static void loadTips() {

FILE: tda/src/main/java/de/grimmfrost/tda/utils/TreeRenderer.java
  class TreeRenderer (line 39) | public class TreeRenderer extends DefaultTreeCellRenderer {
    method TreeRenderer (line 41) | public TreeRenderer() {
    method getTreeCellRendererComponent (line 45) | public Component getTreeCellRendererComponent(JTree tree, Object value...
    method isCategory (line 77) | protected boolean isCategory(Object value) {
    method getIconFromCategory (line 82) | protected Icon getIconFromCategory(Object value) {
    method isHistogramInfo (line 89) | private boolean isHistogramInfo(Object value) {
    method isThreadInfo (line 94) | private boolean isThreadInfo(Object value) {
    method isLogfile (line 99) | private boolean isLogfile(Object value) {
    method isLogFileContent (line 104) | private boolean isLogFileContent(Object value) {

FILE: tda/src/main/java/de/grimmfrost/tda/utils/ViewScrollPane.java
  class ViewScrollPane (line 34) | public class ViewScrollPane extends JScrollPane {
    method ViewScrollPane (line 42) | public ViewScrollPane(Component comp, boolean white) {

FILE: tda/src/main/java/de/grimmfrost/tda/utils/jedit/DefaultInputHandler.java
  class DefaultInputHandler (line 24) | public class DefaultInputHandler extends InputHandler {
    method DefaultInputHandler (line 28) | public DefaultInputHandler() {
    method addDefaultKeyBindings (line 35) | public void addDefaultKeyBindings() {
    method addKeyBinding (line 82) | public void addKeyBinding(KeyStroke keyStroke, ActionListener action) {
    method addKeyBinding (line 100) | public void addKeyBinding(String keyBinding, ActionListener action) {
    method removeKeyBinding (line 128) | public void removeKeyBinding(String keyBinding) {
    method removeAllKeyBindings (line 135) | public void removeAllKeyBindings() {
    method copy (line 144) | public InputHandler copy() {
    method keyPressed (line 152) | public void keyPressed(KeyEvent evt) {
    method keyTyped (line 211) | public void keyTyped(KeyEvent evt) {
    method parseKeyStroke (line 264) | public static KeyStroke parseKeyStroke(String keyStroke) {
    method DefaultInputHandler (line 318) | private DefaultInputHandler(DefaultInputHandler copy) {

FILE: tda/src/main/java/de/grimmfrost/tda/utils/jedit/InputHandler.java
  class InputHandler (line 29) | public abstract class InputHandler extends KeyAdapter {
    method getAction (line 121) | public static ActionListener getAction(String name) {
    method getActionName (line 129) | public static String getActionName(ActionListener listener) {
    method getActions (line 143) | public static Enumeration getActions() {
    method addDefaultKeyBindings (line 153) | public abstract void addDefaultKeyBindings();
    method addKeyBinding (line 160) | public abstract void addKeyBinding(KeyStroke keyStroke, ActionListener...
    method addKeyBinding (line 168) | public abstract void addKeyBinding(String keyBinding, ActionListener a...
    method removeKeyBinding (line 174) | public abstract void removeKeyBinding(String keyBinding);
    method removeAllKeyBindings (line 179) | public abstract void removeAllKeyBindings();
    method grabNextKeyStroke (line 186) | public void grabNextKeyStroke(ActionListener action) {
    method isRepeatEnabled (line 195) | public boolean isRepeatEnabled() {
    method setRepeatEnabled (line 204) | public void setRepeatEnabled(boolean repeat) {
    method getRepeatCount (line 211) | public int getRepeatCount() {
    method setRepeatCount (line 219) | public void setRepeatCount(int repeatCount) {
    method getMacroRecorder (line 227) | public InputHandler.MacroRecorder getMacroRecorder() {
    method setMacroRecorder (line 236) | public void setMacroRecorder(InputHandler.MacroRecorder recorder) {
    method copy (line 245) | public abstract InputHandler copy();
    method executeAction (line 254) | public void executeAction(ActionListener listener, Object source,
    method getTextArea (line 305) | public static JEditTextArea getTextArea(EventObject evt) {
    method handleGrabAction (line 338) | protected void handleGrabAction(KeyEvent evt) {
    type NonRepeatable (line 357) | public interface NonRepeatable {}
    type NonRecordable (line 363) | public interface NonRecordable {}
    type Wrapper (line 369) | public interface Wrapper {}
    type MacroRecorder (line 374) | public interface MacroRecorder {
      method actionPerformed (line 375) | void actionPerformed(ActionListener listener,
    class backspace (line 379) | public static class backspace implements ActionListener {
      method actionPerformed (line 380) | public void actionPerformed(ActionEvent evt) {
    class backspace_word (line 406) | public static class backspace_word implements ActionListener {
      method actionPerformed (line 407) | public void actionPerformed(ActionEvent evt) {
    class delete (line 442) | public static class delete implements ActionListener {
      method actionPerformed (line 443) | public void actionPerformed(ActionEvent evt) {
    class delete_word (line 469) | public static class delete_word implements ActionListener {
      method actionPerformed (line 470) | public void actionPerformed(ActionEvent evt) {
    class end (line 504) | public static class end implements ActionListener {
      method end (line 507) | public end(boolean select) {
      method actionPerformed (line 511) | public void actionPerformed(ActionEvent evt) {
    class document_end (line 549) | public static class document_end implements ActionListener {
      method document_end (line 552) | public document_end(boolean select) {
      method actionPerformed (line 556) | public void actionPerformed(ActionEvent evt) {
    class home (line 567) | public static class home implements ActionListener {
      method home (line 570) | public home(boolean select) {
      method actionPerformed (line 574) | public void actionPerformed(ActionEvent evt) {
    class document_home (line 608) | public static class document_home implements ActionListener {
      method document_home (line 611) | public document_home(boolean select) {
      method actionPerformed (line 615) | public void actionPerformed(ActionEvent evt) {
    class insert_break (line 624) | public static class insert_break implements ActionListener {
      method actionPerformed (line 625) | public void actionPerformed(ActionEvent evt) {
    class insert_tab (line 637) | public static class insert_tab implements ActionListener {
      method actionPerformed (line 638) | public void actionPerformed(ActionEvent evt) {
    class next_char (line 650) | public static class next_char implements ActionListener {
      method next_char (line 653) | public next_char(boolean select) {
      method actionPerformed (line 657) | public void actionPerformed(ActionEvent evt) {
    class next_line (line 673) | public static class next_line implements ActionListener {
      method next_line (line 676) | public next_line(boolean select) {
      method actionPerformed (line 680) | public void actionPerformed(ActionEvent evt) {
    class next_page (line 706) | public static class next_page implements ActionListener {
      method next_page (line 709) | public next_page(boolean select) {
      method actionPerformed (line 713) | public void actionPerformed(ActionEvent evt) {
    class next_word (line 737) | public static class next_word implements ActionListener {
      method next_word (line 740) | public next_word(boolean select) {
      method actionPerformed (line 744) | public void actionPerformed(ActionEvent evt) {
    class overwrite (line 773) | public static class overwrite implements ActionListener {
      method actionPerformed (line 774) | public void actionPerformed(ActionEvent evt) {
    class prev_char (line 781) | public static class prev_char implements ActionListener {
      method prev_char (line 784) | public prev_char(boolean select) {
      method actionPerformed (line 788) | public void actionPerformed(ActionEvent evt) {
    class prev_line (line 804) | public static class prev_line implements ActionListener {
      method prev_line (line 807) | public prev_line(boolean select) {
      method actionPerformed (line 811) | public void actionPerformed(ActionEvent evt) {
    class prev_page (line 837) | public static class prev_page implements ActionListener {
      method prev_page (line 840) | public prev_page(boolean select) {
      method actionPerformed (line 844) | public void actionPerformed(ActionEvent evt) {
    class prev_word (line 864) | public static class prev_word implements ActionListener {
      method prev_word (line 867) | public prev_word(boolean select) {
      method actionPerformed (line 871) | public void actionPerformed(ActionEvent evt) {
    class repeat (line 900) | public static class repeat implements ActionListener,
      method actionPerformed (line 902) | public void actionPerformed(ActionEvent evt) {
    class toggle_rect (line 913) | public static class toggle_rect implements ActionListener {
      method actionPerformed (line 914) | public void actionPerformed(ActionEvent evt) {
    class insert_char (line 921) | public static class insert_char implements ActionListener,
      method actionPerformed (line 923) | public void actionPerformed(ActionEvent evt) {

FILE: tda/src/main/java/de/grimmfrost/tda/utils/jedit/JEditTextArea.java
  class JEditTextArea (line 51) | public class JEditTextArea extends JComponent {
    method JEditTextArea (line 63) | public JEditTextArea() {
    method JEditTextArea (line 71) | public JEditTextArea(TextAreaDefaults defaults) {
    method isManagingFocus (line 117) | public final boolean isManagingFocus() {
    method getPainter (line 124) | public final TextAreaPainter getPainter() {
    method getInputHandler (line 131) | public final InputHandler getInputHandler() {
    method setInputHandler (line 139) | public void setInputHandler(InputHandler inputHandler) {
    method isCaretBlinkEnabled (line 146) | public final boolean isCaretBlinkEnabled() {
    method setCaretBlinkEnabled (line 154) | public void setCaretBlinkEnabled(boolean caretBlinks) {
    method isCaretVisible (line 166) | public final boolean isCaretVisible() {
    method setCaretVisible (line 175) | public void setCaretVisible(boolean caretVisible) {
    method blinkCaret (line 185) | public final void blinkCaret() {
    method getElectricScroll (line 198) | public final int getElectricScroll() {
    method setElectricScroll (line 208) | public final void setElectricScroll(int electricScroll) {
    method updateScrollBars (line 217) | public void updateScrollBars() {
    method getFirstLine (line 235) | public final int getFirstLine() {
    method setFirstLine (line 243) | public void setFirstLine(int firstLine) {
    method getVisibleLines (line 258) | public final int getVisibleLines() {
    method recalculateVisibleLines (line 266) | public final void recalculateVisibleLines() {
    method getHorizontalOffset (line 280) | public final int getHorizontalOffset() {
    method setHorizontalOffset (line 289) | public void setHorizontalOffset(int horizontalOffset) {
    method setOrigin (line 307) | public boolean setOrigin(int firstLine, int horizontalOffset) {
    method scrollToCaret (line 335) | public boolean scrollToCaret() {
    method scrollTo (line 352) | public boolean scrollTo(int line, int offset) {
    method lineToY (line 393) | public int lineToY(int line) {
    method yToLine (line 402) | public int yToLine(int y) {
    method offsetToX (line 415) | public final int offsetToX(int line, int offset) {
    method _offsetToX (line 428) | public int _offsetToX(int line, int offset) {
    method xToOffset (line 490) | public int xToOffset(int line, int x) {
    method xyToOffset (line 589) | public int xyToOffset(int x, int y) {
    method getDocument (line 598) | public final SyntaxDocument getDocument() {
    method setDocument (line 606) | public void setDocument(SyntaxDocument document) {
    method getTokenMarker (line 626) | public final TokenMarker getTokenMarker() {
    method setTokenMarker (line 635) | public final void setTokenMarker(TokenMarker tokenMarker) {
    method getDocumentLength (line 643) | public final int getDocumentLength() {
    method getLineCount (line 650) | public final int getLineCount() {
    method getLineOfOffset (line 658) | public final int getLineOfOffset(int offset) {
    method getLineStartOffset (line 668) | public int getLineStartOffset(int line) {
    method getLineEndOffset (line 683) | public int getLineEndOffset(int line) {
    method getLineLength (line 696) | public int getLineLength(int line) {
    method getText (line 708) | public String getText() {
    method setText (line 720) | public void setText(String text) {
    method getText (line 738) | public final String getText(int start, int len) {
    method getText (line 754) | public final void getText(int start, int len, Segment segment) {
    method getLineText (line 768) | public final String getLineText(int lineIndex) {
    method getLineText (line 778) | public final void getLineText(int lineIndex, Segment segment) {
    method getSelectionStart (line 786) | public final int getSelectionStart() {
    method getSelectionStart (line 794) | public int getSelectionStart(int line) {
    method getSelectionStartLine (line 813) | public final int getSelectionStartLine() {
    method setSelectionStart (line 823) | public final void setSelectionStart(int selectionStart) {
    method getSelectionEnd (line 830) | public final int getSelectionEnd() {
    method getSelectionEnd (line 838) | public int getSelectionEnd(int line) {
    method getSelectionEndLine (line 857) | public final int getSelectionEndLine() {
    method setSelectionEnd (line 867) | public final void setSelectionEnd(int selectionEnd) {
    method getCaretPosition (line 876) | public final int getCaretPosition() {
    method getCaretLine (line 883) | public final int getCaretLine() {
    method getMarkPosition (line 892) | public final int getMarkPosition() {
    method getMarkLine (line 899) | public final int getMarkLine() {
    method setCaretPosition (line 909) | public final void setCaretPosition(int caret) {
    method selectAll (line 916) | public final void selectAll() {
    method selectNone (line 923) | public final void selectNone() {
    method select (line 935) | public void select(int start, int end) {
    method getSelectedText (line 1004) | public final String getSelectedText() {
    method setSelectedText (line 1055) | public void setSelectedText(String selectedText) {
    method isEditable (line 1132) | public final boolean isEditable() {
    method setEditable (line 1141) | public final void setEditable(boolean editable) {
    method getRightClickPopup (line 1148) | public final JPopupMenu getRightClickPopup() {
    method setRightClickPopup (line 1156) | public final void setRightClickPopup(JPopupMenu popup) {
    method getMagicCaretPosition (line 1164) | public final int getMagicCaretPosition() {
    method setMagicCaretPosition (line 1173) | public final void setMagicCaretPosition(int magicCaret) {
    method overwriteSetSelectedText (line 1184) | public void overwriteSetSelectedText(String str) {
    method isOverwriteEnabled (line 1215) | public final boolean isOverwriteEnabled() {
    method setOverwriteEnabled (line 1224) | public final void setOverwriteEnabled(boolean overwrite) {
    method isSelectionRectangular (line 1232) | public final boolean isSelectionRectangular() {
    method setSelectionRectangular (line 1241) | public final void setSelectionRectangular(boolean rectSelect) {
    method getBracketPosition (line 1250) | public final int getBracketPosition() {
    method getBracketLine (line 1258) | public final int getBracketLine() {
    method addCaretListener (line 1266) | public final void addCaretListener(CaretListener listener) {
    method removeCaretListener (line 1274) | public final void removeCaretListener(CaretListener listener) {
    method cut (line 1282) | public void cut() {
    method copy (line 1292) | public void copy() {
    method paste (line 1311) | public void paste() {
    method removeNotify (line 1337) | public void removeNotify() {
    method processKeyEvent (line 1349) | public void processKeyEvent(KeyEvent evt) {
    method fireCaretEvent (line 1403) | protected void fireCaretEvent() {
    method updateBracketHighlight (line 1412) | protected void updateBracketHighlight(int newCaretPosition) {
    method documentChanged (line 1432) | protected void documentChanged(DocumentEvent evt) {
    class ScrollLayout (line 1456) | class ScrollLayout implements LayoutManager {
      method addLayoutComponent (line 1458) | public void addLayoutComponent(String name, Component comp) {
      method removeLayoutComponent (line 1470) | public void removeLayoutComponent(Component comp) {
      method preferredLayoutSize (line 1484) | public Dimension preferredLayoutSize(Container parent) {
      method minimumLayoutSize (line 1501) | public Dimension minimumLayoutSize(Container parent) {
      method layoutContainer (line 1518) | public void layoutContainer(Container parent) {
    class CaretBlinker (line 1567) | class CaretBlinker implements ActionListener {
      method actionPerformed (line 1569) | public void actionPerformed(ActionEvent evt) {
    class MutableCaretEvent (line 1576) | class MutableCaretEvent extends CaretEvent {
      method MutableCaretEvent (line 1578) | MutableCaretEvent() {
      method getDot (line 1582) | public int getDot() {
      method getMark (line 1586) | public int getMark() {
    class AdjustHandler (line 1591) | class AdjustHandler implements AdjustmentListener {
      method adjustmentValueChanged (line 1593) | public void adjustmentValueChanged(final AdjustmentEvent evt) {
    class ComponentHandler (line 1614) | class ComponentHandler extends ComponentAdapter {
      method componentResized (line 1616) | public void componentResized(ComponentEvent evt) {
    class DocumentHandler (line 1622) | class DocumentHandler implements DocumentListener {
      method insertUpdate (line 1624) | public void insertUpdate(DocumentEvent evt) {
      method removeUpdate (line 1648) | public void removeUpdate(DocumentEvent evt) {
      method changedUpdate (line 1680) | public void changedUpdate(DocumentEvent evt) {
    class DragHandler (line 1684) | class DragHandler implements MouseMotionListener {
      method mouseDragged (line 1686) | public void mouseDragged(MouseEvent evt) {
      method mouseMoved (line 1695) | public void mouseMoved(MouseEvent evt) {
    class FocusHandler (line 1699) | class FocusHandler implements FocusListener {
      method focusGained (line 1701) | public void focusGained(FocusEvent evt) {
      method focusLost (line 1706) | public void focusLost(FocusEvent evt) {
    class MouseHandler (line 1712) | class MouseHandler extends MouseAdapter implements MouseWheelListener {
      method mousePressed (line 1714) | public void mousePressed(MouseEvent evt) {
      method doSingleClick (line 1749) | private void doSingleClick(MouseEvent evt, int line,
      method doDoubleClick (line 1759) | private void doDoubleClick(MouseEvent evt, int line,
      method doTripleClick (line 1820) | private void doTripleClick(MouseEvent evt, int line,
      method mouseWheelMoved (line 1829) | public void mouseWheelMoved(MouseWheelEvent e) {
    class CaretUndo (line 1842) | class CaretUndo extends AbstractUndoableEdit {
      method CaretUndo (line 1847) | CaretUndo(int start, int end) {
      method isSignificant (line 1852) | public boolean isSignificant() {
      method getPresentationName (line 1856) | public String getPresentationName() {
      method undo (line 1860) | public void undo() throws CannotUndoException {
      method redo (line 1866) | public void redo() throws CannotRedoException {
      method addEdit (line 1872) | public boolean addEdit(UndoableEdit edit) {

FILE: tda/src/main/java/de/grimmfrost/tda/utils/jedit/KeywordMap.java
  class KeywordMap (line 24) | public class KeywordMap
    method KeywordMap (line 30) | public KeywordMap(boolean ignoreCase)
    method KeywordMap (line 42) | public KeywordMap(boolean ignoreCase, int mapLength)
    method lookup (line 55) | public byte lookup(Segment text, int offset, int length)
    method add (line 80) | public void add(String keyword, byte id)
    method getIgnoreCase (line 90) | public boolean getIgnoreCase()
    method setIgnoreCase (line 100) | public void setIgnoreCase(boolean ignoreCase)
    method getStringMapKey (line 108) | protected int getStringMapKey(String s)
    method getSegmentMapKey (line 115) | protected int getSegmentMapKey(Segment s, int off, int len)
    class Keyword (line 123) | class Keyword
      method Keyword (line 125) | public Keyword(char[] keyword, byte id, Keyword next)

FILE: tda/src/main/java/de/grimmfrost/tda/utils/jedit/PopupMenu.java
  class PopupMenu (line 40) | public class PopupMenu extends JPopupMenu implements ActionListener {
    method PopupMenu (line 49) | public PopupMenu(JEditTextArea ref, TDA parent, boolean showSave) {
    method actionPerformed (line 85) | public void actionPerformed(ActionEvent e) {
    method search (line 117) | private void search(String searchString, int offSet) {
    method gotoLine (line 126) | private void gotoLine() {
    method search (line 142) | private void search() {
    method show (line 154) | public void show(Component invoker, int x, int y) {

FILE: tda/src/main/java/de/grimmfrost/tda/utils/jedit/SyntaxDocument.java
  class SyntaxDocument (line 22) | public class SyntaxDocument extends PlainDocument
    method getTokenMarker (line 29) | public TokenMarker getTokenMarker()
    method setTokenMarker (line 40) | public void setTokenMarker(TokenMarker tm)
    method tokenizeLines (line 55) | public void tokenizeLines()
    method tokenizeLines (line 67) | public void tokenizeLines(int start, int len)
    method beginCompoundEdit (line 100) | public void beginCompoundEdit() {}
    method endCompoundEdit (line 108) | public void endCompoundEdit() {}
    method addUndoableEdit (line 117) | public void addUndoableEdit(UndoableEdit edit) {}
    method fireInsertUpdate (line 127) | protected void fireInsertUpdate(DocumentEvent evt)
    method fireRemoveUpdate (line 149) | protected void fireRemoveUpdate(DocumentEvent evt)

FILE: tda/src/main/java/de/grimmfrost/tda/utils/jedit/SyntaxStyle.java
  class SyntaxStyle (line 20) | public class SyntaxStyle
    method SyntaxStyle (line 28) | public SyntaxStyle(Color color, boolean italic, boolean bold)
    method getColor (line 38) | public Color getColor()
    method isPlain (line 46) | public boolean isPlain()
    method isItalic (line 54) | public boolean isItalic()
    method isBold (line 62) | public boolean isBold()
    method getStyledFont (line 71) | public Font getStyledFont(Font font)
    method getFontMetrics (line 89) | public FontMetrics getFontMetrics(Font font)
    method setGraphicsFlags (line 112) | public void setGraphicsFlags(Graphics gfx, Font font)
    method toString (line 122) | public String toString()

FILE: tda/src/main/java/de/grimmfrost/tda/utils/jedit/SyntaxUtilities.java
  class SyntaxUtilities (line 21) | public class SyntaxUtilities
    method regionMatches (line 31) | public static boolean regionMatches(boolean ignoreCase, Segment text,
    method regionMatches (line 61) | public static boolean regionMatches(boolean ignoreCase, Segment text,
    method getDefaultSyntaxStyles (line 88) | public static SyntaxStyle[] getDefaultSyntaxStyles()
    method paintSyntaxLine (line 119) | public static int paintSyntaxLine(Segment line, Token tokens,
    method SyntaxUtilities (line 156) | private SyntaxUtilities() {}

FILE: tda/src/main/java/de/grimmfrost/tda/utils/jedit/TextAreaDefaults.java
  class TextAreaDefaults (line 22) | public class TextAreaDefaults
    method getDefaults (line 54) | public static TextAreaDefaults getDefaults()

FILE: tda/src/main/java/de/grimmfrost/tda/utils/jedit/TextAreaPainter.java
  class TextAreaPainter (line 23) | public class TextAreaPainter extends JComponent implements TabExpander
    method TextAreaPainter (line 29) | public TextAreaPainter(JEditTextArea textArea, TextAreaDefaults defaults)
    method isManagingFocus (line 67) | public final boolean isManagingFocus()
    method getStyles (line 76) | public final SyntaxStyle[] getStyles()
    method setStyles (line 86) | public final void setStyles(SyntaxStyle[] styles)
    method getCaretColor (line 95) | public final Color getCaretColor()
    method setCaretColor (line 104) | public final void setCaretColor(Color caretColor)
    method getSelectionColor (line 113) | public final Color getSelectionColor()
    method setSelectionColor (line 122) | public final void setSelectionColor(Color selectionColor)
    method getLineHighlightColor (line 131) | public final Color getLineHighlightColor()
    method setLineHighlightColor (line 140) | public final void setLineHighlightColor(Color lineHighlightColor)
    method isLineHighlightEnabled (line 149) | public final boolean isLineHighlightEnabled()
    method setLineHighlightEnabled (line 159) | public final void setLineHighlightEnabled(boolean lineHighlight)
    method getBracketHighlightColor (line 168) | public final Color getBracketHighlightColor()
    method setBracketHighlightColor (line 177) | public final void setBracketHighlightColor(Color bracketHighlightColor)
    method isBracketHighlightEnabled (line 188) | public final boolean isBracketHighlightEnabled()
    method setBracketHighlightEnabled (line 200) | public final void setBracketHighlightEnabled(boolean bracketHighlight)
    method isBlockCaretEnabled (line 209) | public final boolean isBlockCaretEnabled()
    method setBlockCaretEnabled (line 219) | public final void setBlockCaretEnabled(boolean blockCaret)
    method getEOLMarkerColor (line 228) | public final Color getEOLMarkerColor()
    method setEOLMarkerColor (line 237) | public final void setEOLMarkerColor(Color eolMarkerColor)
    method getEOLMarkersPainted (line 246) | public final boolean getEOLMarkersPainted()
    method setEOLMarkersPainted (line 255) | public final void setEOLMarkersPainted(boolean eolMarkers)
    method getInvalidLinesPainted (line 265) | public boolean getInvalidLinesPainted()
    method setInvalidLinesPainted (line 274) | public void setInvalidLinesPainted(boolean paintInvalid)
    method addCustomHighlight (line 283) | public void addCustomHighlight(Highlight highlight)
    type Highlight (line 292) | public interface Highlight
      method init (line 299) | void init(JEditTextArea textArea, Highlight next);
      method paintHighlight (line 308) | void paintHighlight(Graphics gfx, int line, int y);
      method getToolTipText (line 317) | String getToolTipText(MouseEvent evt);
    method getToolTipText (line 324) | public String getToolTipText(MouseEvent evt)
    method getFontMetrics (line 335) | public FontMetrics getFontMetrics()
    method setFont (line 345) | public void setFont(Font font)
    method paint (line 356) | public void paint(Graphics gfx)
    method invalidateLine (line 407) | public final void invalidateLine(int line)
    method invalidateLineRange (line 418) | public final void invalidateLineRange(int firstLine, int lastLine)
    method invalidateSelectedLines (line 427) | public final void invalidateSelectedLines()
    method nextTabStop (line 440) | public float nextTabStop(float x, int tabOffset)
    method getPreferredSize (line 450) | public Dimension getPreferredSize()
    method getMinimumSize (line 462) | public Dimension getMinimumSize()
    method paintLine (line 495) | protected void paintLine(Graphics gfx, TokenMarker tokenMarker,
    method paintPlainLine (line 524) | protected void paintPlainLine(Graphics gfx, int line, Font defaultFont,
    method paintSyntaxLine (line 543) | protected void paintSyntaxLine(Graphics gfx, TokenMarker tokenMarker,
    method paintHighlight (line 565) | protected void paintHighlight(Graphics gfx, int line, int y)
    method paintLineHighlight (line 581) | protected void paintLineHighlight(Graphics gfx, int line, int y)
    method paintBracketHighlight (line 650) | protected void paintBracketHighlight(Graphics gfx, int line, int y)
    method paintCaret (line 665) | protected void paintCaret(Graphics gfx, int line, int y)

FILE: tda/src/main/java/de/grimmfrost/tda/utils/jedit/TextUtilities.java
  class TextUtilities (line 18) | public class TextUtilities
    method findMatchingBracket (line 29) | public static int findMatchingBracket(Document doc, int offset)
    method findWordStart (line 132) | public static int findWordStart(String line, int pos, String noWordSep)
    method findWordEnd (line 161) | public static int findWordEnd(String line, int pos, String noWordSep)

FILE: tda/src/main/java/de/grimmfrost/tda/utils/jedit/Token.java
  class Token (line 21) | public class Token
    method Token (line 135) | public Token(int length, byte id)
    method toString (line 144) | public String toString()

FILE: tda/src/main/java/de/grimmfrost/tda/utils/jedit/TokenMarker.java
  class TokenMarker (line 28) | public abstract class TokenMarker
    method markTokens (line 36) | public Token markTokens(Segment line, int lineIndex)
    method markTokensImpl (line 124) | protected abstract byte markTokensImpl(byte token, Segment line,
    method supportsMultilineTokens (line 136) | public boolean supportsMultilineTokens()
    method insertLines (line 148) | public void insertLines(int index, int lines)
    method deleteLines (line 171) | public void deleteLines(int index, int lines)
    method getLineCount (line 184) | public int getLineCount()
    method isNextLineRequested (line 194) | public boolean isNextLineRequested()
    method TokenMarker (line 241) | protected TokenMarker()
    method ensureCapacity (line 257) | protected void ensureCapacity(int index)
    method addToken (line 275) | protected void addToken(int length, byte id)
    class LineInfo (line 310) | public class LineInfo
      method LineInfo (line 316) | public LineInfo()
      method LineInfo (line 324) | public LineInfo(byte token, Object obj)

FILE: tda/src/test/java/de/grimmfrost/tda/mcp/HeadlessAnalysisProviderTest.java
  class HeadlessAnalysisProviderTest (line 10) | public class HeadlessAnalysisProviderTest {
    method testDeadlockDetection (line 12) | @Test
    method testSummary (line 36) | @Test
    method testVirtualThreadAnalysis (line 52) | @Test
    method testNativeThreadAnalysis (line 75) | @Test
    method testZombieThreadAnalysis (line 101) | @Test

FILE: tda/src/test/java/de/grimmfrost/tda/model/TableCategoryTest.java
  class TableCategoryTest (line 8) | public class TableCategoryTest {
    method testAddToCatNodesPreservation (line 10) | @Test
    method testBugReproductionBehavior (line 30) | @Test

FILE: tda/src/test/java/de/grimmfrost/tda/parser/DumpParserFactoryTest.java
  class DumpParserFactoryTest (line 37) | public class DumpParserFactoryTest {
    method setUp (line 39) | @BeforeEach
    method tearDown (line 43) | @AfterEach
    method testGet (line 50) | @Test
    method testGetDumpParserForSunLogfile (line 59) | @Test
    method testGetDumpParserForJSONLogfile (line 74) | @Test
    method testGetDumpParserForUTF16Logfile (line 89) | @Test

FILE: tda/src/test/java/de/grimmfrost/tda/parser/JCmdJSONParserTest.java
  class JCmdJSONParserTest (line 14) | public class JCmdJSONParserTest {
    method testJSONDumpParsing (line 16) | @Test

FILE: tda/src/test/java/de/grimmfrost/tda/parser/SunJDKParserTest.java
  class SunJDKParserTest (line 44) | public class SunJDKParserTest {
    method setUp (line 46) | @BeforeEach
    method tearDown (line 50) | @AfterEach
    method testDumpLoad (line 57) | @Test
    method testIsFoundClassHistograms (line 89) | @Test
    method test64BitDumpLoad (line 111) | @Test
    method testJava8DumpLoad (line 140) | @Test
    method testJava11DumpLoad (line 169) | @Test
    method testHPDumps (line 199) | @Test
    method testRemoteVisualVMDumps (line 228) | @Test
    method testURLThreadNameDumps (line 257) | @Test
    method testVirtualThreadDumps (line 286) | @Test
    method testCarrierThreadIssuesDetection (line 315) | @Test
    method testSMRInfoParsing (line 386) | @Test
    method testSMRInfoWithUnresolved (line 413) | @Test
    method getSMSInfoTextBlock (line 430) | private static @NonNull InputStream getSMSInfoTextBlock() {
    method testLongRunningDetectionWithVariableFields (line 447) | @Test
    method testGetThreadTokensWithThreadTypeNumber (line 508) | @Test
    method testMonitorNodesHaveChildren (line 528) | @Test

FILE: tda/src/test/java/de/grimmfrost/tda/utils/LogManagerTest.java
  class LogManagerTest (line 6) | public class LogManagerTest {
    method testInitInTestEnvironment (line 7) | @Test

FILE: visualvm-logfile-component/src/main/java/net/java/dev/tda/visualvm/logfile/AddLogfileAction.java
  class AddLogfileAction (line 36) | public class AddLogfileAction extends SingleDataSourceAction<LogfileData...
    method AddLogfileAction (line 47) | private AddLogfileAction() {
    method alwaysEnabled (line 53) | public static synchronized AddLogfileAction alwaysEnabled() {
    method selectionAware (line 62) | public static synchronized AddLogfileAction selectionAware() {
    method actionPerformed (line 70) | public void actionPerformed(LogfileDataSource container, ActionEvent e) {
    method isEnabled (line 86) | protected boolean isEnabled(LogfileDataSource container) {
    method initialize (line 90) | @Override

FILE: visualvm-logfile-component/src/main/java/net/java/dev/tda/visualvm/logfile/Install.java
  class Install (line 28) | public class Install extends ModuleInstall {
    method restored (line 30) | @Override

FILE: visualvm-logfile-component/src/main/java/net/java/dev/tda/visualvm/logfile/LogPanel.java
  class LogPanel (line 37) | public class LogPanel extends JPanel {
    method LogPanel (line 40) | public LogPanel(TDA ref) {
    method setCaretPosition (line 58) | public void setCaretPosition(int i) {
    method setText (line 62) | public void setText(String content) {

FILE: visualvm-logfile-component/src/main/java/net/java/dev/tda/visualvm/logfile/Logfile.java
  class Logfile (line 31) | public class Logfile extends Snapshot {
    method Logfile (line 33) | public Logfile(File file) throws IOException {
    method Logfile (line 37) | public Logfile(File file, DataSource master) throws IOException {
    method supportsSaveAs (line 44) | @Override

FILE: visualvm-logfile-component/src/main/java/net/java/dev/tda/visualvm/logfile/LogfileCategory.java
  class LogfileCategory (line 29) | public class LogfileCategory extends SnapshotCategory<Logfile> {
    method LogfileCategory (line 35) | public LogfileCategory() {

FILE: visualvm-logfile-component/src/main/java/net/java/dev/tda/visualvm/logfile/LogfileDataSource.java
  class LogfileDataSource (line 35) | public class LogfileDataSource extends DataSource {
    method sharedInstance (line 39) | public static synchronized LogfileDataSource sharedInstance() {
    method LogfileDataSource (line 48) | private LogfileDataSource() {
    class LogfileDataSourceDescriptor (line 54) | private static class LogfileDataSourceDescriptor extends DataSourceDes...
      method LogfileDataSourceDescriptor (line 57) | LogfileDataSourceDescriptor() {
    class LogfileDataSourceDescriptorProvider (line 63) | private static class LogfileDataSourceDescriptorProvider extends Abstr...
      method createModelFor (line 65) | public DataSourceDescriptor createModelFor(DataSource ds) {

FILE: visualvm-logfile-component/src/main/java/net/java/dev/tda/visualvm/logfile/LogfileDescriptor.java
  class LogfileDescriptor (line 30) | public class LogfileDescriptor extends SnapshotDescriptor<Logfile> {
    method LogfileDescriptor (line 34) | public LogfileDescriptor(Logfile logFile) {

FILE: visualvm-logfile-component/src/main/java/net/java/dev/tda/visualvm/logfile/LogfileDescriptorProvider.java
  class LogfileDescriptorProvider (line 31) | public class LogfileDescriptorProvider extends AbstractModelProvider<Dat...
    method createModelFor (line 33) | public DataSourceDescriptor createModelFor(DataSource ds) {

FILE: visualvm-logfile-component/src/main/java/net/java/dev/tda/visualvm/logfile/LogfileDumpView.java
  class LogfileDumpView (line 37) | public class LogfileDumpView extends DataSourceView {
    method LogfileDumpView (line 43) | public LogfileDumpView(Logfile logfile) {
    method createComponent (line 48) | @Override
    method readText (line 73) | private String readText() {

FILE: visualvm-logfile-component/src/main/java/net/java/dev/tda/visualvm/logfile/LogfileDumpViewProvider.java
  class LogfileDumpViewProvider (line 31) | public class LogfileDumpViewProvider extends PluggableDataSourceViewProv...
    method supportsViewFor (line 33) | protected boolean supportsViewFor(Logfile coreDump) {
    method createView (line 37) | protected DataSourceView createView(Logfile logfile) {
    method getPluggableLocations (line 41) | public Set<Integer> getPluggableLocations(DataSourceView view) {

FILE: visualvm-logfile-component/src/main/java/net/java/dev/tda/visualvm/logfile/LogfileProvider.java
  class LogfileProvider (line 36) | public class LogfileProvider {
    method createLogfile (line 39) | public static void createLogfile(File logfile) {
    method initialize (line 50) | public static void initialize() {

FILE: visualvm-logfile-component/src/main/java/net/java/dev/tda/visualvm/logfile/LogfileSupport.java
  class LogfileSupport (line 29) | public class LogfileSupport {
    method getCategory (line 33) | public static LogfileCategory getCategory() {
    method getOverviewView (line 41) | public static PluggableDataSourceViewProvider<Logfile> getOverviewView...

FILE: visualvm-module/src/main/java/net/java/dev/tda/visualvm/Install.java
  class Install (line 26) | public class Install extends ModuleInstall {
    method restored (line 28) | @Override

FILE: visualvm-module/src/main/java/net/java/dev/tda/visualvm/TDAView.java
  class TDAView (line 41) | public class TDAView extends DataSourceView {
    method TDAView (line 49) | public TDAView(DataSource logContent) {
    method createComponent (line 55) | @Override
    method addToTDA (line 81) | public void addToTDA(String file) {
    method createView (line 85) | private JPanel createView() {

FILE: visualvm-module/src/main/java/net/java/dev/tda/visualvm/TDAViewProvider.java
  class TDAViewProvider (line 35) | public class TDAViewProvider extends DataSourceViewProvider<DataSource> {
    method initialize (line 41) | static void initialize() {
    method supportsViewFor (line 45) | @Override
    method createView (line 50) | @Override

FILE: visualvm-module/src/main/java/net/java/dev/tda/visualvm/VisualvmOptionsCategory.java
  class VisualvmOptionsCategory (line 27) | public final class VisualvmOptionsCategory extends OptionsCategory {
    method getIcon (line 29) | @Override
    method getCategoryName (line 34) | @Override
    method getTitle (line 39) | @Override
    method create (line 44) | @Override

FILE: visualvm-module/src/main/java/net/java/dev/tda/visualvm/VisualvmOptionsPanelController.java
  class VisualvmOptionsPanelController (line 35) | final class VisualvmOptionsPanelController extends OptionsPanelController {
    method update (line 44) | @Override
    method applyChanges (line 50) | @Override
    method cancel (line 58) | @Override
    method isValid (line 63) | @Override
    method isChanged (line 68) | @Override
    method getHelpCtx (line 73) | @Override
    method getComponent (line 79) | @Override
    method addPropertyChangeListener (line 84) | @Override
    method removePropertyChangeListener (line 89) | @Override
    method getPanel (line 94) | private JTabbedPane getPanel() {
    method changed (line 108) | void changed() {
Condensed preview — 144 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,998K chars).
[
  {
    "path": ".github/copilot-instructions.md",
    "chars": 2210,
    "preview": "# Copilot Review Instructions: TDA - Thread Dump Analyzer\n\nYou are reviewing **TDA (Thread Dump Analyzer)**, a Java-base"
  },
  {
    "path": ".github/workflows/build.yml",
    "chars": 773,
    "preview": "name: Java CI with Maven\n\non:\n  push:\n    branches: [ \"*\" ]\n    paths-ignore:\n      - 'README.md'\n      - 'CHANGELOG.md'"
  },
  {
    "path": ".github/workflows/pages.yml",
    "chars": 767,
    "preview": "name: Deploy GitHub Pages\n\non:\n  push:\n    branches: [ \"main\" ]\n    paths:\n      - 'docs/**'\n  workflow_dispatch:\n\npermi"
  },
  {
    "path": ".github/workflows/release.yml",
    "chars": 1885,
    "preview": "name: Release\n\non:\n  push:\n    tags:\n      - '[0-9]+.[0-9]+*'\n\njobs:\n  build-macos:\n    name: Build macOS Binary\n    run"
  },
  {
    "path": ".gitignore",
    "chars": 323,
    "preview": "target/\n*.class\n*.jar\n*.war\n*.ear\n\n# IntelliJ IDEA\n.idea/\n*.iml\n*.iws\n*.ipr\nout/\n\n# NetBeans (just in case some remain o"
  },
  {
    "path": "CHANGELOG.md",
    "chars": 6427,
    "preview": "# Changelog\n\nAll notable changes to TDA (Thread Dump Analyzer) will be documented in this file.\n\n## [3.0]\n### Features\n-"
  },
  {
    "path": "LICENSE",
    "chars": 26461,
    "preview": "                  GNU LESSER GENERAL PUBLIC LICENSE\n                       Version 2.1, February 1999\n\n Copyright (C) 19"
  },
  {
    "path": "README.md",
    "chars": 14778,
    "preview": "[![Java CI with Maven](https://github.com/irockel/tda/actions/workflows/build.yml/badge.svg)](https://github.com/irockel"
  },
  {
    "path": "docs/index.html",
    "chars": 17533,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width"
  },
  {
    "path": "pom.xml",
    "chars": 3847,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2"
  },
  {
    "path": "renovate.json",
    "chars": 887,
    "preview": "{\n  \"$schema\": \"https://docs.renovatebot.com/renovate-schema.json\",\n  \"extends\": [\n    \"config:recommended\",\n    \":separ"
  },
  {
    "path": "tda/dependency-reduced-pom.xml",
    "chars": 6511,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/"
  },
  {
    "path": "tda/pom.xml",
    "chars": 7641,
    "preview": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n  xsi:schemaLoc"
  },
  {
    "path": "tda/src/main/java/de/grimmfrost/tda/CustomCategoriesDialog.java",
    "chars": 7095,
    "preview": "/*\n * CustomCategoriesDialog.java\n *\n * This file is part of TDA - Thread Dump Analysis Tool.\n *\n * TDA is free software"
  },
  {
    "path": "tda/src/main/java/de/grimmfrost/tda/EditCustomCategoryDialog.java",
    "chars": 10869,
    "preview": "/*\n * EditCustomCategoryDialog.java\n *\n * This file is part of TDA - Thread Dump Analysis Tool.\n *\n * TDA is free softwa"
  },
  {
    "path": "tda/src/main/java/de/grimmfrost/tda/EditFilterDialog.java",
    "chars": 7922,
    "preview": "/*\n * EditFilterDialog.java\n *\n * This file is part of TDA - Thread Dump Analysis Tool.\n *\n * TDA is free software; you "
  },
  {
    "path": "tda/src/main/java/de/grimmfrost/tda/FilterDialog.java",
    "chars": 6657,
    "preview": "/*\n * FilterDialog.java\n *\n * This file is part of TDA - Thread Dump Analysis Tool.\n *\n * TDA is free software; you can "
  },
  {
    "path": "tda/src/main/java/de/grimmfrost/tda/HelpOverviewDialog.java",
    "chars": 4743,
    "preview": "/*\n * HelpOverviewDialog.java\n *\n * This file is part of TDA - Thread Dump Analysis Tool.\n *\n * TDA is free software; yo"
  },
  {
    "path": "tda/src/main/java/de/grimmfrost/tda/InfoDialog.java",
    "chars": 4654,
    "preview": "/*\n * PreferencesDialog.java\n *\n * This file is part of TDA - Thread Dump Analysis Tool.\n *\n * TDA is free software; you"
  },
  {
    "path": "tda/src/main/java/de/grimmfrost/tda/LongThreadDialog.java",
    "chars": 5445,
    "preview": "/*\n * LongThreadDialog.java\n *\n * This file is part of TDA - Thread Dump Analysis Tool.\n *\n * TDA is free software; you "
  },
  {
    "path": "tda/src/main/java/de/grimmfrost/tda/MainMenu.java",
    "chars": 17685,
    "preview": "/*\n * MainMenu.java\n *\n * This file is part of TDA - Thread Dump Analysis Tool.\n *\n * TDA is free software; you can redi"
  },
  {
    "path": "tda/src/main/java/de/grimmfrost/tda/PreferencesDialog.java",
    "chars": 10206,
    "preview": "/*\n * PreferencesDialog.java\n *\n * This file is part of TDA - Thread Dump Analysis Tool.\n *\n * TDA is free software; you"
  },
  {
    "path": "tda/src/main/java/de/grimmfrost/tda/SearchDialog.java",
    "chars": 4193,
    "preview": "/*\n * SearchDialog.java\n *\n * This file is part of TDA - Thread Dump Analysis Tool.\n *\n * TDA is free software; you can "
  },
  {
    "path": "tda/src/main/java/de/grimmfrost/tda/TDA.java",
    "chars": 94208,
    "preview": "/**\n * Thread Dump Analysis Tool, parses Thread Dump input and displays it as tree\n * <p>\n * This file is part of TDA - "
  },
  {
    "path": "tda/src/main/java/de/grimmfrost/tda/filter/Filter.java",
    "chars": 7557,
    "preview": "/*\n * Filter.java\n *\n * This file is part of TDA - Thread Dump Analysis Tool.\n *\n * TDA is free software; you can redist"
  },
  {
    "path": "tda/src/main/java/de/grimmfrost/tda/filter/FilterChecker.java",
    "chars": 3694,
    "preview": "/*\n * FilterChecker.java\n *\n * This file is part of TDA - Thread Dump Analysis Tool.\n *\n * TDA is free software; you can"
  },
  {
    "path": "tda/src/main/java/de/grimmfrost/tda/jconsole/MBeanDumper.java",
    "chars": 13665,
    "preview": "/**\n * Thread Dump Analysis Tool, parses Thread Dump input and displays it as tree\n *\n * This file is part of TDA - Thre"
  },
  {
    "path": "tda/src/main/java/de/grimmfrost/tda/jconsole/TDAPlugin.java",
    "chars": 3826,
    "preview": "/**\n * Thread Dump Analysis Tool, parses Thread Dump input and displays it as tree\n *\n * This file is part of TDA - Thre"
  },
  {
    "path": "tda/src/main/java/de/grimmfrost/tda/mcp/HeadlessAnalysisProvider.java",
    "chars": 9770,
    "preview": "package de.grimmfrost.tda.mcp;\n\nimport de.grimmfrost.tda.*;\nimport de.grimmfrost.tda.model.Category;\nimport de.grimmfros"
  },
  {
    "path": "tda/src/main/java/de/grimmfrost/tda/mcp/MCPServer.java",
    "chars": 8420,
    "preview": "package de.grimmfrost.tda.mcp;\n\nimport com.google.gson.Gson;\nimport com.google.gson.JsonObject;\nimport com.google.gson.J"
  },
  {
    "path": "tda/src/main/java/de/grimmfrost/tda/model/AbstractCategory.java",
    "chars": 6242,
    "preview": "/*\n * This file is part of TDA - Thread Dump Analysis Tool.\n *\n * TDA is free software; you can redistribute it and/or m"
  },
  {
    "path": "tda/src/main/java/de/grimmfrost/tda/model/AbstractInfo.java",
    "chars": 1376,
    "preview": "/*\n * AbstractInfo.java\n *\n * This file is part of TDA - Thread Dump Analysis Tool.\n *\n * TDA is free software; you can "
  },
  {
    "path": "tda/src/main/java/de/grimmfrost/tda/model/Category.java",
    "chars": 2392,
    "preview": "/*\n * This file is part of TDA - Thread Dump Analysis Tool.\n *\n * TDA is free software; you can redistribute it and/or m"
  },
  {
    "path": "tda/src/main/java/de/grimmfrost/tda/model/CustomCategory.java",
    "chars": 2331,
    "preview": "/*\n * CustomCategory.java\n *\n * This file is part of TDA - Thread Dump Analysis Tool.\n *\n * TDA is free software; you ca"
  },
  {
    "path": "tda/src/main/java/de/grimmfrost/tda/model/DumpStore.java",
    "chars": 2208,
    "preview": "/*\n * DumpStore.java\n *\n * This file is part of TDA - Thread Dump Analysis Tool.\n *\n * Foobar is free software; you can "
  },
  {
    "path": "tda/src/main/java/de/grimmfrost/tda/model/HeapInfo.java",
    "chars": 1828,
    "preview": "/*\n * HeapInfo.java\n *\n * This file is part of TDA - Thread Dump Analysis Tool.\n *\n * TDA is free software; you can redi"
  },
  {
    "path": "tda/src/main/java/de/grimmfrost/tda/model/HistogramInfo.java",
    "chars": 1240,
    "preview": "/*\n * DumpGeneralInfo.java\n *\n *\n * This file is part of TDA - Thread Dump Analysis Tool.\n *\n * TDA is free software; yo"
  },
  {
    "path": "tda/src/main/java/de/grimmfrost/tda/model/LogFileContent.java",
    "chars": 3736,
    "preview": "/*\n * LogFileContent.java\n *\n * This file is part of TDA - Thread Dump Analysis Tool.\n *\n * Foobar is free software; you"
  },
  {
    "path": "tda/src/main/java/de/grimmfrost/tda/model/Logfile.java",
    "chars": 2019,
    "preview": "/*\n * Logfile.java\n *\n * This file is part of TDA - Thread Dump Analysis Tool.\n *\n * Foobar is free software; you can re"
  },
  {
    "path": "tda/src/main/java/de/grimmfrost/tda/model/MonitorMap.java",
    "chars": 4937,
    "preview": "/*\n * MonitorMap.java\n *\n * This file is part of TDA - Thread Dump Analysis Tool.\n *\n * TDA is free software; you can re"
  },
  {
    "path": "tda/src/main/java/de/grimmfrost/tda/model/TableCategory.java",
    "chars": 5643,
    "preview": "/*\n * This file is part of TDA - Thread Dump Analysis Tool.\n *\n * TDA is free software; you can redistribute it and/or m"
  },
  {
    "path": "tda/src/main/java/de/grimmfrost/tda/model/ThreadDumpInfo.java",
    "chars": 24661,
    "preview": "/*\n * ThreadDumpInfo.java\n *\n * This file is part of TDA - Thread Dump Analysis Tool.\n *\n * TDA is free software; you ca"
  },
  {
    "path": "tda/src/main/java/de/grimmfrost/tda/model/ThreadInfo.java",
    "chars": 2374,
    "preview": "/*\n * ThreadDumpInfo.java\n *\n * This file is part of TDA - Thread Dump Analysis Tool.\n *\n * TDA is free software; you ca"
  },
  {
    "path": "tda/src/main/java/de/grimmfrost/tda/model/TreeCategory.java",
    "chars": 4251,
    "preview": "/*\n * TreeCategory.java\n *\n * This file is part of TDA - Thread Dump Analysis Tool.\n *\n * Foobar is free software; you c"
  },
  {
    "path": "tda/src/main/java/de/grimmfrost/tda/parser/AbstractDumpParser.java",
    "chars": 17144,
    "preview": "/*\n * This file is part of TDA - Thread Dump Analysis Tool.\n *\n * TDA is free software; you can redistribute it and/or m"
  },
  {
    "path": "tda/src/main/java/de/grimmfrost/tda/parser/Analyzer.java",
    "chars": 8334,
    "preview": "/*\n * Analyzer.java\n *\n * This file is part of TDA - Thread Dump Analysis Tool.\n *\n * Foobar is free software; you can r"
  },
  {
    "path": "tda/src/main/java/de/grimmfrost/tda/parser/DumpParser.java",
    "chars": 1902,
    "preview": "/*\n * DumpParser.java\n *\n * This file is part of TDA - Thread Dump Analysis Tool.\n *\n * Foobar is free software; you can"
  },
  {
    "path": "tda/src/main/java/de/grimmfrost/tda/parser/DumpParserFactory.java",
    "chars": 6397,
    "preview": "/*\n * DumpParserFactory.java\n *\n * This file is part of TDA - Thread Dump Analysis Tool.\n *\n * TDA is free software; you"
  },
  {
    "path": "tda/src/main/java/de/grimmfrost/tda/parser/JCmdJSONParser.java",
    "chars": 6117,
    "preview": "package de.grimmfrost.tda.parser;\n\nimport com.google.gson.Gson;\nimport com.google.gson.JsonArray;\nimport com.google.gson"
  },
  {
    "path": "tda/src/main/java/de/grimmfrost/tda/parser/SunJDKParser.java",
    "chars": 53026,
    "preview": "/*\n * SunJDKParser.java\n *\n * This file is part of TDA - Thread Dump Analysis Tool.\n *\n * TDA is free software; you can "
  },
  {
    "path": "tda/src/main/java/de/grimmfrost/tda/parser/WrappedSunJDKParser.java",
    "chars": 2046,
    "preview": "/*\r\n * WrappedSunJDKParser.java\r\n *\r\n * This file is part of TDA - Thread Dump Analysis Tool.\r\n *\r\n * Foobar is free sof"
  },
  {
    "path": "tda/src/main/java/de/grimmfrost/tda/utils/AppInfo.java",
    "chars": 2350,
    "preview": "/*\n * AppInfo.java\n *\n * This file is part of TDA - Thread Dump Analysis Tool.\n *\n * TDA is free software; you can redis"
  },
  {
    "path": "tda/src/main/java/de/grimmfrost/tda/utils/Browser.java",
    "chars": 4869,
    "preview": "/**\n * class Browser Copyright (C) 1999-2001 Fredrik Ehnbom <fredde@gjt.org>\n * available at\n * <http://www.gjt.org/serv"
  },
  {
    "path": "tda/src/main/java/de/grimmfrost/tda/utils/ColoredTable.java",
    "chars": 2907,
    "preview": "/*\n * ColoredTable.java\n *\n * This file is part of TDA - Thread Dump Analysis Tool.\n *\n * TDA is free software; you can "
  },
  {
    "path": "tda/src/main/java/de/grimmfrost/tda/utils/DateMatcher.java",
    "chars": 4016,
    "preview": "/*\n * DateMatcher.java\n *\n * This file is part of TDA - Thread Dump Analysis Tool.\n *\n * TDA is free software; you can r"
  },
  {
    "path": "tda/src/main/java/de/grimmfrost/tda/utils/HistogramTableModel.java",
    "chars": 7965,
    "preview": "/*\n * HistogramTableModel.java\n *\n * Thread Dump Analysis Tool, parses Thread Dump input and displays it as tree\n *\n * T"
  },
  {
    "path": "tda/src/main/java/de/grimmfrost/tda/utils/IconFactory.java",
    "chars": 2540,
    "preview": "/*\n * IconFactory.java\n *\n * This file is part of TDA - Thread Dump Analysis Tool.\n *\n * TDA is free software; you can r"
  },
  {
    "path": "tda/src/main/java/de/grimmfrost/tda/utils/LogManager.java",
    "chars": 6842,
    "preview": "package de.grimmfrost.tda.utils;\n\nimport java.io.File;\nimport java.io.IOException;\nimport java.io.PrintWriter;\nimport ja"
  },
  {
    "path": "tda/src/main/java/de/grimmfrost/tda/utils/MonitorComparator.java",
    "chars": 2381,
    "preview": "/*\n * MonitorComparator.java\n *\n * This file is part of TDA - Thread Dump Analysis Tool.\n *\n * TDA is free software; you"
  },
  {
    "path": "tda/src/main/java/de/grimmfrost/tda/utils/MonitorsTableModel.java",
    "chars": 941,
    "preview": "/*\n * To change this template, choose Tools | Templates\n * and open the template in the editor.\n */\n\npackage de.grimmfro"
  },
  {
    "path": "tda/src/main/java/de/grimmfrost/tda/utils/PrefManager.java",
    "chars": 18861,
    "preview": "/*\n * PrefManager.java\n *\n * Thread Dump Analysis Tool, parses Thread Dump input and displays it as tree\n *\n * This file"
  },
  {
    "path": "tda/src/main/java/de/grimmfrost/tda/utils/ResourceManager.java",
    "chars": 500,
    "preview": "/*\n * To change this template, choose Tools | Templates\n * and open the template in the editor.\n */\n\npackage de.grimmfro"
  },
  {
    "path": "tda/src/main/java/de/grimmfrost/tda/utils/StatusBar.java",
    "chars": 6938,
    "preview": "/*\n * StatusBar.java\n *\n * This file is part of TDA - Thread Dump Analysis Tool.\n *\n * TDA is free software; you can red"
  },
  {
    "path": "tda/src/main/java/de/grimmfrost/tda/utils/SwingWorker.java",
    "chars": 4434,
    "preview": "/*\n * SwingWorker.java\n *\n * Thread Dump Analysis Tool, parses Thread Dump input and displays it as tree\n *\n * This file"
  },
  {
    "path": "tda/src/main/java/de/grimmfrost/tda/utils/TableSorter.java",
    "chars": 17672,
    "preview": "/*\n * TableSorter.java\n *\n * This class is taken from the java tutorial at java.sun.com with \n * an unkown license.\n *\n "
  },
  {
    "path": "tda/src/main/java/de/grimmfrost/tda/utils/ThreadsTableModel.java",
    "chars": 5257,
    "preview": "/*\n * ThreadsTableModel.java\n  *\n * This file is part of TDA - Thread Dump Analysis Tool.\n *\n * TDA is free software; yo"
  },
  {
    "path": "tda/src/main/java/de/grimmfrost/tda/utils/ThreadsTableSelectionModel.java",
    "chars": 518,
    "preview": "/*\n * To change this template, choose Tools | Templates\n * and open the template in the editor.\n */\n\npackage de.grimmfro"
  },
  {
    "path": "tda/src/main/java/de/grimmfrost/tda/utils/TipOfDay.java",
    "chars": 1743,
    "preview": "/*\n * TipOfDay.java\n *\n * This file is part of TDA - Thread Dump Analysis Tool.\n *\n * TDA is free software; you can redi"
  },
  {
    "path": "tda/src/main/java/de/grimmfrost/tda/utils/TreeRenderer.java",
    "chars": 4044,
    "preview": "/*\n * TreeRenderer.java\n  *\n * This file is part of TDA - Thread Dump Analysis Tool.\n *\n * TDA is free software; you can"
  },
  {
    "path": "tda/src/main/java/de/grimmfrost/tda/utils/ViewScrollPane.java",
    "chars": 1705,
    "preview": "/*\n * PreferencesDialog.java\n *\n * This file is part of TDA - Thread Dump Analysis Tool.\n *\n * TDA is free software; you"
  },
  {
    "path": "tda/src/main/java/de/grimmfrost/tda/utils/jedit/DefaultInputHandler.java",
    "chars": 11167,
    "preview": "/*\n * DefaultInputHandler.java - Default implementation of an input handler\n * Copyright (C) 1999 Slava Pestov\n *\n * You"
  },
  {
    "path": "tda/src/main/java/de/grimmfrost/tda/utils/jedit/InputHandler.java",
    "chars": 33136,
    "preview": "/*\n * InputHandler.java - Manages key bindings and executes actions\n * Copyright (C) 1999 Slava Pestov\n *\n * You may use"
  },
  {
    "path": "tda/src/main/java/de/grimmfrost/tda/utils/jedit/JEditTextArea.java",
    "chars": 58405,
    "preview": "/*\n * JEditTextArea.java - jEdit's text component\n * Copyright (C) 1999 Slava Pestov\n *\n * You may use and modify this p"
  },
  {
    "path": "tda/src/main/java/de/grimmfrost/tda/utils/jedit/KeywordMap.java",
    "chars": 3365,
    "preview": "/*\n * KeywordMap.java - Fast keyword->id map\n * Copyright (C) 1998, 1999 Slava Pestov\n * Copyright (C) 1999 Mike Dillon\n"
  },
  {
    "path": "tda/src/main/java/de/grimmfrost/tda/utils/jedit/PopupMenu.java",
    "chars": 6042,
    "preview": "/**\n * Thread Dump Analysis Tool, parses Thread Dump input and displays it as tree\n *\n * This file is part of TDA - Thre"
  },
  {
    "path": "tda/src/main/java/de/grimmfrost/tda/utils/jedit/SyntaxDocument.java",
    "chars": 4258,
    "preview": "/*\n * SyntaxDocument.java - Document that can be tokenized\n * Copyright (C) 1999 Slava Pestov\n *\n * You may use and modi"
  },
  {
    "path": "tda/src/main/java/de/grimmfrost/tda/utils/jedit/SyntaxStyle.java",
    "chars": 3118,
    "preview": "/*\n * SyntaxStyle.java - A simple text style class\n * Copyright (C) 1999 Slava Pestov\n *\n * You may use and modify this "
  },
  {
    "path": "tda/src/main/java/de/grimmfrost/tda/utils/jedit/SyntaxUtilities.java",
    "chars": 4566,
    "preview": "/*\n * SyntaxUtilities.java - Utility functions used by syntax colorizing\n * Copyright (C) 1999 Slava Pestov\n *\n * You ma"
  },
  {
    "path": "tda/src/main/java/de/grimmfrost/tda/utils/jedit/TextAreaDefaults.java",
    "chars": 2498,
    "preview": "/*\n * $Id: TextAreaDefaults.java,v 1.3 2008-09-30 19:20:56 irockel Exp $\n *\n * TextAreaDefaults.java - Encapsulates defa"
  },
  {
    "path": "tda/src/main/java/de/grimmfrost/tda/utils/jedit/TextAreaPainter.java",
    "chars": 16897,
    "preview": "/*\n * TextAreaPainter.java - Paints the text area\n * Copyright (C) 1999 Slava Pestov\n *\n * You may use and modify this p"
  },
  {
    "path": "tda/src/main/java/de/grimmfrost/tda/utils/jedit/TextUtilities.java",
    "chars": 4433,
    "preview": "/*\n * TextUtilities.java - Utility functions used by the text area classes\n * Copyright (C) 1999 Slava Pestov\n *\n * You "
  },
  {
    "path": "tda/src/main/java/de/grimmfrost/tda/utils/jedit/Token.java",
    "chars": 3488,
    "preview": "/*\n * Token.java - Generic token\n * Copyright (C) 1998, 1999 Slava Pestov\n *\n * You may use and modify this package for "
  },
  {
    "path": "tda/src/main/java/de/grimmfrost/tda/utils/jedit/TokenMarker.java",
    "chars": 9208,
    "preview": "/*\n * TokenMarker.java - Generic token marker\n * Copyright (C) 1998, 1999 Slava Pestov\n *\n * You may use and modify this"
  },
  {
    "path": "tda/src/main/resources/META-INF/services/com.sun.tools.jconsole.JConsolePlugin",
    "chars": 37,
    "preview": "de.grimmfrost.tda.jconsole.TDAPlugin\n"
  },
  {
    "path": "tda/src/main/resources/de/grimmfrost/tda/doc/COPYING",
    "chars": 26535,
    "preview": "<html>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"stylesheet.css\" title=\"Style\">\n<body bgcolor=\"ffffff\"><pre>\n\t\t  GNU "
  },
  {
    "path": "tda/src/main/resources/de/grimmfrost/tda/doc/README",
    "chars": 2719,
    "preview": "<html>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"stylesheet.css\" title=\"Style\">\n<body bgcolor=\"#f5f5f5\">\n<h3>TDA - Th"
  },
  {
    "path": "tda/src/main/resources/de/grimmfrost/tda/doc/stylesheet.css",
    "chars": 2387,
    "preview": "/* Javadoc style sheet */\r\n\r\n/* Define colors, fonts and other style attributes here to override the defaults */\r\n\r\n/* P"
  },
  {
    "path": "tda/src/main/resources/de/grimmfrost/tda/doc/tips.properties",
    "chars": 810,
    "preview": "# Tips of the day.\ntips.count=5\ntip.0=If you open a logfile with thread dumps you should check the thread dump nodes if "
  },
  {
    "path": "tda/src/main/resources/de/grimmfrost/tda/doc/welcome.html",
    "chars": 6416,
    "preview": "<html xmlns=\"http://www.w3.org/1999/html\">\n<head>\n    <style>\n        body {\n            font-family: \"Segoe UI\", Tahoma"
  },
  {
    "path": "tda/src/main/resources/de/grimmfrost/tda/locale.properties",
    "chars": 3271,
    "preview": "# i18n properties/English.\n#\n# This file is part of TDA - Thread Dump Analysis Tool.\n#\n# Foobar is free software; you ca"
  },
  {
    "path": "tda/src/main/resources/de/grimmfrost/tda/version.properties",
    "chars": 27,
    "preview": "version=${project.version}\n"
  },
  {
    "path": "tda/src/test/java/de/grimmfrost/tda/mcp/HeadlessAnalysisProviderTest.java",
    "chars": 5881,
    "preview": "package de.grimmfrost.tda.mcp;\n\nimport org.junit.jupiter.api.Test;\nimport static org.junit.jupiter.api.Assertions.*;\nimp"
  },
  {
    "path": "tda/src/test/java/de/grimmfrost/tda/model/TableCategoryTest.java",
    "chars": 1931,
    "preview": "package de.grimmfrost.tda.model;\n\nimport javax.swing.tree.DefaultMutableTreeNode;\n\nimport org.junit.jupiter.api.Test;\nim"
  },
  {
    "path": "tda/src/test/java/de/grimmfrost/tda/parser/DumpParserFactoryTest.java",
    "chars": 3558,
    "preview": "/*\n * DumpParserFactoryTest.java\n *\n * This file is part of TDA - Thread Dump Analysis Tool.\n *\n * Foobar is free softwa"
  },
  {
    "path": "tda/src/test/java/de/grimmfrost/tda/parser/JCmdJSONParserTest.java",
    "chars": 2095,
    "preview": "package de.grimmfrost.tda.parser;\n\nimport de.grimmfrost.tda.model.Category;\nimport de.grimmfrost.tda.model.ThreadDumpInf"
  },
  {
    "path": "tda/src/test/java/de/grimmfrost/tda/parser/SunJDKParserTest.java",
    "chars": 22698,
    "preview": "/*\n * SunJDKParserTest.java\n *\n * This file is part of TDA - Thread Dump Analysis Tool.\n *\n * Foobar is free software; y"
  },
  {
    "path": "tda/src/test/java/de/grimmfrost/tda/utils/LogManagerTest.java",
    "chars": 501,
    "preview": "package de.grimmfrost.tda.utils;\n\nimport org.junit.jupiter.api.Test;\nimport static org.junit.jupiter.api.Assertions.*;\n\n"
  },
  {
    "path": "tda/src/test/resources/carrier_stuck.log",
    "chars": 1971,
    "preview": "2026-01-23 21:50:00\nFull thread dump OpenJDK 64-Bit Server VM (21.0.2+13-LTS mixed mode, sharing):\n\n\"ForkJoinPool-1-work"
  },
  {
    "path": "tda/src/test/resources/hpdump.log",
    "chars": 691562,
    "preview": "\r\n\r\nFull thread dump  [ 3 15 14:48:56 KST 2008] (Java HotSpot(TM) 64-Bit Server VM 1.5.0.11 jinteg:11.07.07-18:21 IA64W "
  },
  {
    "path": "tda/src/test/resources/intellij_dump.json",
    "chars": 5101,
    "preview": "{\n  \"threadDump\": {\n    \"processId\": \"3862\",\n    \"time\": \"2026-01-25T15:46:04.439828Z\",\n    \"runtimeVersion\": \"21.0.10+7"
  },
  {
    "path": "tda/src/test/resources/java11dump.log",
    "chars": 3297,
    "preview": "2020-04-16 02:53:41\nFull thread dump OpenJDK 64-Bit Server VM (11.0.6+10 mixed mode):\n\n\"main\" #1 prio=5 os_prio=0 cpu=11"
  },
  {
    "path": "tda/src/test/resources/java21dump.log",
    "chars": 9422,
    "preview": "2024-08-20 14:25:30\nFull thread dump OpenJDK 64-Bit Server VM (21.0.2+13-LTS mixed mode, sharing):\n\n\"main\" #1 [1] prio=5"
  },
  {
    "path": "tda/src/test/resources/java8dump.log",
    "chars": 7218,
    "preview": "2016-07-12 14:02:38\nFull thread dump OpenJDK 64-Bit Server VM (25.91-b14 mixed mode):\n\n\"Thread-2\" #20 prio=6 os_prio=0 t"
  },
  {
    "path": "tda/src/test/resources/jdk11_long_running.log",
    "chars": 861,
    "preview": "2026-01-17 10:00:00\nFull thread dump OpenJDK 64-Bit Server VM (11.0.12+7-LTS mixed mode):\n\n\"C2 CompilerThread0\" #5 daemo"
  },
  {
    "path": "tda/src/test/resources/jstack_dump.log",
    "chars": 7960,
    "preview": "2026-01-20 17:29:40\nFull thread dump OpenJDK 64-Bit Server VM (21.0.9+10-LTS mixed mode, sharing):\n\nThreads class SMR in"
  },
  {
    "path": "tda/src/test/resources/test.log",
    "chars": 129340,
    "preview": "2007-11-06 10:30:41\nFull thread dump Java HotSpot(TM) Client VM 1.6.0_03-b05\n\n\"RMI TCP Connection(23)-127.0.1.1\" id=3149"
  },
  {
    "path": "tda/src/test/resources/test64bit.log",
    "chars": 1023,
    "preview": "Full thread dump Java HotSpot(TM) 64-Bit Server VM (1.5.0_13-b05 mixed mode):\n\n\"LeaseRenewalManager Task\" daemon prio=1 "
  },
  {
    "path": "tda/src/test/resources/testwithhistogram.log",
    "chars": 73576,
    "preview": "[2006-05-03:12:00:00.000] dummy log line for timestamp\n\nFull thread dump Java HotSpot(TM) Client VM (1.5.0_06-b05 mixed "
  },
  {
    "path": "tda/src/test/resources/urlthread.log",
    "chars": 52271,
    "preview": "2008-03-24 23:12:13\nFull thread dump Java HotSpot(TM) Server VM (1.6.0_03-b05 mixed mode):\n\n\"RMI TCP Connection(69241)-2"
  },
  {
    "path": "tda/src/test/resources/visualvmremote.log",
    "chars": 62692,
    "preview": "\r\n2008-11-20 09:28:02\r\nFull thread dump Java HotSpot(TM) 64-Bit Server VM (11.0-b15 mixed mode):\r\n\r\n\"Timer-180\" - Thread"
  },
  {
    "path": "tda-macos-binary/pom.xml",
    "chars": 3620,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2"
  },
  {
    "path": "visualvm-lib-component/manifest.mf",
    "chars": 807,
    "preview": "OpenIDE-Module-Public-Packages: de.grimmfrost.tda.*, de.grimmfrost.tda.filter.*, de.grimmfrost.tda.jconsole.*, de.grimmf"
  },
  {
    "path": "visualvm-lib-component/pom.xml",
    "chars": 5491,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2"
  },
  {
    "path": "visualvm-lib-component/src/main/resources/net/java/dev/tda/Bundle.properties",
    "chars": 234,
    "preview": "OpenIDE-Module-Name=VisualVM-TDA-Library-Component\nOpenIDE-Module-Display-Category=Tools\nOpenIDE-Module-Long-Description"
  },
  {
    "path": "visualvm-logfile-component/manifest.mf",
    "chars": 714,
    "preview": "OpenIDE-Module-Public-Packages: net.java.dev.tda.visualvm.logfile.*\nOpenIDE-Module-Module-Dependencies: net.java.dev.tda"
  },
  {
    "path": "visualvm-logfile-component/pom.xml",
    "chars": 2974,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2"
  },
  {
    "path": "visualvm-logfile-component/src/main/java/net/java/dev/tda/visualvm/logfile/AddLogfileAction.java",
    "chars": 3513,
    "preview": "/*\n * This file is part of TDA - Thread Dump Analysis Tool.\n *\n * TDA is free software; you can redistribute it and/or m"
  },
  {
    "path": "visualvm-logfile-component/src/main/java/net/java/dev/tda/visualvm/logfile/Install.java",
    "chars": 1190,
    "preview": "/*\n * This file is part of TDA - Thread Dump Analysis Tool.\n *\n * TDA is free software; you can redistribute it and/or m"
  },
  {
    "path": "visualvm-logfile-component/src/main/java/net/java/dev/tda/visualvm/logfile/LogPanel.java",
    "chars": 2353,
    "preview": "/*\n * This file is part of TDA - Thread Dump Analysis Tool.\n *\n * TDA is free software; you can redistribute it and/or m"
  },
  {
    "path": "visualvm-logfile-component/src/main/java/net/java/dev/tda/visualvm/logfile/Logfile.java",
    "chars": 1598,
    "preview": "/*\n * This file is part of TDA - Thread Dump Analysis Tool.\n *\n * TDA is free software; you can redistribute it and/or m"
  },
  {
    "path": "visualvm-logfile-component/src/main/java/net/java/dev/tda/visualvm/logfile/LogfileCategory.java",
    "chars": 1456,
    "preview": "/*\n * This file is part of TDA - Thread Dump Analysis Tool.\n *\n * TDA is free software; you can redistribute it and/or m"
  },
  {
    "path": "visualvm-logfile-component/src/main/java/net/java/dev/tda/visualvm/logfile/LogfileDataSource.java",
    "chars": 2757,
    "preview": "/*\n * This file is part of TDA - Thread Dump Analysis Tool.\n *\n * TDA is free software; you can redistribute it and/or m"
  },
  {
    "path": "visualvm-logfile-component/src/main/java/net/java/dev/tda/visualvm/logfile/LogfileDescriptor.java",
    "chars": 1371,
    "preview": "/*\n * This file is part of TDA - Thread Dump Analysis Tool.\n *\n * TDA is free software; you can redistribute it and/or m"
  },
  {
    "path": "visualvm-logfile-component/src/main/java/net/java/dev/tda/visualvm/logfile/LogfileDescriptorProvider.java",
    "chars": 1471,
    "preview": "/*\n * This file is part of TDA - Thread Dump Analysis Tool.\n *\n * TDA is free software; you can redistribute it and/or m"
  },
  {
    "path": "visualvm-logfile-component/src/main/java/net/java/dev/tda/visualvm/logfile/LogfileDumpView.java",
    "chars": 3292,
    "preview": "/*\n * This file is part of TDA - Thread Dump Analysis Tool.\n *\n * TDA is free software; you can redistribute it and/or m"
  },
  {
    "path": "visualvm-logfile-component/src/main/java/net/java/dev/tda/visualvm/logfile/LogfileDumpViewProvider.java",
    "chars": 1524,
    "preview": "/*\n * This file is part of TDA - Thread Dump Analysis Tool.\n *\n * TDA is free software; you can redistribute it and/or m"
  },
  {
    "path": "visualvm-logfile-component/src/main/java/net/java/dev/tda/visualvm/logfile/LogfileProvider.java",
    "chars": 2269,
    "preview": "/*\n * This file is part of TDA - Thread Dump Analysis Tool.\n *\n * TDA is free software; you can redistribute it and/or m"
  },
  {
    "path": "visualvm-logfile-component/src/main/java/net/java/dev/tda/visualvm/logfile/LogfileSupport.java",
    "chars": 1551,
    "preview": "/*\n * This file is part of TDA - Thread Dump Analysis Tool.\n *\n * TDA is free software; you can redistribute it and/or m"
  },
  {
    "path": "visualvm-logfile-component/src/main/resources/net/java/dev/tda/visualvm/logfile/Bundle.properties",
    "chars": 650,
    "preview": "OpenIDE-Module-Display-Category=Tools\nOpenIDE-Module-Long-Description=\\\n    Logfile Plugin for VisualVM, needed by TDA P"
  },
  {
    "path": "visualvm-logfile-component/src/main/resources/net/java/dev/tda/visualvm/logfile/layer.xml",
    "chars": 2204,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE filesystem PUBLIC \"-//NetBeans//DTD Filesystem 1.1//EN\" \"http://www.net"
  },
  {
    "path": "visualvm-module/manifest.mf",
    "chars": 1007,
    "preview": "OpenIDE-Module-Public-Packages: -\nOpenIDE-Module-Module-Dependencies: net.java.dev.tda/2 > 2.0,\n  net.java.dev.tda.visua"
  },
  {
    "path": "visualvm-module/pom.xml",
    "chars": 4189,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2"
  },
  {
    "path": "visualvm-module/src/main/java/net/java/dev/tda/visualvm/Install.java",
    "chars": 1118,
    "preview": "/*\n * This file is part of TDA - Thread Dump Analysis Tool.\n *\n * TDA is free software; you can redistribute it and/or m"
  },
  {
    "path": "visualvm-module/src/main/java/net/java/dev/tda/visualvm/TDAView.java",
    "chars": 4237,
    "preview": "/*\n * This file is part of TDA - Thread Dump Analysis Tool.\n *\n * TDA is free software; you can redistribute it and/or m"
  },
  {
    "path": "visualvm-module/src/main/java/net/java/dev/tda/visualvm/TDAViewProvider.java",
    "chars": 2367,
    "preview": "/*\n * This file is part of TDA - Thread Dump Analysis Tool.\n *\n * TDA is free software; you can redistribute it and/or m"
  },
  {
    "path": "visualvm-module/src/main/java/net/java/dev/tda/visualvm/VisualvmOptionsCategory.java",
    "chars": 1696,
    "preview": "/*\n * This file is part of TDA - Thread Dump Analysis Tool.\n *\n * TDA is free software; you can redistribute it and/or m"
  },
  {
    "path": "visualvm-module/src/main/java/net/java/dev/tda/visualvm/VisualvmOptionsPanelController.java",
    "chars": 3692,
    "preview": "/*\n * This file is part of TDA - Thread Dump Analysis Tool.\n *\n * TDA is free software; you can redistribute it and/or m"
  },
  {
    "path": "visualvm-module/src/main/resources/net/java/dev/tda/visualvm/Bundle.properties",
    "chars": 685,
    "preview": "# Module configuration\nOpenIDE-Module-Display-Category=Tools\nOpenIDE-Module-Long-Description=\\\n    VisualVM Module of TD"
  },
  {
    "path": "visualvm-module/src/main/resources/net/java/dev/tda/visualvm/layer.xml",
    "chars": 380,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE filesystem PUBLIC \"-//NetBeans//DTD Filesystem 1.1//EN\" \"http://www.net"
  }
]

// ... and 5 more files (download for full content)

About this extraction

This page contains the full source code of the irockel/tda GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 144 files (1.8 MB), approximately 489.2k tokens, and a symbol index with 1210 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!