/* * Copyright (c) 2000, 2008, 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</tt> class is the <i>open data</i> class which implements the <tt>TabularData</tt> * and the <tt>Map</tt> 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</tt> instance whose open-type is <var>tabularType</var>, * and whose underlying <tt>HashMap</tt> has a default initial capacity (101) and default load factor (0.75). * <p> * This constructor simply calls <tt>this(tabularType, 101, 0.75f);</tt> * * @param tabularType the <i>tabular type</i> describing this <tt>TabularData</tt> 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</tt> instance whose open-type is <var>tabularType</var>, * and whose underlying <tt>HashMap</tt> has the specified initial capacity and load factor. * * @param tabularType the <i>tabular type</i> describing this <tt>TabularData</tt> 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</i> describing this <tt>TabularData</tt> instance. */ public TabularType getTabularType() { return tabularType; } /** * Calculates the index that would be used in this <tt>TabularData</tt> instance to refer to the specified * composite data <var>value</var> parameter if it were added to this instance. * This method checks for the type validity of the specified <var>value</var>, * but does not check if the calculated index is already used to refer to a value in this <tt>TabularData</tt> instance. * * @param value the composite data value whose index in this * <tt>TabularData</tt> 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</var> would have in this <tt>TabularData</tt> instance. * * @throws NullPointerException if <var>value</var> is <tt>null</tt>. * * @throws InvalidOpenTypeException if <var>value</var> does not conform to this <tt>TabularData</tt> 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</tt> if and only if this <tt>TabularData</tt> instance contains a <tt>CompositeData</tt> value * (ie a row) whose index is the specified <var>key</var>. If <var>key</var> cannot be cast to a one dimension array * of Object instances, this method simply returns <tt>false</tt>; otherwise it returns the the result of the call to * <tt>this.containsKey((Object[]) key)</tt>. * * @param key the index value whose presence in this <tt>TabularData</tt> instance is to be tested. * * @return <tt>true</tt> if this <tt>TabularData</tt> 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</tt> if and only if this <tt>TabularData</tt> instance contains a <tt>CompositeData</tt> value * (ie a row) whose index is the specified <var>key</var>. If <var>key</var> is <tt>null</tt> or does not conform to * this <tt>TabularData</tt> instance's <tt>TabularType</tt> definition, this method simply returns <tt>false</tt>. * * @param key the index value whose presence in this <tt>TabularData</tt> instance is to be tested. * * @return <tt>true</tt> if this <tt>TabularData</tt> 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</tt> if and only if this <tt>TabularData</tt> instance contains the specified * <tt>CompositeData</tt> value. If <var>value</var> is <tt>null</tt> or does not conform to * this <tt>TabularData</tt> instance's row type definition, this method simply returns <tt>false</tt>. * * @param value the row value whose presence in this <tt>TabularData</tt> instance is to be tested. * * @return <tt>true</tt> if this <tt>TabularData</tt> instance contains the specified row value. */ public boolean containsValue(CompositeData value) { return dataMap.containsValue(value); } /** * Returns <tt>true</tt> if and only if this <tt>TabularData</tt> instance contains the specified * value. * * @param value the row value whose presence in this <tt>TabularData</tt> instance is to be tested. * * @return <tt>true</tt> if this <tt>TabularData</tt> instance contains the specified row value. */ public boolean containsValue(Object value) { return dataMap.containsValue(value); } /** * This method simply calls <tt>get((Object[]) key)</tt>. * * @throws NullPointerException if the <var>key</var> is <tt>null</tt> * @throws ClassCastException if the <var>key</var> is not of the type <tt>Object[]</tt> * @throws InvalidKeyException if the <var>key</var> does not conform to this <tt>TabularData</tt> instance's * <tt>TabularType</tt> definition */ public Object get(Object key) { return get((Object[]) key); } /** * Returns the <tt>CompositeData</tt> value whose index is * <var>key</var>, or <tt>null</tt> if there is no value mapping * to <var>key</var>, in this <tt>TabularData</tt> instance. * * @param key the index of the value to get in this * <tt>TabularData</tt> instance; * must be valid with this * <tt>TabularData</tt> instance's row type definition; * must not * be null. * * @return the value corresponding to <var>key</var>. * * @throws NullPointerException if the <var>key</var> is <tt>null</tt> * @throws InvalidKeyException if the <var>key</var> does not conform to this <tt>TabularData</tt> instance's * <tt>TabularType</tt> 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)</tt> and * therefore ignores its <var>key</var> parameter which can be <tt>null</tt>. * * @param key an ignored parameter. * @param value the {@link CompositeData} to put. * * @return the value which is put * * @throws NullPointerException if the <var>value</var> is <tt>null</tt> * @throws ClassCastException if the <var>value</var> is not of * the type <tt>CompositeData</tt> * @throws InvalidOpenTypeException if the <var>value</var> does * not conform to this <tt>TabularData</tt> instance's * <tt>TabularType</tt> definition * @throws KeyAlreadyExistsException if the key for the * <var>value</var> parameter, calculated according to this * <tt>TabularData</tt> instance's <tt>TabularType</tt> 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)</tt>. * * @param key an <tt>Object[]</tt> representing the key to remove. * * @return previous value associated with specified key, or <tt>null</tt> * if there was no mapping for key. * * @throws NullPointerException if the <var>key</var> is <tt>null</tt> * @throws ClassCastException if the <var>key</var> is not of the type <tt>Object[]</tt> * @throws InvalidKeyException if the <var>key</var> does not conform to this <tt>TabularData</tt> instance's * <tt>TabularType</tt> definition */ public Object remove(Object key) { return remove((Object[]) key); } /** * Removes the <tt>CompositeData</tt> value whose index is <var>key</var> from this <tt>TabularData</tt> instance, * and returns the removed value, or returns <tt>null</tt> if there is no value whose index is <var>key</var>. * * @param key the index of the value to get in this <tt>TabularData</tt> instance; * must be valid with this <tt>TabularData</tt> instance's row type definition; * must not be null. * * @return previous value associated with specified key, or <tt>null</tt> * if there was no mapping for key. * * @throws NullPointerException if the <var>key</var> is <tt>null</tt> * @throws InvalidKeyException if the <var>key</var> does not conform to this <tt>TabularData</tt> instance's * <tt>TabularType</tt> 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</var> * to this <tt>TabularData</tt> instance. This method converts * the collection of values contained in this map into an array of * <tt>CompositeData</tt> values, if possible, and then call the * method <tt>putAll(CompositeData[])</tt>. Note that the keys * used in the specified map <var>t</var> are ignored. This method * allows, for example to add the content of another * <tt>TabularData</tt> 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</tt> instance; if <var>t</var> is * <tt>null</tt> or empty, this method returns without doing * anything. * * @throws NullPointerException if a value in <var>t</var> is * <tt>null</tt>. * @throws ClassCastException if a value in <var>t</var> is not an * instance of <tt>CompositeData</tt>. * @throws InvalidOpenTypeException if a value in <var>t</var> * does not conform to this <tt>TabularData</tt> instance's row * type definition. * @throws KeyAlreadyExistsException if the index for a value in * <var>t</var>, calculated according to this * <tt>TabularData</tt> instance's <tt>TabularType</tt> definition * already maps to an existing value in this instance, or two * values in <var>t</var> 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</tt> // 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</tt>"); } // Add the array of values // putAll(values); } /** * Add all the elements in <var>values</var> to this * <tt>TabularData</tt> instance. If any element in * <var>values</var> does not satisfy the constraints defined in * {@link #put(CompositeData) <tt>put</tt>}, or if any two * elements in <var>values</var> have the same index calculated * according to this <tt>TabularData</tt> instance's * <tt>TabularType</tt> definition, then an exception describing * the failure is thrown and no element of <var>values</var> is * added, thus leaving this <tt>TabularData</tt> instance * unchanged. * * @param values the array of composite data values to be added as * new rows to this <tt>TabularData</tt> instance; if * <var>values</var> is <tt>null</tt> or empty, this method * returns without doing anything. * * @throws NullPointerException if an element of <var>values</var> * is <tt>null</tt> * @throws InvalidOpenTypeException if an element of * <var>values</var> does not conform to this * <tt>TabularData</tt> instance's row type definition (ie its * <tt>TabularType</tt> definition) * @throws KeyAlreadyExistsException if the index for an element * of <var>values</var>, calculated according to this * <tt>TabularData</tt> instance's <tt>TabularType</tt> definition * already maps to an existing value in this instance, or two * elements of <var>values</var> have the same index */ public void putAll(CompositeData[] values) { // if values is null or empty, just return // if ( (values == null) || (values.length == 0) ) {Lines 1–500 of 916. Load more
/* * Copyright (c) 2000, 2008, 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</tt> class is the <i>open data</i> class which implements the <tt>TabularData</tt> * and the <tt>Map</tt> 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</tt> instance whose open-type is <var>tabularType</var>, * and whose underlying <tt>HashMap</tt> has a default initial capacity (101) and default load factor (0.75). * <p> * This constructor simply calls <tt>this(tabularType, 101, 0.75f);</tt> * * @param tabularType the <i>tabular type</i> describing this <tt>TabularData</tt> 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</tt> instance whose open-type is <var>tabularType</var>, * and whose underlying <tt>HashMap</tt> has the specified initial capacity and load factor. * * @param tabularType the <i>tabular type</i> describing this <tt>TabularData</tt> 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</i> describing this <tt>TabularData</tt> instance. */ public TabularType getTabularType() { return tabularType; } /** * Calculates the index that would be used in this <tt>TabularData</tt> instance to refer to the specified * composite data <var>value</var> parameter if it were added to this instance. * This method checks for the type validity of the specified <var>value</var>, * but does not check if the calculated index is already used to refer to a value in this <tt>TabularData</tt> instance. * * @param value the composite data value whose index in this * <tt>TabularData</tt> 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</var> would have in this <tt>TabularData</tt> instance. * * @throws NullPointerException if <var>value</var> is <tt>null</tt>. * * @throws InvalidOpenTypeException if <var>value</var> does not conform to this <tt>TabularData</tt> 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</tt> if and only if this <tt>TabularData</tt> instance contains a <tt>CompositeData</tt> value * (ie a row) whose index is the specified <var>key</var>. If <var>key</var> cannot be cast to a one dimension array * of Object instances, this method simply returns <tt>false</tt>; otherwise it returns the the result of the call to * <tt>this.containsKey((Object[]) key)</tt>. * * @param key the index value whose presence in this <tt>TabularData</tt> instance is to be tested. * * @return <tt>true</tt> if this <tt>TabularData</tt> 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</tt> if and only if this <tt>TabularData</tt> instance contains a <tt>CompositeData</tt> value * (ie a row) whose index is the specified <var>key</var>. If <var>key</var> is <tt>null</tt> or does not conform to * this <tt>TabularData</tt> instance's <tt>TabularType</tt> definition, this method simply returns <tt>false</tt>. * * @param key the index value whose presence in this <tt>TabularData</tt> instance is to be tested. * * @return <tt>true</tt> if this <tt>TabularData</tt> 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</tt> if and only if this <tt>TabularData</tt> instance contains the specified * <tt>CompositeData</tt> value. If <var>value</var> is <tt>null</tt> or does not conform to * this <tt>TabularData</tt> instance's row type definition, this method simply returns <tt>false</tt>. * * @param value the row value whose presence in this <tt>TabularData</tt> instance is to be tested. * * @return <tt>true</tt> if this <tt>TabularData</tt> instance contains the specified row value. */ public boolean containsValue(CompositeData value) { return dataMap.containsValue(value); } /** * Returns <tt>true</tt> if and only if this <tt>TabularData</tt> instance contains the specified * value. * * @param value the row value whose presence in this <tt>TabularData</tt> instance is to be tested. * * @return <tt>true</tt> if this <tt>TabularData</tt> instance contains the specified row value. */ public boolean containsValue(Object value) { return dataMap.containsValue(value); } /** * This method simply calls <tt>get((Object[]) key)</tt>. * * @throws NullPointerException if the <var>key</var> is <tt>null</tt> * @throws ClassCastException if the <var>key</var> is not of the type <tt>Object[]</tt> * @throws InvalidKeyException if the <var>key</var> does not conform to this <tt>TabularData</tt> instance's * <tt>TabularType</tt> definition */ public Object get(Object key) { return get((Object[]) key); } /** * Returns the <tt>CompositeData</tt> value whose index is * <var>key</var>, or <tt>null</tt> if there is no value mapping * to <var>key</var>, in this <tt>TabularData</tt> instance. * * @param key the index of the value to get in this * <tt>TabularData</tt> instance; * must be valid with this * <tt>TabularData</tt> instance's row type definition; * must not * be null. * * @return the value corresponding to <var>key</var>. * * @throws NullPointerException if the <var>key</var> is <tt>null</tt> * @throws InvalidKeyException if the <var>key</var> does not conform to this <tt>TabularData</tt> instance's * <tt>TabularType</tt> 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)</tt> and * therefore ignores its <var>key</var> parameter which can be <tt>null</tt>. * * @param key an ignored parameter. * @param value the {@link CompositeData} to put. * * @return the value which is put * * @throws NullPointerException if the <var>value</var> is <tt>null</tt> * @throws ClassCastException if the <var>value</var> is not of * the type <tt>CompositeData</tt> * @throws InvalidOpenTypeException if the <var>value</var> does * not conform to this <tt>TabularData</tt> instance's * <tt>TabularType</tt> definition * @throws KeyAlreadyExistsException if the key for the * <var>value</var> parameter, calculated according to this * <tt>TabularData</tt> instance's <tt>TabularType</tt> 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)</tt>. * * @param key an <tt>Object[]</tt> representing the key to remove. * * @return previous value associated with specified key, or <tt>null</tt> * if there was no mapping for key. * * @throws NullPointerException if the <var>key</var> is <tt>null</tt> * @throws ClassCastException if the <var>key</var> is not of the type <tt>Object[]</tt> * @throws InvalidKeyException if the <var>key</var> does not conform to this <tt>TabularData</tt> instance's * <tt>TabularType</tt> definition */ public Object remove(Object key) { return remove((Object[]) key); } /** * Removes the <tt>CompositeData</tt> value whose index is <var>key</var> from this <tt>TabularData</tt> instance, * and returns the removed value, or returns <tt>null</tt> if there is no value whose index is <var>key</var>. * * @param key the index of the value to get in this <tt>TabularData</tt> instance; * must be valid with this <tt>TabularData</tt> instance's row type definition; * must not be null. * * @return previous value associated with specified key, or <tt>null</tt> * if there was no mapping for key. * * @throws NullPointerException if the <var>key</var> is <tt>null</tt> * @throws InvalidKeyException if the <var>key</var> does not conform to this <tt>TabularData</tt> instance's * <tt>TabularType</tt> 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</var> * to this <tt>TabularData</tt> instance. This method converts * the collection of values contained in this map into an array of * <tt>CompositeData</tt> values, if possible, and then call the * method <tt>putAll(CompositeData[])</tt>. Note that the keys * used in the specified map <var>t</var> are ignored. This method * allows, for example to add the content of another * <tt>TabularData</tt> 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</tt> instance; if <var>t</var> is * <tt>null</tt> or empty, this method returns without doing * anything. * * @throws NullPointerException if a value in <var>t</var> is * <tt>null</tt>. * @throws ClassCastException if a value in <var>t</var> is not an * instance of <tt>CompositeData</tt>. * @throws InvalidOpenTypeException if a value in <var>t</var> * does not conform to this <tt>TabularData</tt> instance's row * type definition. * @throws KeyAlreadyExistsException if the index for a value in * <var>t</var>, calculated according to this * <tt>TabularData</tt> instance's <tt>TabularType</tt> definition * already maps to an existing value in this instance, or two * values in <var>t</var> 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</tt> // 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</tt>"); } // Add the array of values // putAll(values); } /** * Add all the elements in <var>values</var> to this * <tt>TabularData</tt> instance. If any element in * <var>values</var> does not satisfy the constraints defined in * {@link #put(CompositeData) <tt>put</tt>}, or if any two * elements in <var>values</var> have the same index calculated * according to this <tt>TabularData</tt> instance's * <tt>TabularType</tt> definition, then an exception describing * the failure is thrown and no element of <var>values</var> is * added, thus leaving this <tt>TabularData</tt> instance * unchanged. * * @param values the array of composite data values to be added as * new rows to this <tt>TabularData</tt> instance; if * <var>values</var> is <tt>null</tt> or empty, this method * returns without doing anything. * * @throws NullPointerException if an element of <var>values</var> * is <tt>null</tt> * @throws InvalidOpenTypeException if an element of * <var>values</var> does not conform to this * <tt>TabularData</tt> instance's row type definition (ie its * <tt>TabularType</tt> definition) * @throws KeyAlreadyExistsException if the index for an element * of <var>values</var>, calculated according to this * <tt>TabularData</tt> instance's <tt>TabularType</tt> definition * already maps to an existing value in this instance, or two * elements of <var>values</var> have the same index */ public void putAll(CompositeData[] values) { // if values is null or empty, just return // if ( (values == null) || (values.length == 0) ) {