View Javadoc

1   package org.springframework.binding.value.support;
2   
3   import java.beans.PropertyChangeListener;
4   import java.beans.PropertyChangeSupport;
5   import java.beans.PropertyVetoException;
6   import java.beans.VetoableChangeListener;
7   import java.beans.VetoableChangeSupport;
8   
9   import org.apache.commons.logging.Log;
10  import org.apache.commons.logging.LogFactory;
11  import org.springframework.binding.value.PropertyChangePublisher;
12  import org.springframework.util.ObjectUtils;
13  
14  /**
15   * Base implementation of the {@link PropertyChangePublisher} interface
16   * providing basic listener support.
17   */
18  public abstract class AbstractPropertyChangePublisher implements PropertyChangePublisher {
19  
20  	protected final Log logger = LogFactory.getLog(getClass());
21  
22  	private transient PropertyChangeSupport changeSupport;
23  
24  	private transient VetoableChangeSupport vetoSupport;
25  
26  	public final void addPropertyChangeListener(PropertyChangeListener listener) {
27  		if (listener == null) {
28  			return;
29  		}
30  		if (changeSupport == null) {
31  			changeSupport = new PropertyChangeSupport(this);
32  		}
33  		changeSupport.addPropertyChangeListener(listener);
34  	}
35  
36  	public final void removePropertyChangeListener(PropertyChangeListener listener) {
37  		if (listener == null || changeSupport == null) {
38  			return;
39  		}
40  		changeSupport.removePropertyChangeListener(listener);
41  	}
42  
43  	public final void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) {
44  		if (listener == null) {
45  			return;
46  		}
47  		if (changeSupport == null) {
48  			changeSupport = new PropertyChangeSupport(this);
49  		}
50  		changeSupport.addPropertyChangeListener(propertyName, listener);
51  	}
52  
53  	public final void removePropertyChangeListener(String propertyName, PropertyChangeListener listener) {
54  		if (listener == null || changeSupport == null) {
55  			return;
56  		}
57  		changeSupport.removePropertyChangeListener(propertyName, listener);
58  	}
59  
60  	public final void addVetoableChangeListener(VetoableChangeListener listener) {
61  		if (listener == null) {
62  			return;
63  		}
64  		if (vetoSupport == null) {
65  			vetoSupport = new VetoableChangeSupport(this);
66  		}
67  		vetoSupport.addVetoableChangeListener(listener);
68  	}
69  
70  	public final void removeVetoableChangeListener(VetoableChangeListener listener) {
71  		if (listener == null || vetoSupport == null) {
72  			return;
73  		}
74  		vetoSupport.removeVetoableChangeListener(listener);
75  	}
76  
77  	public final void addVetoableChangeListener(String propertyName, VetoableChangeListener listener) {
78  		if (listener == null) {
79  			return;
80  		}
81  		if (vetoSupport == null) {
82  			vetoSupport = new VetoableChangeSupport(this);
83  		}
84  		vetoSupport.addVetoableChangeListener(propertyName, listener);
85  	}
86  
87  	public final void removeVetoableChangeListener(String propertyName, VetoableChangeListener listener) {
88  		if (listener == null || vetoSupport == null) {
89  			return;
90  		}
91  		vetoSupport.removeVetoableChangeListener(propertyName, listener);
92  	}
93  
94  	public final PropertyChangeListener[] getPropertyChangeListeners() {
95  		if (changeSupport == null) {
96  			return new PropertyChangeListener[0];
97  		}
98  		return changeSupport.getPropertyChangeListeners();
99  	}
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 }