package com.kryptnostic.rhizome.hazelcast.serializers; import java.io.IOException; import java.util.LinkedHashSet; import java.util.Set; import java.util.UUID; import com.google.common.collect.Iterables; import com.google.common.collect.Sets; import com.hazelcast.nio.ObjectDataInput; import com.hazelcast.nio.ObjectDataOutput; import com.kryptnostic.rhizome.hazelcast.objects.OrderedUUIDSet; import com.kryptnostic.rhizome.hazelcast.objects.UUIDSet; public class SetStreamSerializers { public static <T> void serialize( ObjectDataOutput out, Set<T> elements, IoPerformingConsumer<T> c ) throws IOException { out.writeInt( elements.size() ); for ( T elem : elements ) { c.accept( elem ); } } /** * This method is useful for re-using static serialization helpers to write out set elements. * * @param out * @param elements * @param c * @throws IOException */ public static <T> void serialize( ObjectDataOutput out, Set<T> elements, IoPerformingBiConsumer<ObjectDataOutput, T> c ) throws IOException { out.writeInt( elements.size() ); for ( T elem : elements ) { c.accept( out, elem ); } } public static <T> void serialize( ObjectDataOutput out, Iterable<T> elements, IoPerformingConsumer<T> c ) throws IOException { // Iterables correctly does collections efficiently. out.writeInt( Iterables.size( elements ) ); for ( T elem : elements ) { c.accept( elem ); } } public static void fastUUIDSetSerialize( ObjectDataOutput out, Iterable<UUID> object ) throws IOException { long[] least = new long[ Iterables.size( object ) ]; long[] most = new long[ Iterables.size( object ) ]; int i = 0; for ( UUID uuid : object ) { least[ i ] = uuid.getLeastSignificantBits(); most[ i ] = uuid.getMostSignificantBits(); i++; } out.writeInt( i ); out.writeLongArray( least ); out.writeLongArray( most ); } public static OrderedUUIDSet fastOrderedUUIDSetDeserialize( ObjectDataInput in ) throws IOException { int size = in.readInt(); OrderedUUIDSet set = new OrderedUUIDSet( size ); return (OrderedUUIDSet) processEntries( set, size, in ); } public static UUIDSet fastUUIDSetDeserialize( ObjectDataInput in ) throws IOException { int size = in.readInt(); UUIDSet set = new UUIDSet( size ); return (UUIDSet) processEntries( set, size, in ); } private static Set<UUID> processEntries( Set<UUID> set, int size, ObjectDataInput in ) throws IOException { long[] least = in.readLongArray(); long[] most = in.readLongArray(); for ( int i = 0; i < size; i++ ) { set.add( new UUID( most[ i ], least[ i ] ) ); } return set; } public static <T> Set<T> deserialize( ObjectDataInput in, IoPerformingFunction<ObjectDataInput, T> f ) throws IOException { int size = in.readInt(); return deserialize( in, Sets.newHashSetWithExpectedSize( size ), size, f ); } public static <T> LinkedHashSet<T> orderedDeserialize( ObjectDataInput in, IoPerformingFunction<ObjectDataInput, T> f ) throws IOException { int size = in.readInt(); return deserialize( in, Sets.newLinkedHashSetWithExpectedSize( size ), size, f ); } public static <T, S extends Set<T>> S deserialize( ObjectDataInput in, S set, int size, IoPerformingFunction<ObjectDataInput, T> f ) throws IOException { for ( int i = 0; i < size; ++i ) { T elem = f.apply( in ); if ( elem != null ) { set.add( elem ); } } return set; } public static void fastStringSetSerialize( ObjectDataOutput out, Iterable<String> object ) throws IOException { int size = Iterables.size( object ); out.writeInt( size ); for ( String item : object ) { out.writeUTF( item ); } } public static Set<String> fastStringSetDeserialize( ObjectDataInput in ) throws IOException { int size = in.readInt(); Set<String> items = Sets.newHashSetWithExpectedSize( size ); for ( int i = 0; i < size; i++ ) { items.add( in.readUTF() ); } return items; } }