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 }