@@ -119,34 +119,39 @@ private Object readLengthDelimitedField(
119119 return CelByteString .of (inputStream .readByteArray ());
120120 case MESSAGE :
121121 return mergeOrReadMessageField (
122- inputStream .readBytes (), fieldDescriptor .getFieldProtoTypeName (), existingValue );
122+ inputStream .readBytes (),
123+ fieldDescriptor .getFieldProtoTypeName (),
124+ existingValue ,
125+ /* isView= */ true );
123126 case STRING :
124127 return inputStream .readStringRequireUtf8 ();
125128 default :
126129 throw new IllegalStateException ("Unexpected field type: " + fieldType );
127130 }
128131 }
129132
133+ // For bytes that don't alias another message's buffer (empty or freshly serialized).
130134 private Object readMessageField (ByteString bytes , String fieldProtoTypeName ) {
131- return mergeOrReadMessageField (bytes , fieldProtoTypeName , /* existingValue= */ null );
135+ return mergeOrReadMessageField (
136+ bytes , fieldProtoTypeName , /* existingValue= */ null , /* isView= */ false );
132137 }
133138
134139 private Object mergeOrReadMessageField (
135- ByteString bytes , String fieldProtoTypeName , @ Nullable Object existingValue ) {
140+ ByteString bytes , String fieldProtoTypeName , @ Nullable Object existingValue , boolean isView ) {
136141 MessageLiteDescriptor descriptor =
137142 descriptorPool .findDescriptor (fieldProtoTypeName ).orElse (null );
138143 if (descriptor == null ) {
139144 if (existingValue instanceof RawProtoMessageLiteValue ) {
140145 bytes = ((RawProtoMessageLiteValue ) existingValue ).toByteString ().concat (bytes );
141146 }
142- return RawProtoMessageLiteValue .create (bytes , fieldProtoTypeName , this , /* isView= */ true );
147+ return RawProtoMessageLiteValue .create (bytes , fieldProtoTypeName , this , isView );
143148 }
144149 WellKnownProto wellKnownProto = WellKnownProto .getByTypeName (fieldProtoTypeName ).orElse (null );
145150 if (isStructLike (wellKnownProto )) {
146151 if (existingValue instanceof ProtoMessageLiteValue ) {
147152 bytes = ((ProtoMessageLiteValue ) existingValue ).toByteString ().concat (bytes );
148153 }
149- return ProtoMessageLiteValue .create (bytes , fieldProtoTypeName , this );
154+ return ProtoMessageLiteValue .create (bytes , descriptor , this );
150155 }
151156 if (existingValue instanceof MessageLite ) {
152157 return mergeMessageLite (((MessageLite ) existingValue ).toBuilder (), bytes , fieldProtoTypeName );
@@ -171,29 +176,7 @@ Object getDefaultCelValue(SelectField field, FieldLiteDescriptor fieldDescriptor
171176 : getDefaultCelValue (fieldDescriptor );
172177 }
173178
174- @ Nullable FieldLiteDescriptor findFieldDescriptor (String protoTypeName , int fieldNumber ) {
175- MessageLiteDescriptor descriptor = descriptorPool .findDescriptor (protoTypeName ).orElse (null );
176- return descriptor == null ? null : descriptor .findByFieldNumber (fieldNumber );
177- }
178-
179- @ Nullable FieldLiteDescriptor findFieldDescriptor (String protoTypeName , String fieldName ) {
180- MessageLiteDescriptor descriptor = descriptorPool .findDescriptor (protoTypeName ).orElse (null );
181- return descriptor == null ? null : descriptor .findByFieldName (fieldName );
182- }
183-
184- @ Nullable MessageLiteDescriptor findDescriptorWithGetters (String protoTypeName ) {
185- return descriptorPool
186- .findDescriptor (protoTypeName )
187- .filter (MessageLiteDescriptor ::hasGetters )
188- .orElse (null );
189- }
190-
191- MessageLite parseMessageLite (ByteString bytes , String protoTypeName ) {
192- MessageLiteDescriptor descriptor = descriptorPool .getDescriptorOrThrow (protoTypeName );
193- return parseMessageLite (bytes , descriptor );
194- }
195-
196- private static MessageLite parseMessageLite (ByteString bytes , MessageLiteDescriptor descriptor ) {
179+ static MessageLite parseMessageLite (ByteString bytes , MessageLiteDescriptor descriptor ) {
197180 if (bytes .isEmpty ()) {
198181 return descriptor .newMessageBuilder ().getDefaultInstanceForType ();
199182 }
@@ -229,7 +212,7 @@ private Object toRuntimeValue(MessageLite msg, MessageLiteDescriptor descriptor)
229212 WellKnownProto wellKnownProto =
230213 WellKnownProto .getByTypeName (descriptor .getProtoTypeName ()).orElse (null );
231214 if (isStructLike (wellKnownProto )) {
232- return ProtoMessageLiteValue .create (msg , descriptor . getProtoTypeName () , this );
215+ return ProtoMessageLiteValue .create (msg , descriptor , this );
233216 }
234217
235218 return fromWellKnownProto (msg , checkNotNull (wellKnownProto ));
@@ -425,12 +408,17 @@ Optional<Object> findByFieldNumber(ByteString bytes, String protoTypeName, Selec
425408 return Optional .ofNullable (readField (bytes , protoTypeName , field ));
426409 }
427410
428- /** Returns whether {@code field} is present in {@code bytes}. */
411+ /** Returns whether {@code field}, unknown to its message's descriptor, is in {@code bytes}. */
429412 boolean hasFieldByNumber (ByteString bytes , String protoTypeName , SelectField field ) {
430- FieldLiteDescriptor fieldDescriptor = findFieldDescriptor (protoTypeName , field .fieldNumber ());
431- if (fieldDescriptor == null ) {
432- fieldDescriptor = newFieldDescriptor (field );
433- }
413+ return hasFieldByNumber (bytes , protoTypeName , field , newFieldDescriptor (field ));
414+ }
415+
416+ /** Like the overload above, for a field its message's descriptor has. */
417+ boolean hasFieldByNumber (
418+ ByteString bytes ,
419+ String protoTypeName ,
420+ SelectField field ,
421+ FieldLiteDescriptor fieldDescriptor ) {
434422 if (fieldDescriptor .getProtoFieldType ().equals (FieldLiteDescriptor .Type .GROUP )) {
435423 throw new UnsupportedOperationException ("Groups are not supported" );
436424 }
@@ -469,8 +457,8 @@ boolean hasFieldByNumber(ByteString bytes, String protoTypeName, SelectField fie
469457 * wire bytes: its CEL value, or null if it's absent.
470458 */
471459 @ Nullable Object readFieldByGetter (
472- MessageLite message , MessageLiteDescriptor descriptor , FieldLiteDescriptor fieldDescriptor ) {
473- Object value = readGetter (message , descriptor , fieldDescriptor .getFieldNumber ());
460+ ProtoMessageLiteValue message , FieldLiteDescriptor fieldDescriptor ) {
461+ Object value = readGetter (message , fieldDescriptor .getFieldNumber ());
474462 if (value == null ) {
475463 return null ;
476464 }
@@ -519,14 +507,14 @@ boolean hasFieldByNumber(ByteString bytes, String protoTypeName, SelectField fie
519507 }
520508
521509 /** Like {@link #hasFieldByNumber}, through the field's generated getter. */
522- boolean hasByGetter (MessageLite message , MessageLiteDescriptor descriptor , SelectField field ) {
523- return readGetter (message , descriptor , field .fieldNumber ()) != null ;
510+ boolean hasByGetter (ProtoMessageLiteValue message , SelectField field ) {
511+ return readGetter (message , field .fieldNumber ()) != null ;
524512 }
525513
526514 // A field's value as its getter returns it, or null if it's unset or an empty repeated or map.
527- private static @ Nullable Object readGetter (
528- MessageLite message , MessageLiteDescriptor descriptor , int fieldNumber ) {
529- Object value = descriptor .getFieldValue (message , fieldNumber );
515+ private static @ Nullable Object readGetter (ProtoMessageLiteValue message , int fieldNumber ) {
516+ Object value =
517+ message . descriptor () .getFieldValue (checkNotNull ( message . rawValue ()) , fieldNumber );
530518 boolean isEmpty =
531519 (value instanceof List && ((List <?>) value ).isEmpty ())
532520 || (value instanceof Map && ((Map <?, ?>) value ).isEmpty ());
@@ -549,18 +537,11 @@ private Object fromGetterValue(Object value, FieldLiteDescriptor fieldDescriptor
549537 : (long ) ((EnumLite ) value ).getNumber ();
550538 case MESSAGE :
551539 MessageLite message = (MessageLite ) value ;
552- String protoTypeName = fieldDescriptor .getFieldProtoTypeName ();
553- MessageLiteDescriptor descriptor =
554- descriptorPool .findDescriptor (protoTypeName ).orElse (null );
555- if (descriptor == null ) {
556- // Without a descriptor, only this submessage is serialized, rather than its whole root.
557- return RawProtoMessageLiteValue .create (message .toByteString (), protoTypeName , this );
558- }
559- if (descriptorPool .findDescriptor (message ).orElse (null ) != descriptor ) {
560- // The pool decodes this type into another class, such as an older version of it.
561- return readMessageField (message .toByteString (), protoTypeName );
562- }
563- return toRuntimeValue (message , descriptor );
540+ MessageLiteDescriptor descriptor = descriptorPool .findDescriptor (message ).orElse (null );
541+ // Not a class the pool knows (e.g. another version of its type): read its own bytes.
542+ return descriptor != null
543+ ? toRuntimeValue (message , descriptor )
544+ : readMessageField (message .toByteString (), fieldDescriptor .getFieldProtoTypeName ());
564545 default :
565546 return super .toRuntimeValue (value );
566547 }
0 commit comments