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 PropertyChangeSource
addPropertyChangeListener
in class java.beans.PropertyChangeSupport
listener
- Listener to be added.public void addPropertyChangeListener(java.lang.String propertyName, java.beans.PropertyChangeListener listener)
addPropertyChangeListener
in interface PropertyChangeSource
addPropertyChangeListener
in class java.beans.PropertyChangeSupport
propertyName
- name of the property to be listened forlistener
- will listen for PropertyChangeEvents having this
propertyNamepublic void removePropertyChangeListener(java.beans.PropertyChangeListener listener)
removePropertyChangeListener
in interface PropertyChangeSource
removePropertyChangeListener
in class java.beans.PropertyChangeSupport
listener
- Listener to be removedpublic void removePropertyChangeListener(java.lang.String propertyName, java.beans.PropertyChangeListener listener)
removePropertyChangeListener
in interface PropertyChangeSource
removePropertyChangeListener
in class java.beans.PropertyChangeSupport
propertyName
- name of property that listener will be removed forlistener
- stops listening for this propertypublic java.beans.PropertyChangeListener[] getPropertyChangeListeners()
PropertyChangeSource
getPropertyChangeListeners
in interface PropertyChangeSource
getPropertyChangeListeners
in class java.beans.PropertyChangeSupport
public java.beans.PropertyChangeListener[] getPropertyChangeListeners(java.lang.String propertyName)
getPropertyChangeListeners
in class java.beans.PropertyChangeSupport
public void firePropertyChange(java.lang.String propertyName, java.lang.Object oldValue, java.lang.Object newValue)
firePropertyChange
in class java.beans.PropertyChangeSupport
public void firePropertyChange(java.beans.PropertyChangeEvent event)
PropertyChangeSource
firePropertyChange
in interface PropertyChangeSource
firePropertyChange
in class java.beans.PropertyChangeSupport
event
- 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 PropertyChangeSource
propertyName
- 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 PropertyChangeSource
propertyName
- 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 PropertyChangeSource
propertyName
- 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.Object
public java.lang.String[] getAddedProperties()
getAddedProperties
in interface PropertyChangeSource
public 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