Package com.google.protobuf
Class MessageSchema<T>
java.lang.Object
com.google.protobuf.MessageSchema<T>
- All Implemented Interfaces:
Schema<T>
Schema used for standard messages.
-
Field Summary
FieldsModifier and TypeFieldDescriptionprivate final int[]
Holds all information for accessing the message fields.private final int
Values at indices 0 -> checkInitializedCount in intArray are positions to check for initialization.private final MessageLite
private static final int[]
private static final int
private final ExtensionSchema
<?> private static final int
private final boolean
private final int[]
Represents [checkInitialized positions, map field positions, repeated field offsets].private static final int
private final ListFieldSchema
private final boolean
private final MapFieldSchema
private final int
private final int
private final NewInstanceSchema
private static final int
private final Object[]
Holds object references for fields.private static final int
private static final int
(package private) static final int
An offset applied to the field type ID for scalar fields that are a member of a oneof.private final boolean
private final int
Values at indices checkInitializedCount -> repeatedFieldOffsetStart are map positions.private static final int
private final UnknownFieldSchema
<?, ?> private static final sun.misc.Unsafe
Keep a direct reference to the unsafe object so we don't need to go through the UnsafeUtil wrapper for every call.private final boolean
-
Constructor Summary
ConstructorsModifierConstructorDescriptionprivate
MessageSchema
(int[] buffer, 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 Summary
Modifier and TypeMethodDescriptionprivate boolean
arePresentForEquals
(T message, T other, int pos) Returns true the field is present in both messages, or neither.private static <T> boolean
booleanAt
(T message, long offset) private static void
checkMutable
(Object message) private <K,
V> int decodeMapEntry
(byte[] data, int position, int limit, MapEntryLite.Metadata<K, V> metadata, Map<K, V> target, ArrayDecoders.Registers registers) Decodes a map entry.private int
decodeMapEntryValue
(byte[] data, int position, int limit, WireFormat.FieldType fieldType, Class<?> messageType, ArrayDecoders.Registers registers) Decodes a map entry key or value.private static <T> double
doubleAt
(T message, long offset) boolean
Determine of the two messages are equal.private boolean
private <UT,
UB> UB filterMapUnknownEnumValues
(Object message, int pos, UB unknownFields, UnknownFieldSchema<UT, UB> unknownFieldSchema, Object containerMessage) private <K,
V, UT, UB>
UBfilterUnknownEnumMap
(int pos, int number, Map<K, V> mapData, Internal.EnumVerifier enumVerifier, UB unknownFields, UnknownFieldSchema<UT, UB> unknownFieldSchema, Object containerMessage) private static <T> float
floatAt
(T message, long offset) private Internal.EnumVerifier
getEnumFieldVerifier
(int pos) private Object
getMapFieldDefaultEntry
(int pos) private Schema
getMessageFieldSchema
(int pos) (package private) static UnknownFieldSetLite
getMutableUnknownFields
(Object message) (package private) int
int
getSerializedSize
(T message) Compute the serialized size of the message.private int
getSerializedSizeProto2
(T message) private int
getSerializedSizeProto3
(T message) private <UT,
UB> int getUnknownFieldsSerializedSize
(UnknownFieldSchema<UT, UB> schema, T message) int
Compute a hashCode for the message.private static <T> int
intAt
(T message, long offset) private static boolean
isEnforceUtf8
(int value) private boolean
isFieldPresent
(T message, int pos) private boolean
isFieldPresent
(T message, int pos, int presenceFieldOffset, int presenceField, int presenceMask) private static boolean
isInitialized
(Object message, int typeAndOffset, Schema schema) final boolean
isInitialized
(T message) Checks whether all required fields are set.private <N> boolean
isListInitialized
(Object message, int typeAndOffset, int pos) private boolean
isMapInitialized
(T message, int typeAndOffset, int pos) private static boolean
private boolean
isOneofCaseEqual
(T message, T other, int pos) private boolean
isOneofPresent
(T message, int fieldNumber, int pos) private static boolean
isRequired
(int value) private static List
<?> private static <T> long
longAt
(T message, long offset) void
makeImmutable
(T message) Marks repeated/map/extension/unknown fields as immutable.void
mergeFrom
(T message, byte[] data, int position, int limit, ArrayDecoders.Registers registers) Like the above but parses from a byte[] without extensions.void
mergeFrom
(T message, Reader reader, ExtensionRegistryLite extensionRegistry) Reads fields from the givenReader
and merges them into the message.void
Merge values fromother
intomessage
.private <UT,
UB, ET extends FieldSet.FieldDescriptorLite<ET>>
voidmergeFromHelper
(UnknownFieldSchema<UT, UB> unknownFieldSchema, ExtensionSchema<ET> extensionSchema, T message, Reader reader, ExtensionRegistryLite extensionRegistry) A helper method for wildcard capture ofunknownFieldSchema
.private final <K,
V> void mergeMap
(Object message, int pos, Object mapDefaultEntry, ExtensionRegistryLite extensionRegistry, Reader reader) private void
mergeMessage
(T targetParent, T sourceParent, int pos) private void
mergeOneofMessage
(T targetParent, T sourceParent, int pos) private void
mergeSingleField
(T message, T other, int pos) private Object
mutableMessageFieldForMerge
(T message, int pos) private Object
mutableOneofMessageFieldForMerge
(T message, int fieldNumber, int pos) Creates a new instance of the message class.(package private) static <T> MessageSchema
<T> newSchema
(Class<T> messageClass, MessageInfo messageInfo, NewInstanceSchema newInstanceSchema, ListFieldSchema listFieldSchema, UnknownFieldSchema<?, ?> unknownFieldSchema, ExtensionSchema<?> extensionSchema, MapFieldSchema mapFieldSchema) (package private) static <T> MessageSchema
<T> newSchemaForMessageInfo
(StructuralMessageInfo messageInfo, NewInstanceSchema newInstanceSchema, ListFieldSchema listFieldSchema, UnknownFieldSchema<?, ?> unknownFieldSchema, ExtensionSchema<?> extensionSchema, MapFieldSchema mapFieldSchema) (package private) static <T> MessageSchema
<T> newSchemaForRawMessageInfo
(RawMessageInfo messageInfo, NewInstanceSchema newInstanceSchema, ListFieldSchema listFieldSchema, UnknownFieldSchema<?, ?> unknownFieldSchema, ExtensionSchema<?> extensionSchema, MapFieldSchema mapFieldSchema) private int
numberAt
(int pos) private static long
offset
(int value) private static <T> boolean
oneofBooleanAt
(T message, long offset) private static <T> double
oneofDoubleAt
(T message, long offset) private static <T> float
oneofFloatAt
(T message, long offset) private static <T> int
oneofIntAt
(T message, long offset) private static <T> long
oneofLongAt
(T message, long offset) private <K,
V> int parseMapField
(T message, byte[] data, int position, int limit, int bufferPosition, long fieldOffset, ArrayDecoders.Registers registers) 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) (package private) int
parseProto2Message
(T message, byte[] data, int position, int limit, int endGroup, ArrayDecoders.Registers registers) Parses a proto2 message or group and returns the position after the message/group.private int
parseProto3Message
(T message, byte[] data, int position, int limit, ArrayDecoders.Registers registers) Parses a proto3 message and returns the limit if parsing is successful.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) private int
positionForFieldNumber
(int number) private int
positionForFieldNumber
(int number, int min) private int
presenceMaskAndOffsetAt
(int pos) private <E> void
readGroupList
(Object message, long offset, Reader reader, Schema<E> schema, ExtensionRegistryLite extensionRegistry) private <E> void
readMessageList
(Object message, int typeAndOffset, Reader reader, Schema<E> schema, ExtensionRegistryLite extensionRegistry) private void
readString
(Object message, int typeAndOffset, Reader reader) private void
readStringList
(Object message, int typeAndOffset, Reader reader) private static Field
reflectField
(Class<?> messageClass, String fieldName) private void
setFieldPresent
(T message, int pos) private void
setOneofPresent
(T message, int fieldNumber, int pos) private int
slowPositionForFieldNumber
(int number, int min) private static void
storeFieldData
(FieldInfo fi, int[] buffer, int bufferIndex, Object[] objects) private void
storeMessageField
(T message, int pos, Object field) private void
storeOneofMessageField
(T message, int fieldNumber, int pos, Object field) private static int
type
(int value) private int
typeAndOffsetAt
(int pos) private void
writeFieldsInAscendingOrderProto2
(T message, Writer writer) private void
writeFieldsInAscendingOrderProto3
(T message, Writer writer) private void
writeFieldsInDescendingOrder
(T message, Writer writer) private <K,
V> void writeMapHelper
(Writer writer, int number, Object mapField, int pos) private void
writeString
(int fieldNumber, Object value, Writer writer) void
Writes the given message to the targetWriter
.private <UT,
UB> void writeUnknownInMessageTo
(UnknownFieldSchema<UT, UB> schema, T message, Writer writer)
-
Field Details
-
INTS_PER_FIELD
private static final int INTS_PER_FIELD- See Also:
-
OFFSET_BITS
private static final int OFFSET_BITS- See Also:
-
OFFSET_MASK
private static final int OFFSET_MASK- See Also:
-
FIELD_TYPE_MASK
private static final int FIELD_TYPE_MASK- See Also:
-
REQUIRED_MASK
private static final int REQUIRED_MASK- See Also:
-
ENFORCE_UTF8_MASK
private static final int ENFORCE_UTF8_MASK- See Also:
-
NO_PRESENCE_SENTINEL
private static final int NO_PRESENCE_SENTINEL- See Also:
-
EMPTY_INT_ARRAY
private static final int[] EMPTY_INT_ARRAY -
ONEOF_TYPE_OFFSET
static final int ONEOF_TYPE_OFFSETAn offset applied to the field type ID for scalar fields that are a member of a oneof.- See Also:
-
UNSAFE
private static final sun.misc.Unsafe UNSAFEKeep 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[] bufferHolds 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 +
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).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 -
objects
Holds object references for fields. For each field entry inbuffer
, 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
-
hasExtensions
private final boolean hasExtensions -
lite
private final boolean lite -
proto3
private final boolean proto3 -
useCachedSizeField
private final boolean useCachedSizeField -
intArray
private final int[] intArrayRepresents [checkInitialized positions, map field positions, repeated field offsets]. -
checkInitializedCount
private final int checkInitializedCountValues at indices 0 -> checkInitializedCount in intArray are positions to check for initialization. -
repeatedFieldOffsetStart
private final int repeatedFieldOffsetStartValues at indices checkInitializedCount -> repeatedFieldOffsetStart are map positions. Everything after that are repeated field offsets. -
newInstanceSchema
-
listFieldSchema
-
unknownFieldSchema
-
extensionSchema
-
mapFieldSchema
-
-
Constructor Details
-
MessageSchema
private MessageSchema(int[] buffer, 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 Details
-
newSchema
static <T> MessageSchema<T> newSchema(Class<T> messageClass, MessageInfo messageInfo, NewInstanceSchema newInstanceSchema, ListFieldSchema listFieldSchema, UnknownFieldSchema<?, ?> unknownFieldSchema, ExtensionSchema<?> extensionSchema, MapFieldSchema mapFieldSchema) -
newSchemaForRawMessageInfo
static <T> MessageSchema<T> newSchemaForRawMessageInfo(RawMessageInfo messageInfo, NewInstanceSchema newInstanceSchema, ListFieldSchema listFieldSchema, UnknownFieldSchema<?, ?> unknownFieldSchema, ExtensionSchema<?> extensionSchema, MapFieldSchema mapFieldSchema) -
reflectField
-
newSchemaForMessageInfo
static <T> MessageSchema<T> newSchemaForMessageInfo(StructuralMessageInfo messageInfo, NewInstanceSchema newInstanceSchema, ListFieldSchema listFieldSchema, UnknownFieldSchema<?, ?> unknownFieldSchema, ExtensionSchema<?> extensionSchema, MapFieldSchema mapFieldSchema) -
storeFieldData
-
newInstance
Description copied from interface:Schema
Creates a new instance of the message class.- Specified by:
newInstance
in interfaceSchema<T>
-
equals
Description copied from interface:Schema
Determine of the two messages are equal. -
equals
-
hashCode
Description copied from interface:Schema
Compute a hashCode for the message. -
mergeFrom
Description copied from interface:Schema
Merge values fromother
intomessage
. This method doesn't make the message immutable. To make the message immutable after merging, useSchema.makeImmutable(T)
. -
mergeSingleField
-
mergeMessage
-
mergeOneofMessage
-
getSerializedSize
Description copied from interface:Schema
Compute the serialized size of the message.- Specified by:
getSerializedSize
in interfaceSchema<T>
-
getSerializedSizeProto2
-
getSerializedSizeProto3
-
getUnknownFieldsSerializedSize
-
listAt
-
writeTo
Description copied from interface:Schema
Writes the given message to the targetWriter
.- Specified by:
writeTo
in interfaceSchema<T>
- Throws:
IOException
-
writeFieldsInAscendingOrderProto2
- Throws:
IOException
-
writeFieldsInAscendingOrderProto3
- Throws:
IOException
-
writeFieldsInDescendingOrder
- Throws:
IOException
-
writeMapHelper
private <K,V> void writeMapHelper(Writer writer, int number, Object mapField, int pos) throws IOException - Throws:
IOException
-
writeUnknownInMessageTo
private <UT,UB> void writeUnknownInMessageTo(UnknownFieldSchema<UT, UB> schema, T message, Writer writer) throws IOException- Throws:
IOException
-
mergeFrom
public void mergeFrom(T message, Reader reader, ExtensionRegistryLite extensionRegistry) throws IOException Description copied from interface:Schema
Reads fields from the givenReader
and merges them into the message. It doesn't make the message immutable after parsing is done. To make the message immutable, useSchema.makeImmutable(T)
.- Specified by:
mergeFrom
in interfaceSchema<T>
- Throws:
IOException
-
mergeFromHelper
private <UT,UB, void mergeFromHelperET extends FieldSet.FieldDescriptorLite<ET>> (UnknownFieldSchema<UT, UB> unknownFieldSchema, ExtensionSchema<ET> extensionSchema, T message, Reader reader, ExtensionRegistryLite extensionRegistry) throws IOExceptionA helper method for wildcard capture ofunknownFieldSchema
. See: https://docs.oracle.com/javase/tutorial/java/generics/capture.html- Throws:
IOException
-
getMutableUnknownFields
-
decodeMapEntryValue
private int decodeMapEntryValue(byte[] data, int position, int limit, WireFormat.FieldType fieldType, Class<?> messageType, ArrayDecoders.Registers registers) throws IOException Decodes a map entry key or value. Stores result in registers.object1.- Throws:
IOException
-
decodeMapEntry
private <K,V> int decodeMapEntry(byte[] data, int position, int limit, MapEntryLite.Metadata<K, V> metadata, Map<K, throws IOExceptionV> target, ArrayDecoders.Registers registers) Decodes a map entry.- Throws:
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 IOException - Throws:
IOException
-
parseMapField
private <K,V> int parseMapField(T message, byte[] data, int position, int limit, int bufferPosition, long fieldOffset, ArrayDecoders.Registers registers) throws IOException - Throws:
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 IOException - Throws:
IOException
-
getMessageFieldSchema
-
getMapFieldDefaultEntry
-
getEnumFieldVerifier
-
parseProto2Message
int parseProto2Message(T message, byte[] data, int position, int limit, int endGroup, ArrayDecoders.Registers registers) throws 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:
IOException
-
mutableMessageFieldForMerge
-
storeMessageField
-
mutableOneofMessageFieldForMerge
-
storeOneofMessageField
-
parseProto3Message
private int parseProto3Message(T message, byte[] data, int position, int limit, ArrayDecoders.Registers registers) throws IOException Parses a proto3 message and returns the limit if parsing is successful.- Throws:
IOException
-
mergeFrom
public void mergeFrom(T message, byte[] data, int position, int limit, ArrayDecoders.Registers registers) throws 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 interfaceSchema<T>
- Throws:
IOException
-
makeImmutable
Description copied from interface:Schema
Marks repeated/map/extension/unknown fields as immutable.- Specified by:
makeImmutable
in interfaceSchema<T>
-
mergeMap
private final <K,V> void mergeMap(Object message, int pos, Object mapDefaultEntry, ExtensionRegistryLite extensionRegistry, Reader reader) throws IOException - Throws:
IOException
-
filterMapUnknownEnumValues
private <UT,UB> UB filterMapUnknownEnumValues(Object message, int pos, UB unknownFields, UnknownFieldSchema<UT, UB> unknownFieldSchema, Object containerMessage) -
filterUnknownEnumMap
private <K,V, UB filterUnknownEnumMapUT, UB> (int pos, int number, Map<K, V> mapData, Internal.EnumVerifier enumVerifier, UB unknownFields, UnknownFieldSchema<UT, UB> unknownFieldSchema, Object containerMessage) -
isInitialized
Description copied from interface:Schema
Checks whether all required fields are set.- Specified by:
isInitialized
in interfaceSchema<T>
-
isInitialized
-
isListInitialized
-
isMapInitialized
-
writeString
- Throws:
IOException
-
readString
- Throws:
IOException
-
readStringList
- Throws:
IOException
-
readMessageList
private <E> void readMessageList(Object message, int typeAndOffset, Reader reader, Schema<E> schema, ExtensionRegistryLite extensionRegistry) throws IOException - Throws:
IOException
-
readGroupList
private <E> void readGroupList(Object message, long offset, Reader reader, Schema<E> schema, ExtensionRegistryLite extensionRegistry) throws IOException - Throws:
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
-
checkMutable
-
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
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
-
setFieldPresent
-
isOneofPresent
-
isOneofCaseEqual
-
setOneofPresent
-
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()
-