package io.ebeaninternal.server.type;
import io.ebeaninternal.server.core.BasicTypeConverter;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.sql.SQLException;
import java.sql.Types;
import java.util.UUID;
public class ScalarTypeUUIDBinary extends ScalarTypeUUIDBase {
protected ScalarTypeUUIDBinary() {
super(false, Types.BINARY);
}
@Override
public int getLength() {
return 16;
}
@Override
public Object toJdbcType(Object value) {
return convertToBytes(value);
}
@Override
public UUID toBeanType(Object value) {
if (value instanceof byte[]) {
return convertFromBytes((byte[]) value);
} else {
return BasicTypeConverter.toUUID(value);
}
}
@Override
public void bind(DataBind b, UUID value) throws SQLException {
if (value == null) {
b.setNull(Types.BINARY);
} else {
b.setBytes(convertToBytes(value));
}
}
@Override
public UUID read(DataReader dataReader) throws SQLException {
byte[] bytes = dataReader.getBytes();
if (bytes == null) {
return null;
} else {
return convertFromBytes(bytes);
}
}
/**
* Convert from byte[] to UUID.
*/
public static UUID convertFromBytes(byte[] bytes) {
int usableBytes = Math.min(bytes.length, 16);
// Need exactly 16 bytes - pad the input if not enough bytes are provided
// Use provided bytes in the least significant position; if more than 16 bytes are given,
// then use the first 16 bytes from the array;
byte[] barr = new byte[16];
for (int i = 15, j = usableBytes - 1; j >= 0; i--, j--) {
barr[i] = bytes[j];
}
ByteArrayInputStream bais = new ByteArrayInputStream(barr);
DataInputStream inputStream = new DataInputStream(bais);
try {
long msb = inputStream.readLong();
long lsb = inputStream.readLong();
return new UUID(msb, lsb);
} catch (IOException e) {
throw new RuntimeException("Not Expecting this", e);
}
}
/**
* Convert from UUID to byte[].
*/
public static byte[] convertToBytes(Object value) {
UUID uuid = (UUID) value;
ByteArrayOutputStream baos = new ByteArrayOutputStream(16);
DataOutputStream outputStream = new DataOutputStream(baos);
try {
outputStream.writeLong(uuid.getMostSignificantBits());
outputStream.writeLong(uuid.getLeastSignificantBits());
} catch (IOException e) {
throw new RuntimeException("Not Expecting this", e);
}
return baos.toByteArray();
}
}