Example usage for org.apache.thrift.protocol TTupleProtocol writeBitSet

List of usage examples for org.apache.thrift.protocol TTupleProtocol writeBitSet

Introduction

In this page you can find the example usage for org.apache.thrift.protocol TTupleProtocol writeBitSet.

Prototype

public void writeBitSet(BitSet bs, int vectorWidth) throws TException 

Source Link

Usage

From source file:net.morimekta.providence.thrift.TTupleProtocolSerializer.java

License:Apache License

private void writeMessage(PMessage<?, ?> message, TTupleProtocol protocol)
        throws TException, SerializerException {
    PMessageDescriptor<?, ?> descriptor = message.descriptor();
    if (descriptor.getVariant() == PMessageVariant.UNION) {
        PField fld = ((PUnion<?, ?>) message).unionField();
        protocol.writeI16((short) fld.getKey());
        writeTypedValue(message.get(fld.getKey()), fld.getDescriptor(), protocol);
    } else {//w  ww  .  j a v  a2 s.  c  o  m
        PField[] fields = descriptor.getFields();
        Arrays.sort(fields, (a, b) -> Integer.compare(a.getKey(), b.getKey()));
        int numOptionals = countOptionals(fields);
        BitSet optionals = new BitSet();
        if (numOptionals > 0) {
            int optionalPos = 0;
            for (PField fld : fields) {
                if (fld.getRequirement() != PRequirement.REQUIRED) {
                    if (message.has(fld.getKey())) {
                        optionals.set(optionalPos);
                    }
                    ++optionalPos;
                }
            }
        }

        boolean shouldWriteOptionals = true;
        int optionalPos = 0;

        for (PField fld : fields) {
            if (fld.getRequirement() == PRequirement.REQUIRED) {
                writeTypedValue(message.get(fld.getKey()), fld.getDescriptor(), protocol);
            } else {
                // Write the optionals bitset at the position of the first
                // non-required field.
                if (shouldWriteOptionals) {
                    protocol.writeBitSet(optionals, numOptionals);
                    shouldWriteOptionals = false;
                }
                if (optionals.get(optionalPos)) {
                    writeTypedValue(message.get(fld.getKey()), fld.getDescriptor(), protocol);
                }
                ++optionalPos;
            }
        }
    }
}