package com.kryptnostic.rhizome.hazelcast.processors;
import java.util.Collection;
import java.util.Map.Entry;
import com.kryptnostic.rhizome.hazelcast.objects.SetProxy;
public class AbstractRemover<K, V extends Collection<T>, T> extends AbstractRhizomeEntryProcessor<K, V, Void> {
private static final long serialVersionUID = 1500519104651067092L;
protected final Iterable<T> objectsToRemove;
protected AbstractRemover( Iterable<T> objectsToRemove ) {
this.objectsToRemove = objectsToRemove;
}
@Override
public Void process( Entry<K, V> entry ) {
V currentObjects = entry.getValue();
if ( currentObjects != null ) {
for( T objectToRemove : objectsToRemove ) {
currentObjects.remove( objectToRemove );
}
}
//Don't trigger re-serialization if handled by SetProxy.
if ( !( currentObjects instanceof SetProxy<?, ?> ) ) {
entry.setValue( currentObjects );
}
//TODO cassandra is not distinguishing null value and empty collection right now; this line should be removed as soon as cassandra fixes NPE in https://github.com/apache/cassandra/pull/98
if( currentObjects.isEmpty() ){
entry.setValue( null );
}
return null;
}
public Iterable<T> getBackingCollection() {
return objectsToRemove;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ( ( objectsToRemove == null ) ? 0 : objectsToRemove.hashCode() );
return result;
}
@Override
public boolean equals( Object obj ) {
if ( this == obj ) {
return true;
}
if ( obj == null ) {
return false;
}
if ( !( obj instanceof AbstractRemover ) ) {
return false;
}
AbstractRemover<?, ?, ?> other = (AbstractRemover<?, ?, ?>) obj;
if ( objectsToRemove == null ) {
if ( other.objectsToRemove != null ) {
return false;
}
} else if ( !objectsToRemove.equals( other.objectsToRemove ) ) {
return false;
}
return true;
}
}