示例#1
0
  private static SortedMap<String, Object> makeMap(String[] itemNames, Object[] itemValues)
      throws OpenDataException {

    if (itemNames == null || itemValues == null)
      throw new IllegalArgumentException("Null itemNames or itemValues");
    if (itemNames.length == 0 || itemValues.length == 0)
      throw new IllegalArgumentException("Empty itemNames or itemValues");
    if (itemNames.length != itemValues.length) {
      throw new IllegalArgumentException(
          "Different lengths: itemNames["
              + itemNames.length
              + "], itemValues["
              + itemValues.length
              + "]");
    }

    SortedMap<String, Object> map = new TreeMap<String, Object>();
    for (int i = 0; i < itemNames.length; i++) {
      String name = itemNames[i];
      if (name == null || name.equals(""))
        throw new IllegalArgumentException("Null or empty item name");
      if (map.containsKey(name)) throw new OpenDataException("Duplicate item name " + name);
      map.put(itemNames[i], itemValues[i]);
    }

    return map;
  }
示例#2
0
  private CompositeDataSupport(SortedMap<String, Object> items, CompositeType compositeType)
      throws OpenDataException {

    // Check compositeType is not null
    //
    if (compositeType == null) {
      throw new IllegalArgumentException("Argument compositeType cannot be null.");
    }

    // item names defined in compositeType:
    Set<String> namesFromType = compositeType.keySet();
    Set<String> namesFromItems = items.keySet();

    // This is just a comparison, but we do it this way for a better
    // exception message.
    if (!namesFromType.equals(namesFromItems)) {
      Set<String> extraFromType = new TreeSet<String>(namesFromType);
      extraFromType.removeAll(namesFromItems);
      Set<String> extraFromItems = new TreeSet<String>(namesFromItems);
      extraFromItems.removeAll(namesFromType);
      if (!extraFromType.isEmpty() || !extraFromItems.isEmpty()) {
        throw new OpenDataException(
            "Item names do not match CompositeType: "
                + "names in items but not in CompositeType: "
                + extraFromItems
                + "; names in CompositeType but not in items: "
                + extraFromType);
      }
    }

    // Check each value, if not null, is of the open type defined for the
    // corresponding item
    for (String name : namesFromType) {
      Object value = items.get(name);
      if (value != null) {
        OpenType<?> itemType = compositeType.getType(name);
        if (!itemType.isValue(value)) {
          throw new OpenDataException(
              "Argument value of wrong type for item "
                  + name
                  + ": value "
                  + value
                  + ", type "
                  + itemType);
        }
      }
    }

    // Initialize internal fields: compositeType and contents
    //
    this.compositeType = compositeType;
    this.contents = items;
  }
示例#3
0
  /**
   * Returns the value of the item whose name is <tt>key</tt>.
   *
   * @throws IllegalArgumentException if <tt>key</tt> is a null or empty String.
   * @throws InvalidKeyException if <tt>key</tt> is not an existing item name for this
   *     <tt>CompositeData</tt> instance.
   */
  public Object get(String key) {

    if ((key == null) || (key.trim().equals(""))) {
      throw new IllegalArgumentException("Argument key cannot be a null or empty String.");
    }
    if (!contents.containsKey(key.trim())) {
      throw new InvalidKeyException(
          "Argument key=\""
              + key.trim()
              + "\" is not an existing item name for this CompositeData instance.");
    }
    return contents.get(key.trim());
  }
示例#4
0
  /**
   * Returns <tt>true</tt> if and only if this <tt>CompositeData</tt> instance contains an item
   * whose name is <tt>key</tt>. If <tt>key</tt> is a null or empty String, this method simply
   * returns false.
   */
  public boolean containsKey(String key) {

    if ((key == null) || (key.trim().equals(""))) {
      return false;
    }
    return contents.containsKey(key);
  }
示例#5
0
  private static SortedMap<String, Object> makeMap(Map<String, ?> items) {
    if (items == null || items.isEmpty())
      throw new IllegalArgumentException("Null or empty items map");

    SortedMap<String, Object> map = new TreeMap<String, Object>();
    for (Object key : items.keySet()) {
      if (key == null || key.equals(""))
        throw new IllegalArgumentException("Null or empty item name");
      if (!(key instanceof String)) {
        throw new ArrayStoreException("Item name is not string: " + key);
        // This can happen because of erasure.  The particular
        // exception is a historical artifact - an implementation
        // detail that leaked into the API.
      }
      map.put((String) key, items.get(key));
    }
    return map;
  }
示例#6
0
  /**
   * Compares the specified <var>obj</var> parameter with this <code>CompositeDataSupport</code>
   * instance for equality.
   *
   * <p>Returns <tt>true</tt> if and only if all of the following statements are true:
   *
   * <ul>
   *   <li><var>obj</var> is non null,
   *   <li><var>obj</var> also implements the <code>CompositeData</code> interface,
   *   <li>their composite types are equal
   *   <li>their contents, i.e. (name, value) pairs are equal. If a value contained in the content
   *       is an array, the value comparison is done as if by calling the {@link
   *       j86.java.util.Arrays#deepEquals(Object[], Object[]) deepEquals} method for arrays of
   *       object reference types or the appropriate overloading of {@code Arrays.equals(e1,e2)} for
   *       arrays of primitive types
   * </ul>
   *
   * <p>This ensures that this <tt>equals</tt> method works properly for <var>obj</var> parameters
   * which are different implementations of the <code>CompositeData</code> interface, with the
   * restrictions mentioned in the {@link j86.java.util.Collection#equals(Object) equals} method of
   * the <tt>j86.java.util.Collection</tt> interface.
   *
   * @param obj the object to be compared for equality with this <code>CompositeDataSupport</code>
   *     instance.
   * @return <code>true</code> if the specified object is equal to this <code>CompositeDataSupport
   *     </code> instance.
   */
  @Override
  public boolean equals(Object obj) {
    if (this == obj) {
      return true;
    }

    // if obj is not a CompositeData, return false
    if (!(obj instanceof CompositeData)) {
      return false;
    }

    CompositeData other = (CompositeData) obj;

    // their compositeType should be equal
    if (!this.getCompositeType().equals(other.getCompositeType())) {
      return false;
    }

    if (contents.size() != other.values().size()) {
      return false;
    }

    for (Map.Entry<String, Object> entry : contents.entrySet()) {
      Object e1 = entry.getValue();
      Object e2 = other.get(entry.getKey());

      if (e1 == e2) continue;
      if (e1 == null) return false;

      boolean eq =
          e1.getClass().isArray()
              ? Arrays.deepEquals(new Object[] {e1}, new Object[] {e2})
              : e1.equals(e2);

      if (!eq) return false;
    }

    // All tests for equality were successful
    //
    return true;
  }
示例#7
0
 private String contentString() {
   StringBuilder sb = new StringBuilder("{");
   String sep = "";
   for (Map.Entry<String, Object> entry : contents.entrySet()) {
     sb.append(sep).append(entry.getKey()).append("=");
     String s = Arrays.deepToString(new Object[] {entry.getValue()});
     sb.append(s.substring(1, s.length() - 1));
     sep = ", ";
   }
   sb.append("}");
   return sb.toString();
 }
示例#8
0
  /**
   * Returns the hash code value for this <code>CompositeDataSupport</code> instance.
   *
   * <p>The hash code of a <code>CompositeDataSupport</code> instance is the sum of the hash codes
   * of all elements of information used in <code>equals</code> comparisons (ie: its <i>composite
   * type</i> and all the item values).
   *
   * <p>This ensures that <code> t1.equals(t2) </code> implies that <code>
   *  t1.hashCode()==t2.hashCode() </code> for any two <code>CompositeDataSupport</code> instances
   * <code>t1</code> and <code>t2</code>, as required by the general contract of the method {@link
   * Object#hashCode() Object.hashCode()}.
   *
   * <p>Each item value's hash code is added to the returned hash code. If an item value is an
   * array, its hash code is obtained as if by calling the {@link
   * j86.java.util.Arrays#deepHashCode(Object[]) deepHashCode} method for arrays of object reference
   * types or the appropriate overloading of {@code Arrays.hashCode(e)} for arrays of primitive
   * types.
   *
   * @return the hash code value for this <code>CompositeDataSupport</code> instance
   */
  @Override
  public int hashCode() {
    int hashcode = compositeType.hashCode();

    for (Object o : contents.values()) {
      if (o instanceof Object[]) hashcode += Arrays.deepHashCode((Object[]) o);
      else if (o instanceof byte[]) hashcode += Arrays.hashCode((byte[]) o);
      else if (o instanceof short[]) hashcode += Arrays.hashCode((short[]) o);
      else if (o instanceof int[]) hashcode += Arrays.hashCode((int[]) o);
      else if (o instanceof long[]) hashcode += Arrays.hashCode((long[]) o);
      else if (o instanceof char[]) hashcode += Arrays.hashCode((char[]) o);
      else if (o instanceof float[]) hashcode += Arrays.hashCode((float[]) o);
      else if (o instanceof double[]) hashcode += Arrays.hashCode((double[]) o);
      else if (o instanceof boolean[]) hashcode += Arrays.hashCode((boolean[]) o);
      else if (o != null) hashcode += o.hashCode();
    }

    return hashcode;
  }
示例#9
0
  /**
   * Returns an unmodifiable Collection view of the item values contained in this
   * <tt>CompositeData</tt> instance. The returned collection's iterator will return the values in
   * the ascending lexicographic order of the corresponding item names.
   */
  public Collection<?> values() {

    return Collections.unmodifiableCollection(contents.values());
  }
示例#10
0
  /**
   * Returns <tt>true</tt> if and only if this <tt>CompositeData</tt> instance contains an item
   * whose value is <tt>value</tt>.
   */
  public boolean containsValue(Object value) {

    return contents.containsValue(value);
  }