package org.infinispan.test.concurrent;
import java.util.concurrent.atomic.AtomicInteger;
import org.hamcrest.Matcher;
/**
* Default {@link InvocationMatcher} implementation.
*
* @author Dan Berindei
* @since 7.0
*/
public class DefaultInvocationMatcher implements InvocationMatcher {
private final String methodName;
private final Matcher instanceMatcher;
private final Matcher[] argumentMatchers;
private final int matchCount;
private final AtomicInteger matches = new AtomicInteger();
public DefaultInvocationMatcher(String methodName) {
this(methodName, null, -1, null);
}
public DefaultInvocationMatcher(String methodName, Matcher instanceMatcher, int matchCount, Matcher... argumentMatchers) {
this.methodName = methodName;
this.instanceMatcher = instanceMatcher;
this.argumentMatchers = argumentMatchers;
this.matchCount = matchCount;
}
@Override
public boolean accept(Object instance, String methodName, Object[] arguments) {
if (!methodName.equals(this.methodName))
return false;
if (instanceMatcher != null && !instanceMatcher.matches(instance))
return false;
if (argumentMatchers != null) {
for (int i = 0; i < argumentMatchers.length; i++) {
if (argumentMatchers[i] != null && !argumentMatchers[i].matches(arguments[i]))
return false;
}
}
if (matchCount >= 0 && matches.getAndIncrement() != matchCount) {
return false;
}
return true;
}
}