package org.mapdb.serializer; import org.mapdb.DataInput2; import org.mapdb.DataOutput2; import org.mapdb.Serializer; import java.io.IOException; import java.util.Arrays; import java.util.Comparator; import java.util.UUID; /** * Created by jan on 2/28/16. */ public class SerializerUUID implements GroupSerializer<java.util.UUID> { @Override public void serialize(DataOutput2 out, UUID value) throws IOException { out.writeLong(value.getMostSignificantBits()); out.writeLong(value.getLeastSignificantBits()); } @Override public UUID deserialize(DataInput2 in, int available) throws IOException { return new UUID(in.readLong(), in.readLong()); } @Override public int fixedSize() { return 16; } @Override public boolean isTrusted() { return true; } @Override public boolean equals(UUID a1, UUID a2) { //on java6 equals method is not thread safe return a1 == a2 || (a1 != null && a1.getLeastSignificantBits() == a2.getLeastSignificantBits() && a1.getMostSignificantBits() == a2.getMostSignificantBits()); } @Override public int hashCode(UUID uuid, int seed) { //on java6 uuid.hashCode is not thread safe. This is workaround long a = uuid.getLeastSignificantBits() ^ uuid.getMostSignificantBits(); return ((int) (a >> 32)) ^ (int) a; } @Override public int valueArraySearch(Object keys, UUID key) { return Arrays.binarySearch(valueArrayToArray(keys), key); } @Override public int valueArraySearch(Object keys, UUID key, Comparator comparator) { return Arrays.binarySearch(valueArrayToArray(keys), key, comparator); } @Override public void valueArraySerialize(DataOutput2 out, Object vals) throws IOException { for (long o : (long[]) vals) { out.writeLong(o); } } @Override public Object valueArrayDeserialize(DataInput2 in, int size) throws IOException { size *= 2; long[] ret = new long[size]; for (int i = 0; i < size; i++) { ret[i] = in.readLong(); } return ret; } @Override public UUID valueArrayGet(Object vals, int pos) { long[] v = (long[]) vals; pos *= 2; return new UUID(v[pos++], v[pos]); } @Override public int valueArraySize(Object vals) { return ((long[]) vals).length / 2; } @Override public Object valueArrayEmpty() { return new long[0]; } @Override public Object valueArrayPut(Object vals, int pos, UUID newValue) { pos *= 2; long[] array = (long[]) vals; final long[] ret = Arrays.copyOf(array, array.length + 2); if (pos < array.length) { System.arraycopy(array, pos, ret, pos + 2, array.length - pos); } ret[pos++] = newValue.getMostSignificantBits(); ret[pos] = newValue.getLeastSignificantBits(); return ret; } @Override public Object valueArrayUpdateVal(Object vals, int pos, UUID newValue) { pos *= 2; long[] vals2 = ((long[]) vals).clone(); vals2[pos++] = newValue.getMostSignificantBits(); vals2[pos] = newValue.getLeastSignificantBits(); return vals2; } @Override public Object valueArrayFromArray(Object[] objects) { long[] ret = new long[objects.length * 2]; int pos = 0; for (Object o : objects) { UUID uuid = (java.util.UUID) o; ret[pos++] = uuid.getMostSignificantBits(); ret[pos++] = uuid.getLeastSignificantBits(); } return ret; } @Override public Object valueArrayCopyOfRange(Object vals, int from, int to) { return Arrays.copyOfRange((long[]) vals, from * 2, to * 2); } @Override public Object valueArrayDeleteValue(Object vals, int pos) { pos *= 2; long[] valsOrig = (long[]) vals; long[] vals2 = new long[valsOrig.length - 2]; System.arraycopy(vals, 0, vals2, 0, pos - 2); System.arraycopy(vals, pos, vals2, pos - 2, vals2.length - (pos - 2)); return vals2; } // // @Override // public BTreeKeySerializer getBTreeKeySerializer(Comparator comparator) { // if(comparator!=null && comparator!=Fun.COMPARATOR) { // return super.getBTreeKeySerializer(comparator); // } // return BTreeKeySerializer.UUID; // } }