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