View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements. See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache license, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License. You may obtain a copy of the License at
8    *
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the license for the specific language governing permissions and
15   * limitations under the license.
16   */
17  package org.apache.logging.log4j.core.message;
18  
19  import java.lang.management.ManagementFactory;
20  import java.lang.management.ThreadInfo;
21  import java.lang.management.ThreadMXBean;
22  import java.lang.reflect.Method;
23  import java.util.HashMap;
24  import java.util.Map;
25  
26  import org.apache.logging.log4j.message.ThreadDumpMessage;
27  import org.apache.logging.log4j.message.ThreadInformation;
28  
29  /**
30   * Factory to create extended thread information.
31   */
32  public class ExtendedThreadInfoFactory implements ThreadDumpMessage.ThreadInfoFactory {
33      public ExtendedThreadInfoFactory() {
34          final Method[] methods = ThreadInfo.class.getMethods();
35          boolean basic = true;
36          for (final Method method : methods) {
37              if (method.getName().equals("getLockInfo")) {
38                  basic = false;
39                  break;
40              }
41          }
42          if (basic) {
43              throw new IllegalStateException();
44          }
45      }
46      @Override
47      public Map<ThreadInformation, StackTraceElement[]> createThreadInfo() {
48          final ThreadMXBean bean = ManagementFactory.getThreadMXBean();
49          final ThreadInfo[] array = bean.dumpAllThreads(true, true);
50  
51          final Map<ThreadInformation, StackTraceElement[]>  threads =
52              new HashMap<>(array.length);
53          for (final ThreadInfo info : array) {
54              threads.put(new ExtendedThreadInformation(info), info.getStackTrace());
55          }
56          return threads;
57      }
58  }