001 package org.springframework.binding.value.support;
002
003 import java.beans.PropertyChangeListener;
004 import java.beans.PropertyChangeSupport;
005 import java.beans.PropertyVetoException;
006 import java.beans.VetoableChangeListener;
007 import java.beans.VetoableChangeSupport;
008
009 import org.apache.commons.logging.Log;
010 import org.apache.commons.logging.LogFactory;
011 import org.springframework.binding.value.PropertyChangePublisher;
012 import org.springframework.util.ObjectUtils;
013
014 /**
015 * Base implementation of the {@link PropertyChangePublisher} interface
016 * providing basic listener support.
017 */
018 public abstract class AbstractPropertyChangePublisher implements PropertyChangePublisher {
019
020 protected final Log logger = LogFactory.getLog(getClass());
021
022 private transient PropertyChangeSupport changeSupport;
023
024 private transient VetoableChangeSupport vetoSupport;
025
026 public final void addPropertyChangeListener(PropertyChangeListener listener) {
027 if (listener == null) {
028 return;
029 }
030 if (changeSupport == null) {
031 changeSupport = new PropertyChangeSupport(this);
032 }
033 changeSupport.addPropertyChangeListener(listener);
034 }
035
036 public final void removePropertyChangeListener(PropertyChangeListener listener) {
037 if (listener == null || changeSupport == null) {
038 return;
039 }
040 changeSupport.removePropertyChangeListener(listener);
041 }
042
043 public final void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) {
044 if (listener == null) {
045 return;
046 }
047 if (changeSupport == null) {
048 changeSupport = new PropertyChangeSupport(this);
049 }
050 changeSupport.addPropertyChangeListener(propertyName, listener);
051 }
052
053 public final void removePropertyChangeListener(String propertyName, PropertyChangeListener listener) {
054 if (listener == null || changeSupport == null) {
055 return;
056 }
057 changeSupport.removePropertyChangeListener(propertyName, listener);
058 }
059
060 public final void addVetoableChangeListener(VetoableChangeListener listener) {
061 if (listener == null) {
062 return;
063 }
064 if (vetoSupport == null) {
065 vetoSupport = new VetoableChangeSupport(this);
066 }
067 vetoSupport.addVetoableChangeListener(listener);
068 }
069
070 public final void removeVetoableChangeListener(VetoableChangeListener listener) {
071 if (listener == null || vetoSupport == null) {
072 return;
073 }
074 vetoSupport.removeVetoableChangeListener(listener);
075 }
076
077 public final void addVetoableChangeListener(String propertyName, VetoableChangeListener listener) {
078 if (listener == null) {
079 return;
080 }
081 if (vetoSupport == null) {
082 vetoSupport = new VetoableChangeSupport(this);
083 }
084 vetoSupport.addVetoableChangeListener(propertyName, listener);
085 }
086
087 public final void removeVetoableChangeListener(String propertyName, VetoableChangeListener listener) {
088 if (listener == null || vetoSupport == null) {
089 return;
090 }
091 vetoSupport.removeVetoableChangeListener(propertyName, listener);
092 }
093
094 public final PropertyChangeListener[] getPropertyChangeListeners() {
095 if (changeSupport == null) {
096 return new PropertyChangeListener[0];
097 }
098 return changeSupport.getPropertyChangeListeners();
099 }
100
101 public final PropertyChangeListener[] getPropertyChangeListeners(String propertyName) {
102 if (changeSupport == null) {
103 return new PropertyChangeListener[0];
104 }
105 return changeSupport.getPropertyChangeListeners(propertyName);
106 }
107
108 public final VetoableChangeListener[] getVetoableChangeListeners() {
109 if (vetoSupport == null) {
110 return new VetoableChangeListener[0];
111 }
112 return vetoSupport.getVetoableChangeListeners();
113 }
114
115 public final VetoableChangeListener[] getVetoableChangeListeners(String propertyName) {
116 if (vetoSupport == null) {
117 return new VetoableChangeListener[0];
118 }
119 return vetoSupport.getVetoableChangeListeners(propertyName);
120 }
121
122 protected final void firePropertyChange(String propertyName, Object oldValue, Object newValue) {
123 PropertyChangeSupport aChangeSupport = this.changeSupport;
124 if (aChangeSupport == null) {
125 return;
126 }
127 aChangeSupport.firePropertyChange(propertyName, oldValue, newValue);
128 }
129
130 protected final void firePropertyChange(String propertyName, boolean oldValue, boolean newValue) {
131 PropertyChangeSupport aChangeSupport = this.changeSupport;
132 if (aChangeSupport == null) {
133 return;
134 }
135 aChangeSupport.firePropertyChange(propertyName, oldValue, newValue);
136 }
137
138 protected final void firePropertyChange(String propertyName, double oldValue, double newValue) {
139 firePropertyChange(propertyName, new Double(oldValue), new Double(newValue));
140 }
141
142 protected final void firePropertyChange(String propertyName, float oldValue, float newValue) {
143 firePropertyChange(propertyName, new Float(oldValue), new Float(newValue));
144 }
145
146 protected final void firePropertyChange(String propertyName, int oldValue, int newValue) {
147 PropertyChangeSupport aChangeSupport = this.changeSupport;
148 if (aChangeSupport == null) {
149 return;
150 }
151 aChangeSupport.firePropertyChange(propertyName, oldValue, newValue);
152 }
153
154 protected final void firePropertyChange(String propertyName, long oldValue, long newValue) {
155 firePropertyChange(propertyName, new Long(oldValue), new Long(newValue));
156 }
157
158 protected final void firePropertiesChanged() {
159 firePropertyChange(null, null, null);
160 }
161
162 protected final void fireVetoableChange(String propertyName, Object oldValue, Object newValue)
163 throws PropertyVetoException {
164 VetoableChangeSupport aVetoSupport = this.vetoSupport;
165 if (aVetoSupport == null) {
166 return;
167 }
168 aVetoSupport.fireVetoableChange(propertyName, oldValue, newValue);
169 }
170
171 protected final void fireVetoableChange(String propertyName, boolean oldValue, boolean newValue)
172 throws PropertyVetoException {
173 VetoableChangeSupport aVetoSupport = this.vetoSupport;
174 if (aVetoSupport == null) {
175 return;
176 }
177 aVetoSupport.fireVetoableChange(propertyName, oldValue, newValue);
178 }
179
180 protected final void fireVetoableChange(String propertyName, double oldValue, double newValue)
181 throws PropertyVetoException {
182 fireVetoableChange(propertyName, new Double(oldValue), new Double(newValue));
183 }
184
185 protected final void fireVetoableChange(String propertyName, int oldValue, int newValue)
186 throws PropertyVetoException {
187 VetoableChangeSupport aVetoSupport = this.vetoSupport;
188 if (aVetoSupport == null) {
189 return;
190 }
191 aVetoSupport.fireVetoableChange(propertyName, oldValue, newValue);
192 }
193
194 protected final void fireVetoableChange(String propertyName, float oldValue, float newValue)
195 throws PropertyVetoException {
196 fireVetoableChange(propertyName, new Float(oldValue), new Float(newValue));
197 }
198
199 protected final void fireVetoableChange(String propertyName, long oldValue, long newValue)
200 throws PropertyVetoException {
201 fireVetoableChange(propertyName, new Long(oldValue), new Long(newValue));
202 }
203
204 protected boolean hasChanged(Object currentValue, Object proposedValue) {
205 return !ObjectUtils.nullSafeEquals(currentValue, proposedValue);
206 }
207
208 protected final boolean hasChanged(boolean currentValue, boolean proposedValue) {
209 return currentValue != proposedValue;
210 }
211
212 protected final boolean hasChanged(int currentValue, int proposedValue) {
213 return currentValue != proposedValue;
214 }
215
216 protected final boolean hasChanged(long currentValue, long proposedValue) {
217 return currentValue != proposedValue;
218 }
219
220 protected final boolean hasChanged(float currentValue, float proposedValue) {
221 return currentValue != proposedValue;
222 }
223
224 protected final boolean hasChanged(double currentValue, double proposedValue) {
225 return currentValue != proposedValue;
226 }
227
228 }