package org.infinispan.objectfilter.impl.predicateindex;
import java.util.Iterator;
import org.infinispan.objectfilter.impl.util.ReflectionHelper;
/**
* @author anistor@redhat.com
* @since 7.0
*/
public final class ReflectionMatcherEvalContext extends MatcherEvalContext<Class<?>, ReflectionHelper.PropertyAccessor, String> {
private final Class<?> entityType;
public ReflectionMatcherEvalContext(Object userContext, Object eventType, Object instance) {
super(userContext, eventType, instance);
entityType = instance.getClass();
}
@Override
public Class<?> getEntityType() {
return entityType;
}
@Override
protected void processAttributes(AttributeNode<ReflectionHelper.PropertyAccessor, String> node, Object instance) {
for (AttributeNode<ReflectionHelper.PropertyAccessor, String> childAttribute : node.getChildren()) {
if (instance == null) {
processAttribute(childAttribute, null);
} else {
ReflectionHelper.PropertyAccessor accessor = childAttribute.getMetadata();
if (accessor.isMultiple()) {
Iterator valuesIt = accessor.getValueIterator(instance);
if (valuesIt == null) {
// try to evaluate eventual 'is null' predicates for this null collection
processAttribute(childAttribute, null);
} else {
while (valuesIt.hasNext()) {
Object attributeValue = valuesIt.next();
processAttribute(childAttribute, attributeValue);
}
}
} else {
Object attributeValue = accessor.getValue(instance);
processAttribute(childAttribute, attributeValue);
}
}
}
}
private void processAttribute(AttributeNode<ReflectionHelper.PropertyAccessor, String> attributeNode, Object attributeValue) {
attributeNode.processValue(attributeValue, this);
processAttributes(attributeNode, attributeValue);
}
}