package com.revolsys.util; import java.awt.Component; import java.beans.BeanInfo; import java.beans.IntrospectionException; import java.beans.Introspector; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeListenerProxy; import java.beans.PropertyChangeSupport; import java.beans.PropertyDescriptor; import java.lang.annotation.Annotation; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Arrays; import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.function.BiConsumer; import java.util.function.BiFunction; import java.util.function.Consumer; import javax.swing.JComponent; import org.apache.commons.beanutils.MethodUtils; import org.springframework.core.annotation.AnnotationUtils; import com.revolsys.beans.NonWeakListener; import com.revolsys.beans.PropertyChangeSupportProxy; import com.revolsys.beans.ProxyPropertyChangeListener; import com.revolsys.beans.WeakPropertyChangeListener; import com.revolsys.datatype.DataType; import com.revolsys.datatype.DataTypes; import com.revolsys.logging.Logs; import com.revolsys.properties.ObjectWithProperties; import com.revolsys.record.Record; import com.revolsys.util.number.Integers; public interface Property { class NewValueListener<V> implements PropertyChangeListener, NonWeakListener { private final Consumer<V> consumer; private final Object source; public NewValueListener(final Consumer<V> consumer, final Object source) { this.consumer = consumer; this.source = source; } @Override public boolean equals(final Object other) { if (other instanceof NewValueListener) { final NewValueListener<?> listener = (NewValueListener<?>)other; if (listener.consumer == consumer) { return true; } } return false; } @Override public int hashCode() { return consumer.hashCode(); } @SuppressWarnings("unchecked") @Override public void propertyChange(final PropertyChangeEvent event) { final Object source = event.getSource(); if (this.source == null || this.source == source) { try { final V newValue = (V)event.getNewValue(); consumer.accept(newValue); } catch (final Throwable e) { Logs.error(this, "Error invoking listener", e); } } } } class OldAndNewValueListener<V1, V2> implements PropertyChangeListener, NonWeakListener { private final BiConsumer<V1, V2> consumer; private final Object source; public OldAndNewValueListener(final BiConsumer<V1, V2> consumer, final Object source) { this.consumer = consumer; this.source = source; } @Override public boolean equals(final Object other) { if (other instanceof OldAndNewValueListener) { final OldAndNewValueListener<?, ?> listener = (OldAndNewValueListener<?, ?>)other; if (listener.consumer == consumer) { return true; } } return false; } @Override public int hashCode() { return consumer.hashCode(); } @SuppressWarnings("unchecked") @Override public void propertyChange(final PropertyChangeEvent event) { final Object source = event.getSource(); if (this.source == null || this.source == source) { try { final V1 oldValue = (V1)event.getOldValue(); final V2 newValue = (V2)event.getNewValue(); consumer.accept(oldValue, newValue); } catch (final Throwable e) { Logs.error(this, "Error invoking listener", e); } } } } class RunnableListener implements PropertyChangeListener, NonWeakListener { private final Runnable runnable; public RunnableListener(final Runnable runnable) { this.runnable = runnable; } @Override public boolean equals(final Object other) { if (other instanceof RunnableListener) { final RunnableListener listener = (RunnableListener)other; if (listener.runnable == runnable) { return true; } } return false; } @Override public int hashCode() { return runnable.hashCode(); } @Override public void propertyChange(final PropertyChangeEvent event) { try { runnable.run(); } catch (final Throwable e) { Logs.error(this, "Error invoking listener", e); } } } class SourceListener<V> implements PropertyChangeListener, NonWeakListener { private final Consumer<V> consumer; public SourceListener(final Consumer<V> consumer) { this.consumer = consumer; } @Override public boolean equals(final Object other) { if (other instanceof SourceListener) { final SourceListener<?> listener = (SourceListener<?>)other; if (listener.consumer == consumer) { return true; } } return false; } @Override public int hashCode() { return consumer.hashCode(); } @SuppressWarnings("unchecked") @Override public void propertyChange(final PropertyChangeEvent event) { try { final V source = (V)event.getSource(); consumer.accept(source); } catch (final Throwable e) { Logs.error(this, "Error invoking listener", e); } } } static void addListener(final Object source, final Object listener) { if (source != null) { final PropertyChangeListener propertyChangeListener = getPropertyChangeListener(listener); if (propertyChangeListener != null) { final PropertyChangeSupport propertyChangeSupport = propertyChangeSupport(source); if (propertyChangeSupport == null) { if (source instanceof JComponent) { final JComponent component = (JComponent)source; component.addPropertyChangeListener(propertyChangeListener); } } else { propertyChangeSupport.addPropertyChangeListener(propertyChangeListener); } } } } static void addListener(final Object source, final PropertyChangeListener listener) { addListener(source, (Object)listener); } static void addListener(final Object source, final String propertyName, final Object listener) { final PropertyChangeListener propertyChangeListener = getPropertyChangeListener(listener); if (propertyChangeListener != null) { if (source != null) { final PropertyChangeSupport propertyChangeSupport = propertyChangeSupport(source); if (propertyChangeSupport == null) { if (source instanceof JComponent) { final JComponent component = (JComponent)source; component.addPropertyChangeListener(propertyName, propertyChangeListener); } } else { propertyChangeSupport.addPropertyChangeListener(propertyName, propertyChangeListener); } } } } static void addListener(final Object source, final String propertyName, final PropertyChangeListener listener) { addListener(source, propertyName, (Object)listener); } // Any source emitted by source static <V> PropertyChangeListener addListenerNewValue(final Object source, final Consumer<V> consumer) { if (source != null && consumer != null) { final PropertyChangeListener listener = new NewValueListener<>(consumer, null); addListener(source, listener); return listener; } return null; } // Any source emitted by source static <V> PropertyChangeListener addListenerNewValue(final Object source, final String propertyName, final Consumer<V> consumer) { if (source != null && consumer != null) { final PropertyChangeListener listener = new NewValueListener<>(consumer, null); addListener(source, propertyName, listener); return listener; } return null; } // Only on source static <V> PropertyChangeListener addListenerNewValueSource(final Object source, final Consumer<V> consumer) { if (source != null && consumer != null) { final PropertyChangeListener listener = new NewValueListener<>(consumer, source); addListener(source, listener); return listener; } return null; } // Only on source static <V> PropertyChangeListener addListenerNewValueSource(final Object source, final String propertyName, final Consumer<V> consumer) { if (source != null && consumer != null) { final PropertyChangeListener listener = new NewValueListener<>(consumer, source); addListener(source, propertyName, listener); return listener; } return null; } // Only on source static <V1, V2> PropertyChangeListener addListenerOldAndNewValueSource(final Object source, final String propertyName, final BiConsumer<V1, V2> consumer) { if (source != null && consumer != null) { final PropertyChangeListener listener = new OldAndNewValueListener<>(consumer, source); addListener(source, propertyName, listener); return listener; } return null; } static PropertyChangeListener addListenerRunnable(final Object source, final Runnable runnable) { if (source != null && runnable != null) { final PropertyChangeListener listener = new RunnableListener(runnable); addListener(source, listener); return listener; } return null; } static PropertyChangeListener addListenerRunnable(final Object source, final String propertyName, final Runnable runnable) { if (source != null && runnable != null) { final PropertyChangeListener listener = new RunnableListener(runnable); addListener(source, propertyName, listener); return listener; } return null; } static <V> PropertyChangeListener addListenerSource(final Object source, final Consumer<V> consumer) { if (source != null && consumer != null) { final PropertyChangeListener listener = new SourceListener<>(consumer); addListener(source, listener); return listener; } return null; } static <V> PropertyChangeListener addListenerSource(final Object source, final String propertyName, final Consumer<V> consumer) { if (source != null && consumer != null) { final PropertyChangeListener listener = new SourceListener<>(consumer); addListener(source, propertyName, listener); return listener; } return null; } static void clearCache() { PropertyDescriptorCache.clearCache(); Introspector.flushCaches(); } static PropertyDescriptor descriptor(final Class<?> beanClass, final String name) { if (beanClass != null && Property.hasValue(name)) { try { final BeanInfo beanInfo = Introspector.getBeanInfo(beanClass); final PropertyDescriptor[] props = beanInfo.getPropertyDescriptors(); for (final PropertyDescriptor property : props) { if (property.getName().equals(name)) { return property; } } } catch (final IntrospectionException e) { Logs.error(Property.class, e); } } return null; } static boolean equals(final Object object1, final Object object2, final String propertyName) { if (object1 == object2) { return true; } else if (object1 != null && object2 != null) { final Object value1 = getProperty(object1, propertyName); final Object value2 = getProperty(object2, propertyName); return DataType.equal(value1, value2); } return false; } static void firePropertyChange(final Object source, final PropertyChangeEvent event) { final PropertyChangeSupport propertyChangeSupport = propertyChangeSupport(source); if (propertyChangeSupport != null) { propertyChangeSupport.firePropertyChange(event); } } static void firePropertyChange(final Object source, final String propertyName, final int index, final Object oldValue, final Object newValue) { final PropertyChangeSupport propertyChangeSupport = propertyChangeSupport(source); if (propertyChangeSupport != null) { propertyChangeSupport.fireIndexedPropertyChange(propertyName, index, oldValue, newValue); } } static void firePropertyChange(final Object source, final String propertyName, final Object oldValue, final Object newValue) { final PropertyChangeSupport propertyChangeSupport = propertyChangeSupport(source); if (propertyChangeSupport != null) { propertyChangeSupport.firePropertyChange(propertyName, oldValue, newValue); } } @SuppressWarnings("unchecked") static <T> T get(final Object object, final String key) { if (object == null) { return null; } else { if (object instanceof Record) { final Record record = (Record)object; return record.getValueByPath(key); } else if (object instanceof Map) { final Map<String, ?> map = (Map<String, ?>)object; return (T)map.get(key); } else if (object instanceof Annotation) { final Annotation annotation = (Annotation)object; return (T)AnnotationUtils.getValue(annotation, key); } else { final String firstName = Property.getFirstName(key); final String subName = Property.getSubName(key); final Object value = Property.getSimple(object, firstName); if (value == null || !Property.hasValue(subName)) { return (T)value; } else { return (T)get(value, subName); } } } } static boolean getBoolean(final Map<String, Object> map, final String key) { if (map == null) { return false; } else { final Object value = map.get(key); if (value == null) { return false; } else if (value instanceof Boolean) { final Boolean booleanValue = (Boolean)value; return booleanValue; } else if (value instanceof Number) { final Number number = (Number)value; return number.intValue() == 1; } else { final String stringValue = value.toString(); if (stringValue.equals("Y") || stringValue.equals("1") || Boolean.parseBoolean(stringValue)) { return true; } else { return false; } } } } static boolean getBoolean(final ObjectWithProperties object, final String key) { if (object == null) { return false; } else { final Object value = object.getProperty(key); if (value == null) { return false; } else if (value instanceof Boolean) { final Boolean booleanValue = (Boolean)value; return booleanValue; } else if (value instanceof Number) { final Number number = (Number)value; return number.intValue() == 1; } else { final String stringValue = value.toString(); if (stringValue.equals("Y") || stringValue.equals("1") || Boolean.parseBoolean(stringValue)) { return true; } else { return false; } } } } static Class<?> getClass(final Class<?> beanClass, final String name) { final PropertyDescriptor propertyDescriptor = descriptor(beanClass, name); if (propertyDescriptor == null) { return null; } else { return propertyDescriptor.getPropertyType(); } } static Class<?> getClass(final Object object, final String fieldName) { if (object == null) { return null; } else { final Class<?> objectClass = object.getClass(); final Class<?> fieldClass = getClass(objectClass, fieldName); return fieldClass; } } static Double getDouble(final ObjectWithProperties object, final String key) { if (object == null) { return null; } else { final Object value = object.getProperty(key); return DataTypes.DOUBLE.toObject(value); } } static double getDouble(final ObjectWithProperties object, final String key, final double defaultValue) { if (object == null) { return defaultValue; } else { final Object value = object.getProperty(key); if (value == null) { return defaultValue; } else { return DataTypes.DOUBLE.toObject(value); } } } static String getFirstName(final String name) { if (hasValue(name)) { final int index = name.indexOf("."); if (index == -1) { return name; } else { return name.substring(0, index); } } return name; } static Integer getInteger(final ObjectWithProperties object, final String key) { if (object == null) { return null; } else { final Object value = object.getProperty(key); return Integers.toValid(value); } } static int getInteger(final ObjectWithProperties object, final String key, final int defaultValue) { if (object == null) { return defaultValue; } else { final Object value = object.getProperty(key); if (value == null) { return defaultValue; } else { return Integers.toValid(value); } } } @SuppressWarnings("unchecked") static <T> T getProperty(final Object object, final String key) { if (object == null) { return null; } else { if (object instanceof Record) { final Record record = (Record)object; return record.getValue(key); } else if (object instanceof Map) { final Map<String, ?> map = (Map<String, ?>)object; return (T)map.get(key); } else if (object instanceof Annotation) { final Annotation annotation = (Annotation)object; return (T)AnnotationUtils.getValue(annotation, key); } else { return getSimple(object, key); } } } @SuppressWarnings("unchecked") static PropertyChangeListener getPropertyChangeListener(final Object listener) { if (listener instanceof PropertyChangeListener) { final PropertyChangeListener propertyChangeListener = (PropertyChangeListener)listener; if (propertyChangeListener instanceof NonWeakListener) { return propertyChangeListener; } else { final WeakPropertyChangeListener weakListener = new WeakPropertyChangeListener( propertyChangeListener); return weakListener; } } else if (listener instanceof Consumer) { final Consumer<Object> consumer = (Consumer<Object>)listener; return (e) -> { final Object object = e.getNewValue(); consumer.accept(object); }; } else { return null; } } @SuppressWarnings("unchecked") static <T> T getSimple(final Object object, final String propertyName) { final PropertyDescriptor propertyDescriptor = PropertyDescriptorCache .getPropertyDescriptor(object, propertyName); if (propertyDescriptor != null) { final Method readMethod = propertyDescriptor.getReadMethod(); if (readMethod == null) { return null; } else { try { return (T)readMethod.invoke(object); } catch (IllegalAccessException | IllegalArgumentException e) { Exceptions.throwUncheckedException(e); } catch (final InvocationTargetException e) { final Throwable targetException = e.getTargetException(); Exceptions.throwUncheckedException(targetException); } } } return null; } static String getString(final ObjectWithProperties object, final String key) { if (object == null) { return null; } else { final Object value = object.getProperty(key); return DataTypes.STRING.toObject(value); } } static String getString(final ObjectWithProperties object, final String key, final String defaultValue) { if (object == null) { return defaultValue; } else { final Object value = object.getProperty(key); if (value == null) { return defaultValue; } else { return DataTypes.STRING.toObject(value); } } } static String getSubName(final String name) { if (hasValue(name)) { final int index = name.indexOf("."); if (index == -1) { return ""; } else { return name.substring(index + 1); } } return name; } public static Class<?> getType(final Object object, final String propertyName) { final PropertyDescriptor propertyDescriptor = PropertyDescriptorCache .getPropertyDescriptor(object, propertyName); if (propertyDescriptor != null) { final Class<?> propertyType = propertyDescriptor.getPropertyType(); return propertyType; } return null; } static boolean hasValue(final CharSequence string) { if (string != null) { final int length = string.length(); for (int i = 0; i < length; i++) { final char character = string.charAt(i); if (!Character.isWhitespace(character)) { return true; } } } return false; } static boolean hasValue(final Collection<?> collection) { if (collection == null || collection.isEmpty()) { return false; } else { return true; } } static boolean hasValue(final Emptyable value) { if (value == null) { return false; } else { return !value.isEmpty(); } } static boolean hasValue(final Object value) { if (value == null) { return false; } else if (value instanceof CharSequence) { final CharSequence string = (CharSequence)value; return hasValue(string); } else if (value instanceof Collection<?>) { final Collection<?> collection = (Collection<?>)value; return !collection.isEmpty(); } else if (value instanceof Map<?, ?>) { final Map<?, ?> map = (Map<?, ?>)value; return !map.isEmpty(); } else if (value instanceof Emptyable) { final Emptyable emptyable = (Emptyable)value; return !emptyable.isEmpty(); } else { return true; } } static boolean hasValue(final Object[] array) { if (array == null || array.length > 1) { return false; } else { return true; } } static boolean hasValuesAll(final Object... values) { if (values == null || values.length == 0) { return false; } else { for (final Object value : values) { if (!hasValue(value)) { return false; } } return true; } } static boolean hasValuesAny(final Object... values) { if (values == null || values.length == 0) { return false; } else { for (final Object value : values) { if (hasValue(value)) { return true; } } return false; } } @SuppressWarnings("unchecked") static <V> V invoke(final Object object, final String methodName, final Object... parameterArray) { try { if (object instanceof Class<?>) { final Class<?> clazz = (Class<?>)object; return (V)MethodUtils.invokeStaticMethod(clazz, methodName, parameterArray); } else { return (V)MethodUtils.invokeMethod(object, methodName, parameterArray); } } catch (final InvocationTargetException e) { return (V)Exceptions.throwCauseException(e); } catch (final Throwable e) { throw new RuntimeException("Unable to invoke " + toString(object, methodName, parameterArray), e); } } static boolean isChanged(final Object oldValue, final Object newValue) { final boolean oldHasValue = Property.hasValue(oldValue); final boolean newHasValue = Property.hasValue(newValue); if (oldHasValue) { if (newHasValue) { if (DataType.equal(oldValue, newValue)) { return false; } else { return true; } } else { return true; } } else { if (newHasValue) { return true; } else { return false; } } } static boolean isEmpty(final Emptyable value) { if (value == null) { return true; } else { return value.isEmpty(); } } static boolean isEmpty(final Object value) { if (value == null) { return true; } else if (value instanceof CharSequence) { final CharSequence string = (CharSequence)value; return !hasValue(string); } else if (value instanceof Collection<?>) { final Collection<?> collection = (Collection<?>)value; return collection.isEmpty(); } else if (value instanceof Map<?, ?>) { final Map<?, ?> map = (Map<?, ?>)value; return map.isEmpty(); } else if (value instanceof Emptyable) { final Emptyable emptyable = (Emptyable)value; return emptyable.isEmpty(); } else { return false; } } static boolean isEmpty(final Object[] value) { if (value == null || value.length == 0) { return true; } else { return false; } } static <V> PropertyChangeListener newListener(final BiConsumer<String, V> consumer) { return (event) -> { final String propertyName = event.getPropertyName(); @SuppressWarnings("unchecked") final V value = (V)event.getNewValue(); consumer.accept(propertyName, value); }; } static <V> PropertyChangeListener newListener(final BiFunction<String, V, ?> function) { return (event) -> { final String propertyName = event.getPropertyName(); @SuppressWarnings("unchecked") final V value = (V)event.getNewValue(); function.apply(propertyName, value); }; } static PropertyChangeSupport propertyChangeSupport(final Object object) { if (object instanceof PropertyChangeSupport) { return (PropertyChangeSupport)object; } else if (object instanceof PropertyChangeSupportProxy) { final PropertyChangeSupportProxy proxy = (PropertyChangeSupportProxy)object; return proxy.getPropertyChangeSupport(); } else { return null; } } static Method readMethod(final Class<?> beanClass, final String name) { final PropertyDescriptor descriptor = descriptor(beanClass, name); if (descriptor != null) { return descriptor.getReadMethod(); } else { return null; } } static Method readMethod(final Object object, final String name) { return readMethod(object.getClass(), name); } static void removeAllListeners(final Component component) { for (final PropertyChangeListener listener : component.getPropertyChangeListeners()) { if (listener instanceof PropertyChangeListenerProxy) { final PropertyChangeListenerProxy proxy = (PropertyChangeListenerProxy)listener; final String propertyName = proxy.getPropertyName(); component.removePropertyChangeListener(propertyName, listener); } component.removePropertyChangeListener(listener); } } static void removeAllListeners(final Object object) { if (object instanceof Component) { final Component component = (Component)object; removeAllListeners(component); } if (object instanceof PropertyChangeSupportProxy) { final PropertyChangeSupportProxy proxy = (PropertyChangeSupportProxy)object; final PropertyChangeSupport propertyChangeSupport = proxy.getPropertyChangeSupport(); for (final PropertyChangeListener listener : propertyChangeSupport .getPropertyChangeListeners()) { if (listener instanceof PropertyChangeListenerProxy) { final PropertyChangeListenerProxy listenerProxy = (PropertyChangeListenerProxy)listener; final String propertyName = listenerProxy.getPropertyName(); propertyChangeSupport.removePropertyChangeListener(propertyName, listener); } propertyChangeSupport.removePropertyChangeListener(listener); } } } static void removeAllListeners(final PropertyChangeSupport propertyChangeSupport) { for (final PropertyChangeListener listener : propertyChangeSupport .getPropertyChangeListeners()) { if (listener instanceof PropertyChangeListenerProxy) { final PropertyChangeListenerProxy proxy = (PropertyChangeListenerProxy)listener; final String propertyName = proxy.getPropertyName(); propertyChangeSupport.removePropertyChangeListener(propertyName, listener); } propertyChangeSupport.removePropertyChangeListener(listener); } } static boolean removeListener(final Object source, final Object listener) { boolean removed = false; if (source != null && listener instanceof PropertyChangeListener) { final PropertyChangeListener propertyChangeListener = (PropertyChangeListener)listener; final PropertyChangeSupport propertyChangeSupport = propertyChangeSupport(source); if (propertyChangeSupport != null) { for (final PropertyChangeListener otherListener : propertyChangeSupport .getPropertyChangeListeners()) { boolean remove = false; PropertyChangeListener compareListener; if (otherListener instanceof PropertyChangeListenerProxy) { final PropertyChangeListenerProxy proxy = (PropertyChangeListenerProxy)otherListener; compareListener = proxy.getListener(); } else { compareListener = otherListener; } if (compareListener == propertyChangeListener) { remove = true; } else if (compareListener instanceof ProxyPropertyChangeListener) { final ProxyPropertyChangeListener proxiedListener = (ProxyPropertyChangeListener)compareListener; final PropertyChangeListener listenerReference = proxiedListener .getPropertyChangeListener(); if (listenerReference == null || listenerReference == propertyChangeListener) { remove = true; } } if (remove) { propertyChangeSupport.removePropertyChangeListener(otherListener); removed = true; } } } if (source instanceof Component) { final Component component = (Component)source; for (final PropertyChangeListener otherListener : component.getPropertyChangeListeners()) { if (otherListener.equals(propertyChangeListener)) { component.removePropertyChangeListener(propertyChangeListener); removed = true; } else if (otherListener instanceof ProxyPropertyChangeListener) { final ProxyPropertyChangeListener proxiedListener = (ProxyPropertyChangeListener)otherListener; final PropertyChangeListener listenerReference = proxiedListener .getPropertyChangeListener(); if (listenerReference == null || listenerReference.equals(propertyChangeListener)) { component.removePropertyChangeListener(otherListener); removed = true; } } } } } return removed; } static void removeListener(final Object source, final String propertyName, final Object listener) { if (listener instanceof PropertyChangeListener) { final PropertyChangeListener propertyChangeListener = (PropertyChangeListener)listener; final PropertyChangeSupport propertyChangeSupport = propertyChangeSupport(source); if (propertyChangeSupport != null) { for (final PropertyChangeListener otherListener : propertyChangeSupport .getPropertyChangeListeners()) { if (otherListener instanceof PropertyChangeListenerProxy) { final PropertyChangeListenerProxy proxy = (PropertyChangeListenerProxy)otherListener; final PropertyChangeListener proxyListener = proxy.getListener(); final String proxyPropertyName = proxy.getPropertyName(); if (proxyListener instanceof WeakPropertyChangeListener) { final WeakPropertyChangeListener weakListener = (WeakPropertyChangeListener)proxyListener; final PropertyChangeListener listenerReference = weakListener .getPropertyChangeListener(); if (listenerReference == null) { propertyChangeSupport.removePropertyChangeListener(proxyPropertyName, weakListener); } else if (proxyPropertyName.equals(propertyName)) { if (listenerReference == propertyChangeListener) { propertyChangeSupport.removePropertyChangeListener(propertyName, weakListener); } } } else if (propertyChangeListener.equals(proxyListener)) { if (proxyPropertyName.equals(propertyName)) { propertyChangeSupport.removePropertyChangeListener(propertyName, propertyChangeListener); } } } else if (otherListener instanceof WeakPropertyChangeListener) { final WeakPropertyChangeListener weakListener = (WeakPropertyChangeListener)otherListener; final PropertyChangeListener listenerReference = weakListener .getPropertyChangeListener(); if (listenerReference == null) { propertyChangeSupport.removePropertyChangeListener(weakListener); } } } } if (source instanceof Component) { final Component component = (Component)source; for (final PropertyChangeListener otherListener : component.getPropertyChangeListeners()) { if (otherListener.equals(propertyChangeListener)) { component.removePropertyChangeListener(propertyName, propertyChangeListener); } else if (otherListener instanceof WeakPropertyChangeListener) { final WeakPropertyChangeListener weakListener = (WeakPropertyChangeListener)otherListener; final PropertyChangeListener listenerReference = weakListener .getPropertyChangeListener(); if (listenerReference == null || listenerReference.equals(propertyChangeListener)) { component.removePropertyChangeListener(propertyName, propertyChangeListener); } } } } } } static void set(final Object object, final Map<String, ? extends Object> properties) { if (properties != null) { for (final Entry<String, ? extends Object> property : properties.entrySet()) { final String propertyName = property.getKey(); final Object value = property.getValue(); try { set(object, propertyName, value); } catch (final Throwable e) { Logs.error(Property.class, "Unable to set property " + propertyName, e); } } } } static void set(final Object object, final String propertyName, final Object value) { if (object != null) { if (object instanceof Record) { final Record record = (Record)object; record.setValueByPath(propertyName, value); } else if (object instanceof Map) { @SuppressWarnings("unchecked") final Map<String, Object> map = (Map<String, Object>)object; map.put(propertyName, value); } else { setSimple(object, propertyName, value); } } } /** * * * @param object * @param propertyName * @param value * @return True if the property existed. */ public static boolean setSimple(final Object object, final String propertyName, final Object value) { final PropertyDescriptor propertyDescriptor = PropertyDescriptorCache .getPropertyDescriptor(object, propertyName); if (propertyDescriptor != null) { final Class<?> propertyType = propertyDescriptor.getPropertyType(); final Method writeMethod = propertyDescriptor.getWriteMethod(); if (writeMethod != null) { Object convertedValue = DataTypes.toObject(propertyType, value); if (convertedValue == null && propertyType.isPrimitive()) { if (Number.class.isAssignableFrom(propertyType)) { convertedValue = DataTypes.toObject(propertyType, 0); } else if (Boolean.TYPE.equals(propertyType)) { convertedValue = false; } else if (Character.TYPE.equals(propertyType)) { convertedValue = ' '; } } try { writeMethod.invoke(object, convertedValue); } catch (IllegalAccessException | IllegalArgumentException e) { Exceptions.throwUncheckedException(e); } catch (final InvocationTargetException e) { final Throwable targetException = e.getTargetException(); Exceptions.throwUncheckedException(targetException); } return true; } } return false; } static String toString(final Object object, final String methodName, final List<Object> parameters) { final StringBuilder string = new StringBuilder(); if (object == null) { } else if (object instanceof Class<?>) { string.append(object); string.append('.'); } else { string.append(object.getClass()); string.append('.'); } string.append(methodName); string.append('('); for (int i = 0; i < parameters.size(); i++) { if (i > 0) { string.append(','); } final Object parameter = parameters.get(i); if (parameter == null) { string.append("null"); } else { string.append(parameter.getClass()); } } string.append(')'); string.append('\n'); string.append(parameters); return string.toString(); } static String toString(final Object object, final String methodName, final Object... parameters) { return toString(object, methodName, Arrays.asList(parameters)); } }