0N/A/*
2362N/A * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
0N/A * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
0N/A *
0N/A * This code is free software; you can redistribute it and/or modify it
0N/A * under the terms of the GNU General Public License version 2 only, as
2362N/A * published by the Free Software Foundation. Oracle designates this
0N/A * particular file as subject to the "Classpath" exception as provided
2362N/A * by Oracle in the LICENSE file that accompanied this code.
0N/A *
0N/A * This code is distributed in the hope that it will be useful, but WITHOUT
0N/A * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
0N/A * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
0N/A * version 2 for more details (a copy is included in the LICENSE file that
0N/A * accompanied this code).
0N/A *
0N/A * You should have received a copy of the GNU General Public License version
0N/A * 2 along with this work; if not, write to the Free Software Foundation,
0N/A * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
0N/A *
2362N/A * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2362N/A * or visit www.oracle.com if you need additional information or have any
2362N/A * questions.
0N/A */
0N/A
0N/Apackage sun.management;
0N/A
0N/Aimport java.io.Serializable;
0N/Aimport java.util.*;
0N/Aimport javax.management.openmbean.CompositeData;
0N/Aimport javax.management.openmbean.CompositeType;
0N/Aimport javax.management.openmbean.OpenType;
0N/Aimport javax.management.openmbean.TabularType;
0N/A
0N/A/**
0N/A * This abstract class provides the implementation of the CompositeData
0N/A * interface. A CompositeData object will be lazily created only when
0N/A * the CompositeData interface is used.
0N/A *
0N/A * Classes that extends this abstract class will implement the
0N/A * getCompositeData() method. The object returned by the
0N/A * getCompositeData() is an instance of CompositeData such that
0N/A * the instance serializes itself as the type CompositeDataSupport.
0N/A */
0N/Apublic abstract class LazyCompositeData
0N/A implements CompositeData, Serializable {
0N/A
0N/A private CompositeData compositeData;
0N/A
0N/A // Implementation of the CompositeData interface
0N/A public boolean containsKey(String key) {
0N/A return compositeData().containsKey(key);
0N/A }
0N/A
0N/A public boolean containsValue(Object value) {
0N/A return compositeData().containsValue(value);
0N/A }
0N/A
0N/A public boolean equals(Object obj) {
0N/A return compositeData().equals(obj);
0N/A }
0N/A
0N/A public Object get(String key) {
0N/A return compositeData().get(key);
0N/A }
0N/A
0N/A public Object[] getAll(String[] keys) {
0N/A return compositeData().getAll(keys);
0N/A }
0N/A
0N/A public CompositeType getCompositeType() {
0N/A return compositeData().getCompositeType();
0N/A }
0N/A
0N/A public int hashCode() {
0N/A return compositeData().hashCode();
0N/A }
0N/A
0N/A public String toString() {
0N/A /** FIXME: What should this be?? */
0N/A return compositeData().toString();
0N/A }
0N/A
0N/A public Collection values() {
0N/A return compositeData().values();
0N/A }
0N/A
0N/A /* Lazy creation of a CompositeData object
0N/A * only when the CompositeData interface is used.
0N/A */
0N/A private synchronized CompositeData compositeData() {
0N/A if (compositeData != null)
0N/A return compositeData;
0N/A compositeData = getCompositeData();
0N/A return compositeData;
0N/A }
0N/A
0N/A /**
0N/A * Designate to a CompositeData object when writing to an
0N/A * output stream during serialization so that the receiver
0N/A * only requires JMX 1.2 classes but not any implementation
0N/A * specific class.
0N/A */
0N/A protected Object writeReplace() throws java.io.ObjectStreamException {
0N/A return compositeData();
0N/A }
0N/A
0N/A /**
0N/A * Returns the CompositeData representing this object.
0N/A * The returned CompositeData object must be an instance
0N/A * of javax.management.openmbean.CompositeDataSupport class
0N/A * so that no implementation specific class is required
0N/A * for unmarshalling besides JMX 1.2 classes.
0N/A */
0N/A protected abstract CompositeData getCompositeData();
0N/A
0N/A // Helper methods
0N/A static String getString(CompositeData cd, String itemName) {
0N/A if (cd == null)
0N/A throw new IllegalArgumentException("Null CompositeData");
0N/A
0N/A return (String) cd.get(itemName);
0N/A }
0N/A
0N/A static boolean getBoolean(CompositeData cd, String itemName) {
0N/A if (cd == null)
0N/A throw new IllegalArgumentException("Null CompositeData");
0N/A
0N/A return ((Boolean) cd.get(itemName)).booleanValue();
0N/A }
0N/A
0N/A static long getLong(CompositeData cd, String itemName) {
0N/A if (cd == null)
0N/A throw new IllegalArgumentException("Null CompositeData");
0N/A
0N/A return ((Long) cd.get(itemName)).longValue();
0N/A }
0N/A
0N/A static int getInt(CompositeData cd, String itemName) {
0N/A if (cd == null)
0N/A throw new IllegalArgumentException("Null CompositeData");
0N/A
0N/A return ((Integer) cd.get(itemName)).intValue();
0N/A }
0N/A
0N/A /**
0N/A * Compares two CompositeTypes and returns true if
0N/A * all items in type1 exist in type2 and their item types
0N/A * are the same.
0N/A */
0N/A protected static boolean isTypeMatched(CompositeType type1, CompositeType type2) {
0N/A if (type1 == type2) return true;
0N/A
0N/A // We can't use CompositeType.isValue() since it returns false
0N/A // if the type name doesn't match.
0N/A Set allItems = type1.keySet();
0N/A
0N/A // Check all items in the type1 exist in type2
0N/A if (!type2.keySet().containsAll(allItems))
0N/A return false;
0N/A
0N/A for (Iterator iter = allItems.iterator(); iter.hasNext(); ) {
0N/A String item = (String) iter.next();
0N/A OpenType ot1 = type1.getType(item);
0N/A OpenType ot2 = type2.getType(item);
0N/A if (ot1 instanceof CompositeType) {
0N/A if (! (ot2 instanceof CompositeType))
0N/A return false;
0N/A if (!isTypeMatched((CompositeType) ot1, (CompositeType) ot2))
0N/A return false;
0N/A } else if (ot1 instanceof TabularType) {
0N/A if (! (ot2 instanceof TabularType))
0N/A return false;
0N/A if (!isTypeMatched((TabularType) ot1, (TabularType) ot2))
0N/A return false;
0N/A } else if (!ot1.equals(ot2)) {
0N/A return false;
0N/A }
0N/A }
0N/A return true;
0N/A }
0N/A
0N/A protected static boolean isTypeMatched(TabularType type1, TabularType type2) {
0N/A if (type1 == type2) return true;
0N/A
0N/A List list1 = type1.getIndexNames();
0N/A List list2 = type2.getIndexNames();
0N/A
0N/A // check if the list of index names are the same
0N/A if (!list1.equals(list2))
0N/A return false;
0N/A
0N/A return isTypeMatched(type1.getRowType(), type2.getRowType());
0N/A }
1807N/A
1807N/A private static final long serialVersionUID = -2190411934472666714L;
0N/A}