package cn.jimmyshi.beanquery;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import org.hamcrest.BaseMatcher;
import org.hamcrest.Description;
import org.hamcrest.Matcher;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class BeanPropertyMatcher<T> extends BaseMatcher<T> {
private transient Logger logger = LoggerFactory.getLogger(BeanPropertyMatcher.class);
private String property;
private Matcher<?> matcher;
public BeanPropertyMatcher(String property, Matcher<?> matcher) {
this.property = property;
this.matcher = matcher;
}
public boolean matches(Object item) {
Object propertyValue = DefaultNullValuePropertyValueGetter.getProperty(item, property);
try {
return matcher.matches(propertyValue);
} catch (Exception ex) {
logger.info("Exception [{}] when matching value [{}] (property [{}] of item [{}]) with matcher [{}]",ex.toString(), propertyValue,
property, item, matcher);
return false;
}
}
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE, false);
}
@Override
public void describeTo(Description description) {
description.appendText(toString());
}
}