package com.orbitz.monitoring.lib.decomposer; import org.apache.commons.beanutils.DynaProperty; import org.apache.commons.beanutils.LazyDynaBean; import org.apache.commons.beanutils.MethodUtils; import org.apache.commons.beanutils.WrapDynaBean; import org.apache.commons.beanutils.WrapDynaClass; import java.io.Serializable; import java.lang.reflect.Method; import java.util.IdentityHashMap; /** * Given an object, this class reflects over its JavaBean attributes and creates a Serializable * representation containing serializable versions of the JavaBean attributes. * * @author Doug Barth */ class ReflectiveDecomposer extends AbstractAttributeDecomposerStep { private final AttributeDecomposer.Step _delegate; public ReflectiveDecomposer(final AttributeDecomposer.Step delegate) { _delegate = delegate; } @Override Serializable createMutableContainer(final Object o) { return new LazyDynaBean(); } /** * Will decompose only if the Object is Serializable * @param o object to decompose * @param container Serializable container * @param alreadyDecomposed hashmap of decomposed objects */ @Override void decomposeInto(final Object o, final Serializable container, final IdentityHashMap<Object, Serializable> alreadyDecomposed) { LazyDynaBean decomposed = (LazyDynaBean)container; WrapDynaBean bean = new WrapDynaBean(o); WrapDynaClass dynaClass = (WrapDynaClass)bean.getDynaClass(); for (DynaProperty property : dynaClass.getDynaProperties()) { String name = property.getName(); Method readMethod = dynaClass.getPropertyDescriptor(name).getReadMethod(); if (MethodUtils.getAccessibleMethod(readMethod) != null) { Object beanProperty; try { beanProperty = bean.get(name); } catch (RuntimeException e) { throw new RuntimeException("Unable to decompose " + o.getClass().getName() + "." + name, e); } Serializable decomposedProperty = _delegate.decompose(beanProperty, alreadyDecomposed); decomposed.set(name, decomposedProperty); } } } }