vetoablechangesupport.java
来自「纯java操作系统jnode,安装简单和操作简单的个人使用的Java操作系统」· Java 代码 · 共 531 行 · 第 1/2 页
JAVA
531 行
{
if (children == null)
return;
VetoableChangeSupport s
= (VetoableChangeSupport) children.get(propertyName);
if (s == null)
return;
while (l instanceof VetoableChangeListenerProxy)
{
VetoableChangeListenerProxy p = (VetoableChangeListenerProxy) l;
if (propertyName == null ? p.propertyName != null
: ! propertyName.equals(p.propertyName))
return;
l = (VetoableChangeListener) p.getListener();
}
s.listeners.remove(l);
if (s.listeners.isEmpty())
{
children.remove(propertyName);
if (children.isEmpty())
children = null;
}
}
/**
* Returns an array of all vetoable change listeners registered under the
* given property name. If there are no registered listeners, this returns
* an empty array.
*
* @return the array of registered listeners
* @throws NullPointerException if propertyName is null
* @since 1.4
*/
public synchronized VetoableChangeListener[]
getVetoableChangeListeners(String propertyName)
{
if (children == null)
return new VetoableChangeListener[0];
VetoableChangeSupport s
= (VetoableChangeSupport) children.get(propertyName);
if (s == null)
return new VetoableChangeListener[0];
return (VetoableChangeListener[])
s.listeners.toArray(new VetoableChangeListener[s.listeners.size()]);
}
/**
* Fire a PropertyChangeEvent containing the old and new values of the
* property to all the global listeners, and to all the listeners for the
* specified property name. This does nothing if old and new are non-null
* and equal. If the change is vetoed, a new event is fired to notify
* listeners about the rollback before the exception is thrown.
*
* @param propertyName the name of the property that changed
* @param oldVal the old value
* @param newVal the new value
* @throws PropertyVetoException if the change is vetoed by a listener
*/
public void fireVetoableChange(String propertyName,
Object oldVal, Object newVal)
throws PropertyVetoException
{
fireVetoableChange(new PropertyChangeEvent(source, propertyName,
oldVal, newVal));
}
/**
* Fire a PropertyChangeEvent containing the old and new values of the
* property to all the global listeners, and to all the listeners for the
* specified property name. This does nothing if old and new are equal.
* If the change is vetoed, a new event is fired to notify listeners about
* the rollback before the exception is thrown.
*
* @param propertyName the name of the property that changed
* @param oldVal the old value
* @param newVal the new value
* @throws PropertyVetoException if the change is vetoed by a listener
*/
public void fireVetoableChange(String propertyName, int oldVal, int newVal)
throws PropertyVetoException
{
if (oldVal != newVal)
fireVetoableChange(new PropertyChangeEvent(source, propertyName,
new Integer(oldVal),
new Integer(newVal)));
}
/**
* Fire a PropertyChangeEvent containing the old and new values of the
* property to all the global listeners, and to all the listeners for the
* specified property name. This does nothing if old and new are equal.
* If the change is vetoed, a new event is fired to notify listeners about
* the rollback before the exception is thrown.
*
* @param propertyName the name of the property that changed
* @param oldVal the old value
* @param newVal the new value
* @throws PropertyVetoException if the change is vetoed by a listener
*/
public void fireVetoableChange(String propertyName,
boolean oldVal, boolean newVal)
throws PropertyVetoException
{
if (oldVal != newVal)
fireVetoableChange(new PropertyChangeEvent(source, propertyName,
Boolean.valueOf(oldVal),
Boolean.valueOf(newVal)));
}
/**
* Fire a PropertyChangeEvent to all the global listeners, and to all the
* listeners for the specified property name. This does nothing if old and
* new values of the event are equal. If the change is vetoed, a new event
* is fired to notify listeners about the rollback before the exception is
* thrown.
*
* @param event the event to fire
* @throws NullPointerException if event is null
* @throws PropertyVetoException if the change is vetoed by a listener
*/
public void fireVetoableChange(PropertyChangeEvent event)
throws PropertyVetoException
{
if (event.oldValue != null && event.oldValue.equals(event.newValue))
return;
Vector v = listeners; // Be thread-safe.
if (v != null)
{
int i = v.size();
try
{
while (--i >= 0)
((VetoableChangeListener) v.get(i)).vetoableChange(event);
}
catch (PropertyVetoException e)
{
event = event.rollback();
int limit = i;
i = v.size();
while (--i >= limit)
((VetoableChangeListener) v.get(i)).vetoableChange(event);
throw e;
}
}
Hashtable h = children; // Be thread-safe.
if (h != null && event.propertyName != null)
{
VetoableChangeSupport s
= (VetoableChangeSupport) h.get(event.propertyName);
if (s != null)
{
Vector v1 = s.listeners; // Be thread-safe.
int i = v1 == null ? 0 : v1.size();
try
{
while (--i >= 0)
((VetoableChangeListener) v1.get(i)).vetoableChange(event);
}
catch (PropertyVetoException e)
{
event = event.rollback();
int limit = i;
i = v.size();
while (--i >= 0)
((VetoableChangeListener) v.get(i)).vetoableChange(event);
i = v1.size();
while (--i >= limit)
((VetoableChangeListener) v1.get(i)).vetoableChange(event);
throw e;
}
}
}
}
/**
* Tell whether the specified property is being listened on or not. This
* will only return <code>true</code> if there are listeners on all
* properties or if there is a listener specifically on this property.
*
* @param propertyName the property that may be listened on
* @return whether the property is being listened on
* @throws NullPointerException if propertyName is null
*/
public synchronized boolean hasListeners(String propertyName)
{
return listeners != null || (children != null
&& children.get(propertyName) != null);
}
/**
* Saves the state of the object to the stream.
*
* @param s the stream to write to
* @throws IOException if anything goes wrong
* @serialData this writes out a null-terminated list of serializable
* global vetoable change listeners (the listeners for a named
* property are written out as the global listeners of the
* children, when the children hashtable is saved)
*/
private synchronized void writeObject(ObjectOutputStream s)
throws IOException
{
s.defaultWriteObject();
if (listeners != null)
{
int i = listeners.size();
while (--i >= 0)
if (listeners.get(i) instanceof Serializable)
s.writeObject(listeners.get(i));
}
s.writeObject(null);
}
/**
* Reads the object back from stream (deserialization).
*
* XXX Since serialization for 1.1 streams was not documented, this may
* not work if vetoableChangeSupportSerializedDataVersion is 1.
*
* @param s the stream to read from
* @throws IOException if reading the stream fails
* @throws ClassNotFoundException if deserialization fails
* @serialData this reads in a null-terminated list of serializable
* global vetoable change listeners (the listeners for a named
* property are written out as the global listeners of the
* children, when the children hashtable is saved)
*/
private void readObject(ObjectInputStream s)
throws IOException, ClassNotFoundException
{
s.defaultReadObject();
VetoableChangeListener l = (VetoableChangeListener) s.readObject();
while (l != null)
{
addVetoableChangeListener(l);
l = (VetoableChangeListener) s.readObject();
}
// Sun is not as careful with children as we are, and lets some proxys
// in that can never receive events. So, we clean up anything that got
// serialized, to make sure our invariants hold.
if (children != null)
{
int i = children.size();
Iterator iter = children.entrySet().iterator();
while (--i >= 0)
{
Entry e = (Entry) iter.next();
String name = (String) e.getKey();
VetoableChangeSupport vcs = (VetoableChangeSupport) e.getValue();
if (vcs.listeners == null)
vcs.listeners = new Vector();
if (vcs.children != null)
vcs.listeners.addAll
(Arrays.asList(vcs.getVetoableChangeListeners(name)));
if (vcs.listeners.size() == 0)
iter.remove();
else
vcs.children = null;
}
if (children.size() == 0)
children = null;
}
}
} // class VetoableChangeSupport
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?