use of org.infinispan.protostream.impl.BaseMarshallerDelegate in project protostream by infinispan.
the class WrappedMessage method readMessage.
private static <T> T readMessage(ImmutableSerializationContext ctx, TagReader in, boolean nulls) throws IOException {
String typeName = null;
Integer typeId = null;
int enumValue = -1;
byte[] messageBytes = null;
Object value = null;
int fieldCount = 0;
int expectedFieldCount = 1;
int tag;
out: while ((tag = in.readTag()) != 0) {
fieldCount++;
switch(tag) {
case WRAPPED_CONTAINER_SIZE << WireType.TAG_TYPE_NUM_BITS | WireType.WIRETYPE_VARINT:
case WRAPPED_CONTAINER_TYPE_ID << WireType.TAG_TYPE_NUM_BITS | WireType.WIRETYPE_VARINT:
case WRAPPED_CONTAINER_TYPE_NAME << WireType.TAG_TYPE_NUM_BITS | WireType.WIRETYPE_LENGTH_DELIMITED:
case WRAPPED_CONTAINER_MESSAGE << WireType.TAG_TYPE_NUM_BITS | WireType.WIRETYPE_LENGTH_DELIMITED:
{
expectedFieldCount = 1;
value = readContainer(ctx, in, tag);
break out;
}
case WRAPPED_EMPTY << WireType.TAG_TYPE_NUM_BITS | WireType.WIRETYPE_VARINT:
{
if (!nulls) {
throw new IllegalStateException("Encountered a null message but nulls are not accepted");
}
expectedFieldCount = 1;
// We ignore the actual boolean value! Will be returning null anyway.
in.readBool();
break out;
}
case WRAPPED_TYPE_NAME << WireType.TAG_TYPE_NUM_BITS | WireType.WIRETYPE_LENGTH_DELIMITED:
{
expectedFieldCount = 2;
typeName = in.readString();
break;
}
case WRAPPED_TYPE_ID << WireType.TAG_TYPE_NUM_BITS | WireType.WIRETYPE_VARINT:
{
expectedFieldCount = 2;
typeId = mapTypeIdIn(in.readInt32(), ctx);
break;
}
case WRAPPED_ENUM << WireType.TAG_TYPE_NUM_BITS | WireType.WIRETYPE_VARINT:
{
expectedFieldCount = 2;
enumValue = in.readEnum();
break;
}
case WRAPPED_MESSAGE << WireType.TAG_TYPE_NUM_BITS | WireType.WIRETYPE_LENGTH_DELIMITED:
{
expectedFieldCount = 2;
messageBytes = in.readByteArray();
break;
}
case WRAPPED_STRING << WireType.TAG_TYPE_NUM_BITS | WireType.WIRETYPE_LENGTH_DELIMITED:
{
expectedFieldCount = 1;
value = in.readString();
break out;
}
case WRAPPED_CHAR << WireType.TAG_TYPE_NUM_BITS | WireType.WIRETYPE_VARINT:
{
expectedFieldCount = 1;
value = (char) in.readInt32();
break out;
}
case WRAPPED_SHORT << WireType.TAG_TYPE_NUM_BITS | WireType.WIRETYPE_VARINT:
{
expectedFieldCount = 1;
value = (short) in.readInt32();
break out;
}
case WRAPPED_BYTE << WireType.TAG_TYPE_NUM_BITS | WireType.WIRETYPE_VARINT:
{
expectedFieldCount = 1;
value = (byte) in.readInt32();
break out;
}
case WRAPPED_DATE_MILLIS << WireType.TAG_TYPE_NUM_BITS | WireType.WIRETYPE_VARINT:
{
expectedFieldCount = 1;
value = new Date(in.readInt64());
break out;
}
case WRAPPED_INSTANT_SECONDS << WireType.TAG_TYPE_NUM_BITS | WireType.WIRETYPE_VARINT:
{
expectedFieldCount = 2;
long seconds = in.readInt64();
value = value == null ? Instant.ofEpochSecond(seconds, 0) : Instant.ofEpochSecond(seconds, ((Instant) value).getNano());
break;
}
case WRAPPED_INSTANT_NANOS << WireType.TAG_TYPE_NUM_BITS | WireType.WIRETYPE_VARINT:
{
expectedFieldCount = 2;
int nanos = in.readInt32();
value = value == null ? Instant.ofEpochSecond(0, nanos) : Instant.ofEpochSecond(((Instant) value).getEpochSecond(), nanos);
break;
}
case WRAPPED_BYTES << WireType.TAG_TYPE_NUM_BITS | WireType.WIRETYPE_LENGTH_DELIMITED:
{
expectedFieldCount = 1;
value = in.readByteArray();
break out;
}
case WRAPPED_BOOL << WireType.TAG_TYPE_NUM_BITS | WireType.WIRETYPE_VARINT:
{
expectedFieldCount = 1;
value = in.readBool();
break out;
}
case WRAPPED_DOUBLE << WireType.TAG_TYPE_NUM_BITS | WireType.WIRETYPE_FIXED64:
{
expectedFieldCount = 1;
value = in.readDouble();
break out;
}
case WRAPPED_FLOAT << WireType.TAG_TYPE_NUM_BITS | WireType.WIRETYPE_FIXED32:
{
expectedFieldCount = 1;
value = in.readFloat();
break out;
}
case WRAPPED_FIXED32 << WireType.TAG_TYPE_NUM_BITS | WireType.WIRETYPE_FIXED32:
{
expectedFieldCount = 1;
value = in.readFixed32();
break out;
}
case WRAPPED_SFIXED32 << WireType.TAG_TYPE_NUM_BITS | WireType.WIRETYPE_FIXED32:
{
expectedFieldCount = 1;
value = in.readSFixed32();
break out;
}
case WRAPPED_FIXED64 << WireType.TAG_TYPE_NUM_BITS | WireType.WIRETYPE_FIXED64:
{
expectedFieldCount = 1;
value = in.readFixed64();
break out;
}
case WRAPPED_SFIXED64 << WireType.TAG_TYPE_NUM_BITS | WireType.WIRETYPE_FIXED64:
{
expectedFieldCount = 1;
value = in.readSFixed64();
break out;
}
case WRAPPED_INT64 << WireType.TAG_TYPE_NUM_BITS | WireType.WIRETYPE_VARINT:
{
expectedFieldCount = 1;
value = in.readInt64();
break out;
}
case WRAPPED_UINT64 << WireType.TAG_TYPE_NUM_BITS | WireType.WIRETYPE_VARINT:
{
expectedFieldCount = 1;
value = in.readUInt64();
break out;
}
case WRAPPED_SINT64 << WireType.TAG_TYPE_NUM_BITS | WireType.WIRETYPE_VARINT:
{
expectedFieldCount = 1;
value = in.readSInt64();
break out;
}
case WRAPPED_INT32 << WireType.TAG_TYPE_NUM_BITS | WireType.WIRETYPE_VARINT:
{
expectedFieldCount = 1;
value = in.readInt32();
break out;
}
case WRAPPED_UINT32 << WireType.TAG_TYPE_NUM_BITS | WireType.WIRETYPE_VARINT:
{
expectedFieldCount = 1;
value = in.readUInt32();
break out;
}
case WRAPPED_SINT32 << WireType.TAG_TYPE_NUM_BITS | WireType.WIRETYPE_VARINT:
{
expectedFieldCount = 1;
value = in.readSInt32();
break out;
}
default:
throw new IllegalStateException("Unexpected tag : " + tag + " (Field number : " + WireType.getTagFieldNumber(tag) + ", Wire type : " + WireType.getTagWireType(tag) + ")");
}
}
if (value == null && typeName == null && typeId == null && messageBytes == null) {
return null;
}
if (value != null) {
if (fieldCount != expectedFieldCount) {
throw new IOException("Invalid WrappedMessage encoding.");
}
return (T) value;
}
if (typeName == null && typeId == null || typeName != null && typeId != null || fieldCount != 2) {
throw new IOException("Invalid WrappedMessage encoding.");
}
if (typeId != null) {
typeName = ctx.getDescriptorByTypeId(typeId).getFullName();
}
BaseMarshallerDelegate marshallerDelegate = ((SerializationContextImpl) ctx).getMarshallerDelegate(typeName);
if (messageBytes != null) {
// it's a Message type
TagReaderImpl nestedInput = TagReaderImpl.newInstance(ctx, messageBytes);
return (T) marshallerDelegate.unmarshall(nestedInput, null);
} else {
// it's an Enum
EnumMarshaller marshaller = (EnumMarshaller) marshallerDelegate.getMarshaller();
T e = (T) marshaller.decode(enumValue);
if (e == null) {
// Unknown enum value cause by schema evolution. We cannot handle data loss here so we throw!
throw new IOException("Unknown enum value " + enumValue + " for Protobuf enum type " + typeName);
}
return e;
}
}
use of org.infinispan.protostream.impl.BaseMarshallerDelegate in project protostream by infinispan.
the class ProtobufUtil method write.
private static <A> void write(ImmutableSerializationContext ctx, TagWriterImpl out, A t) throws IOException {
if (t == null) {
throw new IllegalArgumentException("Object to marshall cannot be null");
}
BaseMarshallerDelegate marshallerDelegate = ((SerializationContextImpl) ctx).getMarshallerDelegate(t);
marshallerDelegate.marshall(out, null, t);
out.flush();
}
Aggregations