You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by fm...@apache.org on 2008/11/18 11:23:37 UTC

svn commit: r718548 - in /incubator/sling/trunk/extensions/threaddump: ./ src/ src/main/ src/main/java/ src/main/java/org/ src/main/java/org/apache/ src/main/java/org/apache/sling/ src/main/java/org/apache/sling/extensions/ src/main/java/org/apache/sli...

Author: fmeschbe
Date: Tue Nov 18 02:23:37 2008
New Revision: 718548

URL: http://svn.apache.org/viewvc?rev=718548&view=rev
Log:
SLING-737 Provide Thread Dumper extension to web console and shell

Added:
    incubator/sling/trunk/extensions/threaddump/   (with props)
    incubator/sling/trunk/extensions/threaddump/pom.xml   (with props)
    incubator/sling/trunk/extensions/threaddump/src/
    incubator/sling/trunk/extensions/threaddump/src/main/
    incubator/sling/trunk/extensions/threaddump/src/main/java/
    incubator/sling/trunk/extensions/threaddump/src/main/java/org/
    incubator/sling/trunk/extensions/threaddump/src/main/java/org/apache/
    incubator/sling/trunk/extensions/threaddump/src/main/java/org/apache/sling/
    incubator/sling/trunk/extensions/threaddump/src/main/java/org/apache/sling/extensions/
    incubator/sling/trunk/extensions/threaddump/src/main/java/org/apache/sling/extensions/threaddump/
    incubator/sling/trunk/extensions/threaddump/src/main/java/org/apache/sling/extensions/threaddump/Activator.java   (with props)
    incubator/sling/trunk/extensions/threaddump/src/main/java/org/apache/sling/extensions/threaddump/BaseThreadDumper.java   (with props)
    incubator/sling/trunk/extensions/threaddump/src/main/java/org/apache/sling/extensions/threaddump/ThreadDumpCommand.java   (with props)
    incubator/sling/trunk/extensions/threaddump/src/main/java/org/apache/sling/extensions/threaddump/ThreadDumperPanel.java   (with props)

Propchange: incubator/sling/trunk/extensions/threaddump/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Tue Nov 18 02:23:37 2008
@@ -0,0 +1,4 @@
+.classpath
+.project
+target
+.settings

Added: incubator/sling/trunk/extensions/threaddump/pom.xml
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/extensions/threaddump/pom.xml?rev=718548&view=auto
==============================================================================
--- incubator/sling/trunk/extensions/threaddump/pom.xml (added)
+++ incubator/sling/trunk/extensions/threaddump/pom.xml Tue Nov 18 02:23:37 2008
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!--
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+    
+    http://www.apache.org/licenses/LICENSE-2.0
+    
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+-->
+<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">
+
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.apache.sling</groupId>
+        <artifactId>sling</artifactId>
+        <version>4-incubator-SNAPSHOT</version>
+        <relativePath>../../parent/pom.xml</relativePath>
+    </parent>
+
+    <artifactId>org.apache.sling.extensions.threaddump</artifactId>
+    <packaging>bundle</packaging>
+    <version>0.1.0-incubator-SNAPSHOT</version>
+
+    <name>Sling Thread Dumper</name>
+    <description>
+        Plugin providing plugins to the Felix Shell and Web Console to
+        have the current threads with the stack traces dumped.
+    </description>
+
+    <scm>
+        <connection>
+            scm:svn:http://svn.apache.org/repos/asf/incubator/sling/trunk/extensions/threaddump
+        </connection>
+        <developerConnection>
+            scm:svn:https://svn.apache.org/repos/asf/incubator/sling/trunk/extensions/threaddump
+        </developerConnection>
+        <url>
+            http://svn.apache.org/viewvc/incubator/sling/trunk/extensions/threaddump
+        </url>
+    </scm>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <extensions>true</extensions>
+                <configuration>
+                    <instructions>
+                        <Import-Package>
+                            org.osgi.framework,
+                            javax.servlet.*;
+                            org.apache.felix.shell;
+                            org.apache.felix.webconsole;resolution:=optional
+                        </Import-Package>
+                        <Private-Package>
+                            org.apache.sling.extensions.threaddump.*
+                        </Private-Package>
+                        <Bundle-Activator>
+                            org.apache.sling.extensions.threaddump.Activator
+                        </Bundle-Activator>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+    <reporting>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-javadoc-plugin</artifactId>
+                <configuration>
+                    <excludePackageNames>
+                        org.apache.sling.extensions.threaddump.internal
+                    </excludePackageNames>
+                </configuration>
+            </plugin>
+        </plugins>
+    </reporting>
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.osgi.core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.osgi.compendium</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.apache.felix.shell</artifactId>
+            <version>1.0.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.apache.felix.webconsole</artifactId>
+            <version>1.2.0</version>
+        </dependency>
+        <dependency>
+            <groupId>javax.servlet</groupId>
+            <artifactId>servlet-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+        </dependency>
+    </dependencies>
+</project>

Propchange: incubator/sling/trunk/extensions/threaddump/pom.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/sling/trunk/extensions/threaddump/src/main/java/org/apache/sling/extensions/threaddump/Activator.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/extensions/threaddump/src/main/java/org/apache/sling/extensions/threaddump/Activator.java?rev=718548&view=auto
==============================================================================
--- incubator/sling/trunk/extensions/threaddump/src/main/java/org/apache/sling/extensions/threaddump/Activator.java (added)
+++ incubator/sling/trunk/extensions/threaddump/src/main/java/org/apache/sling/extensions/threaddump/Activator.java Tue Nov 18 02:23:37 2008
@@ -0,0 +1,71 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sling.extensions.threaddump;
+
+import java.util.Dictionary;
+import java.util.Hashtable;
+
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
+
+public class Activator implements BundleActivator {
+
+    public void start(BundleContext bundleContext) {
+        try {
+            register(bundleContext,
+                new String[] { "org.apache.felix.shell.Command" },
+                new ThreadDumpCommand(), null);
+        } catch (Throwable t) {
+            // shell service might not be available, don't care
+        }
+        try {
+            ThreadDumperPanel tdp = new ThreadDumperPanel();
+            tdp.activate(bundleContext);
+
+            Dictionary<String, Object> properties = new Hashtable<String, Object>();
+            properties.put("felix.webconsole.label", tdp.getLabel());
+
+            register(bundleContext, new String[] { "javax.servlet.Servlet",
+                "org.apache.felix.webconsole.ConfigurationPrinter" }, tdp,
+                properties);
+        } catch (Throwable t) {
+            // shell service might not be available, don't care
+        }
+    }
+
+    public void stop(BundleContext bundleContext) {
+    }
+
+    private void register(BundleContext context, String[] serviceNames,
+            Object service, Dictionary<String, Object> properties) {
+
+        // ensure properties
+        if (properties == null) {
+            properties = new Hashtable<String, Object>();
+        }
+
+        // default settings
+        properties.put(Constants.SERVICE_DESCRIPTION, "Thread Dumper ("
+            + serviceNames[0] + ")");
+        properties.put(Constants.SERVICE_VENDOR, "Apache Software Foundation");
+
+            context.registerService(serviceNames, service, properties);
+    }
+}

Propchange: incubator/sling/trunk/extensions/threaddump/src/main/java/org/apache/sling/extensions/threaddump/Activator.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/sling/trunk/extensions/threaddump/src/main/java/org/apache/sling/extensions/threaddump/Activator.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision Rev Url

Added: incubator/sling/trunk/extensions/threaddump/src/main/java/org/apache/sling/extensions/threaddump/BaseThreadDumper.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/extensions/threaddump/src/main/java/org/apache/sling/extensions/threaddump/BaseThreadDumper.java?rev=718548&view=auto
==============================================================================
--- incubator/sling/trunk/extensions/threaddump/src/main/java/org/apache/sling/extensions/threaddump/BaseThreadDumper.java (added)
+++ incubator/sling/trunk/extensions/threaddump/src/main/java/org/apache/sling/extensions/threaddump/BaseThreadDumper.java Tue Nov 18 02:23:37 2008
@@ -0,0 +1,164 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sling.extensions.threaddump;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.net.URL;
+import java.net.URLClassLoader;
+
+import javax.servlet.Servlet;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.felix.webconsole.AbstractWebConsolePlugin;
+import org.apache.felix.webconsole.ConfigurationPrinter;
+
+class BaseThreadDumper {
+
+    boolean printThread(PrintWriter pw, long threadId, boolean withStackTrace) {
+        // first get the root thread group
+        ThreadGroup rootGroup = getRootThreadGroup();
+        int numThreads = rootGroup.activeCount();
+        Thread[] threads = new Thread[numThreads * 2];
+        rootGroup.enumerate(threads);
+
+        for (Thread thread : threads) {
+            if (thread != null && thread.getId() == threadId) {
+                printThread(pw, thread, withStackTrace);
+                return true;
+            }
+        }
+
+        return false;
+    }
+    
+    void printThreads(PrintWriter pw, boolean withStackTrace) {
+        // first get the root thread group
+        ThreadGroup rootGroup = getRootThreadGroup();
+
+        printThreadGroup(pw, rootGroup, withStackTrace);
+
+        int numGroups = rootGroup.activeGroupCount();
+        ThreadGroup[] groups = new ThreadGroup[2 * numGroups];
+        rootGroup.enumerate(groups);
+        for (int i = 0; i < groups.length; i++) {
+            printThreadGroup(pw, groups[i], withStackTrace);
+        }
+
+        pw.println();
+    }
+
+    private ThreadGroup getRootThreadGroup() {
+        ThreadGroup rootGroup = Thread.currentThread().getThreadGroup();
+        while (rootGroup.getParent() != null) {
+            rootGroup = rootGroup.getParent();
+        }
+        return rootGroup;
+    }
+    
+    private void printThreadGroup(PrintWriter pw, ThreadGroup group, boolean withStackTrace) {
+        if (group != null) {
+            StringBuffer info = new StringBuffer();
+            info.append("ThreadGroup ").append(group.getName());
+            info.append(" [");
+            info.append("maxprio=").append(group.getMaxPriority());
+
+            info.append(", parent=");
+            if (group.getParent() != null) {
+                info.append(group.getParent().getName());
+            } else {
+                info.append('-');
+            }
+
+            info.append(", isDaemon=").append(group.isDaemon());
+            info.append(", isDestroyed=").append(group.isDestroyed());
+            info.append(']');
+
+            pw.println(info);
+
+            int numThreads = group.activeCount();
+            Thread[] threads = new Thread[numThreads * 2];
+            group.enumerate(threads, false);
+            for (int i = 0; i < threads.length; i++) {
+                printThread(pw, threads[i], withStackTrace);
+            }
+
+            pw.println();
+        }
+    }
+
+    private void printThread(PrintWriter pw, Thread thread, boolean withStackTrace) {
+        if (thread != null) {
+            StringBuffer info = new StringBuffer();
+            info.append("  Thread ").append(thread.getId());
+            info.append('/').append(thread.getName());
+            info.append(" [");
+            info.append("priority=").append(thread.getPriority());
+            info.append(", alive=").append(thread.isAlive());
+            info.append(", daemon=").append(thread.isDaemon());
+            info.append(", interrupted=").append(thread.isInterrupted());
+            info.append(", loader=").append(thread.getContextClassLoader());
+            info.append(']');
+
+            pw.println(info);
+
+            if (withStackTrace) {
+                printClassLoader(pw, thread.getContextClassLoader());
+                printStackTrace(pw, thread.getStackTrace());
+                pw.println();
+            }
+        }
+    }
+
+    private void printClassLoader(PrintWriter pw, ClassLoader classLoader) {
+        if (classLoader != null) {
+            pw.print("    ClassLoader=");
+            pw.println(classLoader);
+            pw.print("      Parent=");
+            pw.println(classLoader.getParent());
+
+            if (classLoader instanceof URLClassLoader) {
+                URLClassLoader loader = (URLClassLoader) classLoader;
+                URL[] urls = loader.getURLs();
+                if (urls != null && urls.length > 0) {
+                    for (int i = 0; i < urls.length; i++) {
+                        pw.print("      ");
+                        pw.print(i);
+                        pw.print(" - ");
+                        pw.println(urls[i]);
+                    }
+                }
+            }
+        }
+    }
+
+    private void printStackTrace(PrintWriter pw, StackTraceElement[] stackTrace) {
+        pw.println("    Stacktrace");
+        if (stackTrace == null || stackTrace.length == 0) {
+            pw.println("      -");
+        } else {
+            for (StackTraceElement stackTraceElement : stackTrace) {
+                pw.print("      ");
+                pw.println(stackTraceElement);
+            }
+        }
+    }
+}

Propchange: incubator/sling/trunk/extensions/threaddump/src/main/java/org/apache/sling/extensions/threaddump/BaseThreadDumper.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/sling/trunk/extensions/threaddump/src/main/java/org/apache/sling/extensions/threaddump/BaseThreadDumper.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision Rev Url

Added: incubator/sling/trunk/extensions/threaddump/src/main/java/org/apache/sling/extensions/threaddump/ThreadDumpCommand.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/extensions/threaddump/src/main/java/org/apache/sling/extensions/threaddump/ThreadDumpCommand.java?rev=718548&view=auto
==============================================================================
--- incubator/sling/trunk/extensions/threaddump/src/main/java/org/apache/sling/extensions/threaddump/ThreadDumpCommand.java (added)
+++ incubator/sling/trunk/extensions/threaddump/src/main/java/org/apache/sling/extensions/threaddump/ThreadDumpCommand.java Tue Nov 18 02:23:37 2008
@@ -0,0 +1,92 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sling.extensions.threaddump;
+
+import java.io.PrintStream;
+import java.io.PrintWriter;
+import java.util.LinkedList;
+import java.util.StringTokenizer;
+
+import org.apache.felix.shell.Command;
+
+public class ThreadDumpCommand extends BaseThreadDumper implements Command {
+
+    private static final String CMD_NAME = "threads";
+
+    private static final String OPT_STACK = "-s";
+
+    public String getName() {
+        return CMD_NAME;
+    }
+
+    public String getShortDescription() {
+        return "dumps the JVM threads";
+    }
+
+    public String getUsage() {
+        return CMD_NAME + " [" + OPT_STACK + "] <id> ...";
+    }
+
+    public void execute(String command, PrintStream out, PrintStream err) {
+
+        // cut off leading command name
+        if (command.startsWith(CMD_NAME)) {
+            command = command.substring(CMD_NAME.length());
+        }
+
+        boolean longListing = false;
+        LinkedList<Long> threadIds = new LinkedList<Long>();
+
+        StringTokenizer tokener = new StringTokenizer(command, ", \t");
+        while (tokener.hasMoreTokens()) {
+            String token = tokener.nextToken().trim();
+            if (OPT_STACK.equals(token)) {
+                longListing = true;
+            } else {
+                try {
+                    long threadId = Long.parseLong(token);
+                    threadIds.add(threadId);
+                } catch (NumberFormatException nfe) {
+                    noSuchThread(err, token);
+                }
+            }
+        }
+
+        PrintWriter pw = new PrintWriter(out);
+
+        if (threadIds.isEmpty()) {
+            printThreads(pw, longListing);
+        } else {
+            while (!threadIds.isEmpty()) {
+                Long threadId = threadIds.removeFirst();
+                if (!printThread(pw, threadId, longListing)) {
+                    noSuchThread(err, threadId);
+                }
+            }
+        }
+
+        pw.flush();
+    }
+
+    private void noSuchThread(PrintStream err, Object threadId) {
+        err.println("No such Thread: " + threadId);
+        err.flush();
+    }
+
+}

Propchange: incubator/sling/trunk/extensions/threaddump/src/main/java/org/apache/sling/extensions/threaddump/ThreadDumpCommand.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/sling/trunk/extensions/threaddump/src/main/java/org/apache/sling/extensions/threaddump/ThreadDumpCommand.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision Rev Url

Added: incubator/sling/trunk/extensions/threaddump/src/main/java/org/apache/sling/extensions/threaddump/ThreadDumperPanel.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/extensions/threaddump/src/main/java/org/apache/sling/extensions/threaddump/ThreadDumperPanel.java?rev=718548&view=auto
==============================================================================
--- incubator/sling/trunk/extensions/threaddump/src/main/java/org/apache/sling/extensions/threaddump/ThreadDumperPanel.java (added)
+++ incubator/sling/trunk/extensions/threaddump/src/main/java/org/apache/sling/extensions/threaddump/ThreadDumperPanel.java Tue Nov 18 02:23:37 2008
@@ -0,0 +1,93 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sling.extensions.threaddump;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.Locale;
+
+import javax.servlet.Servlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.felix.webconsole.AbstractWebConsolePlugin;
+import org.apache.felix.webconsole.ConfigurationPrinter;
+
+public class ThreadDumperPanel extends AbstractWebConsolePlugin implements
+        Servlet, ConfigurationPrinter {
+
+    private static final String LABEL = "threads";
+
+    private static final String TITLE = "Threads";
+
+    private BaseThreadDumper baseThreadDumper = new BaseThreadDumper();
+
+    // ---------- AbstractWebConsolePlugin API
+
+    @Override
+    public String getLabel() {
+        return LABEL;
+    }
+
+    @Override
+    public String getTitle() {
+        return TITLE;
+    }
+
+    @Override
+    protected void renderContent(HttpServletRequest request,
+            HttpServletResponse response) throws IOException {
+        PrintWriter pw = response.getWriter();
+
+        pw.println("<pre>");
+        pw.println("</pre>");
+
+        pw.println( "<table class='content' cellpadding='0' cellspacing='0' width='100%'>" );
+
+        pw.println( "<tr class='content'>" );
+        pw.println( "<th class='content container'>" + getTitle() + "</th>" );
+        pw.println( "</tr>" );
+
+        pw.println( "<tr class='content'>" );
+        pw.println( "<td class='content'>" );
+        pw.println( "<pre>" );
+
+        pw.println( "*** Date: "
+            + SimpleDateFormat.getDateTimeInstance( SimpleDateFormat.LONG, SimpleDateFormat.LONG, Locale.US ).format(
+                new Date() ) );
+        pw.println();
+
+        baseThreadDumper.printThreads(pw, true);
+
+        pw.println( "</pre>" );
+        pw.println( "</td>" );
+        pw.println( "</tr>" );
+        pw.println( "</table>" );
+    }
+
+    // ---------- ConfigurationPrinter
+
+    public void printConfiguration(PrintWriter pw) {
+        pw.println("*** Threads Dumps:");
+        baseThreadDumper.printThreads(pw, true);
+    }
+}

Propchange: incubator/sling/trunk/extensions/threaddump/src/main/java/org/apache/sling/extensions/threaddump/ThreadDumperPanel.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/sling/trunk/extensions/threaddump/src/main/java/org/apache/sling/extensions/threaddump/ThreadDumperPanel.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision Rev Url