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 static final intprivate final intValues at indices 0 -> checkInitializedCount in intArray are positions to check for initialization.private final MessageLiteprivate static final int[]private static final intprivate final ExtensionSchema<?>private static final intprivate static final intprivate final booleanprivate final int[]Represents [checkInitialized positions, map field positions, repeated field offsets].private static final intprivate static final intprivate static final intprivate final ListFieldSchemaprivate final booleanprivate final MapFieldSchemaprivate final intprivate final intprivate final NewInstanceSchemaprivate static final intprivate final Object[]Holds object references for fields.private static final intprivate static final int(package private) static final intAn offset applied to the field type ID for scalar fields that are a member of a oneof.private final intValues at indices checkInitializedCount -> repeatedFieldOffsetStart are map positions.private static final intBit masks for field type extra feature bits encoded in Java gencode via GetExperimentalJavaFieldType in helpers.cc.private static final intprivate final ProtoSyntaxprivate final UnknownFieldSchema<?,?> private static final sun.misc.UnsafeKeep a direct reference to the unsafe object so we don't need to go through the UnsafeUtil wrapper for every call.private final booleanprivate static final int -
Constructor Summary
ConstructorsModifierConstructorDescriptionprivateMessageSchema(int[] buffer, Object[] objects, int minFieldNumber, int maxFieldNumber, MessageLite defaultInstance, ProtoSyntax syntax, boolean useCachedSizeField, int[] intArray, int checkInitialized, int mapFieldPositions, NewInstanceSchema newInstanceSchema, ListFieldSchema listFieldSchema, UnknownFieldSchema<?, ?> unknownFieldSchema, ExtensionSchema<?> extensionSchema, MapFieldSchema mapFieldSchema) -
Method Summary
Modifier and TypeMethodDescriptionprivate booleanarePresentForEquals(T message, T other, int pos) Returns true the field is present in both messages, or neither.private static <T> booleanbooleanAt(T message, long offset) private static voidcheckMutable(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 intdecodeMapEntryValue(byte[] data, int position, int limit, WireFormat.FieldType fieldType, Class<?> messageType, ArrayDecoders.Registers registers) Decodes a map entry key or value.private static <T> doubledoubleAt(T message, long offset) booleanDetermine of the two messages are equal.private booleanprivate <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> floatfloatAt(T message, long offset) private Internal.EnumVerifiergetEnumFieldVerifier(int pos) private ObjectgetMapFieldDefaultEntry(int pos) private SchemagetMessageFieldSchema(int pos) (package private) static UnknownFieldSetLitegetMutableUnknownFields(Object message) (package private) intintgetSerializedSize(T message) Compute the serialized size of the message.private <UT,UB> int getUnknownFieldsSerializedSize(UnknownFieldSchema<UT, UB> schema, T message) intCompute a hashCode for the message.private static <T> intintAt(T message, long offset) private static booleanisEnforceUtf8(int value) private booleanisFieldPresent(T message, int pos) private booleanisFieldPresent(T message, int pos, int presenceFieldOffset, int presenceField, int presenceMask) private static booleanisInitialized(Object message, int typeAndOffset, Schema schema) final booleanisInitialized(T message) Checks whether all required fields are set.private static booleanisLegacyEnumIsClosed(int value) private <N> booleanisListInitialized(Object message, int typeAndOffset, int pos) private booleanisMapInitialized(T message, int typeAndOffset, int pos) private static booleanprivate booleanisOneofCaseEqual(T message, T other, int pos) private booleanisOneofPresent(T message, int fieldNumber, int pos) private static booleanisRequired(int value) private static <T> longlongAt(T message, long offset) voidmakeImmutable(T message) Marks repeated/map/extension/unknown fields as immutable.voidmergeFrom(T message, byte[] data, int position, int limit, ArrayDecoders.Registers registers) Like the above but parses from a byte[] without extensions.voidmergeFrom(T message, Reader reader, ExtensionRegistryLite extensionRegistry) Reads fields from the givenReaderand merges them into the message.voidMerge values fromotherintomessage.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 voidmergeMessage(T targetParent, T sourceParent, int pos) private voidmergeOneofMessage(T targetParent, T sourceParent, int pos) private voidmergeSingleField(T message, T other, int pos) private ObjectmutableMessageFieldForMerge(T message, int pos) private ObjectmutableOneofMessageFieldForMerge(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 intnumberAt(int pos) private static longoffset(int value) private static <T> booleanoneofBooleanAt(T message, long offset) private static <T> doubleoneofDoubleAt(T message, long offset) private static <T> floatoneofFloatAt(T message, long offset) private static <T> intoneofIntAt(T message, long offset) private static <T> longoneofLongAt(T message, long offset) private <K,V> int parseMapField(T message, byte[] data, int position, int limit, int bufferPosition, long fieldOffset, ArrayDecoders.Registers registers) (package private) intparseMessage(T message, byte[] data, int position, int limit, int endDelimited, ArrayDecoders.Registers registers) Parses a message and returns the position after the message/group.private intparseOneofField(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) private intparseRepeatedField(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 intpositionForFieldNumber(int number) private intpositionForFieldNumber(int number, int min) private intpresenceMaskAndOffsetAt(int pos) private <E> voidreadGroupList(Object message, long offset, Reader reader, Schema<E> schema, ExtensionRegistryLite extensionRegistry) private <E> voidreadMessageList(Object message, int typeAndOffset, Reader reader, Schema<E> schema, ExtensionRegistryLite extensionRegistry) private voidreadString(Object message, int typeAndOffset, Reader reader) private voidreadStringList(Object message, int typeAndOffset, Reader reader) private static FieldreflectField(Class<?> messageClass, String fieldName) private voidsetFieldPresent(T message, int pos) private voidsetOneofPresent(T message, int fieldNumber, int pos) private intslowPositionForFieldNumber(int number, int min) private static voidstoreFieldData(FieldInfo fi, int[] buffer, int bufferIndex, Object[] objects) private voidstoreMessageField(T message, int pos, Object field) private voidstoreOneofMessageField(T message, int fieldNumber, int pos, Object field) private static inttype(int value) private inttypeAndOffsetAt(int pos) private voidwriteFieldsInAscendingOrder(T message, Writer writer) private voidwriteFieldsInDescendingOrder(T message, Writer writer) private <K,V> void writeMapHelper(Writer writer, int number, Object mapField, int pos) private voidwriteString(int fieldNumber, Object value, Writer writer) voidWrites 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:
-
LEGACY_ENUM_IS_CLOSED_MASK
private static final int LEGACY_ENUM_IS_CLOSED_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 -
REQUIRED_BIT
private static final int REQUIRED_BITBit masks for field type extra feature bits encoded in Java gencode via GetExperimentalJavaFieldType in helpers.cc.- See Also:
-
UTF8_CHECK_BIT
private static final int UTF8_CHECK_BIT- See Also:
-
CHECK_INITIALIZED_BIT
private static final int CHECK_INITIALIZED_BIT- See Also:
-
LEGACY_ENUM_IS_CLOSED_BIT
private static final int LEGACY_ENUM_IS_CLOSED_BIT- See Also:
-
HAS_HAS_BIT
private static final int HAS_HAS_BIT- See Also:
-
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):buffer[i] [ 0 - 3] unused [ 4 - 31] field number buffer[i+1] [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 +
Offset refer to the field offsets returned by Unsafe.objectFieldOffset() for reflective access to corresponding field.ONEOF_TYPE_OFFSET[44 - 63] field offset / oneof value field offset buffer[i+2] [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 offsetNote 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). This corresponds to a shared bitFieldN_, which must have the field presence mask shift applied to get the corresponding field's presence.
-
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 -
syntax
-
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, ProtoSyntax syntax, 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:SchemaCreates a new instance of the message class.- Specified by:
newInstancein interfaceSchema<T>
-
equals
Description copied from interface:SchemaDetermine of the two messages are equal. -
equals
-
hashCode
Description copied from interface:SchemaCompute a hashCode for the message. -
mergeFrom
Description copied from interface:SchemaMerge values fromotherintomessage. 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:SchemaCompute the serialized size of the message.- Specified by:
getSerializedSizein interfaceSchema<T>
-
getUnknownFieldsSerializedSize
-
writeTo
Description copied from interface:SchemaWrites the given message to the targetWriter.- Specified by:
writeToin interfaceSchema<T>- Throws:
IOException
-
writeFieldsInAscendingOrder
- 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:SchemaReads fields from the givenReaderand 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:
mergeFromin 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
-
parseMessage
int parseMessage(T message, byte[] data, int position, int limit, int endDelimited, ArrayDecoders.Registers registers) throws IOException Parses a message and returns the position after the message/group. If it's parsing a LENGTH_PREFIXED message (endDelimited == 0), returns limit if parsing is successful; If it's parsing a DELIMITED message aka group (endDelimited != 0), parsing ends when a tag == endDelimited is encountered and the position after that tag is returned.- Throws:
IOException
-
mutableMessageFieldForMerge
-
storeMessageField
-
mutableOneofMessageFieldForMerge
-
storeOneofMessageField
-
mergeFrom
public void mergeFrom(T message, byte[] data, int position, int limit, ArrayDecoders.Registers registers) throws IOException Description copied from interface:SchemaLike 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:
mergeFromin interfaceSchema<T>- Throws:
IOException
-
makeImmutable
Description copied from interface:SchemaMarks repeated/map/extension/unknown fields as immutable.- Specified by:
makeImmutablein 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:SchemaChecks whether all required fields are set.- Specified by:
isInitializedin 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) -
isLegacyEnumIsClosed
private static boolean isLegacyEnumIsClosed(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()
-