Package org.openquark.util.attributes

Source Code of org.openquark.util.attributes.AttributeSet

/*
* Copyright (c) 2007 BUSINESS OBJECTS SOFTWARE LIMITED
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
*     * Redistributions of source code must retain the above copyright notice,
*       this list of conditions and the following disclaimer.
*     * Redistributions in binary form must reproduce the above copyright
*       notice, this list of conditions and the following disclaimer in the
*       documentation and/or other materials provided with the distribution.
*     * Neither the name of Business Objects nor the names of its contributors
*       may be used to endorse or promote products derived from this software
*       without specific prior written permission.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/


/*
* AttributeSet.java
* Created: 22-Apr-2004
* By: Richard Webster
*/
package org.openquark.util.attributes;

import java.awt.Color;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.openquark.util.CaseInsensitiveMap;
import org.openquark.util.ObjectUtils;
import org.openquark.util.time.Time;
import org.openquark.util.xml.XMLSerializationManager;
import org.w3c.dom.Element;


/**
* A collection of attributes which can be accessed by name.
*/
public final class AttributeSet {

    /** This map hold the attribute values. */
    private final Map<String, Attribute> attributes;

    /**
     * AttributeSet constructor.
     */
    public AttributeSet() {
        this(true);
    }

    /**
     * AttributeSet constructor.
     */
    public AttributeSet(boolean caseInsensitive) {
        super();
        if (caseInsensitive) {
            attributes = new CaseInsensitiveMap<Attribute>();
        } else {
            attributes = new HashMap<String, Attribute>();
        }
    }

    /**
     * AttributeSet constructor.
     * @param other  another attribute set
     */
    public AttributeSet (AttributeSet other) {
        if (other.attributes instanceof CaseInsensitiveMap) {
            this.attributes = new CaseInsensitiveMap<Attribute>(other.attributes);
        } else {
            this.attributes = new HashMap<String, Attribute>(other.attributes);
        }
    }

    /**
     * AttributeSet constructor.
     * @param attributes  a collection of attributes.
     */
    public AttributeSet (List<Attribute> attributes) {
        this();
        setAttributes(attributes);
    }

    /**
     * @see java.lang.Object#toString()
     * @return a string representation to assist in debugging
     */
    public String toString () {
        StringBuilder s = new StringBuilder ();

        for (Attribute attr : attributes.values()) {
            if (s.length () > 0)
                s.append (", "); //$NON-NLS-1$

            s.append (attr.toString ());
        }
        return s.toString ();
    }

    /**
     * @see java.lang.Object#equals(Object)
     * @param obj   the reference object with which to compare.
     * @return <code>true</code> if this object is the same as the obj
     *              argument; <code>false</code> otherwise.
     */
    public boolean equals(Object obj) {
        if (obj == null || getClass() != obj.getClass())
            return false;

        AttributeSet other = (AttributeSet) obj;
        return attributes.equals(other.attributes);
    }

    /**
     * @see java.lang.Object#hashCode()
     * @return a hash code value for this object.
     */
    public int hashCode() {
        return attributes.hashCode();
    }

    /**
     * Returns True if there are no attributes in the set.
     * @return True if there are no attributes in the set
     */
    public boolean isEmpty () {
        return attributes.isEmpty ();
    }
   
    /**
     * Removes all attributes from this set.
     */
    public void clear() {
        attributes.clear();
    }

    /**
     * Returns whether an attribute with the specified name exists in the set.
     * Note that the name lookup is not case sensitive.
     * @param attributeName  the attribute name
     * @return True if an attribute with the specified name exists in the set
     */
    public boolean containsAttribute(String attributeName) {
        return attributes.containsKey(attributeName);
    }

    /**
     * Returns the attribute with the specified name, or null if none exists.
     * Note that the name lookup is not case sensitive.
     * @param attributeName  the attribute name
     * @return the attribute with the specified name, or null if none exists
     */
    public Attribute getAttribute (String attributeName) {
        return attributes.get(attributeName);
    }

    /**
     * Returns a collection of all the attributes in the set.
     * @return a collection of all the attributes in the set
     */
    public Collection<Attribute> getAllAttributes () {
        return Collections.unmodifiableCollection(attributes.values());
    }
   
    /**
     * Returns a collection of all the keys found in the set.
     * @return Collection
     */
    public Collection<String> getAllAttributeNames() {
        return Collections.unmodifiableSet(attributes.keySet());
    }

    /**
     * Set the specified attribute in the set.
     * If an attribute with this name already exists in the set, then the new attribute
     * will replace it.
     * @param newAttr  the new attribute value
     */
    public void setAttribute (Attribute newAttr) {
        // Replace the attribute in the map.
        attributes.put (newAttr.getName(), newAttr);
    }

    /**
     * Appends the specified value(s) to the list of values for the specified attribute.
     * If it is not possible to append the value, then the attribute value will be
     * replaced by the specified attribute.
     * @param newAttr  the attribute value(s) to append
     */
    public void appendListAttribute (Attribute newAttr) {
        // Don't change anything if the new attribute has no values.
        List<?> newAttrValues = newAttr.getValues();
        if (newAttrValues.isEmpty()) {
            return;
        }

        // Check whether there is an existing attribute with this name.
        Attribute existingAttr = attributes.get(newAttr.getName ());
        if (existingAttr == null) {
            setAttribute(newAttr);
            return;
        }

        List<?> oldAttrValues = existingAttr.getValues();
        if (oldAttrValues.isEmpty()) {
            setAttribute(newAttr);
            return;
        }

        // Check whether the new and old attributes are of the same type.
        // Handle numeric types specially.
        Object firstOldValue = oldAttrValues.get(0);
        Object firstNewValue = newAttrValues.get(0);

        Class<?> oldAttrType = (firstOldValue instanceof Number) ? Number.class : firstOldValue.getClass();
        Class<?> newAttrType = (firstNewValue instanceof Number) ? Number.class : firstNewValue.getClass();

        // If the types are compatible, then merge the value lists.
        // Otherwise, just use the new attribute values.
        if (oldAttrType.equals(newAttrType)) {
            List<Object> mergedValues = new ArrayList<Object>(oldAttrValues);
            mergedValues.addAll (newAttrValues);

            Attribute mergedAttr = new Attribute (newAttr.getName(), mergedValues);
            setAttribute(mergedAttr);
        }
        else {
            setAttribute(newAttr);
        }
    }

    /**
     * Sets the specified attributes.
     * @param attrSet  another set of attributes
     */
    public void setAttributes(AttributeSet attrSet) {
        setAttributes(attrSet.attributes.values());
    }

    /**
     * Sets the specified attributes
     * @param attrs  a collection of attributes to be added
     */
    public void setAttributes(Collection<Attribute> attrs) {
        for (Attribute attribute : attrs) {
            setAttribute(attribute);
        }
    }

    /**
     * Removes the specified attribute from the set.
     * @param attributeName  the name of the attribute to remove
     */
    public void removeAttribute(String attributeName) {
        attributes.remove (attributeName);
    }

    /**
     * Removes any attributes from the set which appear in the specified set with the same value.
     */
    private void removeMatchingAttributes(AttributeSet attrsToRemove) {
        Set<String> matchingAttrKeys = new HashSet<String>(attributes.keySet());
        matchingAttrKeys.retainAll(attrsToRemove.attributes.keySet());

        for (String matchingAttrName : matchingAttrKeys) {
            Attribute thisAttr = attributes.get(matchingAttrName);
            Attribute otherAttr = attrsToRemove.attributes.get(matchingAttrName);
           
            if (ObjectUtils.equals(thisAttr, otherAttr)) {
                removeAttribute(matchingAttrName);
            }
        }
    }

    /**
     * Returns a single value for the attribute, or null if none exists.
     * @param attributeName  the name of the attribute for which the value should be fetched
     * @return the value for the attribute, or null if none exists
     */
    public Object getAttributeSingleValue(String attributeName) {
        Attribute attribute = attributes.get(attributeName);
        if (attribute == null)
            return null;

        return attribute.getSingleValue();
    }

    /**
     * Returns the values for the attribute, or an empty list if none exists.
     * @param attributeName  the name of the attribute for which the value should be fetched
     * @return the values for the attribute, or an empty list if none exists
     */
    public List<?> getAttributeValues(String attributeName) {
        Attribute attribute = attributes.get(attributeName);
        if (attribute == null)
            return Collections.emptyList();

        return attribute.getValues();
    }

    /**
     * Returns the value of the colour attribute with the specified name.
     * The name and default value from the attribute description will be used.
     * If there are multiple values for this attribute, the last one applied will be returned.
     * If a matching property is not found, then the defaultValue is returned.
     *
     * @param attrDesc  the attribute description
     * @return the colour value of the attribute, or the default value from the attribute description
     */
    public Color getColourAttributeValue (AttributeDescription attrDesc) {
        Color defaultValue = (attrDesc.defaultValue instanceof Color) ? (Color) attrDesc.defaultValue : null;
        return getColourAttributeValue(attrDesc.name, defaultValue);
    }

    /**
     * Returns the value of the colour attribute with the specified name.
     * If there are multiple values for this attribute, the last one applied will be returned.
     * If a matching property is not found, then the defaultValue is returned.
     *
     * @param attrName      the name of the attribute
     * @param defaultValue  the default value to return if there is no attribute value
     * @return the colour value of the attribute, or the default value if none is found
     */
    public Color getColourAttributeValue (String attrName, Color defaultValue) {
        Object value = getAttributeSingleValue(attrName);
       
        if (value instanceof Color)
            return (Color) value;
       
        return defaultValue;
    }

    /**
     * Returns the value of the specified integer attribute.
     * The name and default value from the attribute description will be used.
     * If there are multiple values for this attribute, the last one applied will be returned.
     * If a matching property is not found, then the defaultValue is returned.
     *
     * @param attrDesc  the attribute description
     * @return the integer value of the attribute, or the default value from the attribute description
     */
    public int getIntegerAttributeValue (AttributeDescription attrDesc) {
        int defaultValue = (attrDesc.defaultValue instanceof Number) ? ((Number) attrDesc.defaultValue).intValue() : 0;
        return getIntegerAttributeValue(attrDesc.name, defaultValue);
    }

    /**
     * Returns the value of the integer attribute with the specified name.
     * If there are multiple values for this attribute, the last one applied will be returned.
     * If a matching property is not found, then the defaultValue is returned.
     *
     * @param attrName      the name of the attribute
     * @param defaultValue  the default value to return if there is no attribute value
     * @return the integer value of the attribute, or the default value if none is found
     */
    public int getIntegerAttributeValue (String attrName, int defaultValue) {
        Object value = getAttributeSingleValue(attrName);

        if (value instanceof Number)
            return ((Number) value).intValue();

        return defaultValue;
    }

    /**
     * Returns the value of the specified double attribute.
     * The name and default value from the attribute description will be used.
     * If there are multiple values for this attribute, the last one applied will be returned.
     * If a matching property is not found, then the defaultValue is returned.
     *
     * @param attrDesc  the attribute description
     * @return the double value of the attribute, or the default value from the attribute description
     */
    public double getDoubleAttributeValue (AttributeDescription attrDesc) {
        double defaultValue = (attrDesc.defaultValue instanceof Number) ? ((Number) attrDesc.defaultValue).doubleValue() : 0.0;

        return getDoubleAttributeValue(attrDesc.name, defaultValue);
    }

    /**
     * Returns the value of the double attribute with the specified name.
     * If there are multiple values for this attribute, the last one applied will be returned.
     * If a matching property is not found, then the defaultValue is returned.
     *
     * @param attrName      the name of the attribute
     * @param defaultValue  the default value to return if there is no attribute value
     * @return the double value of the attribute, or the default value if none is found
     */
    public double getDoubleAttributeValue (String attrName, double defaultValue) {
        Object value = getAttributeSingleValue(attrName);
       
        if (value instanceof Number)
            return ((Number) value).doubleValue();

        return defaultValue;
    }

    /**
     * Returns the value of the specified boolean attribute.
     * The name and default value from the attribute description will be used.
     * If there are multiple values for this attribute, the last one applied will be returned.
     * If a matching property is not found, then the defaultValue is returned.
     *
     * @param attrDesc  the attribute description
     * @return the boolean value of the attribute, or the default value from the attribute description
     */
    public boolean getBooleanAttributeValue (AttributeDescription attrDesc) {
        boolean defaultValue = (attrDesc.defaultValue instanceof Boolean) ? ((Boolean) attrDesc.defaultValue).booleanValue() : false;
        return getBooleanAttributeValue(attrDesc.name, defaultValue);
    }

    /**
     * Returns the value of the boolean attribute with the specified name.
     * If there are multiple values for this attribute, the last one applied will be returned.
     * If a matching property is not found, then the defaultValue is returned.
     *
     * @param attrName      the name of the attribute
     * @param defaultValue  the default value to return if there is no attribute value
     * @return the boolean value of the attribute, or the default value if none is found
     */
    public boolean getBooleanAttributeValue (String attrName, boolean defaultValue) {
        Object value = getAttributeSingleValue(attrName);
       
        if (value instanceof Boolean)
            return ((Boolean) value).booleanValue();
       
        return defaultValue;
    }

    /**
     * Returns the value of the string attribute with the specified name.
     * The name and default value from the attribute description will be used.
     * If there are multiple values for this attribute, the last one applied will be returned.
     * If a matching property is not found, then the defaultValue is returned.
     *
     * @param attrDesc  the attribute description
     * @return the string value of the attribute, or the default value from the attribute description
     */
    public String getStringAttributeValue (AttributeDescription attrDesc) {
        String defaultValue = (attrDesc.defaultValue instanceof String) ? (String) attrDesc.defaultValue : ""; //$NON-NLS-1$
        if (defaultValue == null) {
            defaultValue = ""; //$NON-NLS-1$
        }
        return getStringAttributeValue(attrDesc.name, defaultValue);
    }

    /**
     * Returns the value of the string attribute with the specified name.
     * If there are multiple values for this attribute, the last one applied will be returned.
     * If a matching property is not found, then the defaultValue is returned.
     *
     * @param attrName      the name of the attribute
     * @param defaultValue  the default value to return if there is no attribute value
     * @return the string value of the attribute, or the default value if none is found
     */
    public String getStringAttributeValue (String attrName, String defaultValue) {
        Object value = getAttributeSingleValue(attrName);
       
        if (value instanceof String)
            return (String) value;
       
        return defaultValue;
    }

    /**
     * Returns the value of the time attribute with the specified name.
     * The name and default value from the attribute description will be used.
     * If there are multiple values for this attribute, the last one applied will be returned.
     * If a matching property is not found, then the defaultValue is returned.
     *
     * @param attrDesc  the attribute description
     * @return the time value of the attribute, or the default value if none is found
     */
    public Time getTimeAttributeValue (AttributeDescription attrDesc) {
        Time defaultValue = (attrDesc.defaultValue instanceof Time) ? (Time) attrDesc.defaultValue : null;
        return getTimeAttributeValue(attrDesc.name, defaultValue);
    }

    /**
     * Returns the value of the time attribute with the specified name.
     * If there are multiple values for this attribute, the last one applied will be returned.
     * If a matching property is not found, then the defaultValue is returned.
     *
     * @param attrName      the name of the attribute
     * @param defaultValue  the default value to return if there is no attribute value
     * @return the time value of the attribute, or the default value if none is found
     */
    public Time getTimeAttributeValue (String attrName, Time defaultValue) {
        Object value = getAttributeSingleValue(attrName);
       
        if (value instanceof Time)
            return (Time) value;
       
        return defaultValue;
    }

    /**
     * Returns the value of the attribute set attribute with the specified name.
     * The name and default value from the attribute description will be used.
     * If there are multiple values for this attribute, the last one applied will be returned.
     * If a matching property is not found, then the defaultValue is returned.
     *
     * @param attrDesc  the attribute description
     * @return the attribute set value of the attribute, or the default value if none is found
     */
    public AttributeSet getAttributeSetValue (AttributeDescription attrDesc) {
        AttributeSet defaultValue = (attrDesc.defaultValue instanceof AttributeSet) ? (AttributeSet) attrDesc.defaultValue : new AttributeSet();
        if (defaultValue == null) {
            defaultValue = new AttributeSet();
        }
        return getAttributeSetValue(attrDesc.name, defaultValue);
    }

    /**
     * Returns the value of the attribute set attribute with the specified name.
     * If there are multiple values for this attribute, the last one applied will be returned.
     * If a matching property is not found, then the defaultValue is returned.
     *
     * @param attrName      the name of the attribute
     * @param defaultValue  the default value to return if there is no attribute value
     * @return the attribute set value of the attribute, or the default value if none is found
     */
    public AttributeSet getAttributeSetValue (String attrName, AttributeSet defaultValue) {
        Object value = getAttributeSingleValue(attrName);

        if (value instanceof AttributeSet)
            return (AttributeSet) value;

        return defaultValue;
    }

    /**
     * Returns the value of the attribute set attribute with the specified name.
     * If there are multiple values for this attribute, the last one applied will be returned.
     * If a matching property is not found, then the defaultValue is returned.
     *
     * @param attrName      the name of the attribute
     * @return the attribute set value of the attribute, or ab empty attribute set if none is found
     */
    public AttributeSet getAttributeSetValue (String attrName) {
        Object value = getAttributeSingleValue(attrName);

        if (value instanceof AttributeSet)
            return (AttributeSet) value;

        return new AttributeSet();
    }

    /**
     * Returns the colour values for the attribute, or an empty list if none exists.
     * @param attributeName  the name of the attribute for which the value should be fetched
     * @return the values for the attribute, or an empty list if none exists
     */
    public List<Color> getColourAttributeValues(String attributeName) {
        List<Color> colors = new ArrayList<Color>();
        filterValuesByType(getAttributeValues(attributeName), Color.class, colors);
        return colors;
    }

    /**
     * Returns the boolean values for the attribute, or an empty list if none exists.
     * @param attributeName  the name of the attribute for which the value should be fetched
     * @return the values for the attribute, or an empty list if none exists
     */
    public List<Boolean> getBooleanAttributeValues(String attributeName) {
        List<Boolean> booleans = new ArrayList<Boolean>();
        filterValuesByType(getAttributeValues(attributeName), Boolean.class, booleans);
        return booleans;
    }

    /**
     * Returns the int values for the attribute, or an empty list if none exists.
     * @param attributeName  the name of the attribute for which the value should be fetched
     * @return the values for the attribute, or an empty list if none exists
     */
    public List<Integer> getIntegerAttributeValues(String attributeName) {
        List<Number> numValues = new ArrayList<Number>();
        filterValuesByType(getAttributeValues(attributeName), Number.class, numValues);

        // Convert the Numbers to Integers, if necessary.
        List<Integer> intValues = new ArrayList<Integer>();
        for (Number numVal : numValues) {
            if (numVal instanceof Integer) {
                intValues.add((Integer)numVal);
            }
            else {
                intValues.add(Integer.valueOf(numVal.intValue()));
            }
        }
        return intValues;
    }

    /**
     * Returns the double values for the attribute, or an empty list if none exists.
     * @param attributeName  the name of the attribute for which the value should be fetched
     * @return the values for the attribute, or an empty list if none exists
     */
    public List<Double> getDoubleAttributeValues(String attributeName) {
        List<Number> numValues = new ArrayList<Number>();
        filterValuesByType(getAttributeValues(attributeName), Number.class, numValues);

        // Convert the Numbers to Doubles, if necessary.
        List<Double> dblValues = new ArrayList<Double>();
        for (Object numVal : numValues) {
            if (numVal instanceof Double) {
                dblValues.add((Double)numVal);
            } else if (numVal instanceof Number) {
                dblValues.add(Double.valueOf((((Number)numVal).doubleValue())));
            }
        }
        return dblValues;
    }

    /**
     * Returns the string values for the attribute, or an empty list if none exists.
     * @param attributeName  the name of the attribute for which the value should be fetched
     * @return the values for the attribute, or an empty list if none exists
     */
    public List<String> getStringAttributeValues(String attributeName) {
        List<String> strings = new ArrayList<String>();
        filterValuesByType(getAttributeValues(attributeName), String.class, strings);
        return strings;
    }

    /**
     * Returns the time values for the attribute, or an empty list if none exists.
     * @param attributeName  the name of the attribute for which the value should be fetched
     * @return the values for the attribute, or an empty list if none exists
     */
    public List<Time> getTimeAttributeValues(String attributeName) {
        List<Time> times = new ArrayList<Time>();
        filterValuesByType(getAttributeValues(attributeName), Time.class, times);
        return times;
    }

    /**
     * Returns the attribute set values for the attribute, or an empty list if none exists.
     * @param attributeName  the name of the attribute for which the value should be fetched
     * @return the values for the attribute, or an empty list if none exists
     */
    public List<AttributeSet> getAttributeSetValues(String attributeName) {
        List<AttributeSet> attributeSets = new ArrayList<AttributeSet>();
        filterValuesByType(getAttributeValues(attributeName), AttributeSet.class, attributeSets);
        return attributeSets;
    }

    /**
     * Returns the attribute values from the list which are of the specified type.
     * @param attrValues  a list of attribute values
     * @param filterType  the type of value to keep
     * @param filtered the list that will have the filtered contents
     */
    @SuppressWarnings({ "unchecked" })
    private static void filterValuesByType(List attrValues, Class filterType, List filtered) {

        filtered.clear();

        if (!attrValues.isEmpty()) {

            // Just check the first item in the list, since they should all be compatible anyway.
            Object firstValue = attrValues.get(0);
            if (filterType.isInstance(firstValue)) {
                filtered.addAll(attrValues);
            }
        }
    }
   
    /**
     * Sets the value of an attribute to an integer value.
     * If an attribute with this name already exists in the set, then the new attribute
     * will replace it.
     *
     * @param attrName  the attribute name
     * @param intVal    the new attribute value
     */
    public void setAttribute (String attrName, int intVal) {
        setAttribute(new Attribute(attrName, intVal));
    }

    /**
     * Sets the value of an attribute to a boolean value.
     * If an attribute with this name already exists in the set, then the new attribute
     * will replace it.
     *
     * @param attrName  the attribute name
     * @param boolVal   the new attribute value
     */
    public void setAttribute (String attrName, boolean boolVal) {
        setAttribute(new Attribute(attrName, boolVal));
    }

    /**
     * Sets the value of an attribute to a color value.
     * If an attribute with this name already exists in the set, then the new attribute
     * will replace it.
     *
     * @param attrName  the attribute name
     * @param colorVal  the new attribute value
     */
    public void setAttribute (String attrName, Color colorVal) {
        setAttribute(new Attribute(attrName, colorVal));
    }

    /**
     * Sets the value of an attribute to a double value.
     * If an attribute with this name already exists in the set, then the new attribute
     * will replace it.
     *
     * @param attrName  the attribute name
     * @param dblVal    the new attribute value
     */
    public void setAttribute (String attrName, double dblVal) {
        setAttribute(new Attribute(attrName, dblVal));
    }

    /**
     * Sets the value of an attribute to a string value.
     * If an attribute with this name already exists in the set, then the new attribute
     * will replace it.
     *
     * @param attrName  the attribute name
     * @param strVal    the new attribute value
     */
    public void setAttribute (String attrName, String strVal) {
        setAttribute(new Attribute(attrName, strVal));
    }   

    /**
     * Sets the value of an attribute to a time value.
     * If an attribute with this name already exists in the set, then the new attribute
     * will replace it.
     *
     * @param attrName  the attribute name
     * @param timeVal   the new attribute value
     */
    public void setAttribute (String attrName, Time timeVal) {
        setAttribute(new Attribute(attrName, timeVal));
   

    /**
     * Sets the value of an attribute to an attribute set value.
     * If an attribute with this name already exists in the set, then the new attribute
     * will replace it.
     *
     * @param attrName  the attribute name
     * @param attrSet   the new attribute value
     */
    public void setAttribute (String attrName, AttributeSet attrSet) {
        setAttribute(new Attribute(attrName, attrSet));
    }

    /**
     * Sets the value of an attribute to a list of values.
     * If an attribute with this name already exists in the set, then the new attribute
     * will replace it.
     *
     * @param attrName    the attribute name
     * @param attrValues  the new attribute values
     */
    public void setAttribute (String attrName, List<?> attrValues) {
        setAttribute(new Attribute(attrName, attrValues));
    }

    /**
     * Appends an integer value to the list of values for the attribute.
     * If the value cannot be appended, then the new value will replace the attribute value.
     *
     * @param attrName  the attribute name
     * @param intVal    the attribute value to append
     */
    public void appendListAttribute (String attrName, int intVal) {
        appendListAttribute(new Attribute(attrName, intVal));
    }

    /**
     * Appends a boolean value to the list of values for the attribute.
     * If the value cannot be appended, then the new value will replace the attribute value.
     *
     * @param attrName  the attribute name
     * @param boolVal   the attribute value to append
     */
    public void appendListAttribute (String attrName, boolean boolVal) {
        appendListAttribute(new Attribute(attrName, boolVal));
    }

    /**
     * Appends a color value to the list of values for the attribute.
     * If the value cannot be appended, then the new value will replace the attribute value.
     *
     * @param attrName  the attribute name
     * @param colorVal  the attribute value to append
     */
    public void appendListAttribute (String attrName, Color colorVal) {
        appendListAttribute(new Attribute(attrName, colorVal));
    }

    /**
     * Appends a double value to the list of values for the attribute.
     * If the value cannot be appended, then the new value will replace the attribute value.
     *
     * @param attrName  the attribute name
     * @param dblVal    the attribute value to append
     */
    public void appendListAttribute (String attrName, double dblVal) {
        appendListAttribute(new Attribute(attrName, dblVal));
    }

    /**
     * Appends a string value to the list of values for the attribute.
     * If the value cannot be appended, then the new value will replace the attribute value.
     *
     * @param attrName  the attribute name
     * @param strVal    the attribute value to append
     */
    public void appendListAttribute (String attrName, String strVal) {
        appendListAttribute(new Attribute(attrName, strVal));
    }

    /**
     * Appends a time value to the list of values for the attribute.
     * If the value cannot be appended, then the new value will replace the attribute value.
     *
     * @param attrName  the attribute name
     * @param timeVal   the attribute value to append
     */
    public void appendListAttribute (String attrName, Time timeVal) {
        appendListAttribute(new Attribute(attrName, timeVal));
    }

    /**
     * Appends an attribute set value to the list of values for the attribute.
     * If the value cannot be appended, then the new value will replace the attribute value.
     *
     * @param attrName  the attribute name
     * @param attrSet   the attribute value to append
     */
    public void appendListAttribute (String attrName, AttributeSet attrSet) {
        appendListAttribute(new Attribute(attrName, attrSet));
    }

    /**
     * Compares the 2 attribute sets and returns the names of the attributes which are different
     * or are only in one set.
     * @param attrSet1  one attribute set
     * @param attrSet2  another attribute set
     * @return the set of attribute names which are different.
     */
    public static Set<String> getDifferingAttributeNames(AttributeSet attrSet1, AttributeSet attrSet2) {
        Set<String> differingAttrName = new HashSet<String>();

        // For each attribute in the first set, check whether there is an equivalent one in the second set.
        for (Attribute attr1 : attrSet1.attributes.values()) {
            Attribute attr2 = attrSet2.getAttribute(attr1.getName());

            if (attr2 == null || !attr1.equals(attr2)) {
                differingAttrName.add(attr1.getName());
            }
        }

        // For each attribute in the second set, check whether there is an attribute with the same name in the first set.
        // It isn't necessary to check whether the attributes are the same since this would have been done earlier.
        for (Attribute attr2 : attrSet2.attributes.values()) {
            Attribute attr1 = attrSet1.getAttribute(attr2.getName());

            if (attr1 == null) {
                differingAttrName.add(attr2.getName());
            }
        }
        return differingAttrName;
    }

    /**
     * Loads the attribute set from the specified XML element.
     * @param attributesElem  the root XML element for the attribute set data
     * @return a new attribute set
     */
    public static AttributeSet Load (Element attributesElem) {
        XMLSerializationManager serializer = XMLSerializationManager.getDefaultInstance();
        return (AttributeSet) serializer.loadFromElement(attributesElem,
                XMLSerializationManager.getAttributeSetSerializer());
    }

    /**
     * Stores the attribute set into the specified XML element.
     * @param attributesElem  the XML element into which the attribute set will be saved
     */
    public void store (Element attributesElem) {
        XMLSerializationManager serializer = XMLSerializationManager.getDefaultInstance();
        serializer.storeToElement(attributesElem, this,
                XMLSerializationManager.getAttributeSetSerializer());
    }

    /**
     * Returns a list containing all the attributes from the set.
     * @return a list containing all the attributes from the set
     */
    public List<Attribute> getAttributesAsList () {
        return new ArrayList<Attribute>(attributes.values());
    }

    /**
     * Creates a copy of the attribute set and sets the specified attribute in the copy.
     * @param attrName  the name of the attribute to set
     * @param value     the attribute value to set
     * @return a copy of the attribute set with the new attribute set
     */
    public AttributeSet setAttributeInCopy(String attrName, Color value) {
        AttributeSet attrSet = new AttributeSet(this);
        attrSet.setAttribute(new Attribute(attrName, value));
        return attrSet;
    }

    /**
     * Creates a copy of the attribute set and sets the specified attribute in the copy.
     * @param attrName  the name of the attribute to set
     * @param value     the attribute value to set
     * @return a copy of the attribute set with the new attribute set
     */
    public AttributeSet setAttributeInCopy(String attrName, int value) {
        AttributeSet attrSet = new AttributeSet(this);
        attrSet.setAttribute(new Attribute(attrName, value));
        return attrSet;
    }

    /**
     * Creates a copy of the attribute set and sets the specified attribute in the copy.
     * @param attrName  the name of the attribute to set
     * @param value     the attribute value to set
     * @return a copy of the attribute set with the new attribute set
     */
    public AttributeSet setAttributeInCopy(String attrName, double value) {
        AttributeSet attrSet = new AttributeSet(this);
        attrSet.setAttribute(new Attribute(attrName, value));
        return attrSet;
    }

    /**
     * Creates a copy of the attribute set and sets the specified attribute in the copy.
     * @param attrName  the name of the attribute to set
     * @param value     the attribute value to set
     * @return a copy of the attribute set with the new attribute set
     */
    public AttributeSet setAttributeInCopy(String attrName, boolean value) {
        AttributeSet attrSet = new AttributeSet(this);
        attrSet.setAttribute(new Attribute(attrName, value));
        return attrSet;
    }

    /**
     * Creates a copy of the attribute set and sets the specified attribute in the copy.
     * @param attrName  the name of the attribute to set
     * @param value     the attribute value to set
     * @return a copy of the attribute set with the new attribute set
     */
    public AttributeSet setAttributeInCopy(String attrName, String value) {
        AttributeSet attrSet = new AttributeSet(this);
        attrSet.setAttribute(new Attribute(attrName, value));
        return attrSet;
    }

    /**
     * Creates a copy of the attribute set and sets the specified attribute in the copy.
     * @param attrName  the name of the attribute to set
     * @param value     the attribute value to set
     * @return a copy of the attribute set with the new attribute set
     */
    public AttributeSet setAttributeInCopy(String attrName, Time value) {
        AttributeSet attrSet = new AttributeSet(this);
        attrSet.setAttribute(new Attribute(attrName, value));
        return attrSet;
    }

    /**
     * Creates a copy of the attribute set and sets the specified attribute in the copy.
     * @param attrName  the name of the attribute to set
     * @param value     the attribute value to set
     * @return a copy of the attribute set with the new attribute set
     */
    public AttributeSet setAttributeInCopy(String attrName, AttributeSet value) {
        AttributeSet attrSet = new AttributeSet(this);
        attrSet.setAttribute(new Attribute(attrName, value));
        return attrSet;
    }

    /**
     * Creates a copy of the attribute set and sets the specified attribute values in the copy.
     * @param attrName  the name of the attribute to set
     * @param value     the attribute values to set
     * @return a copy of the attribute set with the new attribute values set
     */
    public AttributeSet setAttributeInCopy(String attrName, List<?> value) {
        AttributeSet attrSet = new AttributeSet(this);
        attrSet.setAttribute(new Attribute(attrName, value));
        return attrSet;
    }

    /**
     * Creates a copy of the attribute set and sets the specified attributes.
     * @param attributes  the attributes to set
     * @return a copy of the attribute set with the new attributes set
     */
    public AttributeSet setAttributesInCopy(List<Attribute> attributes) {
        AttributeSet attrSet = new AttributeSet(this);
        attrSet.setAttributes(attributes);
        return attrSet;
    }

    /**
     * Creates a copy of the attribute set and sets the specified attributes.
     * @param attributes  the attributes to set
     * @return a copy of the attribute set with the new attributes set
     */
    public AttributeSet setAttributesInCopy(AttributeSet attributes) {
        AttributeSet attrSet = new AttributeSet(this);
        attrSet.setAttributes(attributes);
        return attrSet;
    }

    /**
     * Creates a copy of the attribute set and appends the specified attribute in the copy.
     * @param attrName  the name of the attribute to append
     * @param value     the attribute value to append
     * @return a copy of the attribute set with the new attribute set
     */
    public AttributeSet appendAttributeInCopy(String attrName, Color value) {
        AttributeSet attrSet = new AttributeSet(this);
        attrSet.appendListAttribute(new Attribute(attrName, value));
        return attrSet;
    }

    /**
     * Creates a copy of the attribute set and appends the specified attribute in the copy.
     * @param attrName  the name of the attribute to append
     * @param value     the attribute value to append
     * @return a copy of the attribute set with the new attribute set
     */
    public AttributeSet appendAttributeInCopy(String attrName, int value) {
        AttributeSet attrSet = new AttributeSet(this);
        attrSet.appendListAttribute(new Attribute(attrName, value));
        return attrSet;
    }

    /**
     * Creates a copy of the attribute set and appends the specified attribute in the copy.
     * @param attrName  the name of the attribute to append
     * @param value     the attribute value to append
     * @return a copy of the attribute set with the new attribute set
     */
    public AttributeSet appendAttributeInCopy(String attrName, double value) {
        AttributeSet attrSet = new AttributeSet(this);
        attrSet.appendListAttribute(new Attribute(attrName, value));
        return attrSet;
    }

    /**
     * Creates a copy of the attribute set and appends the specified attribute in the copy.
     * @param attrName  the name of the attribute to append
     * @param value     the attribute value to append
     * @return a copy of the attribute set with the new attribute set
     */
    public AttributeSet appendAttributeInCopy(String attrName, boolean value) {
        AttributeSet attrSet = new AttributeSet(this);
        attrSet.appendListAttribute(new Attribute(attrName, value));
        return attrSet;
    }

    /**
     * Creates a copy of the attribute set and appends the specified attribute in the copy.
     * @param attrName  the name of the attribute to append
     * @param value     the attribute value to append
     * @return a copy of the attribute set with the new attribute set
     */
    public AttributeSet appendAttributeInCopy(String attrName, String value) {
        AttributeSet attrSet = new AttributeSet(this);
        attrSet.appendListAttribute(new Attribute(attrName, value));
        return attrSet;
    }

    /**
     * Creates a copy of the attribute set and appends the specified attribute in the copy.
     * @param attrName  the name of the attribute to append
     * @param value     the attribute value to append
     * @return a copy of the attribute set with the new attribute set
     */
    public AttributeSet appendAttributeInCopy(String attrName, Time value) {
        AttributeSet attrSet = new AttributeSet(this);
        attrSet.appendListAttribute(new Attribute(attrName, value));
        return attrSet;
    }

    /**
     * Creates a copy of the attribute set and appends the specified attribute in the copy.
     * @param attrName  the name of the attribute to append
     * @param value     the attribute value to append
     * @return a copy of the attribute set with the new attribute set
     */
    public AttributeSet appendAttributeInCopy(String attrName, AttributeSet value) {
        AttributeSet attrSet = new AttributeSet(this);
        attrSet.appendListAttribute(new Attribute(attrName, value));
        return attrSet;
    }

    /**
     * Creates a copy of the attribute set and appends the specified attributes in the copy.
     * @param attrName  the name of the attribute to append
     * @param value     the attribute values to append
     * @return a copy of the attribute set with the new attribute values set
     */
    public AttributeSet appendAttributeInCopy(String attrName, List<?> value) {
        AttributeSet attrSet = new AttributeSet(this);
        attrSet.appendListAttribute(new Attribute(attrName, value));
        return attrSet;
    }
   
    /**
     * Method removeAttributeInCopy
     *
     * @param attrName
     * @return Returns a copy of this AttributeSet, minus the Attribute with the given name
     */
    public AttributeSet removeAttributeInCopy (String attrName) {
        AttributeSet attrSet = new AttributeSet(this);
        attrSet.removeAttribute(attrName);
        return attrSet;
    }

    /**
     * Returns a copy of this attribute set, minus any attributes in the specified set with the same values.
     */
    public AttributeSet removeMatchingAttributesInCopy(AttributeSet attrsToRemove) {
        AttributeSet attrSet = new AttributeSet(this);
        attrSet.removeMatchingAttributes(attrsToRemove);
        return attrSet;
    }
}
TOP

Related Classes of org.openquark.util.attributes.AttributeSet

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.