package org.infinispan.test.concurrent; import java.util.concurrent.atomic.AtomicInteger; import org.infinispan.commands.DataCommand; import org.infinispan.commands.ReplicableCommand; import org.infinispan.commands.remote.CacheRpcCommand; import org.infinispan.remoting.transport.Address; /** * Generic {@link CommandMatcher} implementation that can use both {@link CacheRpcCommand} criteria (cache name, origin) * and {@link DataCommand} criteria (key). * * @author Dan Berindei * @since 7.0 */ public class DefaultCommandMatcher implements CommandMatcher { public static final Address LOCAL_ORIGIN_PLACEHOLDER = new AddressPlaceholder(); public static final Address ANY_REMOTE_PLACEHOLDER = new AddressPlaceholder(); private final Class<? extends ReplicableCommand> commandClass; private final String cacheName; private final Address origin; private final Object key; private final AtomicInteger actualMatchCount = new AtomicInteger(0); public DefaultCommandMatcher(Class<? extends ReplicableCommand> commandClass) { this(commandClass, null, null, null); } public DefaultCommandMatcher(Class<? extends CacheRpcCommand> commandClass, String cacheName, Address origin) { this(commandClass, cacheName, origin, null); } public DefaultCommandMatcher(Class<? extends DataCommand> commandClass, Object key) { this(commandClass, null, null, key); } DefaultCommandMatcher(Class<? extends ReplicableCommand> commandClass, String cacheName, Address origin, Object key) { this.commandClass = commandClass; this.cacheName = cacheName; this.origin = origin; this.key = key; } @Override public boolean accept(ReplicableCommand command) { if (commandClass != null && !commandClass.equals(command.getClass())) return false; if (cacheName != null && !cacheName.equals(((CacheRpcCommand) command).getCacheName().toString())) { return false; } if (origin != null && !addressMatches((CacheRpcCommand) command)) return false; if (key != null && !key.equals(((DataCommand) command).getKey())) return false; return true; } private boolean addressMatches(CacheRpcCommand command) { Address commandOrigin = command.getOrigin(); if (origin == LOCAL_ORIGIN_PLACEHOLDER) return commandOrigin == null; else if (origin == ANY_REMOTE_PLACEHOLDER) return commandOrigin != null; else return !origin.equals(commandOrigin); } private static class AddressPlaceholder implements Address { @Override public int compareTo(Address o) { throw new UnsupportedOperationException("This address should never be part of a view"); } } }