|
Java example source code file (TabularDataSupport.java)
The TabularDataSupport.java Java example source code/* * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package javax.management.openmbean; // java import // import com.sun.jmx.mbeanserver.GetPropertyAction; import com.sun.jmx.mbeanserver.Util; import java.io.IOException; import java.io.ObjectInputStream; import java.io.Serializable; import java.security.AccessController; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; // jmx import // /** * The <tt>TabularDataSupport class is the open data class which implements the TabularData * and the <tt>Map interfaces, and which is internally based on a hash map data structure. * * @since 1.5 */ /* It would make much more sense to implement Map<List>,CompositeData> here, but unfortunately we cannot for compatibility reasons. If we did that, then we would have to define e.g. CompositeData remove(Object) instead of Object remove(Object). That would mean that if any existing code subclassed TabularDataSupport and overrode Object remove(Object), it would (a) no longer compile and (b) not actually override CompositeData remove(Object) in binaries compiled before the change. */ public class TabularDataSupport implements TabularData, Map<Object,Object>, Cloneable, Serializable { /* Serial version */ static final long serialVersionUID = 5720150593236309827L; /** * @serial This tabular data instance's contents: a {@link HashMap} */ // field cannot be final because of clone method private Map<Object,CompositeData> dataMap; /** * @serial This tabular data instance's tabular type */ private final TabularType tabularType; /** * The array of item names that define the index used for rows (convenience field) */ private transient String[] indexNamesArray; /* *** Constructors *** */ /** * Creates an empty <tt>TabularDataSupport instance whose open-type is tabularType, * and whose underlying <tt>HashMap has a default initial capacity (101) and default load factor (0.75). * <p> * This constructor simply calls <tt>this(tabularType, 101, 0.75f); * * @param tabularType the <i>tabular type describing this TabularData instance; * cannot be null. * * @throws IllegalArgumentException if the tabular type is null. */ public TabularDataSupport(TabularType tabularType) { this(tabularType, 16, 0.75f); } /** * Creates an empty <tt>TabularDataSupport instance whose open-type is tabularType, * and whose underlying <tt>HashMap has the specified initial capacity and load factor. * * @param tabularType the <i>tabular type describing this TabularData instance; * cannot be null. * * @param initialCapacity the initial capacity of the HashMap. * * @param loadFactor the load factor of the HashMap * * @throws IllegalArgumentException if the initial capacity is less than zero, * or the load factor is nonpositive, * or the tabular type is null. */ public TabularDataSupport(TabularType tabularType, int initialCapacity, float loadFactor) { // Check tabularType is not null // if (tabularType == null) { throw new IllegalArgumentException("Argument tabularType cannot be null."); } // Initialize this.tabularType (and indexNamesArray for convenience) // this.tabularType = tabularType; List<String> tmpNames = tabularType.getIndexNames(); this.indexNamesArray = tmpNames.toArray(new String[tmpNames.size()]); // Since LinkedHashMap was introduced in SE 1.4, it's conceivable even // if very unlikely that we might be the server of a 1.3 client. In // that case you'll need to set this property. See CR 6334663. String useHashMapProp = AccessController.doPrivileged( new GetPropertyAction("jmx.tabular.data.hash.map")); boolean useHashMap = "true".equalsIgnoreCase(useHashMapProp); // Construct the empty contents HashMap // this.dataMap = useHashMap ? new HashMap<Object,CompositeData>(initialCapacity, loadFactor) : new LinkedHashMap<Object, CompositeData>(initialCapacity, loadFactor); } /* *** TabularData specific information methods *** */ /** * Returns the <i>tabular type describing this TabularData instance. */ public TabularType getTabularType() { return tabularType; } /** * Calculates the index that would be used in this <tt>TabularData instance to refer to the specified * composite data <var>value parameter if it were added to this instance. * This method checks for the type validity of the specified <var>value, * but does not check if the calculated index is already used to refer to a value in this <tt>TabularData instance. * * @param value the composite data value whose index in this * <tt>TabularData instance is to be calculated; * must be of the same composite type as this instance's row type; * must not be null. * * @return the index that the specified <var>value would have in this TabularData instance. * * @throws NullPointerException if <var>value is null. * * @throws InvalidOpenTypeException if <var>value does not conform to this TabularData instance's * row type definition. */ public Object[] calculateIndex(CompositeData value) { // Check value is valid // checkValueType(value); // Return its calculated index // return internalCalculateIndex(value).toArray(); } /* *** Content information query methods *** */ /** * Returns <tt>true if and only if this TabularData instance contains a CompositeData value * (ie a row) whose index is the specified <var>key. If key cannot be cast to a one dimension array * of Object instances, this method simply returns <tt>false; otherwise it returns the the result of the call to * <tt>this.containsKey((Object[]) key). * * @param key the index value whose presence in this <tt>TabularData instance is to be tested. * * @return <tt>true if this TabularData indexes a row value with the specified key. */ public boolean containsKey(Object key) { // if key is not an array of Object instances, return false // Object[] k; try { k = (Object[]) key; } catch (ClassCastException e) { return false; } return this.containsKey(k); } /** * Returns <tt>true if and only if this TabularData instance contains a CompositeData value * (ie a row) whose index is the specified <var>key. If key is null or does not conform to * this <tt>TabularData instance's TabularType definition, this method simply returns false. * * @param key the index value whose presence in this <tt>TabularData instance is to be tested. * * @return <tt>true if this TabularData indexes a row value with the specified key. */ public boolean containsKey(Object[] key) { return ( key == null ? false : dataMap.containsKey(Arrays.asList(key))); } /** * Returns <tt>true if and only if this TabularData instance contains the specified * <tt>CompositeData value. If value is null or does not conform to * this <tt>TabularData instance's row type definition, this method simply returns false. * * @param value the row value whose presence in this <tt>TabularData instance is to be tested. * * @return <tt>true if this TabularData instance contains the specified row value. */ public boolean containsValue(CompositeData value) { return dataMap.containsValue(value); } /** * Returns <tt>true if and only if this TabularData instance contains the specified * value. * * @param value the row value whose presence in this <tt>TabularData instance is to be tested. * * @return <tt>true if this TabularData instance contains the specified row value. */ public boolean containsValue(Object value) { return dataMap.containsValue(value); } /** * This method simply calls <tt>get((Object[]) key). * * @throws NullPointerException if the <var>key is null * @throws ClassCastException if the <var>key is not of the type Object[] * @throws InvalidKeyException if the <var>key does not conform to this TabularData instance's * <tt>TabularType definition */ public Object get(Object key) { return get((Object[]) key); } /** * Returns the <tt>CompositeData value whose index is * <var>key, or null if there is no value mapping * to <var>key, in this TabularData instance. * * @param key the index of the value to get in this * <tt>TabularData instance; * must be valid with this * <tt>TabularData instance's row type definition; * must not * be null. * * @return the value corresponding to <var>key. * * @throws NullPointerException if the <var>key is null * @throws InvalidKeyException if the <var>key does not conform to this TabularData instance's * <tt>TabularType type definition. */ public CompositeData get(Object[] key) { // Check key is not null and valid with tabularType // (throws NullPointerException, InvalidKeyException) // checkKeyType(key); // Return the mapping stored in the parent HashMap // return dataMap.get(Arrays.asList(key)); } /* *** Content modification operations (one element at a time) *** */ /** * This method simply calls <tt>put((CompositeData) value) and * therefore ignores its <var>key parameter which can be null. * * @param key an ignored parameter. * @param value the {@link CompositeData} to put. * * @return the value which is put * * @throws NullPointerException if the <var>value is null * @throws ClassCastException if the <var>value is not of * the type <tt>CompositeData * @throws InvalidOpenTypeException if the <var>value does * not conform to this <tt>TabularData instance's * <tt>TabularType definition * @throws KeyAlreadyExistsException if the key for the * <var>value parameter, calculated according to this * <tt>TabularData instance's TabularType definition * already maps to an existing value */ public Object put(Object key, Object value) { internalPut((CompositeData) value); return value; // should be return internalPut(...); (5090566) } public void put(CompositeData value) { internalPut(value); } private CompositeData internalPut(CompositeData value) { // Check value is not null, value's type is the same as this instance's row type, // and calculate the value's index according to this instance's tabularType and // check it is not already used for a mapping in the parent HashMap // List<?> index = checkValueAndIndex(value); // store the (key, value) mapping in the dataMap HashMap // return dataMap.put(index, value); } /** * This method simply calls <tt>remove((Object[]) key). * * @param key an <tt>Object[] representing the key to remove. * * @return previous value associated with specified key, or <tt>null * if there was no mapping for key. * * @throws NullPointerException if the <var>key is null * @throws ClassCastException if the <var>key is not of the type Object[] * @throws InvalidKeyException if the <var>key does not conform to this TabularData instance's * <tt>TabularType definition */ public Object remove(Object key) { return remove((Object[]) key); } /** * Removes the <tt>CompositeData value whose index is key from this TabularData instance, * and returns the removed value, or returns <tt>null if there is no value whose index is key. * * @param key the index of the value to get in this <tt>TabularData instance; * must be valid with this <tt>TabularData instance's row type definition; * must not be null. * * @return previous value associated with specified key, or <tt>null * if there was no mapping for key. * * @throws NullPointerException if the <var>key is null * @throws InvalidKeyException if the <var>key does not conform to this TabularData instance's * <tt>TabularType definition */ public CompositeData remove(Object[] key) { // Check key is not null and valid with tabularType // (throws NullPointerException, InvalidKeyException) // checkKeyType(key); // Removes the (key, value) mapping in the parent HashMap // return dataMap.remove(Arrays.asList(key)); } /* *** Content modification bulk operations *** */ /** * Add all the values contained in the specified map <var>t * to this <tt>TabularData instance. This method converts * the collection of values contained in this map into an array of * <tt>CompositeData values, if possible, and then call the * method <tt>putAll(CompositeData[]). Note that the keys * used in the specified map <var>t are ignored. This method * allows, for example to add the content of another * <tt>TabularData instance with the same row type (but * possibly different index names) into this instance. * * @param t the map whose values are to be added as new rows to * this <tt>TabularData instance; if t is * <tt>null or empty, this method returns without doing * anything. * * @throws NullPointerException if a value in <var>t is * <tt>null. * @throws ClassCastException if a value in <var>t is not an * instance of <tt>CompositeData. * @throws InvalidOpenTypeException if a value in <var>t * does not conform to this <tt>TabularData instance's row * type definition. * @throws KeyAlreadyExistsException if the index for a value in * <var>t, calculated according to this * <tt>TabularData instance's TabularType definition * already maps to an existing value in this instance, or two * values in <var>t have the same index. */ public void putAll(Map<?,?> t) { // if t is null or empty, just return // if ( (t == null) || (t.size() == 0) ) { return; } // Convert the values in t into an array of <tt>CompositeData // CompositeData[] values; try { values = t.values().toArray(new CompositeData[t.size()]); } catch (java.lang.ArrayStoreException e) { throw new ClassCastException("Map argument t contains values which are not instances of <tt>CompositeData"); } // Add the array of values // putAll(values); } /** * Add all the elements in <var>values to this * <tt>TabularData instance. If any element in * <var>values does not satisfy the constraints defined in * {@link #put(CompositeData) <tt>put}, or if any two * elements in <var>values have the same index calculated * according to this <tt>TabularData instance's * <tt>TabularType definition, then an exception describing * the failure is thrown and no element of <var>values is * added, thus leaving this <tt>TabularData instance * unchanged. * * @param values the array of composite data values to be added as * new rows to this <tt>TabularData instance; if * <var>values is null or empty, this method * returns without doing anything. * * @throws NullPointerException if an element of <var>values * is <tt>null * @throws InvalidOpenTypeException if an element of * <var>values does not conform to this * <tt>TabularData instance's row type definition (ie its * <tt>TabularType definition) * @throws KeyAlreadyExistsException if the index for an element * of <var>values, calculated according to this * <tt>TabularData instance's TabularType definition * already maps to an existing value in this instance, or two * elements of <var>values have the same index */ public void putAll(CompositeData[] values) { // if values is null or empty, just return // if ( (values == null) || (values.length == 0) ) { return; } // create the list of indexes corresponding to each value List<List>> indexes = new ArrayList<List>>(values.length + 1); // Check all elements in values and build index list // List<?> index; for (int i=0; i<values.length; i++) { // check value and calculate index index = checkValueAndIndex(values[i]); // check index is different of those previously calculated if (indexes.contains(index)) { throw new KeyAlreadyExistsException("Argument elements values["+ i +"] and values["+ indexes.indexOf(index) + "] have the same indexes, "+ "calculated according to this TabularData instance's tabularType."); } // add to index list indexes.add(index); } // store all (index, value) mappings in the dataMap HashMap // for (int i=0; i<values.length; i++) { dataMap.put(indexes.get(i), values[i]); } } /** * Removes all rows from this <code>TabularDataSupport instance. */ public void clear() { dataMap.clear(); } /* *** Informational methods from java.util.Map *** */ /** * Returns the number of rows in this <code>TabularDataSupport instance. * * @return the number of rows in this <code>TabularDataSupport instance. */ public int size() { return dataMap.size(); } /** * Returns <tt>true if this Other Java examples (source code examples)Here is a short list of links related to this Java TabularDataSupport.java source code file: |
... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.