1 /* 2 * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 package com.sun.management.internal; 26 27 import java.lang.management.ManagementFactory; 28 import java.util.ArrayList; 29 import java.util.Collections; 30 import java.util.HashMap; 31 import java.util.List; 32 import java.util.Map; 33 import java.util.Set; 34 import java.util.stream.Collectors; 35 import java.util.stream.Stream; 36 import javax.management.DynamicMBean; 37 import javax.management.ObjectName; 38 import sun.management.ManagementFactoryHelper; 39 import sun.management.spi.PlatformMBeanProvider; 40 41 public final class PlatformMBeanProviderImpl extends PlatformMBeanProvider { 42 private final List<PlatformComponent<?>> mxbeanList; 43 44 public PlatformMBeanProviderImpl() { 45 mxbeanList = Collections.unmodifiableList(init()); 46 } 47 48 @Override 49 public List<PlatformComponent<?>> getPlatformComponentList() { 50 return mxbeanList; 51 } 52 53 private List<PlatformComponent<?>> init() { 54 ArrayList<PlatformComponent<?>> initMBeanList = new ArrayList<>(); 55 /** 56 * Garbage Collector in the Java virtual machine. 57 */ 58 initMBeanList.add(new PlatformComponent<java.lang.management.MemoryManagerMXBean>() { 59 private final Set<String> garbageCollectorMXBeanInterfaceNames 60 = Collections.unmodifiableSet( 61 Stream.of("java.lang.management.MemoryManagerMXBean", 62 "java.lang.management.GarbageCollectorMXBean", 63 "com.sun.management.GarbageCollectorMXBean") 64 .collect(Collectors.toSet())); 65 66 @Override 67 public Set<Class<? extends java.lang.management.MemoryManagerMXBean>> mbeanInterfaces() { 68 return Stream.of(java.lang.management.MemoryManagerMXBean.class, 69 java.lang.management.GarbageCollectorMXBean.class, 70 com.sun.management.GarbageCollectorMXBean.class) 71 .collect(Collectors.toSet()); 72 } 73 74 @Override 75 public Set<String> mbeanInterfaceNames() { 76 return garbageCollectorMXBeanInterfaceNames; 77 } 78 79 @Override 80 public String getObjectNamePattern() { 81 return ManagementFactory.GARBAGE_COLLECTOR_MXBEAN_DOMAIN_TYPE + ",name=*"; 82 } 83 84 @Override 85 public boolean isSingleton() { 86 return false; // zero or more instances 87 } 88 89 @Override 90 public Map<String, java.lang.management.MemoryManagerMXBean> nameToMBeanMap() { 91 List<java.lang.management.GarbageCollectorMXBean> list 92 = ManagementFactoryHelper.getGarbageCollectorMXBeans();; 93 Map<String, java.lang.management.MemoryManagerMXBean> map; 94 if (list.isEmpty()) { 95 map = Collections.<String, java.lang.management.MemoryManagerMXBean>emptyMap(); 96 } else { 97 map = new HashMap<>(list.size()); 98 for (java.lang.management.MemoryManagerMXBean gcm : list) { 99 map.put(gcm.getObjectName().getCanonicalName(), 100 gcm); 101 } 102 } 103 return map; 104 } 105 }); 106 107 /** 108 * OperatingSystemMXBean 109 */ 110 initMBeanList.add(new PlatformComponent<java.lang.management.OperatingSystemMXBean>() { 111 private final Set<String> operatingSystemMXBeanInterfaceNames 112 = Collections.unmodifiableSet( 113 Stream.of("java.lang.management.OperatingSystemMXBean", 114 "com.sun.management.OperatingSystemMXBean", 115 "com.sun.management.UnixOperatingSystemMXBean") 116 .collect(Collectors.toSet())); 117 118 @Override 119 public Set<Class<? extends java.lang.management.OperatingSystemMXBean>> mbeanInterfaces() { 120 return Stream.of(java.lang.management.OperatingSystemMXBean.class, 121 com.sun.management.OperatingSystemMXBean.class, 122 com.sun.management.UnixOperatingSystemMXBean.class) 123 .collect(Collectors.toSet()); 124 } 125 126 @Override 127 public Set<String> mbeanInterfaceNames() { 128 return operatingSystemMXBeanInterfaceNames; 129 } 130 131 @Override 132 public String getObjectNamePattern() { 133 return ManagementFactory.OPERATING_SYSTEM_MXBEAN_NAME; 134 } 135 136 @Override 137 public Map<String, java.lang.management.OperatingSystemMXBean> nameToMBeanMap() { 138 return Collections.<String, java.lang.management.OperatingSystemMXBean>singletonMap( 139 ManagementFactory.OPERATING_SYSTEM_MXBEAN_NAME, 140 ManagementFactoryHelper.getOperatingSystemMXBean()); 141 } 142 }); 143 144 /** 145 * Diagnostic support for the HotSpot Virtual Machine. 146 */ 147 initMBeanList.add(new PlatformComponent<com.sun.management.HotSpotDiagnosticMXBean>() { 148 private final Set<String> hotSpotDiagnosticMXBeanInterfaceNames = 149 Collections.unmodifiableSet(Collections.<String>singleton("com.sun.management.HotSpotDiagnosticMXBean")); 150 151 @Override 152 public Set<Class<? extends com.sun.management.HotSpotDiagnosticMXBean>> mbeanInterfaces() { 153 return Collections.singleton(com.sun.management.HotSpotDiagnosticMXBean.class); 154 } 155 156 @Override 157 public Set<String> mbeanInterfaceNames() { 158 return hotSpotDiagnosticMXBeanInterfaceNames; 159 } 160 161 @Override 162 public String getObjectNamePattern() { 163 return "com.sun.management:type=HotSpotDiagnostic"; 164 } 165 166 @Override 167 public Map<String, com.sun.management.HotSpotDiagnosticMXBean> nameToMBeanMap() { 168 return Collections.<String, com.sun.management.HotSpotDiagnosticMXBean>singletonMap( 169 "com.sun.management:type=HotSpotDiagnostic", 170 ManagementFactoryHelper.getDiagnosticMXBean()); 171 } 172 }); 173 174 /** 175 * DynamicMBean 176 */ 177 HashMap<ObjectName, DynamicMBean> dynmbeans 178 = ManagementFactoryHelper.getPlatformDynamicMBeans(); 179 final Set<String> dynamicMBeanInterfaceNames = 180 Collections.unmodifiableSet(Collections.<String>singleton("javax.management.DynamicMBean")); 181 for (Map.Entry<ObjectName, DynamicMBean> e : dynmbeans.entrySet()) { 182 initMBeanList.add(new PlatformComponent<DynamicMBean>() { 183 @Override 184 public Set<String> mbeanInterfaceNames() { 185 return dynamicMBeanInterfaceNames; 186 } 187 188 @Override 189 public Set<Class<? extends DynamicMBean>> mbeanInterfaces() { 190 return Collections.emptySet(); // DynamicMBean cannot be used to find an MBean by ManagementFactory 191 } 192 193 @Override 194 public String getObjectNamePattern() { 195 return e.getKey().getCanonicalName(); 196 } 197 198 @Override 199 public Map<String, DynamicMBean> nameToMBeanMap() { 200 return Collections.<String, DynamicMBean>singletonMap( 201 e.getKey().getCanonicalName(), 202 e.getValue()); 203 } 204 }); 205 } 206 initMBeanList.trimToSize(); 207 return initMBeanList; 208 } 209 }