public class PropertyChangeDispatcher extends java.beans.PropertyChangeSupport implements PropertyChangeSource
Overrode methods for firing PropertyChangeEvents to fire the property even when the old and the new values were the same. This required creating our own Map of listeners, keyed by the propertyName (if specific) and by null for the unnamed listeners (i.e. those listening for all PropertyChangeEvents).
Unlike the superclass PropertyChangeSupport, multiple registrations still receive only one PropertyChangeEvent per fire. This is accomplished by making the listeners a Set rather than a List, as in PropertyChangeSupport.
A delegate for handling properties for an entity. Uses reflection to set/get properties by name (String). This will also fire a PropertyChangeEvent whenever a property is set/gotten using the setProperty() or getProperty() methods here.
Static caches keyed by class are kept for setters and getters, since only one set is needed per class. They are created on-the-fly as required and re-used when an instance of a previous class is created.
| Modifier and Type | Field and Description |
|---|---|
private java.util.Map<java.lang.String,java.lang.Object> |
addedProperties
Contains properties to be added on-the-fly.
|
private static java.util.Map<java.lang.Class<?>,java.util.Map<java.lang.String,java.lang.reflect.Method>> |
allGetters
Holds references to getter methods keyed by property name, each setter
map keyed by a Class reference Signature of map is <Class,
HashMap<String, Method>>
|
private static java.util.Map<java.lang.Class<?>,java.util.Map<java.lang.String,java.lang.reflect.Method>> |
allSetters
Holds references to setter methods keyed by property name, each setter
map keyed by a Class reference Signature of map is <Class,
HashMap<String, Method>>
|
private java.util.Map<java.lang.String,java.lang.reflect.Method> |
getters
Local reference to getters for the class of this instance.
|
private java.util.Map<java.lang.String,java.util.Set<java.beans.PropertyChangeListener>> |
listeners
Holds the named listeners with the key as the propertyName, and the
unnamed listeners keyed by null.
|
private java.util.Map<java.lang.String,java.lang.reflect.Method> |
setters
Local reference to setters for the class of this instance.
|
private java.lang.Object |
source
The entity for which this PropertyChangeDispatcher manages properties.
|
private static java.lang.Class<?> |
STOP_CLASS
Used internally to hold an instance of java.lang.Object.class.
|
| Constructor and Description |
|---|
PropertyChangeDispatcher(java.lang.Object bean)
Instantiate a PropertyChangeDispatcher with default STOP_CLASS (currently
Object).
|
PropertyChangeDispatcher(java.lang.Object bean,
java.lang.Class<?> stopClass)
Create a new PropertyChangeDispatcher to manage properties for the given
Object.
|
| Modifier and Type | Method and Description |
|---|---|
void |
addPropertyChangeListener(java.beans.PropertyChangeListener listener)
Adds listener to the unnamed listeners (keyed by 'null').
|
void |
addPropertyChangeListener(java.lang.String propertyName,
java.beans.PropertyChangeListener listener)
Adds the listener for the specific named propertyName.
|
void |
clearAddedProperties()
Removes all added properties
|
void |
clearAddedProperty(java.lang.String propertyName)
Removes the added property of the given name.
|
void |
firePropertyChange(java.beans.PropertyChangeEvent event)
Notify all PropertyChangeListeners of the PropertyChangeEvent.
|
void |
firePropertyChange(java.lang.String propertyName,
java.lang.Object oldValue,
java.lang.Object newValue) |
java.lang.String[] |
getAddedProperties() |
java.lang.Object |
getProperty(java.lang.String propertyName)
Get the value of the given property, First the class's properties are
tried, then the addedProperties.
|
java.lang.Object |
getProperty(java.lang.String propertyName,
java.lang.Object defaultValue)
Get the value of the given property or return the given default.
|
java.beans.PropertyChangeListener[] |
getPropertyChangeListeners()
Get an Array containing all of the PropertyChangeListeners.
|
java.beans.PropertyChangeListener[] |
getPropertyChangeListeners(java.lang.String propertyName) |
static java.lang.String |
getPropertyName(java.lang.String name,
int offset)
Changes set/get/is method name to corresponding property name by deleting
the first
offset characters and making the first character
of the result lower case. |
static boolean |
isGetterSignature(java.lang.reflect.Method method)
Is the signature empty or has an int (for indexed getter)?
|
static boolean |
isSetterSignature(java.lang.reflect.Method method)
Is the signature of length 1 (scaler setter) or 2 (for indexed getter)?
|
java.lang.String |
paramString() |
void |
removePropertyChangeListener(java.beans.PropertyChangeListener listener)
Removes the listener from the unnamed listeners.
|
void |
removePropertyChangeListener(java.lang.String propertyName,
java.beans.PropertyChangeListener listener)
Removes the listener for this given property.
|
void |
setProperty(java.lang.String propertyName,
java.lang.Object propertyValue)
Set the specified property to the given value, firing a
PropertyChangeEvent to inform any registered listeners of the change.
|
java.lang.String |
toString() |
private static final java.lang.Class<?> STOP_CLASS
private static java.util.Map<java.lang.Class<?>,java.util.Map<java.lang.String,java.lang.reflect.Method>> allSetters
private static java.util.Map<java.lang.Class<?>,java.util.Map<java.lang.String,java.lang.reflect.Method>> allGetters
private java.lang.Object source
private java.util.Map<java.lang.String,java.lang.Object> addedProperties
private java.util.Map<java.lang.String,java.lang.reflect.Method> setters
private java.util.Map<java.lang.String,java.lang.reflect.Method> getters
private java.util.Map<java.lang.String,java.util.Set<java.beans.PropertyChangeListener>> listeners
public PropertyChangeDispatcher(java.lang.Object bean,
java.lang.Class<?> stopClass)
bean - The Object this dispatcher will manage properties forstopClass - Class to stop introspecting - normally SimEntityBase or
BasicSimEntitypublic PropertyChangeDispatcher(java.lang.Object bean)
bean - The Object this dispatcher will manage properties forpublic void addPropertyChangeListener(java.beans.PropertyChangeListener listener)
addPropertyChangeListener in interface PropertyChangeSourceaddPropertyChangeListener in class java.beans.PropertyChangeSupportlistener - Listener to be added.public void addPropertyChangeListener(java.lang.String propertyName,
java.beans.PropertyChangeListener listener)
addPropertyChangeListener in interface PropertyChangeSourceaddPropertyChangeListener in class java.beans.PropertyChangeSupportpropertyName - name of the property to be listened forlistener - will listen for PropertyChangeEvents having this
propertyNamepublic void removePropertyChangeListener(java.beans.PropertyChangeListener listener)
removePropertyChangeListener in interface PropertyChangeSourceremovePropertyChangeListener in class java.beans.PropertyChangeSupportlistener - Listener to be removedpublic void removePropertyChangeListener(java.lang.String propertyName,
java.beans.PropertyChangeListener listener)
removePropertyChangeListener in interface PropertyChangeSourceremovePropertyChangeListener in class java.beans.PropertyChangeSupportpropertyName - name of property that listener will be removed forlistener - stops listening for this propertypublic java.beans.PropertyChangeListener[] getPropertyChangeListeners()
PropertyChangeSourcegetPropertyChangeListeners in interface PropertyChangeSourcegetPropertyChangeListeners in class java.beans.PropertyChangeSupportpublic java.beans.PropertyChangeListener[] getPropertyChangeListeners(java.lang.String propertyName)
getPropertyChangeListeners in class java.beans.PropertyChangeSupportpublic void firePropertyChange(java.lang.String propertyName,
java.lang.Object oldValue,
java.lang.Object newValue)
firePropertyChange in class java.beans.PropertyChangeSupportpublic void firePropertyChange(java.beans.PropertyChangeEvent event)
PropertyChangeSourcefirePropertyChange in interface PropertyChangeSourcefirePropertyChange in class java.beans.PropertyChangeSupportevent - The event with all the information about what property has changed
and to what value.public void setProperty(java.lang.String propertyName,
java.lang.Object propertyValue)
setProperty in interface PropertyChangeSourcepropertyName - Name of the property, used as key to Method, if
defined or Object, if notpropertyValue - new value of the propertypublic java.lang.Object getProperty(java.lang.String propertyName)
getProperty in interface PropertyChangeSourcepropertyName - key to Method for built-in properties or HashMap of
additional properties if notpublic java.lang.Object getProperty(java.lang.String propertyName,
java.lang.Object defaultValue)
getProperty in interface PropertyChangeSourcepropertyName - name of propertydefaultValue - The default value -- returned if property's value cannot
be returned or is null.java.lang.NullPointerException - If the property doesn't exist.public void clearAddedProperties()
public java.lang.String paramString()
public java.lang.String toString()
toString in class java.lang.Objectpublic java.lang.String[] getAddedProperties()
getAddedProperties in interface PropertyChangeSourcepublic void clearAddedProperty(java.lang.String propertyName)
propertyName - The name of the property to be cleared.public static java.lang.String getPropertyName(java.lang.String name,
int offset)
offset characters and making the first character
of the result lower case.name - method name of setter/getteroffset - normally 3 (for "set"/"get") or 2 (for "is")public static boolean isGetterSignature(java.lang.reflect.Method method)
method - Method to be checkedpublic static boolean isSetterSignature(java.lang.reflect.Method method)
method - Method to be checked