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    }