package aima.core.agent.impl;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
/**
* @author Ravi Mohan
* @author Ciaran O'Reilly
* @author Mike Stampone
*/
public abstract class ObjectWithDynamicAttributes {
private Map<Object, Object> attributes = new LinkedHashMap<Object, Object>();
//
// PUBLIC METHODS
//
/**
* By default, returns the simple name of the underlying class as given in
* the source code.
*
* @return the simple name of the underlying class
*/
public String describeType() {
return getClass().getSimpleName();
}
/**
* Returns a string representation of the object's current attributes
*
* @return a string representation of the object's current attributes
*/
public String describeAttributes() {
StringBuilder sb = new StringBuilder();
sb.append("[");
boolean first = true;
for (Object key : attributes.keySet()) {
if (first) {
first = false;
} else {
sb.append(", ");
}
sb.append(key);
sb.append("==");
sb.append(attributes.get(key));
}
sb.append("]");
return sb.toString();
}
/**
* Returns an unmodifiable view of the object's key set
*
* @return an unmodifiable view of the object's key set
*/
public Set<Object> getKeySet() {
return Collections.unmodifiableSet(attributes.keySet());
}
/**
* Associates the specified value with the specified attribute key. If the
* ObjectWithDynamicAttributes previously contained a mapping for the
* attribute key, the old value is replaced.
*
* @param key
* the attribute key
* @param value
* the attribute value
*/
public void setAttribute(Object key, Object value) {
attributes.put(key, value);
}
/**
* Returns the value of the specified attribute key, or null if the
* attribute was not found.
*
* @param key
* the attribute key
*
* @return the value of the specified attribute name, or null if not found.
*/
public Object getAttribute(Object key) {
return attributes.get(key);
}
/**
* Removes the attribute with the specified key from this
* ObjectWithDynamicAttributes.
*
* @param key
* the attribute key
*/
public void removeAttribute(Object key) {
attributes.remove(key);
}
/**
* Creates and returns a copy of this ObjectWithDynamicAttributes
*/
public ObjectWithDynamicAttributes copy() {
ObjectWithDynamicAttributes copy = null;
try {
copy = getClass().newInstance();
copy.attributes.putAll(attributes);
} catch (Exception ex) {
ex.printStackTrace();
}
return copy;
}
@Override
public boolean equals(Object o) {
return o != null && getClass() == o.getClass()
&& attributes.equals(((ObjectWithDynamicAttributes) o).attributes);
}
@Override
public int hashCode() {
return attributes.hashCode();
}
@Override
public String toString() {
return describeType() + describeAttributes();
}
}