package org.infinispan.commands.write;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
import java.util.Collection;
import java.util.Collections;
import org.infinispan.commands.AbstractTopologyAffectedCommand;
import org.infinispan.commands.Visitor;
import org.infinispan.container.DataContainer;
import org.infinispan.context.InvocationContext;
import org.infinispan.context.impl.FlagBitSets;
import org.infinispan.notifications.cachelistener.CacheNotifier;
/**
* @author Mircea.Markus@jboss.com
* @since 4.0
*/
public class ClearCommand extends AbstractTopologyAffectedCommand implements WriteCommand {
public static final byte COMMAND_ID = 5;
private CacheNotifier<Object, Object> notifier;
private DataContainer<?,?> dataContainer;
public ClearCommand() {
}
public ClearCommand(CacheNotifier<Object, Object> notifier, DataContainer<?, ?> dataContainer, long flagsBitSet) {
this.notifier = notifier;
this.dataContainer = dataContainer;
setFlagsBitSet(flagsBitSet);
}
public void init(CacheNotifier<Object, Object> notifier, DataContainer<?, ?> dataContainer) {
this.notifier = notifier;
this.dataContainer = dataContainer;
}
@Override
public Object acceptVisitor(InvocationContext ctx, Visitor visitor) throws Throwable {
return visitor.visitClearCommand(ctx, this);
}
@Override
public Object perform(InvocationContext ctx) throws Throwable {
dataContainer.iterator().forEachRemaining(e ->
notifier.notifyCacheEntryRemoved(e.getKey(), e.getValue(), e.getMetadata(), true, ctx, this));
return null;
}
@Override
public byte getCommandId() {
return COMMAND_ID;
}
@Override
public void writeTo(ObjectOutput output) throws IOException {
output.writeLong(FlagBitSets.copyWithoutRemotableFlags(getFlagsBitSet()));
}
@Override
public void readFrom(ObjectInput input) throws IOException, ClassNotFoundException {
setFlagsBitSet(input.readLong());
}
@Override
public String toString() {
return new StringBuilder()
.append("ClearCommand{flags=")
.append(printFlags())
.append("}")
.toString();
}
@Override
public boolean isSuccessful() {
return true;
}
@Override
public boolean isConditional() {
return false;
}
@Override
public ValueMatcher getValueMatcher() {
return ValueMatcher.MATCH_ALWAYS;
}
@Override
public void setValueMatcher(ValueMatcher valueMatcher) {
// Do nothing
}
@Override
public Collection<?> getAffectedKeys() {
return Collections.emptySet();
}
@Override
public void fail() {
throw new UnsupportedOperationException();
}
@Override
public boolean isReturnValueExpected() {
return false;
}
@Override
public boolean canBlock() {
return true;
}
@Override
public LoadType loadType() {
return LoadType.DONT_LOAD;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
ClearCommand that = (ClearCommand) o;
if (getTopologyId() != that.getTopologyId()) return false;
return getFlagsBitSet() == that.getFlagsBitSet();
}
@Override
public int hashCode() {
int result = getTopologyId();
long flags = getFlagsBitSet();
result = 31 * result + (int) (flags ^ (flags >>> 32));
return result;
}
}