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 }