package de.axone.cache.ng;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.function.Function;
import de.axone.cache.ng.CacheNG.CacheKey;
import de.axone.cache.ng.CacheNG.HasCacheKey;
public final class CacheKeyBuilder implements CacheKey, Serializable, HasCacheKey {
private final Collection<Object> theKey;
private CacheKeyBuilder( Collection<Object> newKey ){
this.theKey = newKey;
}
private static CacheKeyBuilder unordered(){
return new CacheKeyBuilder( new HashSet<Object>() );
}
public static CacheKeyBuilder unordered( Class<?> clazz ){
return new CacheKeyBuilder( new HashSet<Object>( 8 ) )
.add( clazz );
}
public static CacheKeyBuilder ordered( Class<?> clazz ){
return new CacheKeyBuilder( new ArrayList<Object>( 8 ) )
.add( clazz );
}
public CacheKeyBuilder add( Object o ){
theKey.add( o );
return this;
}
public <T> CacheKeyBuilder addMayBeNull( T o, Function<T,?> accessor ){
if( o == null ) add( null );
return add( accessor.apply( o ) );
}
public CacheKeyBuilder addKey( HasCacheKey o ){
theKey.add( o != null ? o.cacheKey() : null );
return this;
}
public CacheKeyBuilder addAll( Object ... os ){
for( Object o : os ) add( o );
return this;
}
public CacheKeyBuilder addKeysSorted( HasCacheKey ... os ){
for( HasCacheKey o : os ) addKey( o );
return this;
}
public CacheKeyBuilder addKeysIgnoreOrder( HasCacheKey ... os ){
CacheKeyBuilder unordered = unordered();
for( HasCacheKey o : os ) unordered.addKey( o );
return addKey( unordered );
}
public CacheKeyBuilder addKeysSorted( Iterable<? extends HasCacheKey> os ){
for( HasCacheKey o : os ) addKey( o );
return this;
}
public CacheKeyBuilder addKeysIgnoreOrder( Iterable<? extends HasCacheKey> os ){
CacheKeyBuilder unordered = unordered();
for( HasCacheKey o : os ) unordered.addKey( o );
return addKey( unordered );
}
@Override
public int hashCode() {
return theKey.hashCode();
}
@Override
public boolean equals( Object obj ) {
if( this == obj ) return true;
if( obj == null ) return false;
if( obj.getClass() != this.getClass() ) return false;
CacheKeyBuilder other = (CacheKeyBuilder) obj;
return theKey.equals( other.theKey );
}
@Override
public Object cacheKey() {
return theKey;
}
@Override
public String toString() {
return String.format( "[0x%08x]", theKey.hashCode() );
}
}