package com.revolsys.io.page;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import com.revolsys.util.Exceptions;
public class SerializablePageValueManager<T> implements PageValueManager<T> {
@Override
public void disposeBytes(final byte[] bytes) {
}
@Override
public byte[] getBytes(final Page page) {
final byte[] bytes = MethodPageValueManager.getIntBytes(page);
final int size = MethodPageValueManager.getIntValue(bytes);
final byte[] valueBytes = new byte[size + 4];
System.arraycopy(bytes, 0, valueBytes, 0, 4);
page.readBytes(valueBytes, 4, size);
return null;
}
@Override
public byte[] getBytes(final T value) {
try {
final ByteArrayOutputStream bOut = new ByteArrayOutputStream();
final ObjectOutputStream out = new ObjectOutputStream(bOut);
out.writeObject(value);
out.close();
final byte[] valueBytes = bOut.toByteArray();
final int size = valueBytes.length;
final byte[] sizeBytes = MethodPageValueManager.getValueIntBytes(size);
final byte[] bytes = new byte[valueBytes.length + sizeBytes.length];
System.arraycopy(sizeBytes, 0, bytes, 0, sizeBytes.length);
System.arraycopy(valueBytes, 0, bytes, sizeBytes.length, valueBytes.length);
return bytes;
} catch (final Exception e) {
return (byte[])Exceptions.throwUncheckedException(e);
}
}
@Override
@SuppressWarnings("unchecked")
public <V extends T> V getValue(final byte[] bytes) {
try {
final ByteArrayInputStream bIn = new ByteArrayInputStream(bytes, 4, bytes.length - 4);
final ObjectInputStream in = new ObjectInputStream(bIn);
return (V)in.readObject();
} catch (final Exception e) {
return (V)Exceptions.throwUncheckedException(e);
}
}
@Override
public <V extends T> V readFromPage(final Page page) {
final byte[] bytes = getBytes(page);
return getValue(bytes);
}
}