1 /* 2 * Copyright (c) 2004, 2019, 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 26 package sun.management; 27 28 import java.lang.management.MemoryNotificationInfo; 29 import java.lang.management.MemoryUsage; 30 import javax.management.openmbean.CompositeData; 31 import javax.management.openmbean.CompositeType; 32 import javax.management.openmbean.CompositeDataSupport; 33 import javax.management.openmbean.OpenDataException; 34 35 /** 36 * A CompositeData for MemoryNotificationInfo for the local management support. 37 * This class avoids the performance penalty paid to the 38 * construction of a CompositeData use in the local case. 39 */ 40 public class MemoryNotifInfoCompositeData extends LazyCompositeData { 41 @SuppressWarnings("serial") // Not statically typed as Serializable 42 private final MemoryNotificationInfo memoryNotifInfo; 43 44 private MemoryNotifInfoCompositeData(MemoryNotificationInfo info) { 45 this.memoryNotifInfo = info; 46 } 47 48 public MemoryNotificationInfo getMemoryNotifInfo() { 49 return memoryNotifInfo; 50 } 51 52 public static CompositeData toCompositeData(MemoryNotificationInfo info) { 53 MemoryNotifInfoCompositeData mnicd = 54 new MemoryNotifInfoCompositeData(info); 55 return mnicd.getCompositeData(); 56 } 57 58 protected CompositeData getCompositeData() { 59 // CONTENTS OF THIS ARRAY MUST BE SYNCHRONIZED WITH 60 // memoryNotifInfoItemNames! 61 final Object[] memoryNotifInfoItemValues = { 62 memoryNotifInfo.getPoolName(), 63 MemoryUsageCompositeData.toCompositeData(memoryNotifInfo.getUsage()), 64 memoryNotifInfo.getCount(), 65 }; 66 67 try { 68 return new CompositeDataSupport(memoryNotifInfoCompositeType, 69 memoryNotifInfoItemNames, 70 memoryNotifInfoItemValues); 71 } catch (OpenDataException e) { 72 // Should never reach here 73 throw new AssertionError(e); 74 } 75 } 76 77 private static final CompositeType memoryNotifInfoCompositeType; 78 static { 79 try { 80 memoryNotifInfoCompositeType = (CompositeType) 81 MappedMXBeanType.toOpenType(MemoryNotificationInfo.class); 82 } catch (OpenDataException e) { 83 // Should never reach here 84 throw new AssertionError(e); 85 } 86 } 87 88 private static final String POOL_NAME = "poolName"; 89 private static final String USAGE = "usage"; 90 private static final String COUNT = "count"; 91 private static final String[] memoryNotifInfoItemNames = { 92 POOL_NAME, 93 USAGE, 94 COUNT, 95 }; 96 97 98 public static String getPoolName(CompositeData cd) { 99 String poolname = getString(cd, POOL_NAME); 100 if (poolname == null) { 101 throw new IllegalArgumentException("Invalid composite data: " + 102 "Attribute " + POOL_NAME + " has null value"); 103 } 104 return poolname; 105 } 106 107 public static MemoryUsage getUsage(CompositeData cd) { 108 CompositeData usageData = (CompositeData) cd.get(USAGE); 109 return MemoryUsage.from(usageData); 110 } 111 112 public static long getCount(CompositeData cd) { 113 return getLong(cd, COUNT); 114 } 115 116 /** Validate if the input CompositeData has the expected 117 * CompositeType (i.e. contain all attributes with expected 118 * names and types). 119 */ 120 public static void validateCompositeData(CompositeData cd) { 121 if (cd == null) { 122 throw new NullPointerException("Null CompositeData"); 123 } 124 125 if (!isTypeMatched(memoryNotifInfoCompositeType, cd.getCompositeType())) { 126 throw new IllegalArgumentException( 127 "Unexpected composite type for MemoryNotificationInfo"); 128 } 129 } 130 131 private static final long serialVersionUID = -1805123446483771291L; 132 }