• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Protocol Buffers - Google's data interchange format
2 // Copyright 2008 Google Inc.  All rights reserved.
3 // https://developers.google.com/protocol-buffers/
4 //
5 // Redistribution and use in source and binary forms, with or without
6 // modification, are permitted provided that the following conditions are
7 // met:
8 //
9 //     * Redistributions of source code must retain the above copyright
10 // notice, this list of conditions and the following disclaimer.
11 //     * Redistributions in binary form must reproduce the above
12 // copyright notice, this list of conditions and the following disclaimer
13 // in the documentation and/or other materials provided with the
14 // distribution.
15 //     * Neither the name of Google Inc. nor the names of its
16 // contributors may be used to endorse or promote products derived from
17 // this software without specific prior written permission.
18 //
19 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 
31 package com.google.protobuf;
32 
33 import com.google.protobuf.Descriptors.Descriptor;
34 import com.google.protobuf.Descriptors.FieldDescriptor;
35 import java.io.IOException;
36 import java.util.ArrayList;
37 import java.util.List;
38 import java.util.Map;
39 import java.util.TreeMap;
40 
41 /**
42  * Reflection utility methods shared by both mutable and immutable messages.
43  *
44  * @author liujisi@google.com (Pherl Liu)
45  */
46 class MessageReflection {
47 
writeMessageTo( Message message, Map<FieldDescriptor, Object> fields, CodedOutputStream output, boolean alwaysWriteRequiredFields)48   static void writeMessageTo(
49       Message message,
50       Map<FieldDescriptor, Object> fields,
51       CodedOutputStream output,
52       boolean alwaysWriteRequiredFields)
53       throws IOException {
54     final boolean isMessageSet =
55         message.getDescriptorForType().getOptions().getMessageSetWireFormat();
56     if (alwaysWriteRequiredFields) {
57       fields = new TreeMap<FieldDescriptor, Object>(fields);
58       for (final FieldDescriptor field : message.getDescriptorForType().getFields()) {
59         if (field.isRequired() && !fields.containsKey(field)) {
60           fields.put(field, message.getField(field));
61         }
62       }
63     }
64     for (final Map.Entry<Descriptors.FieldDescriptor, Object> entry : fields.entrySet()) {
65       final Descriptors.FieldDescriptor field = entry.getKey();
66       final Object value = entry.getValue();
67       if (isMessageSet
68           && field.isExtension()
69           && field.getType() == Descriptors.FieldDescriptor.Type.MESSAGE
70           && !field.isRepeated()) {
71         output.writeMessageSetExtension(field.getNumber(), (Message) value);
72       } else {
73         FieldSet.writeField(field, value, output);
74       }
75     }
76 
77     final UnknownFieldSet unknownFields = message.getUnknownFields();
78     if (isMessageSet) {
79       unknownFields.writeAsMessageSetTo(output);
80     } else {
81       unknownFields.writeTo(output);
82     }
83   }
84 
getSerializedSize(Message message, Map<FieldDescriptor, Object> fields)85   static int getSerializedSize(Message message, Map<FieldDescriptor, Object> fields) {
86     int size = 0;
87     final boolean isMessageSet =
88         message.getDescriptorForType().getOptions().getMessageSetWireFormat();
89 
90     for (final Map.Entry<Descriptors.FieldDescriptor, Object> entry : fields.entrySet()) {
91       final Descriptors.FieldDescriptor field = entry.getKey();
92       final Object value = entry.getValue();
93       if (isMessageSet
94           && field.isExtension()
95           && field.getType() == Descriptors.FieldDescriptor.Type.MESSAGE
96           && !field.isRepeated()) {
97         size +=
98             CodedOutputStream.computeMessageSetExtensionSize(field.getNumber(), (Message) value);
99       } else {
100         size += FieldSet.computeFieldSize(field, value);
101       }
102     }
103 
104     final UnknownFieldSet unknownFields = message.getUnknownFields();
105     if (isMessageSet) {
106       size += unknownFields.getSerializedSizeAsMessageSet();
107     } else {
108       size += unknownFields.getSerializedSize();
109     }
110     return size;
111   }
112 
delimitWithCommas(List<String> parts)113   static String delimitWithCommas(List<String> parts) {
114     StringBuilder result = new StringBuilder();
115     for (String part : parts) {
116       if (result.length() > 0) {
117         result.append(", ");
118       }
119       result.append(part);
120     }
121     return result.toString();
122   }
123 
124   @SuppressWarnings("unchecked")
isInitialized(MessageOrBuilder message)125   static boolean isInitialized(MessageOrBuilder message) {
126     // Check that all required fields are present.
127     for (final Descriptors.FieldDescriptor field : message.getDescriptorForType().getFields()) {
128       if (field.isRequired()) {
129         if (!message.hasField(field)) {
130           return false;
131         }
132       }
133     }
134 
135     // Check that embedded messages are initialized.
136     for (final Map.Entry<Descriptors.FieldDescriptor, Object> entry :
137         message.getAllFields().entrySet()) {
138       final Descriptors.FieldDescriptor field = entry.getKey();
139       if (field.getJavaType() == Descriptors.FieldDescriptor.JavaType.MESSAGE) {
140         if (field.isRepeated()) {
141           for (final Message element : (List<Message>) entry.getValue()) {
142             if (!element.isInitialized()) {
143               return false;
144             }
145           }
146         } else {
147           if (!((Message) entry.getValue()).isInitialized()) {
148             return false;
149           }
150         }
151       }
152     }
153 
154     return true;
155   }
156 
subMessagePrefix( final String prefix, final Descriptors.FieldDescriptor field, final int index)157   private static String subMessagePrefix(
158       final String prefix, final Descriptors.FieldDescriptor field, final int index) {
159     final StringBuilder result = new StringBuilder(prefix);
160     if (field.isExtension()) {
161       result.append('(').append(field.getFullName()).append(')');
162     } else {
163       result.append(field.getName());
164     }
165     if (index != -1) {
166       result.append('[').append(index).append(']');
167     }
168     result.append('.');
169     return result.toString();
170   }
171 
findMissingFields( final MessageOrBuilder message, final String prefix, final List<String> results)172   private static void findMissingFields(
173       final MessageOrBuilder message, final String prefix, final List<String> results) {
174     for (final Descriptors.FieldDescriptor field : message.getDescriptorForType().getFields()) {
175       if (field.isRequired() && !message.hasField(field)) {
176         results.add(prefix + field.getName());
177       }
178     }
179 
180     for (final Map.Entry<Descriptors.FieldDescriptor, Object> entry :
181         message.getAllFields().entrySet()) {
182       final Descriptors.FieldDescriptor field = entry.getKey();
183       final Object value = entry.getValue();
184 
185       if (field.getJavaType() == Descriptors.FieldDescriptor.JavaType.MESSAGE) {
186         if (field.isRepeated()) {
187           int i = 0;
188           for (final Object element : (List) value) {
189             findMissingFields(
190                 (MessageOrBuilder) element, subMessagePrefix(prefix, field, i++), results);
191           }
192         } else {
193           if (message.hasField(field)) {
194             findMissingFields(
195                 (MessageOrBuilder) value, subMessagePrefix(prefix, field, -1), results);
196           }
197         }
198       }
199     }
200   }
201 
202   /**
203    * Populates {@code this.missingFields} with the full "path" of each missing required field in the
204    * given message.
205    */
findMissingFields(final MessageOrBuilder message)206   static List<String> findMissingFields(final MessageOrBuilder message) {
207     final List<String> results = new ArrayList<String>();
208     findMissingFields(message, "", results);
209     return results;
210   }
211 
212   static interface MergeTarget {
213     enum ContainerType {
214       MESSAGE,
215       EXTENSION_SET
216     }
217 
218     /** Returns the descriptor for the target. */
getDescriptorForType()219     public Descriptors.Descriptor getDescriptorForType();
220 
getContainerType()221     public ContainerType getContainerType();
222 
findExtensionByName( ExtensionRegistry registry, String name)223     public ExtensionRegistry.ExtensionInfo findExtensionByName(
224         ExtensionRegistry registry, String name);
225 
findExtensionByNumber( ExtensionRegistry registry, Descriptors.Descriptor containingType, int fieldNumber)226     public ExtensionRegistry.ExtensionInfo findExtensionByNumber(
227         ExtensionRegistry registry, Descriptors.Descriptor containingType, int fieldNumber);
228 
229     /**
230      * Obtains the value of the given field, or the default value if it is not set. For primitive
231      * fields, the boxed primitive value is returned. For enum fields, the EnumValueDescriptor for
232      * the value is returned. For embedded message fields, the sub-message is returned. For repeated
233      * fields, a java.util.List is returned.
234      */
getField(Descriptors.FieldDescriptor field)235     public Object getField(Descriptors.FieldDescriptor field);
236 
237     /**
238      * Returns true if the given field is set. This is exactly equivalent to calling the generated
239      * "has" accessor method corresponding to the field.
240      *
241      * @throws IllegalArgumentException The field is a repeated field, or {@code
242      *     field.getContainingType() != getDescriptorForType()}.
243      */
hasField(Descriptors.FieldDescriptor field)244     boolean hasField(Descriptors.FieldDescriptor field);
245 
246     /**
247      * Sets a field to the given value. The value must be of the correct type for this field, i.e.
248      * the same type that {@link Message#getField(Descriptors.FieldDescriptor)} would return.
249      */
setField(Descriptors.FieldDescriptor field, Object value)250     MergeTarget setField(Descriptors.FieldDescriptor field, Object value);
251 
252     /**
253      * Clears the field. This is exactly equivalent to calling the generated "clear" accessor method
254      * corresponding to the field.
255      */
clearField(Descriptors.FieldDescriptor field)256     MergeTarget clearField(Descriptors.FieldDescriptor field);
257 
258     /**
259      * Sets an element of a repeated field to the given value. The value must be of the correct type
260      * for this field, i.e. the same type that {@link
261      * Message#getRepeatedField(Descriptors.FieldDescriptor, int)} would return.
262      *
263      * @throws IllegalArgumentException The field is not a repeated field, or {@code
264      *     field.getContainingType() != getDescriptorForType()}.
265      */
setRepeatedField(Descriptors.FieldDescriptor field, int index, Object value)266     MergeTarget setRepeatedField(Descriptors.FieldDescriptor field, int index, Object value);
267 
268     /**
269      * Like {@code setRepeatedField}, but appends the value as a new element.
270      *
271      * @throws IllegalArgumentException The field is not a repeated field, or {@code
272      *     field.getContainingType() != getDescriptorForType()}.
273      */
addRepeatedField(Descriptors.FieldDescriptor field, Object value)274     MergeTarget addRepeatedField(Descriptors.FieldDescriptor field, Object value);
275 
276     /**
277      * Returns true if the given oneof is set.
278      *
279      * @throws IllegalArgumentException if {@code oneof.getContainingType() !=
280      *     getDescriptorForType()}.
281      */
hasOneof(Descriptors.OneofDescriptor oneof)282     boolean hasOneof(Descriptors.OneofDescriptor oneof);
283 
284     /**
285      * Clears the oneof. This is exactly equivalent to calling the generated "clear" accessor method
286      * corresponding to the oneof.
287      */
clearOneof(Descriptors.OneofDescriptor oneof)288     MergeTarget clearOneof(Descriptors.OneofDescriptor oneof);
289 
290     /** Obtains the FieldDescriptor if the given oneof is set. Returns null if no field is set. */
getOneofFieldDescriptor(Descriptors.OneofDescriptor oneof)291     Descriptors.FieldDescriptor getOneofFieldDescriptor(Descriptors.OneofDescriptor oneof);
292 
293     /**
294      * Parse the input stream into a sub field group defined based on either FieldDescriptor or the
295      * default instance.
296      */
parseGroup( CodedInputStream input, ExtensionRegistryLite registry, Descriptors.FieldDescriptor descriptor, Message defaultInstance)297     Object parseGroup(
298         CodedInputStream input,
299         ExtensionRegistryLite registry,
300         Descriptors.FieldDescriptor descriptor,
301         Message defaultInstance)
302         throws IOException;
303 
304     /**
305      * Parse the input stream into a sub field message defined based on either FieldDescriptor or
306      * the default instance.
307      */
parseMessage( CodedInputStream input, ExtensionRegistryLite registry, Descriptors.FieldDescriptor descriptor, Message defaultInstance)308     Object parseMessage(
309         CodedInputStream input,
310         ExtensionRegistryLite registry,
311         Descriptors.FieldDescriptor descriptor,
312         Message defaultInstance)
313         throws IOException;
314 
315     /**
316      * Parse from a ByteString into a sub field message defined based on either FieldDescriptor or
317      * the default instance. There isn't a varint indicating the length of the message at the
318      * beginning of the input ByteString.
319      */
parseMessageFromBytes( ByteString bytes, ExtensionRegistryLite registry, Descriptors.FieldDescriptor descriptor, Message defaultInstance)320     Object parseMessageFromBytes(
321         ByteString bytes,
322         ExtensionRegistryLite registry,
323         Descriptors.FieldDescriptor descriptor,
324         Message defaultInstance)
325         throws IOException;
326 
327     /**
328      * Read the given group field from the wire, merging with the existing field if it is already
329      * present.
330      *
331      * <p>For extensions, defaultInstance must be specified. For regular fields, defaultInstance can
332      * be null.
333      */
mergeGroup( CodedInputStream input, ExtensionRegistryLite extensionRegistry, FieldDescriptor field, Message defaultInstance)334     void mergeGroup(
335         CodedInputStream input,
336         ExtensionRegistryLite extensionRegistry,
337         FieldDescriptor field,
338         Message defaultInstance)
339         throws IOException;
340 
341     /**
342      * Read the given message field from the wire, merging with the existing field if it is already
343      * present.
344      *
345      * <p>For extensions, defaultInstance must be specified. For regular fields, defaultInstance can
346      * be null.
347      */
mergeMessage( CodedInputStream input, ExtensionRegistryLite extensionRegistry, FieldDescriptor field, Message defaultInstance)348     void mergeMessage(
349         CodedInputStream input,
350         ExtensionRegistryLite extensionRegistry,
351         FieldDescriptor field,
352         Message defaultInstance)
353         throws IOException;
354 
355     /** Returns the UTF8 validation level for the field. */
getUtf8Validation(Descriptors.FieldDescriptor descriptor)356     WireFormat.Utf8Validation getUtf8Validation(Descriptors.FieldDescriptor descriptor);
357 
358     /**
359      * Returns a new merge target for a sub-field. When defaultInstance is provided, it indicates
360      * the descriptor is for an extension type, and implementations should create a new instance
361      * from the defaultInstance prototype directly.
362      */
newMergeTargetForField( Descriptors.FieldDescriptor descriptor, Message defaultInstance)363     MergeTarget newMergeTargetForField(
364         Descriptors.FieldDescriptor descriptor, Message defaultInstance);
365 
366     /**
367      * Returns an empty merge target for a sub-field. When defaultInstance is provided, it indicates
368      * the descriptor is for an extension type, and implementations should create a new instance
369      * from the defaultInstance prototype directly.
370      */
newEmptyTargetForField( Descriptors.FieldDescriptor descriptor, Message defaultInstance)371     MergeTarget newEmptyTargetForField(
372         Descriptors.FieldDescriptor descriptor, Message defaultInstance);
373 
374     /** Finishes the merge and returns the underlying object. */
finish()375     Object finish();
376   }
377 
378   static class BuilderAdapter implements MergeTarget {
379 
380     private final Message.Builder builder;
381     private boolean hasNestedBuilders = true;
382 
383     @Override
getDescriptorForType()384     public Descriptors.Descriptor getDescriptorForType() {
385       return builder.getDescriptorForType();
386     }
387 
BuilderAdapter(Message.Builder builder)388     public BuilderAdapter(Message.Builder builder) {
389       this.builder = builder;
390     }
391 
392     @Override
getField(Descriptors.FieldDescriptor field)393     public Object getField(Descriptors.FieldDescriptor field) {
394       return builder.getField(field);
395     }
396 
getFieldBuilder(Descriptors.FieldDescriptor field)397     private Message.Builder getFieldBuilder(Descriptors.FieldDescriptor field) {
398       if (hasNestedBuilders) {
399         try {
400           return builder.getFieldBuilder(field);
401         } catch (UnsupportedOperationException e) {
402           hasNestedBuilders = false;
403         }
404       }
405       return null;
406     }
407 
408     @Override
hasField(Descriptors.FieldDescriptor field)409     public boolean hasField(Descriptors.FieldDescriptor field) {
410       return builder.hasField(field);
411     }
412 
413     @Override
setField(Descriptors.FieldDescriptor field, Object value)414     public MergeTarget setField(Descriptors.FieldDescriptor field, Object value) {
415       if (!field.isRepeated() && value instanceof MessageLite.Builder) {
416         if (value != getFieldBuilder(field)) {
417           builder.setField(field, ((MessageLite.Builder) value).buildPartial());
418         }
419         return this;
420       }
421       builder.setField(field, value);
422       return this;
423     }
424 
425     @Override
clearField(Descriptors.FieldDescriptor field)426     public MergeTarget clearField(Descriptors.FieldDescriptor field) {
427       builder.clearField(field);
428       return this;
429     }
430 
431     @Override
setRepeatedField( Descriptors.FieldDescriptor field, int index, Object value)432     public MergeTarget setRepeatedField(
433         Descriptors.FieldDescriptor field, int index, Object value) {
434       if (value instanceof MessageLite.Builder) {
435         value = ((MessageLite.Builder) value).buildPartial();
436       }
437       builder.setRepeatedField(field, index, value);
438       return this;
439     }
440 
441     @Override
addRepeatedField(Descriptors.FieldDescriptor field, Object value)442     public MergeTarget addRepeatedField(Descriptors.FieldDescriptor field, Object value) {
443       if (value instanceof MessageLite.Builder) {
444         value = ((MessageLite.Builder) value).buildPartial();
445       }
446       builder.addRepeatedField(field, value);
447       return this;
448     }
449 
450     @Override
hasOneof(Descriptors.OneofDescriptor oneof)451     public boolean hasOneof(Descriptors.OneofDescriptor oneof) {
452       return builder.hasOneof(oneof);
453     }
454 
455     @Override
clearOneof(Descriptors.OneofDescriptor oneof)456     public MergeTarget clearOneof(Descriptors.OneofDescriptor oneof) {
457       builder.clearOneof(oneof);
458       return this;
459     }
460 
461     @Override
getOneofFieldDescriptor(Descriptors.OneofDescriptor oneof)462     public Descriptors.FieldDescriptor getOneofFieldDescriptor(Descriptors.OneofDescriptor oneof) {
463       return builder.getOneofFieldDescriptor(oneof);
464     }
465 
466     @Override
getContainerType()467     public ContainerType getContainerType() {
468       return ContainerType.MESSAGE;
469     }
470 
471     @Override
findExtensionByName( ExtensionRegistry registry, String name)472     public ExtensionRegistry.ExtensionInfo findExtensionByName(
473         ExtensionRegistry registry, String name) {
474       return registry.findImmutableExtensionByName(name);
475     }
476 
477     @Override
findExtensionByNumber( ExtensionRegistry registry, Descriptors.Descriptor containingType, int fieldNumber)478     public ExtensionRegistry.ExtensionInfo findExtensionByNumber(
479         ExtensionRegistry registry, Descriptors.Descriptor containingType, int fieldNumber) {
480       return registry.findImmutableExtensionByNumber(containingType, fieldNumber);
481     }
482 
483     @Override
parseGroup( CodedInputStream input, ExtensionRegistryLite extensionRegistry, Descriptors.FieldDescriptor field, Message defaultInstance)484     public Object parseGroup(
485         CodedInputStream input,
486         ExtensionRegistryLite extensionRegistry,
487         Descriptors.FieldDescriptor field,
488         Message defaultInstance)
489         throws IOException {
490       Message.Builder subBuilder;
491       // When default instance is not null. The field is an extension field.
492       if (defaultInstance != null) {
493         subBuilder = defaultInstance.newBuilderForType();
494       } else {
495         subBuilder = builder.newBuilderForField(field);
496       }
497       if (!field.isRepeated()) {
498         Message originalMessage = (Message) getField(field);
499         if (originalMessage != null) {
500           subBuilder.mergeFrom(originalMessage);
501         }
502       }
503       input.readGroup(field.getNumber(), subBuilder, extensionRegistry);
504       return subBuilder.buildPartial();
505     }
506 
507     @Override
parseMessage( CodedInputStream input, ExtensionRegistryLite extensionRegistry, Descriptors.FieldDescriptor field, Message defaultInstance)508     public Object parseMessage(
509         CodedInputStream input,
510         ExtensionRegistryLite extensionRegistry,
511         Descriptors.FieldDescriptor field,
512         Message defaultInstance)
513         throws IOException {
514       Message.Builder subBuilder;
515       // When default instance is not null. The field is an extension field.
516       if (defaultInstance != null) {
517         subBuilder = defaultInstance.newBuilderForType();
518       } else {
519         subBuilder = builder.newBuilderForField(field);
520       }
521       if (!field.isRepeated()) {
522         Message originalMessage = (Message) getField(field);
523         if (originalMessage != null) {
524           subBuilder.mergeFrom(originalMessage);
525         }
526       }
527       input.readMessage(subBuilder, extensionRegistry);
528       return subBuilder.buildPartial();
529     }
530 
531     @Override
parseMessageFromBytes( ByteString bytes, ExtensionRegistryLite extensionRegistry, Descriptors.FieldDescriptor field, Message defaultInstance)532     public Object parseMessageFromBytes(
533         ByteString bytes,
534         ExtensionRegistryLite extensionRegistry,
535         Descriptors.FieldDescriptor field,
536         Message defaultInstance)
537         throws IOException {
538       Message.Builder subBuilder;
539       // When default instance is not null. The field is an extension field.
540       if (defaultInstance != null) {
541         subBuilder = defaultInstance.newBuilderForType();
542       } else {
543         subBuilder = builder.newBuilderForField(field);
544       }
545       if (!field.isRepeated()) {
546         Message originalMessage = (Message) getField(field);
547         if (originalMessage != null) {
548           subBuilder.mergeFrom(originalMessage);
549         }
550       }
551       subBuilder.mergeFrom(bytes, extensionRegistry);
552       return subBuilder.buildPartial();
553     }
554 
555     @Override
mergeGroup( CodedInputStream input, ExtensionRegistryLite extensionRegistry, FieldDescriptor field, Message defaultInstance)556     public void mergeGroup(
557         CodedInputStream input,
558         ExtensionRegistryLite extensionRegistry,
559         FieldDescriptor field,
560         Message defaultInstance)
561         throws IOException {
562       if (!field.isRepeated()) {
563         Message.Builder subBuilder;
564         if (hasField(field)) {
565           subBuilder = getFieldBuilder(field);
566           if (subBuilder != null) {
567             input.readGroup(field.getNumber(), subBuilder, extensionRegistry);
568             return;
569           } else {
570             subBuilder = newMessageFieldInstance(field, defaultInstance);
571             subBuilder.mergeFrom((Message) getField(field));
572           }
573         } else {
574           subBuilder = newMessageFieldInstance(field, defaultInstance);
575         }
576         input.readGroup(field.getNumber(), subBuilder, extensionRegistry);
577         Object unused = setField(field, subBuilder.buildPartial());
578       } else {
579         Message.Builder subBuilder = newMessageFieldInstance(field, defaultInstance);
580         input.readGroup(field.getNumber(), subBuilder, extensionRegistry);
581         Object unused = addRepeatedField(field, subBuilder.buildPartial());
582       }
583     }
584 
585     @Override
mergeMessage( CodedInputStream input, ExtensionRegistryLite extensionRegistry, Descriptors.FieldDescriptor field, Message defaultInstance)586     public void mergeMessage(
587         CodedInputStream input,
588         ExtensionRegistryLite extensionRegistry,
589         Descriptors.FieldDescriptor field,
590         Message defaultInstance)
591         throws IOException {
592       if (!field.isRepeated()) {
593         Message.Builder subBuilder;
594         if (hasField(field)) {
595           subBuilder = getFieldBuilder(field);
596           if (subBuilder != null) {
597             input.readMessage(subBuilder, extensionRegistry);
598             return;
599           } else {
600             subBuilder = newMessageFieldInstance(field, defaultInstance);
601             subBuilder.mergeFrom((Message) getField(field));
602           }
603         } else {
604           subBuilder = newMessageFieldInstance(field, defaultInstance);
605         }
606         input.readMessage(subBuilder, extensionRegistry);
607         Object unused = setField(field, subBuilder.buildPartial());
608       } else {
609         Message.Builder subBuilder = newMessageFieldInstance(field, defaultInstance);
610         input.readMessage(subBuilder, extensionRegistry);
611         Object unused = addRepeatedField(field, subBuilder.buildPartial());
612       }
613     }
614 
newMessageFieldInstance( FieldDescriptor field, Message defaultInstance)615     private Message.Builder newMessageFieldInstance(
616         FieldDescriptor field, Message defaultInstance) {
617       // When default instance is not null. The field is an extension field.
618       if (defaultInstance != null) {
619         return defaultInstance.newBuilderForType();
620       } else {
621         return builder.newBuilderForField(field);
622       }
623     }
624 
625     @Override
newMergeTargetForField( Descriptors.FieldDescriptor field, Message defaultInstance)626     public MergeTarget newMergeTargetForField(
627         Descriptors.FieldDescriptor field, Message defaultInstance) {
628       Message.Builder subBuilder;
629       if (!field.isRepeated() && hasField(field)) {
630         subBuilder = getFieldBuilder(field);
631         if (subBuilder != null) {
632           return new BuilderAdapter(subBuilder);
633         }
634       }
635 
636       subBuilder = newMessageFieldInstance(field, defaultInstance);
637       if (!field.isRepeated()) {
638         Message originalMessage = (Message) getField(field);
639         if (originalMessage != null) {
640           subBuilder.mergeFrom(originalMessage);
641         }
642       }
643       return new BuilderAdapter(subBuilder);
644     }
645 
646     @Override
newEmptyTargetForField( Descriptors.FieldDescriptor field, Message defaultInstance)647     public MergeTarget newEmptyTargetForField(
648         Descriptors.FieldDescriptor field, Message defaultInstance) {
649       Message.Builder subBuilder;
650       if (defaultInstance != null) {
651         subBuilder = defaultInstance.newBuilderForType();
652       } else {
653         subBuilder = builder.newBuilderForField(field);
654       }
655       return new BuilderAdapter(subBuilder);
656     }
657 
658     @Override
getUtf8Validation(Descriptors.FieldDescriptor descriptor)659     public WireFormat.Utf8Validation getUtf8Validation(Descriptors.FieldDescriptor descriptor) {
660       if (descriptor.needsUtf8Check()) {
661         return WireFormat.Utf8Validation.STRICT;
662       }
663       // TODO(liujisi): support lazy strings for repeated fields.
664       if (!descriptor.isRepeated() && builder instanceof GeneratedMessage.Builder) {
665         return WireFormat.Utf8Validation.LAZY;
666       }
667       return WireFormat.Utf8Validation.LOOSE;
668     }
669 
670     @Override
finish()671     public Object finish() {
672       return builder;
673     }
674   }
675 
676 
677   static class ExtensionAdapter implements MergeTarget {
678 
679     private final FieldSet<Descriptors.FieldDescriptor> extensions;
680 
ExtensionAdapter(FieldSet<Descriptors.FieldDescriptor> extensions)681     ExtensionAdapter(FieldSet<Descriptors.FieldDescriptor> extensions) {
682       this.extensions = extensions;
683     }
684 
685     @Override
getDescriptorForType()686     public Descriptors.Descriptor getDescriptorForType() {
687       throw new UnsupportedOperationException("getDescriptorForType() called on FieldSet object");
688     }
689 
690     @Override
getField(Descriptors.FieldDescriptor field)691     public Object getField(Descriptors.FieldDescriptor field) {
692       return extensions.getField(field);
693     }
694 
695     @Override
hasField(Descriptors.FieldDescriptor field)696     public boolean hasField(Descriptors.FieldDescriptor field) {
697       return extensions.hasField(field);
698     }
699 
700     @Override
setField(Descriptors.FieldDescriptor field, Object value)701     public MergeTarget setField(Descriptors.FieldDescriptor field, Object value) {
702       extensions.setField(field, value);
703       return this;
704     }
705 
706     @Override
clearField(Descriptors.FieldDescriptor field)707     public MergeTarget clearField(Descriptors.FieldDescriptor field) {
708       extensions.clearField(field);
709       return this;
710     }
711 
712     @Override
setRepeatedField( Descriptors.FieldDescriptor field, int index, Object value)713     public MergeTarget setRepeatedField(
714         Descriptors.FieldDescriptor field, int index, Object value) {
715       extensions.setRepeatedField(field, index, value);
716       return this;
717     }
718 
719     @Override
addRepeatedField(Descriptors.FieldDescriptor field, Object value)720     public MergeTarget addRepeatedField(Descriptors.FieldDescriptor field, Object value) {
721       extensions.addRepeatedField(field, value);
722       return this;
723     }
724 
725     @Override
hasOneof(Descriptors.OneofDescriptor oneof)726     public boolean hasOneof(Descriptors.OneofDescriptor oneof) {
727       return false;
728     }
729 
730     @Override
clearOneof(Descriptors.OneofDescriptor oneof)731     public MergeTarget clearOneof(Descriptors.OneofDescriptor oneof) {
732       // Nothing to clear.
733       return this;
734     }
735 
736     @Override
getOneofFieldDescriptor(Descriptors.OneofDescriptor oneof)737     public Descriptors.FieldDescriptor getOneofFieldDescriptor(Descriptors.OneofDescriptor oneof) {
738       return null;
739     }
740 
741     @Override
getContainerType()742     public ContainerType getContainerType() {
743       return ContainerType.EXTENSION_SET;
744     }
745 
746     @Override
findExtensionByName( ExtensionRegistry registry, String name)747     public ExtensionRegistry.ExtensionInfo findExtensionByName(
748         ExtensionRegistry registry, String name) {
749       return registry.findImmutableExtensionByName(name);
750     }
751 
752     @Override
findExtensionByNumber( ExtensionRegistry registry, Descriptors.Descriptor containingType, int fieldNumber)753     public ExtensionRegistry.ExtensionInfo findExtensionByNumber(
754         ExtensionRegistry registry, Descriptors.Descriptor containingType, int fieldNumber) {
755       return registry.findImmutableExtensionByNumber(containingType, fieldNumber);
756     }
757 
758     @Override
parseGroup( CodedInputStream input, ExtensionRegistryLite registry, Descriptors.FieldDescriptor field, Message defaultInstance)759     public Object parseGroup(
760         CodedInputStream input,
761         ExtensionRegistryLite registry,
762         Descriptors.FieldDescriptor field,
763         Message defaultInstance)
764         throws IOException {
765       Message.Builder subBuilder = defaultInstance.newBuilderForType();
766       if (!field.isRepeated()) {
767         Message originalMessage = (Message) getField(field);
768         if (originalMessage != null) {
769           subBuilder.mergeFrom(originalMessage);
770         }
771       }
772       input.readGroup(field.getNumber(), subBuilder, registry);
773       return subBuilder.buildPartial();
774     }
775 
776     @Override
parseMessage( CodedInputStream input, ExtensionRegistryLite registry, Descriptors.FieldDescriptor field, Message defaultInstance)777     public Object parseMessage(
778         CodedInputStream input,
779         ExtensionRegistryLite registry,
780         Descriptors.FieldDescriptor field,
781         Message defaultInstance)
782         throws IOException {
783       Message.Builder subBuilder = defaultInstance.newBuilderForType();
784       if (!field.isRepeated()) {
785         Message originalMessage = (Message) getField(field);
786         if (originalMessage != null) {
787           subBuilder.mergeFrom(originalMessage);
788         }
789       }
790       input.readMessage(subBuilder, registry);
791       return subBuilder.buildPartial();
792     }
793 
794     @Override
mergeGroup( CodedInputStream input, ExtensionRegistryLite extensionRegistry, FieldDescriptor field, Message defaultInstance)795     public void mergeGroup(
796         CodedInputStream input,
797         ExtensionRegistryLite extensionRegistry,
798         FieldDescriptor field,
799         Message defaultInstance)
800         throws IOException {
801       if (!field.isRepeated()) {
802         if (hasField(field)) {
803           MessageLite.Builder current = ((MessageLite) getField(field)).toBuilder();
804           input.readGroup(field.getNumber(), current, extensionRegistry);
805           Object unused = setField(field, current.buildPartial());
806           return;
807         }
808         Message.Builder subBuilder = defaultInstance.newBuilderForType();
809         input.readGroup(field.getNumber(), subBuilder, extensionRegistry);
810         Object unused = setField(field, subBuilder.buildPartial());
811       } else {
812         Message.Builder subBuilder = defaultInstance.newBuilderForType();
813         input.readGroup(field.getNumber(), subBuilder, extensionRegistry);
814         Object unused = addRepeatedField(field, subBuilder.buildPartial());
815       }
816     }
817 
818     @Override
mergeMessage( CodedInputStream input, ExtensionRegistryLite extensionRegistry, FieldDescriptor field, Message defaultInstance)819     public void mergeMessage(
820         CodedInputStream input,
821         ExtensionRegistryLite extensionRegistry,
822         FieldDescriptor field,
823         Message defaultInstance)
824         throws IOException {
825       if (!field.isRepeated()) {
826         if (hasField(field)) {
827           MessageLite.Builder current = ((MessageLite) getField(field)).toBuilder();
828           input.readMessage(current, extensionRegistry);
829           Object unused = setField(field, current.buildPartial());
830           return;
831         }
832         Message.Builder subBuilder = defaultInstance.newBuilderForType();
833         input.readMessage(subBuilder, extensionRegistry);
834         Object unused = setField(field, subBuilder.buildPartial());
835       } else {
836         Message.Builder subBuilder = defaultInstance.newBuilderForType();
837         input.readMessage(subBuilder, extensionRegistry);
838         Object unused = addRepeatedField(field, subBuilder.buildPartial());
839       }
840     }
841 
842     @Override
parseMessageFromBytes( ByteString bytes, ExtensionRegistryLite registry, Descriptors.FieldDescriptor field, Message defaultInstance)843     public Object parseMessageFromBytes(
844         ByteString bytes,
845         ExtensionRegistryLite registry,
846         Descriptors.FieldDescriptor field,
847         Message defaultInstance)
848         throws IOException {
849       Message.Builder subBuilder = defaultInstance.newBuilderForType();
850       if (!field.isRepeated()) {
851         Message originalMessage = (Message) getField(field);
852         if (originalMessage != null) {
853           subBuilder.mergeFrom(originalMessage);
854         }
855       }
856       subBuilder.mergeFrom(bytes, registry);
857       return subBuilder.buildPartial();
858     }
859 
860     @Override
newMergeTargetForField( Descriptors.FieldDescriptor descriptor, Message defaultInstance)861     public MergeTarget newMergeTargetForField(
862         Descriptors.FieldDescriptor descriptor, Message defaultInstance) {
863       throw new UnsupportedOperationException("newMergeTargetForField() called on FieldSet object");
864     }
865 
866     @Override
newEmptyTargetForField( Descriptors.FieldDescriptor descriptor, Message defaultInstance)867     public MergeTarget newEmptyTargetForField(
868         Descriptors.FieldDescriptor descriptor, Message defaultInstance) {
869       throw new UnsupportedOperationException("newEmptyTargetForField() called on FieldSet object");
870     }
871 
872     @Override
getUtf8Validation(Descriptors.FieldDescriptor descriptor)873     public WireFormat.Utf8Validation getUtf8Validation(Descriptors.FieldDescriptor descriptor) {
874       if (descriptor.needsUtf8Check()) {
875         return WireFormat.Utf8Validation.STRICT;
876       }
877       // TODO(b/248145492): support lazy strings for ExtesnsionSet.
878       return WireFormat.Utf8Validation.LOOSE;
879     }
880 
881     @Override
finish()882     public Object finish() {
883       throw new UnsupportedOperationException("finish() called on FieldSet object");
884     }
885   }
886 
887   static class ExtensionBuilderAdapter implements MergeTarget {
888 
889     private final FieldSet.Builder<Descriptors.FieldDescriptor> extensions;
890 
ExtensionBuilderAdapter(FieldSet.Builder<Descriptors.FieldDescriptor> extensions)891     ExtensionBuilderAdapter(FieldSet.Builder<Descriptors.FieldDescriptor> extensions) {
892       this.extensions = extensions;
893     }
894 
895     @Override
getDescriptorForType()896     public Descriptors.Descriptor getDescriptorForType() {
897       throw new UnsupportedOperationException("getDescriptorForType() called on FieldSet object");
898     }
899 
900     @Override
getField(Descriptors.FieldDescriptor field)901     public Object getField(Descriptors.FieldDescriptor field) {
902       return extensions.getField(field);
903     }
904 
905     @Override
hasField(Descriptors.FieldDescriptor field)906     public boolean hasField(Descriptors.FieldDescriptor field) {
907       return extensions.hasField(field);
908     }
909 
910     @Override
setField(Descriptors.FieldDescriptor field, Object value)911     public MergeTarget setField(Descriptors.FieldDescriptor field, Object value) {
912       extensions.setField(field, value);
913       return this;
914     }
915 
916     @Override
clearField(Descriptors.FieldDescriptor field)917     public MergeTarget clearField(Descriptors.FieldDescriptor field) {
918       extensions.clearField(field);
919       return this;
920     }
921 
922     @Override
setRepeatedField( Descriptors.FieldDescriptor field, int index, Object value)923     public MergeTarget setRepeatedField(
924         Descriptors.FieldDescriptor field, int index, Object value) {
925       extensions.setRepeatedField(field, index, value);
926       return this;
927     }
928 
929     @Override
addRepeatedField(Descriptors.FieldDescriptor field, Object value)930     public MergeTarget addRepeatedField(Descriptors.FieldDescriptor field, Object value) {
931       extensions.addRepeatedField(field, value);
932       return this;
933     }
934 
935     @Override
hasOneof(Descriptors.OneofDescriptor oneof)936     public boolean hasOneof(Descriptors.OneofDescriptor oneof) {
937       return false;
938     }
939 
940     @Override
clearOneof(Descriptors.OneofDescriptor oneof)941     public MergeTarget clearOneof(Descriptors.OneofDescriptor oneof) {
942       // Nothing to clear.
943       return this;
944     }
945 
946     @Override
getOneofFieldDescriptor(Descriptors.OneofDescriptor oneof)947     public Descriptors.FieldDescriptor getOneofFieldDescriptor(Descriptors.OneofDescriptor oneof) {
948       return null;
949     }
950 
951     @Override
getContainerType()952     public ContainerType getContainerType() {
953       return ContainerType.EXTENSION_SET;
954     }
955 
956     @Override
findExtensionByName( ExtensionRegistry registry, String name)957     public ExtensionRegistry.ExtensionInfo findExtensionByName(
958         ExtensionRegistry registry, String name) {
959       return registry.findImmutableExtensionByName(name);
960     }
961 
962     @Override
findExtensionByNumber( ExtensionRegistry registry, Descriptors.Descriptor containingType, int fieldNumber)963     public ExtensionRegistry.ExtensionInfo findExtensionByNumber(
964         ExtensionRegistry registry, Descriptors.Descriptor containingType, int fieldNumber) {
965       return registry.findImmutableExtensionByNumber(containingType, fieldNumber);
966     }
967 
968     @Override
parseGroup( CodedInputStream input, ExtensionRegistryLite registry, Descriptors.FieldDescriptor field, Message defaultInstance)969     public Object parseGroup(
970         CodedInputStream input,
971         ExtensionRegistryLite registry,
972         Descriptors.FieldDescriptor field,
973         Message defaultInstance)
974         throws IOException {
975       Message.Builder subBuilder = defaultInstance.newBuilderForType();
976       if (!field.isRepeated()) {
977         Message originalMessage = (Message) getField(field);
978         if (originalMessage != null) {
979           subBuilder.mergeFrom(originalMessage);
980         }
981       }
982       input.readGroup(field.getNumber(), subBuilder, registry);
983       return subBuilder.buildPartial();
984     }
985 
986     @Override
parseMessage( CodedInputStream input, ExtensionRegistryLite registry, Descriptors.FieldDescriptor field, Message defaultInstance)987     public Object parseMessage(
988         CodedInputStream input,
989         ExtensionRegistryLite registry,
990         Descriptors.FieldDescriptor field,
991         Message defaultInstance)
992         throws IOException {
993       Message.Builder subBuilder = defaultInstance.newBuilderForType();
994       if (!field.isRepeated()) {
995         Message originalMessage = (Message) getField(field);
996         if (originalMessage != null) {
997           subBuilder.mergeFrom(originalMessage);
998         }
999       }
1000       input.readMessage(subBuilder, registry);
1001       return subBuilder.buildPartial();
1002     }
1003 
1004     @Override
mergeGroup( CodedInputStream input, ExtensionRegistryLite extensionRegistry, FieldDescriptor field, Message defaultInstance)1005     public void mergeGroup(
1006         CodedInputStream input,
1007         ExtensionRegistryLite extensionRegistry,
1008         FieldDescriptor field,
1009         Message defaultInstance)
1010         throws IOException {
1011       if (!field.isRepeated()) {
1012         if (hasField(field)) {
1013           Object fieldOrBuilder = extensions.getFieldAllowBuilders(field);
1014           MessageLite.Builder subBuilder;
1015           if (fieldOrBuilder instanceof MessageLite.Builder) {
1016             subBuilder = (MessageLite.Builder) fieldOrBuilder;
1017           } else {
1018             subBuilder = ((MessageLite) fieldOrBuilder).toBuilder();
1019             extensions.setField(field, subBuilder);
1020           }
1021           input.readGroup(field.getNumber(), subBuilder, extensionRegistry);
1022           return;
1023         }
1024         Message.Builder subBuilder = defaultInstance.newBuilderForType();
1025         input.readGroup(field.getNumber(), subBuilder, extensionRegistry);
1026         Object unused = setField(field, subBuilder);
1027       } else {
1028         Message.Builder subBuilder = defaultInstance.newBuilderForType();
1029         input.readGroup(field.getNumber(), subBuilder, extensionRegistry);
1030         Object unused = addRepeatedField(field, subBuilder.buildPartial());
1031       }
1032     }
1033 
1034     @Override
mergeMessage( CodedInputStream input, ExtensionRegistryLite extensionRegistry, FieldDescriptor field, Message defaultInstance)1035     public void mergeMessage(
1036         CodedInputStream input,
1037         ExtensionRegistryLite extensionRegistry,
1038         FieldDescriptor field,
1039         Message defaultInstance)
1040         throws IOException {
1041       if (!field.isRepeated()) {
1042         if (hasField(field)) {
1043           Object fieldOrBuilder = extensions.getFieldAllowBuilders(field);
1044           MessageLite.Builder subBuilder;
1045           if (fieldOrBuilder instanceof MessageLite.Builder) {
1046             subBuilder = (MessageLite.Builder) fieldOrBuilder;
1047           } else {
1048             subBuilder = ((MessageLite) fieldOrBuilder).toBuilder();
1049             extensions.setField(field, subBuilder);
1050           }
1051           input.readMessage(subBuilder, extensionRegistry);
1052           return;
1053         }
1054         Message.Builder subBuilder = defaultInstance.newBuilderForType();
1055         input.readMessage(subBuilder, extensionRegistry);
1056         Object unused = setField(field, subBuilder);
1057       } else {
1058         Message.Builder subBuilder = defaultInstance.newBuilderForType();
1059         input.readMessage(subBuilder, extensionRegistry);
1060         Object unused = addRepeatedField(field, subBuilder.buildPartial());
1061       }
1062     }
1063 
1064     @Override
parseMessageFromBytes( ByteString bytes, ExtensionRegistryLite registry, Descriptors.FieldDescriptor field, Message defaultInstance)1065     public Object parseMessageFromBytes(
1066         ByteString bytes,
1067         ExtensionRegistryLite registry,
1068         Descriptors.FieldDescriptor field,
1069         Message defaultInstance)
1070         throws IOException {
1071       Message.Builder subBuilder = defaultInstance.newBuilderForType();
1072       if (!field.isRepeated()) {
1073         Message originalMessage = (Message) getField(field);
1074         if (originalMessage != null) {
1075           subBuilder.mergeFrom(originalMessage);
1076         }
1077       }
1078       subBuilder.mergeFrom(bytes, registry);
1079       return subBuilder.buildPartial();
1080     }
1081 
1082     @Override
newMergeTargetForField( Descriptors.FieldDescriptor descriptor, Message defaultInstance)1083     public MergeTarget newMergeTargetForField(
1084         Descriptors.FieldDescriptor descriptor, Message defaultInstance) {
1085       throw new UnsupportedOperationException("newMergeTargetForField() called on FieldSet object");
1086     }
1087 
1088     @Override
newEmptyTargetForField( Descriptors.FieldDescriptor descriptor, Message defaultInstance)1089     public MergeTarget newEmptyTargetForField(
1090         Descriptors.FieldDescriptor descriptor, Message defaultInstance) {
1091       throw new UnsupportedOperationException("newEmptyTargetForField() called on FieldSet object");
1092     }
1093 
1094     @Override
getUtf8Validation(Descriptors.FieldDescriptor descriptor)1095     public WireFormat.Utf8Validation getUtf8Validation(Descriptors.FieldDescriptor descriptor) {
1096       if (descriptor.needsUtf8Check()) {
1097         return WireFormat.Utf8Validation.STRICT;
1098       }
1099       // TODO(b/248145492): support lazy strings for ExtesnsionSet.
1100       return WireFormat.Utf8Validation.LOOSE;
1101     }
1102 
1103     @Override
finish()1104     public Object finish() {
1105       throw new UnsupportedOperationException("finish() called on FieldSet object");
1106     }
1107   }
1108 
1109   /**
1110    * Parses a single field into MergeTarget. The target can be Message.Builder, FieldSet or
1111    * MutableMessage.
1112    *
1113    * <p>Package-private because it is used by GeneratedMessage.ExtendableMessage.
1114    *
1115    * @param tag The tag, which should have already been read.
1116    * @param unknownFields If not null, unknown fields will be merged to this {@link
1117    *     UnknownFieldSet}, otherwise unknown fields will be discarded.
1118    * @return {@code true} unless the tag is an end-group tag.
1119    */
mergeFieldFrom( CodedInputStream input, UnknownFieldSet.Builder unknownFields, ExtensionRegistryLite extensionRegistry, Descriptors.Descriptor type, MergeTarget target, int tag)1120   static boolean mergeFieldFrom(
1121       CodedInputStream input,
1122       UnknownFieldSet.Builder unknownFields,
1123       ExtensionRegistryLite extensionRegistry,
1124       Descriptors.Descriptor type,
1125       MergeTarget target,
1126       int tag)
1127       throws IOException {
1128     if (type.getOptions().getMessageSetWireFormat() && tag == WireFormat.MESSAGE_SET_ITEM_TAG) {
1129       mergeMessageSetExtensionFromCodedStream(
1130           input, unknownFields, extensionRegistry, type, target);
1131       return true;
1132     }
1133 
1134     final int wireType = WireFormat.getTagWireType(tag);
1135     final int fieldNumber = WireFormat.getTagFieldNumber(tag);
1136 
1137     final Descriptors.FieldDescriptor field;
1138     Message defaultInstance = null;
1139 
1140     if (type.isExtensionNumber(fieldNumber)) {
1141       // extensionRegistry may be either ExtensionRegistry or
1142       // ExtensionRegistryLite.  Since the type we are parsing is a full
1143       // message, only a full ExtensionRegistry could possibly contain
1144       // extensions of it.  Otherwise we will treat the registry as if it
1145       // were empty.
1146       if (extensionRegistry instanceof ExtensionRegistry) {
1147         final ExtensionRegistry.ExtensionInfo extension =
1148             target.findExtensionByNumber((ExtensionRegistry) extensionRegistry, type, fieldNumber);
1149         if (extension == null) {
1150           field = null;
1151         } else {
1152           field = extension.descriptor;
1153           defaultInstance = extension.defaultInstance;
1154           if (defaultInstance == null
1155               && field.getJavaType() == Descriptors.FieldDescriptor.JavaType.MESSAGE) {
1156             throw new IllegalStateException(
1157                 "Message-typed extension lacked default instance: " + field.getFullName());
1158           }
1159         }
1160       } else {
1161         field = null;
1162       }
1163     } else if (target.getContainerType() == MergeTarget.ContainerType.MESSAGE) {
1164       field = type.findFieldByNumber(fieldNumber);
1165     } else {
1166       field = null;
1167     }
1168 
1169     boolean unknown = false;
1170     boolean packed = false;
1171     if (field == null) {
1172       unknown = true; // Unknown field.
1173     } else if (wireType
1174         == FieldSet.getWireFormatForFieldType(field.getLiteType(), /* isPacked= */ false)) {
1175       packed = false;
1176     } else if (field.isPackable()
1177         && wireType
1178             == FieldSet.getWireFormatForFieldType(field.getLiteType(), /* isPacked= */ true)) {
1179       packed = true;
1180     } else {
1181       unknown = true; // Unknown wire type.
1182     }
1183 
1184     if (unknown) { // Unknown field or wrong wire type.  Skip.
1185       if (unknownFields != null) {
1186         return unknownFields.mergeFieldFrom(tag, input);
1187       } else {
1188         return input.skipField(tag);
1189       }
1190     }
1191 
1192     if (packed) {
1193       final int length = input.readRawVarint32();
1194       final int limit = input.pushLimit(length);
1195       if (field.getLiteType() == WireFormat.FieldType.ENUM) {
1196         while (input.getBytesUntilLimit() > 0) {
1197           final int rawValue = input.readEnum();
1198           if (field.getFile().supportsUnknownEnumValue()) {
1199             target.addRepeatedField(
1200                 field, field.getEnumType().findValueByNumberCreatingIfUnknown(rawValue));
1201           } else {
1202             final Object value = field.getEnumType().findValueByNumber(rawValue);
1203             // If the number isn't recognized as a valid value for this enum,
1204             // add it to the unknown fields.
1205             if (value == null) {
1206               if (unknownFields != null) {
1207                 unknownFields.mergeVarintField(fieldNumber, rawValue);
1208               }
1209             } else {
1210               target.addRepeatedField(field, value);
1211             }
1212           }
1213         }
1214       } else {
1215         while (input.getBytesUntilLimit() > 0) {
1216           final Object value =
1217               WireFormat.readPrimitiveField(
1218                   input, field.getLiteType(), target.getUtf8Validation(field));
1219           target.addRepeatedField(field, value);
1220         }
1221       }
1222       input.popLimit(limit);
1223     } else {
1224       final Object value;
1225       switch (field.getType()) {
1226         case GROUP:
1227           {
1228             target.mergeGroup(input, extensionRegistry, field, defaultInstance);
1229             return true;
1230           }
1231         case MESSAGE:
1232           {
1233             target.mergeMessage(input, extensionRegistry, field, defaultInstance);
1234             return true;
1235           }
1236         case ENUM:
1237           final int rawValue = input.readEnum();
1238           if (field.getFile().supportsUnknownEnumValue()) {
1239             value = field.getEnumType().findValueByNumberCreatingIfUnknown(rawValue);
1240           } else {
1241             value = field.getEnumType().findValueByNumber(rawValue);
1242             // If the number isn't recognized as a valid value for this enum,
1243             // add it to the unknown fields.
1244             if (value == null) {
1245               if (unknownFields != null) {
1246                 unknownFields.mergeVarintField(fieldNumber, rawValue);
1247               }
1248               return true;
1249             }
1250           }
1251           break;
1252         default:
1253           value =
1254               WireFormat.readPrimitiveField(
1255                   input, field.getLiteType(), target.getUtf8Validation(field));
1256           break;
1257       }
1258 
1259       if (field.isRepeated()) {
1260         target.addRepeatedField(field, value);
1261       } else {
1262         target.setField(field, value);
1263       }
1264     }
1265 
1266     return true;
1267   }
1268 
1269   /** Read a message from the given input stream into the provided target and UnknownFieldSet. */
mergeMessageFrom( Message.Builder target, UnknownFieldSet.Builder unknownFields, CodedInputStream input, ExtensionRegistryLite extensionRegistry)1270   static void mergeMessageFrom(
1271       Message.Builder target,
1272       UnknownFieldSet.Builder unknownFields,
1273       CodedInputStream input,
1274       ExtensionRegistryLite extensionRegistry)
1275       throws IOException {
1276     BuilderAdapter builderAdapter = new BuilderAdapter(target);
1277     Descriptor descriptorForType = target.getDescriptorForType();
1278     while (true) {
1279       final int tag = input.readTag();
1280       if (tag == 0) {
1281         break;
1282       }
1283 
1284       if (!mergeFieldFrom(
1285           input, unknownFields, extensionRegistry, descriptorForType, builderAdapter, tag)) {
1286         // end group tag
1287         break;
1288       }
1289     }
1290   }
1291 
1292   /** Called by {@code #mergeFieldFrom()} to parse a MessageSet extension into MergeTarget. */
mergeMessageSetExtensionFromCodedStream( CodedInputStream input, UnknownFieldSet.Builder unknownFields, ExtensionRegistryLite extensionRegistry, Descriptors.Descriptor type, MergeTarget target)1293   private static void mergeMessageSetExtensionFromCodedStream(
1294       CodedInputStream input,
1295       UnknownFieldSet.Builder unknownFields,
1296       ExtensionRegistryLite extensionRegistry,
1297       Descriptors.Descriptor type,
1298       MergeTarget target)
1299       throws IOException {
1300 
1301     // The wire format for MessageSet is:
1302     //   message MessageSet {
1303     //     repeated group Item = 1 {
1304     //       required int32 typeId = 2;
1305     //       required bytes message = 3;
1306     //     }
1307     //   }
1308     // "typeId" is the extension's field number.  The extension can only be
1309     // a message type, where "message" contains the encoded bytes of that
1310     // message.
1311     //
1312     // In practice, we will probably never see a MessageSet item in which
1313     // the message appears before the type ID, or where either field does not
1314     // appear exactly once.  However, in theory such cases are valid, so we
1315     // should be prepared to accept them.
1316 
1317     int typeId = 0;
1318     ByteString rawBytes = null; // If we encounter "message" before "typeId"
1319     ExtensionRegistry.ExtensionInfo extension = null;
1320 
1321     // Read bytes from input, if we get it's type first then parse it eagerly,
1322     // otherwise we store the raw bytes in a local variable.
1323     while (true) {
1324       final int tag = input.readTag();
1325       if (tag == 0) {
1326         break;
1327       }
1328 
1329       if (tag == WireFormat.MESSAGE_SET_TYPE_ID_TAG) {
1330         typeId = input.readUInt32();
1331         if (typeId != 0) {
1332           // extensionRegistry may be either ExtensionRegistry or
1333           // ExtensionRegistryLite. Since the type we are parsing is a full
1334           // message, only a full ExtensionRegistry could possibly contain
1335           // extensions of it. Otherwise we will treat the registry as if it
1336           // were empty.
1337           if (extensionRegistry instanceof ExtensionRegistry) {
1338             extension =
1339                 target.findExtensionByNumber((ExtensionRegistry) extensionRegistry, type, typeId);
1340           }
1341         }
1342 
1343       } else if (tag == WireFormat.MESSAGE_SET_MESSAGE_TAG) {
1344         if (typeId != 0) {
1345           if (extension != null && ExtensionRegistryLite.isEagerlyParseMessageSets()) {
1346             // We already know the type, so we can parse directly from the
1347             // input with no copying.  Hooray!
1348             eagerlyMergeMessageSetExtension(input, extension, extensionRegistry, target);
1349             rawBytes = null;
1350             continue;
1351           }
1352         }
1353         // We haven't seen a type ID yet or we want parse message lazily.
1354         rawBytes = input.readBytes();
1355 
1356       } else { // Unknown tag. Skip it.
1357         if (!input.skipField(tag)) {
1358           break; // End of group
1359         }
1360       }
1361     }
1362     input.checkLastTagWas(WireFormat.MESSAGE_SET_ITEM_END_TAG);
1363 
1364     // Process the raw bytes.
1365     if (rawBytes != null && typeId != 0) { // Zero is not a valid type ID.
1366       if (extension != null) { // We known the type
1367         mergeMessageSetExtensionFromBytes(rawBytes, extension, extensionRegistry, target);
1368       } else { // We don't know how to parse this. Ignore it.
1369         if (rawBytes != null && unknownFields != null) {
1370           unknownFields.mergeField(
1371               typeId, UnknownFieldSet.Field.newBuilder().addLengthDelimited(rawBytes).build());
1372         }
1373       }
1374     }
1375   }
1376 
mergeMessageSetExtensionFromBytes( ByteString rawBytes, ExtensionRegistry.ExtensionInfo extension, ExtensionRegistryLite extensionRegistry, MergeTarget target)1377   private static void mergeMessageSetExtensionFromBytes(
1378       ByteString rawBytes,
1379       ExtensionRegistry.ExtensionInfo extension,
1380       ExtensionRegistryLite extensionRegistry,
1381       MergeTarget target)
1382       throws IOException {
1383 
1384     Descriptors.FieldDescriptor field = extension.descriptor;
1385     boolean hasOriginalValue = target.hasField(field);
1386 
1387     if (hasOriginalValue || ExtensionRegistryLite.isEagerlyParseMessageSets()) {
1388       // If the field already exists, we just parse the field.
1389       Object value =
1390           target.parseMessageFromBytes(
1391               rawBytes, extensionRegistry, field, extension.defaultInstance);
1392       target.setField(field, value);
1393     } else {
1394       // Use LazyField to load MessageSet lazily.
1395       LazyField lazyField = new LazyField(extension.defaultInstance, extensionRegistry, rawBytes);
1396       target.setField(field, lazyField);
1397     }
1398   }
1399 
eagerlyMergeMessageSetExtension( CodedInputStream input, ExtensionRegistry.ExtensionInfo extension, ExtensionRegistryLite extensionRegistry, MergeTarget target)1400   private static void eagerlyMergeMessageSetExtension(
1401       CodedInputStream input,
1402       ExtensionRegistry.ExtensionInfo extension,
1403       ExtensionRegistryLite extensionRegistry,
1404       MergeTarget target)
1405       throws IOException {
1406     Descriptors.FieldDescriptor field = extension.descriptor;
1407     Object value = target.parseMessage(input, extensionRegistry, field, extension.defaultInstance);
1408     target.setField(field, value);
1409   }
1410 }
1411