package ameba.message.filtering;
import ameba.message.internal.BeanPathProperties;
import ameba.util.bean.BeanInvoker;
import ameba.util.bean.BeanMap;
import ameba.util.bean.BeanTransformer;
import java.util.Set;
/**
* <p>FilteringBeanMap class.</p>
*
* @author icode
*
*/
public class FilteringBeanMap<T> extends BeanMap<T> {
private static final BeanTransformer<FilteringBeanMap> TRANSFORMER = new Transformer();
private BeanPathProperties pathProperties;
/**
* <p>Constructor for FilteringBeanMap.</p>
*
* @param bean a T object.
* @param pathProperties a {@link ameba.message.internal.BeanPathProperties} object.
*/
public FilteringBeanMap(T bean, final BeanPathProperties pathProperties) {
transformer = TRANSFORMER;
this.pathProperties = pathProperties;
this.bean = bean;
initialise();
}
private FilteringBeanMap(T bean) {
this(bean, null);
}
/**
* <p>from.</p>
*
* @param src a {@link java.lang.Object} object.
* @param pathProperties a {@link ameba.message.internal.BeanPathProperties} object.
* @return a {@link java.lang.Object} object.
*/
public static Object from(Object src, final BeanPathProperties pathProperties) {
return new Transformer() {
@Override
protected FilteringBeanMap onTransform(Object obj) {
return new FilteringBeanMap<>(obj, pathProperties);
}
}.transform(src);
}
/** {@inheritDoc} */
@Override
protected Object transform(BeanInvoker invoker) throws Throwable {
Object o = super.transform(invoker);
if (o instanceof FilteringBeanMap) {
final BeanPathProperties pathProperties = new BeanPathProperties();
if (this.pathProperties != null) {
pathProperties.put(null, pathProperties.getProperties(invoker.getPropertyName()));
((FilteringBeanMap) o).pathProperties = pathProperties;
}
}
return o;
}
/** {@inheritDoc} */
@Override
protected String transformPropertyName(final String name) {
if (pathProperties != null) {
Set<String> props = pathProperties.getProperties(null);
if (!props.contains("*") && !props.contains(name)) {
return null;
}
}
return super.transformPropertyName(name);
}
private static class Transformer extends BeanTransformer<FilteringBeanMap> {
@Override
protected FilteringBeanMap onTransform(Object obj) {
return new FilteringBeanMap<>(obj);
}
}
}