Class MessageSchema<T>

  • All Implemented Interfaces:
    Schema<T>

    final class MessageSchema<T>
    extends java.lang.Object
    implements Schema<T>
    Schema used for standard messages.
    • Field Detail

      • EMPTY_INT_ARRAY

        private static final int[] EMPTY_INT_ARRAY
      • ONEOF_TYPE_OFFSET

        static final int ONEOF_TYPE_OFFSET
        An offset applied to the field type ID for scalar fields that are a member of a oneof.
        See Also:
        Constant Field Values
      • UNSAFE

        private static final sun.misc.Unsafe UNSAFE
        Keep a direct reference to the unsafe object so we don't need to go through the UnsafeUtil wrapper for every call.
      • buffer

        private final int[] buffer
        Holds all information for accessing the message fields. The layout is as follows (field positions are relative to the offset of the start of the field in the buffer):

         [ 0 -    3] unused
         [ 4 -   31] field number
         [32 -   33] unused
         [34 -   34] whether UTF-8 enforcement should be applied to a string field.
         [35 -   35] whether the field is required
         [36 -   43] field type / for oneof: field type + ONEOF_TYPE_OFFSET
         [44 -   63] field offset / oneof value field offset
         [64 -   69] unused
         [70 -   75] field presence mask shift (unused for oneof/repeated fields)
         [76 -   95] presence field offset / oneof case field offset / cached size field offset
         
        Note that presence field offset can only use 20 bits - 1. All bits set to 1 is the sentinel value for non-presence. This is not validated at runtime, we simply assume message layouts will not exceed 1MB (assuming ~10 bytes per field, that implies 100k fields which should hit other javac limits first).
      • objects

        private final java.lang.Object[] objects
        Holds object references for fields. For each field entry in buffer, there are two corresponding entries in this array. The content is different from different field types:
           Map fields:
             objects[pos] = map default entry instance
             objects[pos + 1] = EnumVerifier if map value is enum, or message class reference if map
                                value is message.
           Message fields:
             objects[pos] = null or cached message schema
             objects[pos + 1] = message class reference
           Enum fields:
             objects[pos] = null
             objects[pos + 1] = EnumVerifier
         
      • minFieldNumber

        private final int minFieldNumber
      • maxFieldNumber

        private final int maxFieldNumber
      • defaultInstance

        private final MessageLite defaultInstance
      • hasExtensions

        private final boolean hasExtensions
      • lite

        private final boolean lite
      • proto3

        private final boolean proto3
      • useCachedSizeField

        private final boolean useCachedSizeField
      • intArray

        private final int[] intArray
        Represents [checkInitialized positions, map field positions, repeated field offsets].
      • checkInitializedCount

        private final int checkInitializedCount
        Values at indices 0 -> checkInitializedCount in intArray are positions to check for initialization.
      • repeatedFieldOffsetStart

        private final int repeatedFieldOffsetStart
        Values at indices checkInitializedCount -> repeatedFieldOffsetStart are map positions. Everything after that are repeated field offsets.
    • Constructor Detail

      • MessageSchema

        private MessageSchema​(int[] buffer,
                              java.lang.Object[] objects,
                              int minFieldNumber,
                              int maxFieldNumber,
                              MessageLite defaultInstance,
                              boolean proto3,
                              boolean useCachedSizeField,
                              int[] intArray,
                              int checkInitialized,
                              int mapFieldPositions,
                              NewInstanceSchema newInstanceSchema,
                              ListFieldSchema listFieldSchema,
                              UnknownFieldSchema<?,​?> unknownFieldSchema,
                              ExtensionSchema<?> extensionSchema,
                              MapFieldSchema mapFieldSchema)
    • Method Detail

      • reflectField

        private static java.lang.reflect.Field reflectField​(java.lang.Class<?> messageClass,
                                                            java.lang.String fieldName)
      • storeFieldData

        private static void storeFieldData​(FieldInfo fi,
                                           int[] buffer,
                                           int bufferIndex,
                                           java.lang.Object[] objects)
      • newInstance

        public T newInstance()
        Description copied from interface: Schema
        Creates a new instance of the message class.
        Specified by:
        newInstance in interface Schema<T>
      • equals

        public boolean equals​(T message,
                              T other)
        Description copied from interface: Schema
        Determine of the two messages are equal.
        Specified by:
        equals in interface Schema<T>
      • equals

        private boolean equals​(T message,
                               T other,
                               int pos)
      • hashCode

        public int hashCode​(T message)
        Description copied from interface: Schema
        Compute a hashCode for the message.
        Specified by:
        hashCode in interface Schema<T>
      • mergeFrom

        public void mergeFrom​(T message,
                              T other)
        Description copied from interface: Schema
        Merge values from other into message. This method doesn't make the message immutable. To make the message immutable after merging, use Schema.makeImmutable(T).
        Specified by:
        mergeFrom in interface Schema<T>
      • mergeSingleField

        private void mergeSingleField​(T message,
                                      T other,
                                      int pos)
      • mergeMessage

        private void mergeMessage​(T targetParent,
                                  T sourceParent,
                                  int pos)
      • mergeOneofMessage

        private void mergeOneofMessage​(T targetParent,
                                       T sourceParent,
                                       int pos)
      • getSerializedSize

        public int getSerializedSize​(T message)
        Description copied from interface: Schema
        Compute the serialized size of the message.
        Specified by:
        getSerializedSize in interface Schema<T>
      • getSerializedSizeProto2

        private int getSerializedSizeProto2​(T message)
      • getSerializedSizeProto3

        private int getSerializedSizeProto3​(T message)
      • getUnknownFieldsSerializedSize

        private <UT,​UB> int getUnknownFieldsSerializedSize​(UnknownFieldSchema<UT,​UB> schema,
                                                                 T message)
      • listAt

        private static java.util.List<?> listAt​(java.lang.Object message,
                                                long offset)
      • writeTo

        public void writeTo​(T message,
                            Writer writer)
                     throws java.io.IOException
        Description copied from interface: Schema
        Writes the given message to the target Writer.
        Specified by:
        writeTo in interface Schema<T>
        Throws:
        java.io.IOException
      • writeFieldsInAscendingOrderProto2

        private void writeFieldsInAscendingOrderProto2​(T message,
                                                       Writer writer)
                                                throws java.io.IOException
        Throws:
        java.io.IOException
      • writeFieldsInAscendingOrderProto3

        private void writeFieldsInAscendingOrderProto3​(T message,
                                                       Writer writer)
                                                throws java.io.IOException
        Throws:
        java.io.IOException
      • writeFieldsInDescendingOrder

        private void writeFieldsInDescendingOrder​(T message,
                                                  Writer writer)
                                           throws java.io.IOException
        Throws:
        java.io.IOException
      • writeMapHelper

        private <K,​V> void writeMapHelper​(Writer writer,
                                                int number,
                                                java.lang.Object mapField,
                                                int pos)
                                         throws java.io.IOException
        Throws:
        java.io.IOException
      • writeUnknownInMessageTo

        private <UT,​UB> void writeUnknownInMessageTo​(UnknownFieldSchema<UT,​UB> schema,
                                                           T message,
                                                           Writer writer)
                                                    throws java.io.IOException
        Throws:
        java.io.IOException
      • mergeFrom

        public void mergeFrom​(T message,
                              Reader reader,
                              ExtensionRegistryLite extensionRegistry)
                       throws java.io.IOException
        Description copied from interface: Schema
        Reads fields from the given Reader and merges them into the message. It doesn't make the message immutable after parsing is done. To make the message immutable, use Schema.makeImmutable(T).
        Specified by:
        mergeFrom in interface Schema<T>
        Throws:
        java.io.IOException
      • mergeFromHelper

        private <UT,​UB,​ET extends FieldSet.FieldDescriptorLite<ET>> void mergeFromHelper​(UnknownFieldSchema<UT,​UB> unknownFieldSchema,
                                                                                                     ExtensionSchema<ET> extensionSchema,
                                                                                                     T message,
                                                                                                     Reader reader,
                                                                                                     ExtensionRegistryLite extensionRegistry)
                                                                                              throws java.io.IOException
        A helper method for wildcard capture of unknownFieldSchema. See: https://docs.oracle.com/javase/tutorial/java/generics/capture.html
        Throws:
        java.io.IOException
      • getMutableUnknownFields

        static UnknownFieldSetLite getMutableUnknownFields​(java.lang.Object message)
      • decodeMapEntryValue

        private int decodeMapEntryValue​(byte[] data,
                                        int position,
                                        int limit,
                                        WireFormat.FieldType fieldType,
                                        java.lang.Class<?> messageType,
                                        ArrayDecoders.Registers registers)
                                 throws java.io.IOException
        Decodes a map entry key or value. Stores result in registers.object1.
        Throws:
        java.io.IOException
      • decodeMapEntry

        private <K,​V> int decodeMapEntry​(byte[] data,
                                               int position,
                                               int limit,
                                               MapEntryLite.Metadata<K,​V> metadata,
                                               java.util.Map<K,​V> target,
                                               ArrayDecoders.Registers registers)
                                        throws java.io.IOException
        Decodes a map entry.
        Throws:
        java.io.IOException
      • parseRepeatedField

        private int parseRepeatedField​(T message,
                                       byte[] data,
                                       int position,
                                       int limit,
                                       int tag,
                                       int number,
                                       int wireType,
                                       int bufferPosition,
                                       long typeAndOffset,
                                       int fieldType,
                                       long fieldOffset,
                                       ArrayDecoders.Registers registers)
                                throws java.io.IOException
        Throws:
        java.io.IOException
      • parseMapField

        private <K,​V> int parseMapField​(T message,
                                              byte[] data,
                                              int position,
                                              int limit,
                                              int bufferPosition,
                                              long fieldOffset,
                                              ArrayDecoders.Registers registers)
                                       throws java.io.IOException
        Throws:
        java.io.IOException
      • parseOneofField

        private int parseOneofField​(T message,
                                    byte[] data,
                                    int position,
                                    int limit,
                                    int tag,
                                    int number,
                                    int wireType,
                                    int typeAndOffset,
                                    int fieldType,
                                    long fieldOffset,
                                    int bufferPosition,
                                    ArrayDecoders.Registers registers)
                             throws java.io.IOException
        Throws:
        java.io.IOException
      • getMessageFieldSchema

        private Schema getMessageFieldSchema​(int pos)
      • getMapFieldDefaultEntry

        private java.lang.Object getMapFieldDefaultEntry​(int pos)
      • parseProto2Message

        int parseProto2Message​(T message,
                               byte[] data,
                               int position,
                               int limit,
                               int endGroup,
                               ArrayDecoders.Registers registers)
                        throws java.io.IOException
        Parses a proto2 message or group and returns the position after the message/group. If it's parsing a message (endGroup == 0), returns limit if parsing is successful; It it's parsing a group (endGroup != 0), parsing ends when a tag == endGroup is encountered and the position after that tag is returned.
        Throws:
        java.io.IOException
      • mutableMessageFieldForMerge

        private java.lang.Object mutableMessageFieldForMerge​(T message,
                                                             int pos)
      • storeMessageField

        private void storeMessageField​(T message,
                                       int pos,
                                       java.lang.Object field)
      • mutableOneofMessageFieldForMerge

        private java.lang.Object mutableOneofMessageFieldForMerge​(T message,
                                                                  int fieldNumber,
                                                                  int pos)
      • storeOneofMessageField

        private void storeOneofMessageField​(T message,
                                            int fieldNumber,
                                            int pos,
                                            java.lang.Object field)
      • parseProto3Message

        private int parseProto3Message​(T message,
                                       byte[] data,
                                       int position,
                                       int limit,
                                       ArrayDecoders.Registers registers)
                                throws java.io.IOException
        Parses a proto3 message and returns the limit if parsing is successful.
        Throws:
        java.io.IOException
      • mergeFrom

        public void mergeFrom​(T message,
                              byte[] data,
                              int position,
                              int limit,
                              ArrayDecoders.Registers registers)
                       throws java.io.IOException
        Description copied from interface: Schema
        Like the above but parses from a byte[] without extensions. Entry point of fast path. Note that this method may throw IndexOutOfBoundsException if the input data is not valid protobuf wire format. Protobuf public API methods should catch and convert that exception to InvalidProtocolBufferException.
        Specified by:
        mergeFrom in interface Schema<T>
        Throws:
        java.io.IOException
      • makeImmutable

        public void makeImmutable​(T message)
        Description copied from interface: Schema
        Marks repeated/map/extension/unknown fields as immutable.
        Specified by:
        makeImmutable in interface Schema<T>
      • mergeMap

        private final <K,​V> void mergeMap​(java.lang.Object message,
                                                int pos,
                                                java.lang.Object mapDefaultEntry,
                                                ExtensionRegistryLite extensionRegistry,
                                                Reader reader)
                                         throws java.io.IOException
        Throws:
        java.io.IOException
      • filterMapUnknownEnumValues

        private <UT,​UB> UB filterMapUnknownEnumValues​(java.lang.Object message,
                                                            int pos,
                                                            UB unknownFields,
                                                            UnknownFieldSchema<UT,​UB> unknownFieldSchema,
                                                            java.lang.Object containerMessage)
      • filterUnknownEnumMap

        private <K,​V,​UT,​UB> UB filterUnknownEnumMap​(int pos,
                                                                      int number,
                                                                      java.util.Map<K,​V> mapData,
                                                                      Internal.EnumVerifier enumVerifier,
                                                                      UB unknownFields,
                                                                      UnknownFieldSchema<UT,​UB> unknownFieldSchema,
                                                                      java.lang.Object containerMessage)
      • isInitialized

        public final boolean isInitialized​(T message)
        Description copied from interface: Schema
        Checks whether all required fields are set.
        Specified by:
        isInitialized in interface Schema<T>
      • isInitialized

        private static boolean isInitialized​(java.lang.Object message,
                                             int typeAndOffset,
                                             Schema schema)
      • isListInitialized

        private <N> boolean isListInitialized​(java.lang.Object message,
                                              int typeAndOffset,
                                              int pos)
      • isMapInitialized

        private boolean isMapInitialized​(T message,
                                         int typeAndOffset,
                                         int pos)
      • writeString

        private void writeString​(int fieldNumber,
                                 java.lang.Object value,
                                 Writer writer)
                          throws java.io.IOException
        Throws:
        java.io.IOException
      • readString

        private void readString​(java.lang.Object message,
                                int typeAndOffset,
                                Reader reader)
                         throws java.io.IOException
        Throws:
        java.io.IOException
      • readStringList

        private void readStringList​(java.lang.Object message,
                                    int typeAndOffset,
                                    Reader reader)
                             throws java.io.IOException
        Throws:
        java.io.IOException
      • readMessageList

        private <E> void readMessageList​(java.lang.Object message,
                                         int typeAndOffset,
                                         Reader reader,
                                         Schema<E> schema,
                                         ExtensionRegistryLite extensionRegistry)
                                  throws java.io.IOException
        Throws:
        java.io.IOException
      • readGroupList

        private <E> void readGroupList​(java.lang.Object message,
                                       long offset,
                                       Reader reader,
                                       Schema<E> schema,
                                       ExtensionRegistryLite extensionRegistry)
                                throws java.io.IOException
        Throws:
        java.io.IOException
      • numberAt

        private int numberAt​(int pos)
      • typeAndOffsetAt

        private int typeAndOffsetAt​(int pos)
      • presenceMaskAndOffsetAt

        private int presenceMaskAndOffsetAt​(int pos)
      • type

        private static int type​(int value)
      • isRequired

        private static boolean isRequired​(int value)
      • isEnforceUtf8

        private static boolean isEnforceUtf8​(int value)
      • offset

        private static long offset​(int value)
      • isMutable

        private static boolean isMutable​(java.lang.Object message)
      • checkMutable

        private static void checkMutable​(java.lang.Object message)
      • doubleAt

        private static <T> double doubleAt​(T message,
                                           long offset)
      • floatAt

        private static <T> float floatAt​(T message,
                                         long offset)
      • intAt

        private static <T> int intAt​(T message,
                                     long offset)
      • longAt

        private static <T> long longAt​(T message,
                                       long offset)
      • booleanAt

        private static <T> boolean booleanAt​(T message,
                                             long offset)
      • oneofDoubleAt

        private static <T> double oneofDoubleAt​(T message,
                                                long offset)
      • oneofFloatAt

        private static <T> float oneofFloatAt​(T message,
                                              long offset)
      • oneofIntAt

        private static <T> int oneofIntAt​(T message,
                                          long offset)
      • oneofLongAt

        private static <T> long oneofLongAt​(T message,
                                            long offset)
      • oneofBooleanAt

        private static <T> boolean oneofBooleanAt​(T message,
                                                  long offset)
      • arePresentForEquals

        private boolean arePresentForEquals​(T message,
                                            T other,
                                            int pos)
        Returns true the field is present in both messages, or neither.
      • isFieldPresent

        private boolean isFieldPresent​(T message,
                                       int pos,
                                       int presenceFieldOffset,
                                       int presenceField,
                                       int presenceMask)
      • isFieldPresent

        private boolean isFieldPresent​(T message,
                                       int pos)
      • setFieldPresent

        private void setFieldPresent​(T message,
                                     int pos)
      • isOneofPresent

        private boolean isOneofPresent​(T message,
                                       int fieldNumber,
                                       int pos)
      • isOneofCaseEqual

        private boolean isOneofCaseEqual​(T message,
                                         T other,
                                         int pos)
      • setOneofPresent

        private void setOneofPresent​(T message,
                                     int fieldNumber,
                                     int pos)
      • positionForFieldNumber

        private int positionForFieldNumber​(int number)
      • positionForFieldNumber

        private int positionForFieldNumber​(int number,
                                           int min)
      • slowPositionForFieldNumber

        private int slowPositionForFieldNumber​(int number,
                                               int min)
      • getSchemaSize

        int getSchemaSize()