com.yahoo.vespa.objects.BufferSerializer Maven / Gradle / Ivy
// Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.vespa.objects;
import com.yahoo.io.GrowableByteBuffer;
import com.yahoo.text.Utf8;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
/**
* @author baldersheim
*/
public class BufferSerializer implements Serializer, Deserializer {
protected GrowableByteBuffer buf;
public BufferSerializer(GrowableByteBuffer buf) { this.buf = buf; }
public BufferSerializer(ByteBuffer buf) { this(new GrowableByteBuffer(buf)); }
public BufferSerializer(byte [] buf) { this(ByteBuffer.wrap(buf)); }
public BufferSerializer() { this(new GrowableByteBuffer()); }
public static BufferSerializer wrap(byte [] buf) { return new BufferSerializer(buf); }
public final GrowableByteBuffer getBuf() { return buf; }
protected final void setBuf(GrowableByteBuffer buf) { this.buf = buf; }
public Serializer putByte(FieldBase field, byte value) { buf.put(value); return this; }
public Serializer putShort(FieldBase field, short value) { buf.putShort(value); return this; }
public Serializer putInt(FieldBase field, int value) { buf.putInt(value); return this; }
public Serializer putLong(FieldBase field, long value) { buf.putLong(value); return this; }
public Serializer putFloat(FieldBase field, float value) { buf.putFloat(value); return this; }
public Serializer putDouble(FieldBase field, double value) { buf.putDouble(value); return this; }
public Serializer put(FieldBase field, byte[] value) { buf.put(value); return this; }
public Serializer put(FieldBase field, String value) {
byte [] utf8 = createUTF8CharArray(value);
putInt(null, utf8.length+1);
put(null, utf8);
putByte(null, (byte) 0);
return this;
}
public Serializer put(FieldBase field, ByteBuffer value) { buf.put(value); return this; }
public Serializer putInt1_4Bytes(FieldBase field, int value) { buf.putInt1_4Bytes(value); return this; }
public Serializer putInt2_4_8Bytes(FieldBase field, long value) { buf.putInt2_4_8Bytes(value); return this; }
public int position() { return buf.position(); }
public ByteOrder order() { return buf.order(); }
public void position(int pos) { buf.position(pos); }
public void order(ByteOrder v) { buf.order(v); }
public void flip() { buf.flip(); }
public byte getByte(FieldBase field) { return buf.getByteBuffer().get(); }
public short getShort(FieldBase field) { return buf.getByteBuffer().getShort(); }
public int getInt(FieldBase field) { return buf.getByteBuffer().getInt(); }
public long getLong(FieldBase field) { return buf.getByteBuffer().getLong(); }
public float getFloat(FieldBase field) { return buf.getByteBuffer().getFloat(); }
public double getDouble(FieldBase field) { return buf.getByteBuffer().getDouble(); }
public byte [] getBytes(FieldBase field, int length) {
if (buf.remaining() < length) {
throw new IllegalArgumentException("Wanted " + length + " bytes, but I only had " + buf.remaining());
}
byte [] bbuf =new byte [length];
buf.getByteBuffer().get(bbuf);
return bbuf;
}
public String getString(FieldBase field) {
int length = getInt(null);
byte[] stringArray = new byte[length-1];
buf.get(stringArray);
getByte(null);
return Utf8.toString(stringArray);
}
public int getInt1_4Bytes(FieldBase field) { return buf.getInt1_4Bytes(); }
public int getInt1_2_4Bytes(FieldBase field) { return buf.getInt1_2_4Bytes(); }
public long getInt2_4_8Bytes(FieldBase field) { return buf.getInt2_4_8Bytes(); }
public int remaining() { return buf.remaining(); }
public static byte[] createUTF8CharArray(String input) {
if (input == null || input.length() < 1) {
return new byte[0];
}
return Utf8.toBytes(input);
}
}