/* * (c) Rob Gordon 2005 */ package org.oddjob.monitor.control; import java.beans.PropertyChangeListener; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map; import org.apache.log4j.Logger; /** * Checks beans to see if they support property change listeners. */ public class PropertyChangeHelper { private static final Logger logger = Logger .getLogger(PropertyChangeHelper.class); private static final Map<Class<?>, PropertyChangeHelper> helpers = new HashMap<Class<?>, PropertyChangeHelper>(); /** Remember the addListener method. */ private Method addPropListenerMethod; /** Remember the removeListener method. */ private Method removePropListenerMethod; private PropertyChangeHelper(Class<?> bean) { Class<?> beanClass = bean.getClass(); Class<?>[] argClasses = { PropertyChangeListener.class }; try { addPropListenerMethod = beanClass.getMethod( "addPropertyChangeListener", argClasses); removePropListenerMethod = beanClass.getMethod( "removePropertyChangeListener", argClasses); } catch (SecurityException e) { logger.debug(e); } catch (NoSuchMethodException e) { // ignore } } private static PropertyChangeHelper lookup(Class<?> bean) { synchronized (helpers) { PropertyChangeHelper helper = helpers.get(bean); if (helper == null) { helper = new PropertyChangeHelper(bean); helpers.put(bean, helper); } return helper; } } public static void addPropertyChangeListener(Object obj, PropertyChangeListener l) { PropertyChangeHelper helper = lookup(obj.getClass()); if (helper.addPropListenerMethod == null) { return; } Object[] args = { obj }; try { helper.addPropListenerMethod.invoke(obj, args); } catch (IllegalArgumentException e) { logger.debug(e); } catch (IllegalAccessException e) { logger.debug(e); } catch (InvocationTargetException e) { logger.debug(e); } } public static void removePropertyChangeListener(Object obj, PropertyChangeListener l) { PropertyChangeHelper helper = lookup(obj.getClass()); if (helper.removePropListenerMethod == null) { return; } Object[] args = { obj }; try { helper.removePropListenerMethod.invoke(obj, args); } catch (IllegalArgumentException e) { logger.debug(e); } catch (IllegalAccessException e) { logger.debug(e); } catch (InvocationTargetException e) { logger.debug(e); } } }