1 /* 2 * Copyright (c) 2012, 2018, 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.LockInfo; 29 import java.util.Map; 30 import javax.management.openmbean.CompositeType; 31 import javax.management.openmbean.CompositeData; 32 import javax.management.openmbean.CompositeDataSupport; 33 import javax.management.openmbean.OpenDataException; 34 35 /** 36 * A CompositeData for LockInfo 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 LockInfoCompositeData extends LazyCompositeData { 41 private final LockInfo lock; 42 43 private LockInfoCompositeData(LockInfo li) { 44 this.lock = li; 45 } 46 47 public LockInfo getLockInfo() { 48 return lock; 49 } 50 51 public static CompositeData toCompositeData(LockInfo li) { 52 if (li == null) { 53 return null; 54 } 55 56 LockInfoCompositeData licd = new LockInfoCompositeData(li); 57 return licd.getCompositeData(); 58 } 59 60 protected CompositeData getCompositeData() { 61 Map<String,Object> items = Map.of( 62 CLASS_NAME, lock.getClassName(), 63 IDENTITY_HASH_CODE, lock.getIdentityHashCode() 64 ); 65 66 try { 67 return new CompositeDataSupport(LOCK_INFO_COMPOSITE_TYPE, items); 68 } catch (OpenDataException e) { 69 // Should never reach here 70 throw Util.newException(e); 71 } 72 } 73 74 private static final CompositeType LOCK_INFO_COMPOSITE_TYPE; 75 static { 76 try { 77 LOCK_INFO_COMPOSITE_TYPE = (CompositeType) 78 MappedMXBeanType.toOpenType(LockInfo.class); 79 } catch (OpenDataException e) { 80 // Should never reach here 81 throw Util.newException(e); 82 } 83 } 84 85 static CompositeType compositeType() { 86 return LOCK_INFO_COMPOSITE_TYPE; 87 } 88 89 private static final String CLASS_NAME = "className"; 90 private static final String IDENTITY_HASH_CODE = "identityHashCode"; 91 92 /* 93 * Returns a LockInfo object mapped from the given CompositeData. 94 */ 95 public static LockInfo toLockInfo(CompositeData cd) { 96 if (cd == null) { 97 throw new NullPointerException("Null CompositeData"); 98 } 99 100 if (!isTypeMatched(LOCK_INFO_COMPOSITE_TYPE, cd.getCompositeType())) { 101 throw new IllegalArgumentException( 102 "Unexpected composite type for LockInfo"); 103 } 104 105 String className = getString(cd, CLASS_NAME); 106 int identityHashCode = getInt(cd, IDENTITY_HASH_CODE); 107 return new LockInfo(className, identityHashCode); 108 } 109 110 private static final long serialVersionUID = -6374759159749014052L; 111 }