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.AbstractMessageLite.Builder.LimitedInputStream; 34 import com.google.protobuf.GeneratedMessageLite.EqualsVisitor.NotEqualsException; 35 import com.google.protobuf.Internal.BooleanList; 36 import com.google.protobuf.Internal.DoubleList; 37 import com.google.protobuf.Internal.FloatList; 38 import com.google.protobuf.Internal.IntList; 39 import com.google.protobuf.Internal.LongList; 40 import com.google.protobuf.Internal.ProtobufList; 41 import com.google.protobuf.WireFormat.FieldType; 42 43 import java.io.IOException; 44 import java.io.InputStream; 45 import java.io.ObjectStreamException; 46 import java.io.Serializable; 47 import java.lang.reflect.InvocationTargetException; 48 import java.lang.reflect.Method; 49 import java.util.ArrayList; 50 import java.util.Collections; 51 import java.util.Iterator; 52 import java.util.List; 53 import java.util.Map; 54 55 /** 56 * Lite version of {@link GeneratedMessage}. 57 * 58 * @author kenton@google.com Kenton Varda 59 */ 60 public abstract class GeneratedMessageLite< 61 MessageType extends GeneratedMessageLite<MessageType, BuilderType>, 62 BuilderType extends GeneratedMessageLite.Builder<MessageType, BuilderType>> 63 extends AbstractMessageLite<MessageType, BuilderType> { 64 65 /** For use by generated code only. Lazily initialized to reduce allocations. */ 66 protected UnknownFieldSetLite unknownFields = UnknownFieldSetLite.getDefaultInstance(); 67 68 /** For use by generated code only. */ 69 protected int memoizedSerializedSize = -1; 70 71 @Override 72 @SuppressWarnings("unchecked") // Guaranteed by runtime. getParserForType()73 public final Parser<MessageType> getParserForType() { 74 return (Parser<MessageType>) dynamicMethod(MethodToInvoke.GET_PARSER); 75 } 76 77 @Override 78 @SuppressWarnings("unchecked") // Guaranteed by runtime. getDefaultInstanceForType()79 public final MessageType getDefaultInstanceForType() { 80 return (MessageType) dynamicMethod(MethodToInvoke.GET_DEFAULT_INSTANCE); 81 } 82 83 @Override 84 @SuppressWarnings("unchecked") // Guaranteed by runtime. newBuilderForType()85 public final BuilderType newBuilderForType() { 86 return (BuilderType) dynamicMethod(MethodToInvoke.NEW_BUILDER); 87 } 88 89 /** 90 * A reflective toString function. This is primarily intended as a developer aid, while keeping 91 * binary size down. The first line of the {@code toString()} representation includes a commented 92 * version of {@code super.toString()} to act as an indicator that this should not be relied on 93 * for comparisons. 94 * <p> 95 * NOTE: This method relies on the field getter methods not being stripped or renamed by proguard. 96 * If they are, the fields will not be included in the returned string representation. 97 * <p> 98 * NOTE: This implementation is liable to change in the future, and should not be relied on in 99 * code. 100 */ 101 @Override toString()102 public String toString() { 103 return MessageLiteToString.toString(this, super.toString()); 104 } 105 106 @SuppressWarnings("unchecked") // Guaranteed by runtime 107 @Override hashCode()108 public int hashCode() { 109 if (memoizedHashCode == 0) { 110 HashCodeVisitor visitor = new HashCodeVisitor(); 111 visit(visitor, (MessageType) this); 112 memoizedHashCode = visitor.hashCode; 113 } 114 return memoizedHashCode; 115 } 116 117 @SuppressWarnings("unchecked") // Guaranteed by runtime hashCode(HashCodeVisitor visitor)118 int hashCode(HashCodeVisitor visitor) { 119 if (memoizedHashCode == 0) { 120 int inProgressHashCode = visitor.hashCode; 121 visitor.hashCode = 0; 122 visit(visitor, (MessageType) this); 123 memoizedHashCode = visitor.hashCode; 124 visitor.hashCode = inProgressHashCode; 125 } 126 return memoizedHashCode; 127 } 128 129 @SuppressWarnings("unchecked") // Guaranteed by isInstance + runtime 130 @Override equals(Object other)131 public boolean equals(Object other) { 132 if (this == other) { 133 return true; 134 } 135 136 if (!getDefaultInstanceForType().getClass().isInstance(other)) { 137 return false; 138 } 139 140 try { 141 visit(EqualsVisitor.INSTANCE, (MessageType) other); 142 } catch (NotEqualsException e) { 143 return false; 144 } 145 return true; 146 } 147 148 /** 149 * Same as {@link #equals(Object)} but throws {@code NotEqualsException}. 150 */ 151 @SuppressWarnings("unchecked") // Guaranteed by isInstance + runtime equals(EqualsVisitor visitor, MessageLite other)152 boolean equals(EqualsVisitor visitor, MessageLite other) { 153 if (this == other) { 154 return true; 155 } 156 157 if (!getDefaultInstanceForType().getClass().isInstance(other)) { 158 return false; 159 } 160 161 visit(visitor, (MessageType) other); 162 return true; 163 } 164 165 // The general strategy for unknown fields is to use an UnknownFieldSetLite that is treated as 166 // mutable during the parsing constructor and immutable after. This allows us to avoid 167 // any unnecessary intermediary allocations while reducing the generated code size. 168 169 /** 170 * Lazily initializes unknown fields. 171 */ ensureUnknownFieldsInitialized()172 private final void ensureUnknownFieldsInitialized() { 173 if (unknownFields == UnknownFieldSetLite.getDefaultInstance()) { 174 unknownFields = UnknownFieldSetLite.newInstance(); 175 } 176 } 177 178 /** 179 * Called by subclasses to parse an unknown field. For use by generated code only. 180 * 181 * @return {@code true} unless the tag is an end-group tag. 182 */ parseUnknownField(int tag, CodedInputStream input)183 protected boolean parseUnknownField(int tag, CodedInputStream input) throws IOException { 184 // This will avoid the allocation of unknown fields when a group tag is encountered. 185 if (WireFormat.getTagWireType(tag) == WireFormat.WIRETYPE_END_GROUP) { 186 return false; 187 } 188 189 ensureUnknownFieldsInitialized(); 190 return unknownFields.mergeFieldFrom(tag, input); 191 } 192 193 /** 194 * Called by subclasses to parse an unknown field. For use by generated code only. 195 */ mergeVarintField(int tag, int value)196 protected void mergeVarintField(int tag, int value) { 197 ensureUnknownFieldsInitialized(); 198 unknownFields.mergeVarintField(tag, value); 199 } 200 201 /** 202 * Called by subclasses to parse an unknown field. For use by generated code only. 203 */ mergeLengthDelimitedField(int fieldNumber, ByteString value)204 protected void mergeLengthDelimitedField(int fieldNumber, ByteString value) { 205 ensureUnknownFieldsInitialized(); 206 unknownFields.mergeLengthDelimitedField(fieldNumber, value); 207 } 208 209 /** 210 * Called by subclasses to complete parsing. For use by generated code only. 211 */ makeImmutable()212 protected void makeImmutable() { 213 dynamicMethod(MethodToInvoke.MAKE_IMMUTABLE); 214 215 unknownFields.makeImmutable(); 216 } 217 218 @Override isInitialized()219 public final boolean isInitialized() { 220 return dynamicMethod(MethodToInvoke.IS_INITIALIZED, Boolean.TRUE) != null; 221 } 222 223 @Override toBuilder()224 public final BuilderType toBuilder() { 225 BuilderType builder = (BuilderType) dynamicMethod(MethodToInvoke.NEW_BUILDER); 226 builder.mergeFrom((MessageType) this); 227 return builder; 228 } 229 230 /** 231 * Defines which method path to invoke in {@link GeneratedMessageLite 232 * #dynamicMethod(MethodToInvoke, Object...)}. 233 * <p> 234 * For use by generated code only. 235 */ 236 public static enum MethodToInvoke { 237 // Rely on/modify instance state 238 IS_INITIALIZED, 239 VISIT, 240 MERGE_FROM_STREAM, 241 MAKE_IMMUTABLE, 242 243 // Rely on static state 244 NEW_MUTABLE_INSTANCE, 245 NEW_BUILDER, 246 GET_DEFAULT_INSTANCE, 247 GET_PARSER; 248 } 249 250 /** 251 * A method that implements different types of operations described in {@link MethodToInvoke}. 252 * Theses different kinds of operations are required to implement message-level operations for 253 * builders in the runtime. This method bundles those operations to reduce the generated methods 254 * count. 255 * <ul> 256 * <li>{@code MERGE_FROM_STREAM} is parameterized with an {@link CodedInputStream} and 257 * {@link ExtensionRegistryLite}. It consumes the input stream, parsing the contents into the 258 * returned protocol buffer. If parsing throws an {@link InvalidProtocolBufferException}, the 259 * implementation wraps it in a RuntimeException. 260 * <li>{@code NEW_INSTANCE} returns a new instance of the protocol buffer that has not yet been 261 * made immutable. See {@code MAKE_IMMUTABLE}. 262 * <li>{@code IS_INITIALIZED} is parameterized with a {@code Boolean} detailing whether to 263 * memoize. It returns {@code null} for false and the default instance for true. We optionally 264 * memoize to support the Builder case, where memoization is not desired. 265 * <li>{@code NEW_BUILDER} returns a {@code BuilderType} instance. 266 * <li>{@code VISIT} is parameterized with a {@code Visitor} and a {@code MessageType} and 267 * recursively iterates through the fields side by side between this and the instance. 268 * <li>{@code MAKE_IMMUTABLE} sets all internal fields to an immutable state. 269 * </ul> 270 * This method, plus the implementation of the Builder, enables the Builder class to be proguarded 271 * away entirely on Android. 272 * <p> 273 * For use by generated code only. 274 */ dynamicMethod(MethodToInvoke method, Object arg0, Object arg1)275 protected abstract Object dynamicMethod(MethodToInvoke method, Object arg0, Object arg1); 276 277 /** 278 * Same as {@link #dynamicMethod(MethodToInvoke, Object, Object)} with {@code null} padding. 279 */ dynamicMethod(MethodToInvoke method, Object arg0)280 protected Object dynamicMethod(MethodToInvoke method, Object arg0) { 281 return dynamicMethod(method, arg0, null); 282 } 283 284 /** 285 * Same as {@link #dynamicMethod(MethodToInvoke, Object, Object)} with {@code null} padding. 286 */ dynamicMethod(MethodToInvoke method)287 protected Object dynamicMethod(MethodToInvoke method) { 288 return dynamicMethod(method, null, null); 289 } 290 visit(Visitor visitor, MessageType other)291 void visit(Visitor visitor, MessageType other) { 292 dynamicMethod(MethodToInvoke.VISIT, visitor, other); 293 unknownFields = visitor.visitUnknownFields(unknownFields, other.unknownFields); 294 } 295 296 /** 297 * Merge some unknown fields into the {@link UnknownFieldSetLite} for this 298 * message. 299 * 300 * <p>For use by generated code only. 301 */ mergeUnknownFields(UnknownFieldSetLite unknownFields)302 protected final void mergeUnknownFields(UnknownFieldSetLite unknownFields) { 303 this.unknownFields = UnknownFieldSetLite.mutableCopyOf(this.unknownFields, unknownFields); 304 } 305 306 @SuppressWarnings("unchecked") 307 public abstract static class Builder< 308 MessageType extends GeneratedMessageLite<MessageType, BuilderType>, 309 BuilderType extends Builder<MessageType, BuilderType>> 310 extends AbstractMessageLite.Builder<MessageType, BuilderType> { 311 312 private final MessageType defaultInstance; 313 protected MessageType instance; 314 protected boolean isBuilt; 315 Builder(MessageType defaultInstance)316 protected Builder(MessageType defaultInstance) { 317 this.defaultInstance = defaultInstance; 318 this.instance = 319 (MessageType) defaultInstance.dynamicMethod(MethodToInvoke.NEW_MUTABLE_INSTANCE); 320 isBuilt = false; 321 } 322 323 /** 324 * Called before any method that would mutate the builder to ensure that it correctly copies 325 * any state before the write happens to preserve immutability guarantees. 326 */ copyOnWrite()327 protected void copyOnWrite() { 328 if (isBuilt) { 329 MessageType newInstance = 330 (MessageType) instance.dynamicMethod(MethodToInvoke.NEW_MUTABLE_INSTANCE); 331 newInstance.visit(MergeFromVisitor.INSTANCE, instance); 332 instance = newInstance; 333 isBuilt = false; 334 } 335 } 336 337 @Override isInitialized()338 public final boolean isInitialized() { 339 return GeneratedMessageLite.isInitialized(instance, false /* shouldMemoize */); 340 } 341 342 @Override clear()343 public final BuilderType clear() { 344 // No need to copy on write since we're dropping the instance anyways. 345 instance = (MessageType) instance.dynamicMethod(MethodToInvoke.NEW_MUTABLE_INSTANCE); 346 return (BuilderType) this; 347 } 348 349 @Override clone()350 public BuilderType clone() { 351 BuilderType builder = 352 (BuilderType) getDefaultInstanceForType().newBuilderForType(); 353 builder.mergeFrom(buildPartial()); 354 return builder; 355 } 356 357 @Override buildPartial()358 public MessageType buildPartial() { 359 if (isBuilt) { 360 return instance; 361 } 362 363 instance.makeImmutable(); 364 365 isBuilt = true; 366 return instance; 367 } 368 369 @Override build()370 public final MessageType build() { 371 MessageType result = buildPartial(); 372 if (!result.isInitialized()) { 373 throw newUninitializedMessageException(result); 374 } 375 return result; 376 } 377 378 @Override internalMergeFrom(MessageType message)379 protected BuilderType internalMergeFrom(MessageType message) { 380 return mergeFrom(message); 381 } 382 383 /** All subclasses implement this. */ mergeFrom(MessageType message)384 public BuilderType mergeFrom(MessageType message) { 385 copyOnWrite(); 386 instance.visit(MergeFromVisitor.INSTANCE, message); 387 return (BuilderType) this; 388 } 389 390 @Override getDefaultInstanceForType()391 public MessageType getDefaultInstanceForType() { 392 return defaultInstance; 393 } 394 395 @Override mergeFrom( com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry)396 public BuilderType mergeFrom( 397 com.google.protobuf.CodedInputStream input, 398 com.google.protobuf.ExtensionRegistryLite extensionRegistry) 399 throws IOException { 400 copyOnWrite(); 401 try { 402 instance.dynamicMethod(MethodToInvoke.MERGE_FROM_STREAM, input, extensionRegistry); 403 } catch (RuntimeException e) { 404 if (e.getCause() instanceof IOException) { 405 throw (IOException) e.getCause(); 406 } 407 throw e; 408 } 409 return (BuilderType) this; 410 } 411 } 412 413 414 // ================================================================= 415 // Extensions-related stuff 416 417 /** 418 * Lite equivalent of {@link com.google.protobuf.GeneratedMessage.ExtendableMessageOrBuilder}. 419 */ 420 public interface ExtendableMessageOrBuilder< 421 MessageType extends ExtendableMessage<MessageType, BuilderType>, 422 BuilderType extends ExtendableBuilder<MessageType, BuilderType>> 423 extends MessageLiteOrBuilder { 424 425 /** Check if a singular extension is present. */ hasExtension( ExtensionLite<MessageType, Type> extension)426 <Type> boolean hasExtension( 427 ExtensionLite<MessageType, Type> extension); 428 429 /** Get the number of elements in a repeated extension. */ getExtensionCount( ExtensionLite<MessageType, List<Type>> extension)430 <Type> int getExtensionCount( 431 ExtensionLite<MessageType, List<Type>> extension); 432 433 /** Get the value of an extension. */ getExtension(ExtensionLite<MessageType, Type> extension)434 <Type> Type getExtension(ExtensionLite<MessageType, Type> extension); 435 436 /** Get one element of a repeated extension. */ getExtension( ExtensionLite<MessageType, List<Type>> extension, int index)437 <Type> Type getExtension( 438 ExtensionLite<MessageType, List<Type>> extension, 439 int index); 440 } 441 442 /** 443 * Lite equivalent of {@link GeneratedMessage.ExtendableMessage}. 444 */ 445 public abstract static class ExtendableMessage< 446 MessageType extends ExtendableMessage<MessageType, BuilderType>, 447 BuilderType extends ExtendableBuilder<MessageType, BuilderType>> 448 extends GeneratedMessageLite<MessageType, BuilderType> 449 implements ExtendableMessageOrBuilder<MessageType, BuilderType> { 450 451 /** 452 * Represents the set of extensions on this message. For use by generated 453 * code only. 454 */ 455 protected FieldSet<ExtensionDescriptor> extensions = FieldSet.newFieldSet(); 456 mergeExtensionFields(final MessageType other)457 protected final void mergeExtensionFields(final MessageType other) { 458 if (extensions.isImmutable()) { 459 extensions = extensions.clone(); 460 } 461 extensions.mergeFrom(((ExtendableMessage) other).extensions); 462 } 463 464 @Override visit(Visitor visitor, MessageType other)465 final void visit(Visitor visitor, MessageType other) { 466 super.visit(visitor, other); 467 extensions = visitor.visitExtensions(extensions, other.extensions); 468 } 469 470 /** 471 * Parse an unknown field or an extension. For use by generated code only. 472 * 473 * <p>For use by generated code only. 474 * 475 * @return {@code true} unless the tag is an end-group tag. 476 */ parseUnknownField( MessageType defaultInstance, CodedInputStream input, ExtensionRegistryLite extensionRegistry, int tag)477 protected <MessageType extends MessageLite> boolean parseUnknownField( 478 MessageType defaultInstance, 479 CodedInputStream input, 480 ExtensionRegistryLite extensionRegistry, 481 int tag) throws IOException { 482 int wireType = WireFormat.getTagWireType(tag); 483 int fieldNumber = WireFormat.getTagFieldNumber(tag); 484 485 // TODO(dweis): How much bytecode would be saved by not requiring the generated code to 486 // provide the default instance? 487 GeneratedExtension<MessageType, ?> extension = extensionRegistry.findLiteExtensionByNumber( 488 defaultInstance, fieldNumber); 489 490 boolean unknown = false; 491 boolean packed = false; 492 if (extension == null) { 493 unknown = true; // Unknown field. 494 } else if (wireType == FieldSet.getWireFormatForFieldType( 495 extension.descriptor.getLiteType(), 496 false /* isPacked */)) { 497 packed = false; // Normal, unpacked value. 498 } else if (extension.descriptor.isRepeated && 499 extension.descriptor.type.isPackable() && 500 wireType == FieldSet.getWireFormatForFieldType( 501 extension.descriptor.getLiteType(), 502 true /* isPacked */)) { 503 packed = true; // Packed value. 504 } else { 505 unknown = true; // Wrong wire type. 506 } 507 508 if (unknown) { // Unknown field or wrong wire type. Skip. 509 return parseUnknownField(tag, input); 510 } 511 512 if (packed) { 513 int length = input.readRawVarint32(); 514 int limit = input.pushLimit(length); 515 if (extension.descriptor.getLiteType() == WireFormat.FieldType.ENUM) { 516 while (input.getBytesUntilLimit() > 0) { 517 int rawValue = input.readEnum(); 518 Object value = 519 extension.descriptor.getEnumType().findValueByNumber(rawValue); 520 if (value == null) { 521 // If the number isn't recognized as a valid value for this 522 // enum, drop it (don't even add it to unknownFields). 523 return true; 524 } 525 extensions.addRepeatedField(extension.descriptor, 526 extension.singularToFieldSetType(value)); 527 } 528 } else { 529 while (input.getBytesUntilLimit() > 0) { 530 Object value = 531 FieldSet.readPrimitiveField(input, 532 extension.descriptor.getLiteType(), 533 /*checkUtf8=*/ false); 534 extensions.addRepeatedField(extension.descriptor, value); 535 } 536 } 537 input.popLimit(limit); 538 } else { 539 Object value; 540 switch (extension.descriptor.getLiteJavaType()) { 541 case MESSAGE: { 542 MessageLite.Builder subBuilder = null; 543 if (!extension.descriptor.isRepeated()) { 544 MessageLite existingValue = 545 (MessageLite) extensions.getField(extension.descriptor); 546 if (existingValue != null) { 547 subBuilder = existingValue.toBuilder(); 548 } 549 } 550 if (subBuilder == null) { 551 subBuilder = extension.getMessageDefaultInstance() 552 .newBuilderForType(); 553 } 554 if (extension.descriptor.getLiteType() == 555 WireFormat.FieldType.GROUP) { 556 input.readGroup(extension.getNumber(), 557 subBuilder, extensionRegistry); 558 } else { 559 input.readMessage(subBuilder, extensionRegistry); 560 } 561 value = subBuilder.build(); 562 break; 563 } 564 case ENUM: 565 int rawValue = input.readEnum(); 566 value = extension.descriptor.getEnumType() 567 .findValueByNumber(rawValue); 568 // If the number isn't recognized as a valid value for this enum, 569 // write it to unknown fields object. 570 if (value == null) { 571 mergeVarintField(fieldNumber, rawValue); 572 return true; 573 } 574 break; 575 default: 576 value = FieldSet.readPrimitiveField(input, 577 extension.descriptor.getLiteType(), 578 /*checkUtf8=*/ false); 579 break; 580 } 581 582 if (extension.descriptor.isRepeated()) { 583 extensions.addRepeatedField(extension.descriptor, 584 extension.singularToFieldSetType(value)); 585 } else { 586 extensions.setField(extension.descriptor, 587 extension.singularToFieldSetType(value)); 588 } 589 } 590 591 return true; 592 } 593 verifyExtensionContainingType( final GeneratedExtension<MessageType, ?> extension)594 private void verifyExtensionContainingType( 595 final GeneratedExtension<MessageType, ?> extension) { 596 if (extension.getContainingTypeDefaultInstance() != 597 getDefaultInstanceForType()) { 598 // This can only happen if someone uses unchecked operations. 599 throw new IllegalArgumentException( 600 "This extension is for a different message type. Please make " + 601 "sure that you are not suppressing any generics type warnings."); 602 } 603 } 604 605 /** Check if a singular extension is present. */ 606 @Override hasExtension(final ExtensionLite<MessageType, Type> extension)607 public final <Type> boolean hasExtension(final ExtensionLite<MessageType, Type> extension) { 608 GeneratedExtension<MessageType, Type> extensionLite = 609 checkIsLite(extension); 610 611 verifyExtensionContainingType(extensionLite); 612 return extensions.hasField(extensionLite.descriptor); 613 } 614 615 /** Get the number of elements in a repeated extension. */ 616 @Override getExtensionCount( final ExtensionLite<MessageType, List<Type>> extension)617 public final <Type> int getExtensionCount( 618 final ExtensionLite<MessageType, List<Type>> extension) { 619 GeneratedExtension<MessageType, List<Type>> extensionLite = 620 checkIsLite(extension); 621 622 verifyExtensionContainingType(extensionLite); 623 return extensions.getRepeatedFieldCount(extensionLite.descriptor); 624 } 625 626 /** Get the value of an extension. */ 627 @Override 628 @SuppressWarnings("unchecked") getExtension(final ExtensionLite<MessageType, Type> extension)629 public final <Type> Type getExtension(final ExtensionLite<MessageType, Type> extension) { 630 GeneratedExtension<MessageType, Type> extensionLite = 631 checkIsLite(extension); 632 633 verifyExtensionContainingType(extensionLite); 634 final Object value = extensions.getField(extensionLite.descriptor); 635 if (value == null) { 636 return extensionLite.defaultValue; 637 } else { 638 return (Type) extensionLite.fromFieldSetType(value); 639 } 640 } 641 642 /** Get one element of a repeated extension. */ 643 @Override 644 @SuppressWarnings("unchecked") getExtension( final ExtensionLite<MessageType, List<Type>> extension, final int index)645 public final <Type> Type getExtension( 646 final ExtensionLite<MessageType, List<Type>> extension, final int index) { 647 GeneratedExtension<MessageType, List<Type>> extensionLite = 648 checkIsLite(extension); 649 650 verifyExtensionContainingType(extensionLite); 651 return (Type) extensionLite.singularFromFieldSetType( 652 extensions.getRepeatedField(extensionLite.descriptor, index)); 653 } 654 655 /** Called by subclasses to check if all extensions are initialized. */ extensionsAreInitialized()656 protected boolean extensionsAreInitialized() { 657 return extensions.isInitialized(); 658 } 659 660 @Override makeImmutable()661 protected final void makeImmutable() { 662 super.makeImmutable(); 663 664 extensions.makeImmutable(); 665 } 666 667 /** 668 * Used by subclasses to serialize extensions. Extension ranges may be 669 * interleaved with field numbers, but we must write them in canonical 670 * (sorted by field number) order. ExtensionWriter helps us write 671 * individual ranges of extensions at once. 672 */ 673 protected class ExtensionWriter { 674 // Imagine how much simpler this code would be if Java iterators had 675 // a way to get the next element without advancing the iterator. 676 677 private final Iterator<Map.Entry<ExtensionDescriptor, Object>> iter = 678 extensions.iterator(); 679 private Map.Entry<ExtensionDescriptor, Object> next; 680 private final boolean messageSetWireFormat; 681 ExtensionWriter(boolean messageSetWireFormat)682 private ExtensionWriter(boolean messageSetWireFormat) { 683 if (iter.hasNext()) { 684 next = iter.next(); 685 } 686 this.messageSetWireFormat = messageSetWireFormat; 687 } 688 writeUntil(final int end, final CodedOutputStream output)689 public void writeUntil(final int end, final CodedOutputStream output) 690 throws IOException { 691 while (next != null && next.getKey().getNumber() < end) { 692 ExtensionDescriptor extension = next.getKey(); 693 if (messageSetWireFormat && extension.getLiteJavaType() == 694 WireFormat.JavaType.MESSAGE && 695 !extension.isRepeated()) { 696 output.writeMessageSetExtension(extension.getNumber(), 697 (MessageLite) next.getValue()); 698 } else { 699 FieldSet.writeField(extension, next.getValue(), output); 700 } 701 if (iter.hasNext()) { 702 next = iter.next(); 703 } else { 704 next = null; 705 } 706 } 707 } 708 } 709 newExtensionWriter()710 protected ExtensionWriter newExtensionWriter() { 711 return new ExtensionWriter(false); 712 } newMessageSetExtensionWriter()713 protected ExtensionWriter newMessageSetExtensionWriter() { 714 return new ExtensionWriter(true); 715 } 716 717 /** Called by subclasses to compute the size of extensions. */ extensionsSerializedSize()718 protected int extensionsSerializedSize() { 719 return extensions.getSerializedSize(); 720 } extensionsSerializedSizeAsMessageSet()721 protected int extensionsSerializedSizeAsMessageSet() { 722 return extensions.getMessageSetSerializedSize(); 723 } 724 } 725 726 /** 727 * Lite equivalent of {@link GeneratedMessage.ExtendableBuilder}. 728 */ 729 @SuppressWarnings("unchecked") 730 public abstract static class ExtendableBuilder< 731 MessageType extends ExtendableMessage<MessageType, BuilderType>, 732 BuilderType extends ExtendableBuilder<MessageType, BuilderType>> 733 extends Builder<MessageType, BuilderType> 734 implements ExtendableMessageOrBuilder<MessageType, BuilderType> { ExtendableBuilder(MessageType defaultInstance)735 protected ExtendableBuilder(MessageType defaultInstance) { 736 super(defaultInstance); 737 738 // TODO(dweis): This is kind of an unnecessary clone since we construct a 739 // new instance in the parent constructor which makes the extensions 740 // immutable. This extra allocation shouldn't matter in practice 741 // though. 742 instance.extensions = instance.extensions.clone(); 743 } 744 745 // For immutable message conversion. internalSetExtensionSet(FieldSet<ExtensionDescriptor> extensions)746 void internalSetExtensionSet(FieldSet<ExtensionDescriptor> extensions) { 747 copyOnWrite(); 748 instance.extensions = extensions; 749 } 750 751 @Override copyOnWrite()752 protected void copyOnWrite() { 753 if (!isBuilt) { 754 return; 755 } 756 757 super.copyOnWrite(); 758 instance.extensions = instance.extensions.clone(); 759 } 760 761 @Override buildPartial()762 public final MessageType buildPartial() { 763 if (isBuilt) { 764 return instance; 765 } 766 767 instance.extensions.makeImmutable(); 768 return super.buildPartial(); 769 } 770 verifyExtensionContainingType( final GeneratedExtension<MessageType, ?> extension)771 private void verifyExtensionContainingType( 772 final GeneratedExtension<MessageType, ?> extension) { 773 if (extension.getContainingTypeDefaultInstance() != 774 getDefaultInstanceForType()) { 775 // This can only happen if someone uses unchecked operations. 776 throw new IllegalArgumentException( 777 "This extension is for a different message type. Please make " + 778 "sure that you are not suppressing any generics type warnings."); 779 } 780 } 781 782 /** Check if a singular extension is present. */ 783 @Override hasExtension(final ExtensionLite<MessageType, Type> extension)784 public final <Type> boolean hasExtension(final ExtensionLite<MessageType, Type> extension) { 785 return instance.hasExtension(extension); 786 } 787 788 /** Get the number of elements in a repeated extension. */ 789 @Override getExtensionCount( final ExtensionLite<MessageType, List<Type>> extension)790 public final <Type> int getExtensionCount( 791 final ExtensionLite<MessageType, List<Type>> extension) { 792 return instance.getExtensionCount(extension); 793 } 794 795 /** Get the value of an extension. */ 796 @Override 797 @SuppressWarnings("unchecked") getExtension(final ExtensionLite<MessageType, Type> extension)798 public final <Type> Type getExtension(final ExtensionLite<MessageType, Type> extension) { 799 return instance.getExtension(extension); 800 } 801 802 /** Get one element of a repeated extension. */ 803 @Override 804 @SuppressWarnings("unchecked") getExtension( final ExtensionLite<MessageType, List<Type>> extension, final int index)805 public final <Type> Type getExtension( 806 final ExtensionLite<MessageType, List<Type>> extension, final int index) { 807 return instance.getExtension(extension, index); 808 } 809 810 // This is implemented here only to work around an apparent bug in the 811 // Java compiler and/or build system. See bug #1898463. The mere presence 812 // of this dummy clone() implementation makes it go away. 813 @Override clone()814 public BuilderType clone() { 815 return super.clone(); 816 } 817 818 /** Set the value of an extension. */ setExtension( final ExtensionLite<MessageType, Type> extension, final Type value)819 public final <Type> BuilderType setExtension( 820 final ExtensionLite<MessageType, Type> extension, 821 final Type value) { 822 GeneratedExtension<MessageType, Type> extensionLite = 823 checkIsLite(extension); 824 825 verifyExtensionContainingType(extensionLite); 826 copyOnWrite(); 827 instance.extensions.setField(extensionLite.descriptor, extensionLite.toFieldSetType(value)); 828 return (BuilderType) this; 829 } 830 831 /** Set the value of one element of a repeated extension. */ setExtension( final ExtensionLite<MessageType, List<Type>> extension, final int index, final Type value)832 public final <Type> BuilderType setExtension( 833 final ExtensionLite<MessageType, List<Type>> extension, 834 final int index, final Type value) { 835 GeneratedExtension<MessageType, List<Type>> extensionLite = 836 checkIsLite(extension); 837 838 verifyExtensionContainingType(extensionLite); 839 copyOnWrite(); 840 instance.extensions.setRepeatedField( 841 extensionLite.descriptor, index, extensionLite.singularToFieldSetType(value)); 842 return (BuilderType) this; 843 } 844 845 /** Append a value to a repeated extension. */ addExtension( final ExtensionLite<MessageType, List<Type>> extension, final Type value)846 public final <Type> BuilderType addExtension( 847 final ExtensionLite<MessageType, List<Type>> extension, 848 final Type value) { 849 GeneratedExtension<MessageType, List<Type>> extensionLite = 850 checkIsLite(extension); 851 852 verifyExtensionContainingType(extensionLite); 853 copyOnWrite(); 854 instance.extensions.addRepeatedField( 855 extensionLite.descriptor, extensionLite.singularToFieldSetType(value)); 856 return (BuilderType) this; 857 } 858 859 /** Clear an extension. */ clearExtension( final ExtensionLite<MessageType, ?> extension)860 public final <Type> BuilderType clearExtension( 861 final ExtensionLite<MessageType, ?> extension) { 862 GeneratedExtension<MessageType, ?> extensionLite = checkIsLite(extension); 863 864 verifyExtensionContainingType(extensionLite); 865 copyOnWrite(); 866 instance.extensions.clearField(extensionLite.descriptor); 867 return (BuilderType) this; 868 } 869 } 870 871 // ----------------------------------------------------------------- 872 873 /** For use by generated code only. */ 874 public static <ContainingType extends MessageLite, Type> 875 GeneratedExtension<ContainingType, Type> newSingularGeneratedExtension( final ContainingType containingTypeDefaultInstance, final Type defaultValue, final MessageLite messageDefaultInstance, final Internal.EnumLiteMap<?> enumTypeMap, final int number, final WireFormat.FieldType type, final Class singularType)876 newSingularGeneratedExtension( 877 final ContainingType containingTypeDefaultInstance, 878 final Type defaultValue, 879 final MessageLite messageDefaultInstance, 880 final Internal.EnumLiteMap<?> enumTypeMap, 881 final int number, 882 final WireFormat.FieldType type, 883 final Class singularType) { 884 return new GeneratedExtension<ContainingType, Type>( 885 containingTypeDefaultInstance, 886 defaultValue, 887 messageDefaultInstance, 888 new ExtensionDescriptor(enumTypeMap, number, type, 889 false /* isRepeated */, 890 false /* isPacked */), 891 singularType); 892 } 893 894 /** For use by generated code only. */ 895 public static <ContainingType extends MessageLite, Type> 896 GeneratedExtension<ContainingType, Type> newRepeatedGeneratedExtension( final ContainingType containingTypeDefaultInstance, final MessageLite messageDefaultInstance, final Internal.EnumLiteMap<?> enumTypeMap, final int number, final WireFormat.FieldType type, final boolean isPacked, final Class singularType)897 newRepeatedGeneratedExtension( 898 final ContainingType containingTypeDefaultInstance, 899 final MessageLite messageDefaultInstance, 900 final Internal.EnumLiteMap<?> enumTypeMap, 901 final int number, 902 final WireFormat.FieldType type, 903 final boolean isPacked, 904 final Class singularType) { 905 @SuppressWarnings("unchecked") // Subclasses ensure Type is a List 906 Type emptyList = (Type) Collections.emptyList(); 907 return new GeneratedExtension<ContainingType, Type>( 908 containingTypeDefaultInstance, 909 emptyList, 910 messageDefaultInstance, 911 new ExtensionDescriptor( 912 enumTypeMap, number, type, true /* isRepeated */, isPacked), 913 singularType); 914 } 915 916 static final class ExtensionDescriptor 917 implements FieldSet.FieldDescriptorLite< 918 ExtensionDescriptor> { ExtensionDescriptor( final Internal.EnumLiteMap<?> enumTypeMap, final int number, final WireFormat.FieldType type, final boolean isRepeated, final boolean isPacked)919 ExtensionDescriptor( 920 final Internal.EnumLiteMap<?> enumTypeMap, 921 final int number, 922 final WireFormat.FieldType type, 923 final boolean isRepeated, 924 final boolean isPacked) { 925 this.enumTypeMap = enumTypeMap; 926 this.number = number; 927 this.type = type; 928 this.isRepeated = isRepeated; 929 this.isPacked = isPacked; 930 } 931 932 final Internal.EnumLiteMap<?> enumTypeMap; 933 final int number; 934 final WireFormat.FieldType type; 935 final boolean isRepeated; 936 final boolean isPacked; 937 938 @Override getNumber()939 public int getNumber() { 940 return number; 941 } 942 943 @Override getLiteType()944 public WireFormat.FieldType getLiteType() { 945 return type; 946 } 947 948 @Override getLiteJavaType()949 public WireFormat.JavaType getLiteJavaType() { 950 return type.getJavaType(); 951 } 952 953 @Override isRepeated()954 public boolean isRepeated() { 955 return isRepeated; 956 } 957 958 @Override isPacked()959 public boolean isPacked() { 960 return isPacked; 961 } 962 963 @Override getEnumType()964 public Internal.EnumLiteMap<?> getEnumType() { 965 return enumTypeMap; 966 } 967 968 @Override 969 @SuppressWarnings("unchecked") internalMergeFrom(MessageLite.Builder to, MessageLite from)970 public MessageLite.Builder internalMergeFrom(MessageLite.Builder to, MessageLite from) { 971 return ((Builder) to).mergeFrom((GeneratedMessageLite) from); 972 } 973 974 975 @Override compareTo(ExtensionDescriptor other)976 public int compareTo(ExtensionDescriptor other) { 977 return number - other.number; 978 } 979 } 980 981 // ================================================================= 982 983 /** Calls Class.getMethod and throws a RuntimeException if it fails. */ 984 @SuppressWarnings("unchecked") getMethodOrDie(Class clazz, String name, Class... params)985 static Method getMethodOrDie(Class clazz, String name, Class... params) { 986 try { 987 return clazz.getMethod(name, params); 988 } catch (NoSuchMethodException e) { 989 throw new RuntimeException( 990 "Generated message class \"" + clazz.getName() + 991 "\" missing method \"" + name + "\".", e); 992 } 993 } 994 995 /** Calls invoke and throws a RuntimeException if it fails. */ invokeOrDie(Method method, Object object, Object... params)996 static Object invokeOrDie(Method method, Object object, Object... params) { 997 try { 998 return method.invoke(object, params); 999 } catch (IllegalAccessException e) { 1000 throw new RuntimeException( 1001 "Couldn't use Java reflection to implement protocol message " + 1002 "reflection.", e); 1003 } catch (InvocationTargetException e) { 1004 final Throwable cause = e.getCause(); 1005 if (cause instanceof RuntimeException) { 1006 throw (RuntimeException) cause; 1007 } else if (cause instanceof Error) { 1008 throw (Error) cause; 1009 } else { 1010 throw new RuntimeException( 1011 "Unexpected exception thrown by generated accessor method.", cause); 1012 } 1013 } 1014 } 1015 1016 /** 1017 * Lite equivalent to {@link GeneratedMessage.GeneratedExtension}. 1018 * 1019 * Users should ignore the contents of this class and only use objects of 1020 * this type as parameters to extension accessors and ExtensionRegistry.add(). 1021 */ 1022 public static class GeneratedExtension< 1023 ContainingType extends MessageLite, Type> 1024 extends ExtensionLite<ContainingType, Type> { 1025 1026 /** 1027 * Create a new instance with the given parameters. 1028 * 1029 * The last parameter {@code singularType} is only needed for enum types. 1030 * We store integer values for enum types in a {@link ExtendableMessage} 1031 * and use Java reflection to convert an integer value back into a concrete 1032 * enum object. 1033 */ GeneratedExtension( final ContainingType containingTypeDefaultInstance, final Type defaultValue, final MessageLite messageDefaultInstance, final ExtensionDescriptor descriptor, final Class singularType)1034 GeneratedExtension( 1035 final ContainingType containingTypeDefaultInstance, 1036 final Type defaultValue, 1037 final MessageLite messageDefaultInstance, 1038 final ExtensionDescriptor descriptor, 1039 final Class singularType) { 1040 // Defensive checks to verify the correct initialization order of 1041 // GeneratedExtensions and their related GeneratedMessages. 1042 if (containingTypeDefaultInstance == null) { 1043 throw new IllegalArgumentException( 1044 "Null containingTypeDefaultInstance"); 1045 } 1046 if (descriptor.getLiteType() == WireFormat.FieldType.MESSAGE && 1047 messageDefaultInstance == null) { 1048 throw new IllegalArgumentException( 1049 "Null messageDefaultInstance"); 1050 } 1051 this.containingTypeDefaultInstance = containingTypeDefaultInstance; 1052 this.defaultValue = defaultValue; 1053 this.messageDefaultInstance = messageDefaultInstance; 1054 this.descriptor = descriptor; 1055 } 1056 1057 final ContainingType containingTypeDefaultInstance; 1058 final Type defaultValue; 1059 final MessageLite messageDefaultInstance; 1060 final ExtensionDescriptor descriptor; 1061 1062 /** 1063 * Default instance of the type being extended, used to identify that type. 1064 */ getContainingTypeDefaultInstance()1065 public ContainingType getContainingTypeDefaultInstance() { 1066 return containingTypeDefaultInstance; 1067 } 1068 1069 /** Get the field number. */ 1070 @Override getNumber()1071 public int getNumber() { 1072 return descriptor.getNumber(); 1073 } 1074 1075 1076 /** 1077 * If the extension is an embedded message or group, returns the default 1078 * instance of the message. 1079 */ 1080 @Override getMessageDefaultInstance()1081 public MessageLite getMessageDefaultInstance() { 1082 return messageDefaultInstance; 1083 } 1084 1085 @SuppressWarnings("unchecked") fromFieldSetType(final Object value)1086 Object fromFieldSetType(final Object value) { 1087 if (descriptor.isRepeated()) { 1088 if (descriptor.getLiteJavaType() == WireFormat.JavaType.ENUM) { 1089 final List result = new ArrayList(); 1090 for (final Object element : (List) value) { 1091 result.add(singularFromFieldSetType(element)); 1092 } 1093 return result; 1094 } else { 1095 return value; 1096 } 1097 } else { 1098 return singularFromFieldSetType(value); 1099 } 1100 } 1101 singularFromFieldSetType(final Object value)1102 Object singularFromFieldSetType(final Object value) { 1103 if (descriptor.getLiteJavaType() == WireFormat.JavaType.ENUM) { 1104 return descriptor.enumTypeMap.findValueByNumber((Integer) value); 1105 } else { 1106 return value; 1107 } 1108 } 1109 1110 @SuppressWarnings("unchecked") toFieldSetType(final Object value)1111 Object toFieldSetType(final Object value) { 1112 if (descriptor.isRepeated()) { 1113 if (descriptor.getLiteJavaType() == WireFormat.JavaType.ENUM) { 1114 final List result = new ArrayList(); 1115 for (final Object element : (List) value) { 1116 result.add(singularToFieldSetType(element)); 1117 } 1118 return result; 1119 } else { 1120 return value; 1121 } 1122 } else { 1123 return singularToFieldSetType(value); 1124 } 1125 } 1126 singularToFieldSetType(final Object value)1127 Object singularToFieldSetType(final Object value) { 1128 if (descriptor.getLiteJavaType() == WireFormat.JavaType.ENUM) { 1129 return ((Internal.EnumLite) value).getNumber(); 1130 } else { 1131 return value; 1132 } 1133 } 1134 1135 @Override getLiteType()1136 public FieldType getLiteType() { 1137 return descriptor.getLiteType(); 1138 } 1139 1140 @Override isRepeated()1141 public boolean isRepeated() { 1142 return descriptor.isRepeated; 1143 } 1144 1145 @Override getDefaultValue()1146 public Type getDefaultValue() { 1147 return defaultValue; 1148 } 1149 } 1150 1151 /** 1152 * A serialized (serializable) form of the generated message. Stores the 1153 * message as a class name and a byte array. 1154 */ 1155 protected static final class SerializedForm implements Serializable { 1156 of(MessageLite message)1157 public static SerializedForm of(MessageLite message) { 1158 return new SerializedForm(message); 1159 } 1160 1161 private static final long serialVersionUID = 0L; 1162 1163 private final String messageClassName; 1164 private final byte[] asBytes; 1165 1166 /** 1167 * Creates the serialized form by calling {@link com.google.protobuf.MessageLite#toByteArray}. 1168 * @param regularForm the message to serialize 1169 */ SerializedForm(MessageLite regularForm)1170 SerializedForm(MessageLite regularForm) { 1171 messageClassName = regularForm.getClass().getName(); 1172 asBytes = regularForm.toByteArray(); 1173 } 1174 1175 /** 1176 * When read from an ObjectInputStream, this method converts this object 1177 * back to the regular form. Part of Java's serialization magic. 1178 * @return a GeneratedMessage of the type that was serialized 1179 */ 1180 @SuppressWarnings("unchecked") readResolve()1181 protected Object readResolve() throws ObjectStreamException { 1182 try { 1183 Class<?> messageClass = Class.forName(messageClassName); 1184 java.lang.reflect.Field defaultInstanceField = 1185 messageClass.getDeclaredField("DEFAULT_INSTANCE"); 1186 defaultInstanceField.setAccessible(true); 1187 MessageLite defaultInstance = (MessageLite) defaultInstanceField.get(null); 1188 return defaultInstance.newBuilderForType() 1189 .mergeFrom(asBytes) 1190 .buildPartial(); 1191 } catch (ClassNotFoundException e) { 1192 throw new RuntimeException("Unable to find proto buffer class: " + messageClassName, e); 1193 } catch (NoSuchFieldException e) { 1194 throw new RuntimeException("Unable to find DEFAULT_INSTANCE in " + messageClassName, e); 1195 } catch (SecurityException e) { 1196 throw new RuntimeException("Unable to call DEFAULT_INSTANCE in " + messageClassName, e); 1197 } catch (IllegalAccessException e) { 1198 throw new RuntimeException("Unable to call parsePartialFrom", e); 1199 } catch (InvalidProtocolBufferException e) { 1200 throw new RuntimeException("Unable to understand proto buffer", e); 1201 } 1202 } 1203 } 1204 1205 /** 1206 * Checks that the {@link Extension} is Lite and returns it as a 1207 * {@link GeneratedExtension}. 1208 */ 1209 private static < 1210 MessageType extends ExtendableMessage<MessageType, BuilderType>, 1211 BuilderType extends ExtendableBuilder<MessageType, BuilderType>, 1212 T> checkIsLite( ExtensionLite<MessageType, T> extension)1213 GeneratedExtension<MessageType, T> checkIsLite( 1214 ExtensionLite<MessageType, T> extension) { 1215 if (!extension.isLite()) { 1216 throw new IllegalArgumentException("Expected a lite extension."); 1217 } 1218 1219 return (GeneratedExtension<MessageType, T>) extension; 1220 } 1221 1222 /** 1223 * A static helper method for checking if a message is initialized, optionally memoizing. 1224 * <p> 1225 * For use by generated code only. 1226 */ isInitialized( T message, boolean shouldMemoize)1227 protected static final <T extends GeneratedMessageLite<T, ?>> boolean isInitialized( 1228 T message, boolean shouldMemoize) { 1229 return message.dynamicMethod(MethodToInvoke.IS_INITIALIZED, shouldMemoize) != null; 1230 } 1231 makeImmutable(T message)1232 protected static final <T extends GeneratedMessageLite<T, ?>> void makeImmutable(T message) { 1233 message.dynamicMethod(MethodToInvoke.MAKE_IMMUTABLE); 1234 } 1235 emptyIntList()1236 protected static IntList emptyIntList() { 1237 return IntArrayList.emptyList(); 1238 } 1239 mutableCopy(IntList list)1240 protected static IntList mutableCopy(IntList list) { 1241 int size = list.size(); 1242 return list.mutableCopyWithCapacity( 1243 size == 0 ? AbstractProtobufList.DEFAULT_CAPACITY : size * 2); 1244 } 1245 emptyLongList()1246 protected static LongList emptyLongList() { 1247 return LongArrayList.emptyList(); 1248 } 1249 mutableCopy(LongList list)1250 protected static LongList mutableCopy(LongList list) { 1251 int size = list.size(); 1252 return list.mutableCopyWithCapacity( 1253 size == 0 ? AbstractProtobufList.DEFAULT_CAPACITY : size * 2); 1254 } 1255 emptyFloatList()1256 protected static FloatList emptyFloatList() { 1257 return FloatArrayList.emptyList(); 1258 } 1259 mutableCopy(FloatList list)1260 protected static FloatList mutableCopy(FloatList list) { 1261 int size = list.size(); 1262 return list.mutableCopyWithCapacity( 1263 size == 0 ? AbstractProtobufList.DEFAULT_CAPACITY : size * 2); 1264 } 1265 emptyDoubleList()1266 protected static DoubleList emptyDoubleList() { 1267 return DoubleArrayList.emptyList(); 1268 } 1269 mutableCopy(DoubleList list)1270 protected static DoubleList mutableCopy(DoubleList list) { 1271 int size = list.size(); 1272 return list.mutableCopyWithCapacity( 1273 size == 0 ? AbstractProtobufList.DEFAULT_CAPACITY : size * 2); 1274 } 1275 emptyBooleanList()1276 protected static BooleanList emptyBooleanList() { 1277 return BooleanArrayList.emptyList(); 1278 } 1279 mutableCopy(BooleanList list)1280 protected static BooleanList mutableCopy(BooleanList list) { 1281 int size = list.size(); 1282 return list.mutableCopyWithCapacity( 1283 size == 0 ? AbstractProtobufList.DEFAULT_CAPACITY : size * 2); 1284 } 1285 emptyProtobufList()1286 protected static <E> ProtobufList<E> emptyProtobufList() { 1287 return ProtobufArrayList.emptyList(); 1288 } 1289 mutableCopy(ProtobufList<E> list)1290 protected static <E> ProtobufList<E> mutableCopy(ProtobufList<E> list) { 1291 int size = list.size(); 1292 return list.mutableCopyWithCapacity( 1293 size == 0 ? AbstractProtobufList.DEFAULT_CAPACITY : size * 2); 1294 } 1295 1296 /** 1297 * A {@link Parser} implementation that delegates to the default instance. 1298 * <p> 1299 * For use by generated code only. 1300 */ 1301 protected static class DefaultInstanceBasedParser<T extends GeneratedMessageLite<T, ?>> 1302 extends AbstractParser<T> { 1303 1304 private T defaultInstance; 1305 DefaultInstanceBasedParser(T defaultInstance)1306 public DefaultInstanceBasedParser(T defaultInstance) { 1307 this.defaultInstance = defaultInstance; 1308 } 1309 1310 @Override parsePartialFrom(CodedInputStream input, ExtensionRegistryLite extensionRegistry)1311 public T parsePartialFrom(CodedInputStream input, ExtensionRegistryLite extensionRegistry) 1312 throws InvalidProtocolBufferException { 1313 return GeneratedMessageLite.parsePartialFrom(defaultInstance, input, extensionRegistry); 1314 } 1315 } 1316 1317 /** 1318 * A static helper method for parsing a partial from input using the extension registry and the 1319 * instance. 1320 */ 1321 // TODO(dweis): Should this verify that the last tag was 0? parsePartialFrom( T instance, CodedInputStream input, ExtensionRegistryLite extensionRegistry)1322 static <T extends GeneratedMessageLite<T, ?>> T parsePartialFrom( 1323 T instance, CodedInputStream input, ExtensionRegistryLite extensionRegistry) 1324 throws InvalidProtocolBufferException { 1325 @SuppressWarnings("unchecked") // Guaranteed by protoc 1326 T result = (T) instance.dynamicMethod(MethodToInvoke.NEW_MUTABLE_INSTANCE); 1327 try { 1328 result.dynamicMethod(MethodToInvoke.MERGE_FROM_STREAM, input, extensionRegistry); 1329 result.makeImmutable(); 1330 } catch (RuntimeException e) { 1331 if (e.getCause() instanceof InvalidProtocolBufferException) { 1332 throw (InvalidProtocolBufferException) e.getCause(); 1333 } 1334 throw e; 1335 } 1336 return result; 1337 } 1338 parsePartialFrom( T defaultInstance, CodedInputStream input)1339 protected static <T extends GeneratedMessageLite<T, ?>> T parsePartialFrom( 1340 T defaultInstance, 1341 CodedInputStream input) 1342 throws InvalidProtocolBufferException { 1343 return parsePartialFrom(defaultInstance, input, ExtensionRegistryLite.getEmptyRegistry()); 1344 } 1345 1346 /** 1347 * Helper method to check if message is initialized. 1348 * 1349 * @throws InvalidProtocolBufferException if it is not initialized. 1350 * @return The message to check. 1351 */ checkMessageInitialized(T message)1352 private static <T extends GeneratedMessageLite<T, ?>> T checkMessageInitialized(T message) 1353 throws InvalidProtocolBufferException { 1354 if (message != null && !message.isInitialized()) { 1355 throw message.newUninitializedMessageException() 1356 .asInvalidProtocolBufferException() 1357 .setUnfinishedMessage(message); 1358 } 1359 return message; 1360 } 1361 1362 // Validates last tag. parseFrom( T defaultInstance, ByteString data)1363 protected static <T extends GeneratedMessageLite<T, ?>> T parseFrom( 1364 T defaultInstance, ByteString data) 1365 throws InvalidProtocolBufferException { 1366 return checkMessageInitialized( 1367 parseFrom(defaultInstance, data, ExtensionRegistryLite.getEmptyRegistry())); 1368 } 1369 1370 // Validates last tag. parseFrom( T defaultInstance, ByteString data, ExtensionRegistryLite extensionRegistry)1371 protected static <T extends GeneratedMessageLite<T, ?>> T parseFrom( 1372 T defaultInstance, ByteString data, ExtensionRegistryLite extensionRegistry) 1373 throws InvalidProtocolBufferException { 1374 return checkMessageInitialized(parsePartialFrom(defaultInstance, data, extensionRegistry)); 1375 } 1376 1377 // This is a special case since we want to verify that the last tag is 0. We assume we exhaust the 1378 // ByteString. parsePartialFrom( T defaultInstance, ByteString data, ExtensionRegistryLite extensionRegistry)1379 private static <T extends GeneratedMessageLite<T, ?>> T parsePartialFrom( 1380 T defaultInstance, ByteString data, ExtensionRegistryLite extensionRegistry) 1381 throws InvalidProtocolBufferException { 1382 T message; 1383 try { 1384 CodedInputStream input = data.newCodedInput(); 1385 message = parsePartialFrom(defaultInstance, input, extensionRegistry); 1386 try { 1387 input.checkLastTagWas(0); 1388 } catch (InvalidProtocolBufferException e) { 1389 throw e.setUnfinishedMessage(message); 1390 } 1391 return message; 1392 } catch (InvalidProtocolBufferException e) { 1393 throw e; 1394 } 1395 } 1396 1397 // This is a special case since we want to verify that the last tag is 0. We assume we exhaust the 1398 // ByteString. parsePartialFrom( T defaultInstance, byte[] data, ExtensionRegistryLite extensionRegistry)1399 private static <T extends GeneratedMessageLite<T, ?>> T parsePartialFrom( 1400 T defaultInstance, byte[] data, ExtensionRegistryLite extensionRegistry) 1401 throws InvalidProtocolBufferException { 1402 T message; 1403 try { 1404 CodedInputStream input = CodedInputStream.newInstance(data); 1405 message = parsePartialFrom(defaultInstance, input, extensionRegistry); 1406 try { 1407 input.checkLastTagWas(0); 1408 } catch (InvalidProtocolBufferException e) { 1409 throw e.setUnfinishedMessage(message); 1410 } 1411 return message; 1412 } catch (InvalidProtocolBufferException e) { 1413 throw e; 1414 } 1415 } 1416 1417 // Validates last tag. parseFrom( T defaultInstance, byte[] data)1418 protected static <T extends GeneratedMessageLite<T, ?>> T parseFrom( 1419 T defaultInstance, byte[] data) 1420 throws InvalidProtocolBufferException { 1421 return checkMessageInitialized( 1422 parsePartialFrom(defaultInstance, data, ExtensionRegistryLite.getEmptyRegistry())); 1423 } 1424 1425 // Validates last tag. parseFrom( T defaultInstance, byte[] data, ExtensionRegistryLite extensionRegistry)1426 protected static <T extends GeneratedMessageLite<T, ?>> T parseFrom( 1427 T defaultInstance, byte[] data, ExtensionRegistryLite extensionRegistry) 1428 throws InvalidProtocolBufferException { 1429 return checkMessageInitialized(parsePartialFrom(defaultInstance, data, extensionRegistry)); 1430 } 1431 1432 // Does not validate last tag. parseFrom( T defaultInstance, InputStream input)1433 protected static <T extends GeneratedMessageLite<T, ?>> T parseFrom( 1434 T defaultInstance, InputStream input) 1435 throws InvalidProtocolBufferException { 1436 return checkMessageInitialized( 1437 parsePartialFrom(defaultInstance, CodedInputStream.newInstance(input), 1438 ExtensionRegistryLite.getEmptyRegistry())); 1439 } 1440 1441 // Does not validate last tag. parseFrom( T defaultInstance, InputStream input, ExtensionRegistryLite extensionRegistry)1442 protected static <T extends GeneratedMessageLite<T, ?>> T parseFrom( 1443 T defaultInstance, InputStream input, ExtensionRegistryLite extensionRegistry) 1444 throws InvalidProtocolBufferException { 1445 return checkMessageInitialized( 1446 parsePartialFrom(defaultInstance, CodedInputStream.newInstance(input), extensionRegistry)); 1447 } 1448 1449 // Does not validate last tag. parseFrom( T defaultInstance, CodedInputStream input)1450 protected static <T extends GeneratedMessageLite<T, ?>> T parseFrom( 1451 T defaultInstance, CodedInputStream input) 1452 throws InvalidProtocolBufferException { 1453 return parseFrom(defaultInstance, input, ExtensionRegistryLite.getEmptyRegistry()); 1454 } 1455 1456 // Does not validate last tag. parseFrom( T defaultInstance, CodedInputStream input, ExtensionRegistryLite extensionRegistry)1457 protected static <T extends GeneratedMessageLite<T, ?>> T parseFrom( 1458 T defaultInstance, CodedInputStream input, ExtensionRegistryLite extensionRegistry) 1459 throws InvalidProtocolBufferException { 1460 return checkMessageInitialized( 1461 parsePartialFrom(defaultInstance, input, extensionRegistry)); 1462 } 1463 1464 // Validates last tag. parseDelimitedFrom( T defaultInstance, InputStream input)1465 protected static <T extends GeneratedMessageLite<T, ?>> T parseDelimitedFrom( 1466 T defaultInstance, InputStream input) 1467 throws InvalidProtocolBufferException { 1468 return checkMessageInitialized( 1469 parsePartialDelimitedFrom(defaultInstance, input, 1470 ExtensionRegistryLite.getEmptyRegistry())); 1471 } 1472 1473 // Validates last tag. parseDelimitedFrom( T defaultInstance, InputStream input, ExtensionRegistryLite extensionRegistry)1474 protected static <T extends GeneratedMessageLite<T, ?>> T parseDelimitedFrom( 1475 T defaultInstance, InputStream input, ExtensionRegistryLite extensionRegistry) 1476 throws InvalidProtocolBufferException { 1477 return checkMessageInitialized( 1478 parsePartialDelimitedFrom(defaultInstance, input, extensionRegistry)); 1479 } 1480 parsePartialDelimitedFrom( T defaultInstance, InputStream input, ExtensionRegistryLite extensionRegistry)1481 private static <T extends GeneratedMessageLite<T, ?>> T parsePartialDelimitedFrom( 1482 T defaultInstance, 1483 InputStream input, 1484 ExtensionRegistryLite extensionRegistry) 1485 throws InvalidProtocolBufferException { 1486 int size; 1487 try { 1488 int firstByte = input.read(); 1489 if (firstByte == -1) { 1490 return null; 1491 } 1492 size = CodedInputStream.readRawVarint32(firstByte, input); 1493 } catch (IOException e) { 1494 throw new InvalidProtocolBufferException(e.getMessage()); 1495 } 1496 InputStream limitedInput = new LimitedInputStream(input, size); 1497 CodedInputStream codedInput = CodedInputStream.newInstance(limitedInput); 1498 T message = parsePartialFrom(defaultInstance, codedInput, extensionRegistry); 1499 try { 1500 codedInput.checkLastTagWas(0); 1501 } catch (InvalidProtocolBufferException e) { 1502 throw e.setUnfinishedMessage(message); 1503 } 1504 return message; 1505 } 1506 1507 /** 1508 * An abstract visitor that the generated code calls into that we use to implement various 1509 * features. Fields that are not members of oneofs are always visited. Members of a oneof are only 1510 * visited when they are the set oneof case value on the "other" proto. The visitOneofNotSet 1511 * method is invoked if other's oneof case is not set. 1512 */ 1513 protected interface Visitor { visitBoolean(boolean minePresent, boolean mine, boolean otherPresent, boolean other)1514 boolean visitBoolean(boolean minePresent, boolean mine, boolean otherPresent, boolean other); visitInt(boolean minePresent, int mine, boolean otherPresent, int other)1515 int visitInt(boolean minePresent, int mine, boolean otherPresent, int other); visitDouble(boolean minePresent, double mine, boolean otherPresent, double other)1516 double visitDouble(boolean minePresent, double mine, boolean otherPresent, double other); visitFloat(boolean minePresent, float mine, boolean otherPresent, float other)1517 float visitFloat(boolean minePresent, float mine, boolean otherPresent, float other); visitLong(boolean minePresent, long mine, boolean otherPresent, long other)1518 long visitLong(boolean minePresent, long mine, boolean otherPresent, long other); visitString(boolean minePresent, String mine, boolean otherPresent, String other)1519 String visitString(boolean minePresent, String mine, boolean otherPresent, String other); visitByteString( boolean minePresent, ByteString mine, boolean otherPresent, ByteString other)1520 ByteString visitByteString( 1521 boolean minePresent, ByteString mine, boolean otherPresent, ByteString other); 1522 visitOneofBoolean(boolean minePresent, Object mine, Object other)1523 Object visitOneofBoolean(boolean minePresent, Object mine, Object other); visitOneofInt(boolean minePresent, Object mine, Object other)1524 Object visitOneofInt(boolean minePresent, Object mine, Object other); visitOneofDouble(boolean minePresent, Object mine, Object other)1525 Object visitOneofDouble(boolean minePresent, Object mine, Object other); visitOneofFloat(boolean minePresent, Object mine, Object other)1526 Object visitOneofFloat(boolean minePresent, Object mine, Object other); visitOneofLong(boolean minePresent, Object mine, Object other)1527 Object visitOneofLong(boolean minePresent, Object mine, Object other); visitOneofString(boolean minePresent, Object mine, Object other)1528 Object visitOneofString(boolean minePresent, Object mine, Object other); visitOneofByteString(boolean minePresent, Object mine, Object other)1529 Object visitOneofByteString(boolean minePresent, Object mine, Object other); visitOneofLazyMessage(boolean minePresent, Object mine, Object other)1530 Object visitOneofLazyMessage(boolean minePresent, Object mine, Object other); visitOneofMessage(boolean minePresent, Object mine, Object other)1531 Object visitOneofMessage(boolean minePresent, Object mine, Object other); visitOneofNotSet(boolean minePresent)1532 void visitOneofNotSet(boolean minePresent); 1533 1534 /** 1535 * Message fields use null sentinals. 1536 */ visitMessage(T mine, T other)1537 <T extends MessageLite> T visitMessage(T mine, T other); visitLazyMessage( boolean minePresent, LazyFieldLite mine, boolean otherPresent, LazyFieldLite other)1538 LazyFieldLite visitLazyMessage( 1539 boolean minePresent, LazyFieldLite mine, boolean otherPresent, LazyFieldLite other); 1540 visitList(ProtobufList<T> mine, ProtobufList<T> other)1541 <T> ProtobufList<T> visitList(ProtobufList<T> mine, ProtobufList<T> other); visitBooleanList(BooleanList mine, BooleanList other)1542 BooleanList visitBooleanList(BooleanList mine, BooleanList other); visitIntList(IntList mine, IntList other)1543 IntList visitIntList(IntList mine, IntList other); visitDoubleList(DoubleList mine, DoubleList other)1544 DoubleList visitDoubleList(DoubleList mine, DoubleList other); visitFloatList(FloatList mine, FloatList other)1545 FloatList visitFloatList(FloatList mine, FloatList other); visitLongList(LongList mine, LongList other)1546 LongList visitLongList(LongList mine, LongList other); visitExtensions( FieldSet<ExtensionDescriptor> mine, FieldSet<ExtensionDescriptor> other)1547 FieldSet<ExtensionDescriptor> visitExtensions( 1548 FieldSet<ExtensionDescriptor> mine, FieldSet<ExtensionDescriptor> other); visitUnknownFields(UnknownFieldSetLite mine, UnknownFieldSetLite other)1549 UnknownFieldSetLite visitUnknownFields(UnknownFieldSetLite mine, UnknownFieldSetLite other); visitMap(MapFieldLite<K, V> mine, MapFieldLite<K, V> other)1550 <K, V> MapFieldLite<K, V> visitMap(MapFieldLite<K, V> mine, MapFieldLite<K, V> other); 1551 } 1552 1553 /** 1554 * Implements equals. Throws a {@link NotEqualsException} when not equal. 1555 */ 1556 static class EqualsVisitor implements Visitor { 1557 1558 static final class NotEqualsException extends RuntimeException {} 1559 1560 static final EqualsVisitor INSTANCE = new EqualsVisitor(); 1561 1562 static final NotEqualsException NOT_EQUALS = new NotEqualsException(); 1563 EqualsVisitor()1564 private EqualsVisitor() {} 1565 1566 @Override visitBoolean( boolean minePresent, boolean mine, boolean otherPresent, boolean other)1567 public boolean visitBoolean( 1568 boolean minePresent, boolean mine, boolean otherPresent, boolean other) { 1569 if (minePresent != otherPresent || mine != other) { 1570 throw NOT_EQUALS; 1571 } 1572 return mine; 1573 } 1574 1575 @Override visitInt(boolean minePresent, int mine, boolean otherPresent, int other)1576 public int visitInt(boolean minePresent, int mine, boolean otherPresent, int other) { 1577 if (minePresent != otherPresent || mine != other) { 1578 throw NOT_EQUALS; 1579 } 1580 return mine; 1581 } 1582 1583 @Override visitDouble( boolean minePresent, double mine, boolean otherPresent, double other)1584 public double visitDouble( 1585 boolean minePresent, double mine, boolean otherPresent, double other) { 1586 if (minePresent != otherPresent || mine != other) { 1587 throw NOT_EQUALS; 1588 } 1589 return mine; 1590 } 1591 1592 @Override visitFloat(boolean minePresent, float mine, boolean otherPresent, float other)1593 public float visitFloat(boolean minePresent, float mine, boolean otherPresent, float other) { 1594 if (minePresent != otherPresent || mine != other) { 1595 throw NOT_EQUALS; 1596 } 1597 return mine; 1598 } 1599 1600 @Override visitLong(boolean minePresent, long mine, boolean otherPresent, long other)1601 public long visitLong(boolean minePresent, long mine, boolean otherPresent, long other) { 1602 if (minePresent != otherPresent || mine != other) { 1603 throw NOT_EQUALS; 1604 } 1605 return mine; 1606 } 1607 1608 @Override visitString( boolean minePresent, String mine, boolean otherPresent, String other)1609 public String visitString( 1610 boolean minePresent, String mine, boolean otherPresent, String other) { 1611 if (minePresent != otherPresent || !mine.equals(other)) { 1612 throw NOT_EQUALS; 1613 } 1614 return mine; 1615 } 1616 1617 @Override visitByteString( boolean minePresent, ByteString mine, boolean otherPresent, ByteString other)1618 public ByteString visitByteString( 1619 boolean minePresent, ByteString mine, boolean otherPresent, ByteString other) { 1620 if (minePresent != otherPresent || !mine.equals(other)) { 1621 throw NOT_EQUALS; 1622 } 1623 return mine; 1624 } 1625 1626 @Override visitOneofBoolean(boolean minePresent, Object mine, Object other)1627 public Object visitOneofBoolean(boolean minePresent, Object mine, Object other) { 1628 if (minePresent && mine.equals(other)) { 1629 return mine; 1630 } 1631 throw NOT_EQUALS; 1632 } 1633 1634 @Override visitOneofInt(boolean minePresent, Object mine, Object other)1635 public Object visitOneofInt(boolean minePresent, Object mine, Object other) { 1636 if (minePresent && mine.equals(other)) { 1637 return mine; 1638 } 1639 throw NOT_EQUALS; 1640 } 1641 1642 @Override visitOneofDouble(boolean minePresent, Object mine, Object other)1643 public Object visitOneofDouble(boolean minePresent, Object mine, Object other) { 1644 if (minePresent && mine.equals(other)) { 1645 return mine; 1646 } 1647 throw NOT_EQUALS; 1648 } 1649 1650 @Override visitOneofFloat(boolean minePresent, Object mine, Object other)1651 public Object visitOneofFloat(boolean minePresent, Object mine, Object other) { 1652 if (minePresent && mine.equals(other)) { 1653 return mine; 1654 } 1655 throw NOT_EQUALS; 1656 } 1657 1658 @Override visitOneofLong(boolean minePresent, Object mine, Object other)1659 public Object visitOneofLong(boolean minePresent, Object mine, Object other) { 1660 if (minePresent && mine.equals(other)) { 1661 return mine; 1662 } 1663 throw NOT_EQUALS; 1664 } 1665 1666 @Override visitOneofString(boolean minePresent, Object mine, Object other)1667 public Object visitOneofString(boolean minePresent, Object mine, Object other) { 1668 if (minePresent && mine.equals(other)) { 1669 return mine; 1670 } 1671 throw NOT_EQUALS; 1672 } 1673 1674 @Override visitOneofByteString(boolean minePresent, Object mine, Object other)1675 public Object visitOneofByteString(boolean minePresent, Object mine, Object other) { 1676 if (minePresent && mine.equals(other)) { 1677 return mine; 1678 } 1679 throw NOT_EQUALS; 1680 } 1681 1682 @Override visitOneofLazyMessage(boolean minePresent, Object mine, Object other)1683 public Object visitOneofLazyMessage(boolean minePresent, Object mine, Object other) { 1684 if (minePresent && mine.equals(other)) { 1685 return mine; 1686 } 1687 throw NOT_EQUALS; 1688 } 1689 1690 @Override visitOneofMessage(boolean minePresent, Object mine, Object other)1691 public Object visitOneofMessage(boolean minePresent, Object mine, Object other) { 1692 if (minePresent && ((GeneratedMessageLite<?, ?>) mine).equals(this, (MessageLite) other)) { 1693 return mine; 1694 } 1695 throw NOT_EQUALS; 1696 } 1697 1698 @Override visitOneofNotSet(boolean minePresent)1699 public void visitOneofNotSet(boolean minePresent) { 1700 if (minePresent) { 1701 throw NOT_EQUALS; 1702 } 1703 } 1704 1705 @Override visitMessage(T mine, T other)1706 public <T extends MessageLite> T visitMessage(T mine, T other) { 1707 if (mine == null && other == null) { 1708 return null; 1709 } 1710 1711 if (mine == null || other == null) { 1712 throw NOT_EQUALS; 1713 } 1714 1715 ((GeneratedMessageLite<?, ?>) mine).equals(this, other); 1716 1717 return mine; 1718 } 1719 1720 @Override visitLazyMessage( boolean minePresent, LazyFieldLite mine, boolean otherPresent, LazyFieldLite other)1721 public LazyFieldLite visitLazyMessage( 1722 boolean minePresent, LazyFieldLite mine, boolean otherPresent, LazyFieldLite other) { 1723 if (!minePresent && !otherPresent) { 1724 return mine; 1725 } else if (minePresent && otherPresent && mine.equals(other)) { 1726 return mine; 1727 } 1728 throw NOT_EQUALS; 1729 } 1730 1731 @Override visitList(ProtobufList<T> mine, ProtobufList<T> other)1732 public <T> ProtobufList<T> visitList(ProtobufList<T> mine, ProtobufList<T> other) { 1733 if (!mine.equals(other)) { 1734 throw NOT_EQUALS; 1735 } 1736 return mine; 1737 } 1738 1739 @Override visitBooleanList(BooleanList mine, BooleanList other)1740 public BooleanList visitBooleanList(BooleanList mine, BooleanList other) { 1741 if (!mine.equals(other)) { 1742 throw NOT_EQUALS; 1743 } 1744 return mine; 1745 } 1746 1747 @Override visitIntList(IntList mine, IntList other)1748 public IntList visitIntList(IntList mine, IntList other) { 1749 if (!mine.equals(other)) { 1750 throw NOT_EQUALS; 1751 } 1752 return mine; 1753 } 1754 1755 @Override visitDoubleList(DoubleList mine, DoubleList other)1756 public DoubleList visitDoubleList(DoubleList mine, DoubleList other) { 1757 if (!mine.equals(other)) { 1758 throw NOT_EQUALS; 1759 } 1760 return mine; 1761 } 1762 1763 @Override visitFloatList(FloatList mine, FloatList other)1764 public FloatList visitFloatList(FloatList mine, FloatList other) { 1765 if (!mine.equals(other)) { 1766 throw NOT_EQUALS; 1767 } 1768 return mine; 1769 } 1770 1771 @Override visitLongList(LongList mine, LongList other)1772 public LongList visitLongList(LongList mine, LongList other) { 1773 if (!mine.equals(other)) { 1774 throw NOT_EQUALS; 1775 } 1776 return mine; 1777 } 1778 1779 @Override visitExtensions( FieldSet<ExtensionDescriptor> mine, FieldSet<ExtensionDescriptor> other)1780 public FieldSet<ExtensionDescriptor> visitExtensions( 1781 FieldSet<ExtensionDescriptor> mine, 1782 FieldSet<ExtensionDescriptor> other) { 1783 if (!mine.equals(other)) { 1784 throw NOT_EQUALS; 1785 } 1786 return mine; 1787 } 1788 1789 @Override visitUnknownFields( UnknownFieldSetLite mine, UnknownFieldSetLite other)1790 public UnknownFieldSetLite visitUnknownFields( 1791 UnknownFieldSetLite mine, 1792 UnknownFieldSetLite other) { 1793 if (!mine.equals(other)) { 1794 throw NOT_EQUALS; 1795 } 1796 return mine; 1797 } 1798 1799 @Override visitMap(MapFieldLite<K, V> mine, MapFieldLite<K, V> other)1800 public <K, V> MapFieldLite<K, V> visitMap(MapFieldLite<K, V> mine, MapFieldLite<K, V> other) { 1801 if (!mine.equals(other)) { 1802 throw NOT_EQUALS; 1803 } 1804 return mine; 1805 } 1806 } 1807 1808 /** 1809 * Implements hashCode by accumulating state. 1810 */ 1811 private static class HashCodeVisitor implements Visitor { 1812 1813 // The caller must ensure that the visitor is invoked parameterized with this and this such that 1814 // other is this. This is required due to how oneof cases are handled. See the class comment 1815 // on Visitor for more information. 1816 1817 private int hashCode = 0; 1818 1819 @Override visitBoolean( boolean minePresent, boolean mine, boolean otherPresent, boolean other)1820 public boolean visitBoolean( 1821 boolean minePresent, boolean mine, boolean otherPresent, boolean other) { 1822 hashCode = (53 * hashCode) + Internal.hashBoolean(mine); 1823 return mine; 1824 } 1825 1826 @Override visitInt(boolean minePresent, int mine, boolean otherPresent, int other)1827 public int visitInt(boolean minePresent, int mine, boolean otherPresent, int other) { 1828 hashCode = (53 * hashCode) + mine; 1829 return mine; 1830 } 1831 1832 @Override visitDouble( boolean minePresent, double mine, boolean otherPresent, double other)1833 public double visitDouble( 1834 boolean minePresent, double mine, boolean otherPresent, double other) { 1835 hashCode = (53 * hashCode) + Internal.hashLong(Double.doubleToLongBits(mine)); 1836 return mine; 1837 } 1838 1839 @Override visitFloat(boolean minePresent, float mine, boolean otherPresent, float other)1840 public float visitFloat(boolean minePresent, float mine, boolean otherPresent, float other) { 1841 hashCode = (53 * hashCode) + Float.floatToIntBits(mine); 1842 return mine; 1843 } 1844 1845 @Override visitLong(boolean minePresent, long mine, boolean otherPresent, long other)1846 public long visitLong(boolean minePresent, long mine, boolean otherPresent, long other) { 1847 hashCode = (53 * hashCode) + Internal.hashLong(mine); 1848 return mine; 1849 } 1850 1851 @Override visitString( boolean minePresent, String mine, boolean otherPresent, String other)1852 public String visitString( 1853 boolean minePresent, String mine, boolean otherPresent, String other) { 1854 hashCode = (53 * hashCode) + mine.hashCode(); 1855 return mine; 1856 } 1857 1858 @Override visitByteString( boolean minePresent, ByteString mine, boolean otherPresent, ByteString other)1859 public ByteString visitByteString( 1860 boolean minePresent, ByteString mine, boolean otherPresent, ByteString other) { 1861 hashCode = (53 * hashCode) + mine.hashCode(); 1862 return mine; 1863 } 1864 1865 @Override visitOneofBoolean(boolean minePresent, Object mine, Object other)1866 public Object visitOneofBoolean(boolean minePresent, Object mine, Object other) { 1867 hashCode = (53 * hashCode) + Internal.hashBoolean(((Boolean) mine)); 1868 return mine; 1869 } 1870 1871 @Override visitOneofInt(boolean minePresent, Object mine, Object other)1872 public Object visitOneofInt(boolean minePresent, Object mine, Object other) { 1873 hashCode = (53 * hashCode) + (Integer) mine; 1874 return mine; 1875 } 1876 1877 @Override visitOneofDouble(boolean minePresent, Object mine, Object other)1878 public Object visitOneofDouble(boolean minePresent, Object mine, Object other) { 1879 hashCode = (53 * hashCode) + Internal.hashLong(Double.doubleToLongBits((Double) mine)); 1880 return mine; 1881 } 1882 1883 @Override visitOneofFloat(boolean minePresent, Object mine, Object other)1884 public Object visitOneofFloat(boolean minePresent, Object mine, Object other) { 1885 hashCode = (53 * hashCode) + Float.floatToIntBits((Float) mine); 1886 return mine; 1887 } 1888 1889 @Override visitOneofLong(boolean minePresent, Object mine, Object other)1890 public Object visitOneofLong(boolean minePresent, Object mine, Object other) { 1891 hashCode = (53 * hashCode) + Internal.hashLong((Long) mine); 1892 return mine; 1893 } 1894 1895 @Override visitOneofString(boolean minePresent, Object mine, Object other)1896 public Object visitOneofString(boolean minePresent, Object mine, Object other) { 1897 hashCode = (53 * hashCode) + mine.hashCode(); 1898 return mine; 1899 } 1900 1901 @Override visitOneofByteString(boolean minePresent, Object mine, Object other)1902 public Object visitOneofByteString(boolean minePresent, Object mine, Object other) { 1903 hashCode = (53 * hashCode) + mine.hashCode(); 1904 return mine; 1905 } 1906 1907 @Override visitOneofLazyMessage(boolean minePresent, Object mine, Object other)1908 public Object visitOneofLazyMessage(boolean minePresent, Object mine, Object other) { 1909 hashCode = (53 * hashCode) + mine.hashCode(); 1910 return mine; 1911 } 1912 1913 @Override visitOneofMessage(boolean minePresent, Object mine, Object other)1914 public Object visitOneofMessage(boolean minePresent, Object mine, Object other) { 1915 return visitMessage((MessageLite) mine, (MessageLite) other); 1916 } 1917 1918 @Override visitOneofNotSet(boolean minePresent)1919 public void visitOneofNotSet(boolean minePresent) { 1920 if (minePresent) { 1921 throw new IllegalStateException(); // Can't happen if other == this. 1922 } 1923 } 1924 1925 @Override visitMessage(T mine, T other)1926 public <T extends MessageLite> T visitMessage(T mine, T other) { 1927 final int protoHash; 1928 if (mine != null) { 1929 if (mine instanceof GeneratedMessageLite) { 1930 protoHash = ((GeneratedMessageLite) mine).hashCode(this); 1931 } else { 1932 protoHash = mine.hashCode(); 1933 } 1934 } else { 1935 protoHash = 37; 1936 } 1937 hashCode = (53 * hashCode) + protoHash; 1938 return mine; 1939 } 1940 1941 @Override visitLazyMessage( boolean minePresent, LazyFieldLite mine, boolean otherPresent, LazyFieldLite other)1942 public LazyFieldLite visitLazyMessage( 1943 boolean minePresent, LazyFieldLite mine, boolean otherPresent, LazyFieldLite other) { 1944 hashCode = (53 * hashCode) + mine.hashCode(); 1945 return mine; 1946 } 1947 1948 @Override visitList(ProtobufList<T> mine, ProtobufList<T> other)1949 public <T> ProtobufList<T> visitList(ProtobufList<T> mine, ProtobufList<T> other) { 1950 hashCode = (53 * hashCode) + mine.hashCode(); 1951 return mine; 1952 } 1953 1954 @Override visitBooleanList(BooleanList mine, BooleanList other)1955 public BooleanList visitBooleanList(BooleanList mine, BooleanList other) { 1956 hashCode = (53 * hashCode) + mine.hashCode(); 1957 return mine; 1958 } 1959 1960 @Override visitIntList(IntList mine, IntList other)1961 public IntList visitIntList(IntList mine, IntList other) { 1962 hashCode = (53 * hashCode) + mine.hashCode(); 1963 return mine; 1964 } 1965 1966 @Override visitDoubleList(DoubleList mine, DoubleList other)1967 public DoubleList visitDoubleList(DoubleList mine, DoubleList other) { 1968 hashCode = (53 * hashCode) + mine.hashCode(); 1969 return mine; 1970 } 1971 1972 @Override visitFloatList(FloatList mine, FloatList other)1973 public FloatList visitFloatList(FloatList mine, FloatList other) { 1974 hashCode = (53 * hashCode) + mine.hashCode(); 1975 return mine; 1976 } 1977 1978 @Override visitLongList(LongList mine, LongList other)1979 public LongList visitLongList(LongList mine, LongList other) { 1980 hashCode = (53 * hashCode) + mine.hashCode(); 1981 return mine; 1982 } 1983 1984 @Override visitExtensions( FieldSet<ExtensionDescriptor> mine, FieldSet<ExtensionDescriptor> other)1985 public FieldSet<ExtensionDescriptor> visitExtensions( 1986 FieldSet<ExtensionDescriptor> mine, 1987 FieldSet<ExtensionDescriptor> other) { 1988 hashCode = (53 * hashCode) + mine.hashCode(); 1989 return mine; 1990 } 1991 1992 @Override visitUnknownFields( UnknownFieldSetLite mine, UnknownFieldSetLite other)1993 public UnknownFieldSetLite visitUnknownFields( 1994 UnknownFieldSetLite mine, 1995 UnknownFieldSetLite other) { 1996 hashCode = (53 * hashCode) + mine.hashCode(); 1997 return mine; 1998 } 1999 2000 @Override visitMap(MapFieldLite<K, V> mine, MapFieldLite<K, V> other)2001 public <K, V> MapFieldLite<K, V> visitMap(MapFieldLite<K, V> mine, MapFieldLite<K, V> other) { 2002 hashCode = (53 * hashCode) + mine.hashCode(); 2003 return mine; 2004 } 2005 } 2006 2007 /** 2008 * Implements field merging semantics over the visitor interface. 2009 */ 2010 protected static class MergeFromVisitor implements Visitor { 2011 2012 public static final MergeFromVisitor INSTANCE = new MergeFromVisitor(); 2013 MergeFromVisitor()2014 private MergeFromVisitor() {} 2015 2016 @Override visitBoolean( boolean minePresent, boolean mine, boolean otherPresent, boolean other)2017 public boolean visitBoolean( 2018 boolean minePresent, boolean mine, boolean otherPresent, boolean other) { 2019 return otherPresent ? other : mine; 2020 } 2021 2022 @Override visitInt(boolean minePresent, int mine, boolean otherPresent, int other)2023 public int visitInt(boolean minePresent, int mine, boolean otherPresent, int other) { 2024 return otherPresent ? other : mine; 2025 } 2026 2027 @Override visitDouble( boolean minePresent, double mine, boolean otherPresent, double other)2028 public double visitDouble( 2029 boolean minePresent, double mine, boolean otherPresent, double other) { 2030 return otherPresent ? other : mine; 2031 } 2032 2033 @Override visitFloat(boolean minePresent, float mine, boolean otherPresent, float other)2034 public float visitFloat(boolean minePresent, float mine, boolean otherPresent, float other) { 2035 return otherPresent ? other : mine; 2036 } 2037 2038 @Override visitLong(boolean minePresent, long mine, boolean otherPresent, long other)2039 public long visitLong(boolean minePresent, long mine, boolean otherPresent, long other) { 2040 return otherPresent ? other : mine; 2041 } 2042 2043 @Override visitString( boolean minePresent, String mine, boolean otherPresent, String other)2044 public String visitString( 2045 boolean minePresent, String mine, boolean otherPresent, String other) { 2046 return otherPresent ? other : mine; 2047 } 2048 2049 @Override visitByteString( boolean minePresent, ByteString mine, boolean otherPresent, ByteString other)2050 public ByteString visitByteString( 2051 boolean minePresent, ByteString mine, boolean otherPresent, ByteString other) { 2052 return otherPresent ? other : mine; 2053 } 2054 2055 @Override visitOneofBoolean(boolean minePresent, Object mine, Object other)2056 public Object visitOneofBoolean(boolean minePresent, Object mine, Object other) { 2057 return other; 2058 } 2059 2060 @Override visitOneofInt(boolean minePresent, Object mine, Object other)2061 public Object visitOneofInt(boolean minePresent, Object mine, Object other) { 2062 return other; 2063 } 2064 2065 @Override visitOneofDouble(boolean minePresent, Object mine, Object other)2066 public Object visitOneofDouble(boolean minePresent, Object mine, Object other) { 2067 return other; 2068 } 2069 2070 @Override visitOneofFloat(boolean minePresent, Object mine, Object other)2071 public Object visitOneofFloat(boolean minePresent, Object mine, Object other) { 2072 return other; 2073 } 2074 2075 @Override visitOneofLong(boolean minePresent, Object mine, Object other)2076 public Object visitOneofLong(boolean minePresent, Object mine, Object other) { 2077 return other; 2078 } 2079 2080 @Override visitOneofString(boolean minePresent, Object mine, Object other)2081 public Object visitOneofString(boolean minePresent, Object mine, Object other) { 2082 return other; 2083 } 2084 2085 @Override visitOneofByteString(boolean minePresent, Object mine, Object other)2086 public Object visitOneofByteString(boolean minePresent, Object mine, Object other) { 2087 return other; 2088 } 2089 2090 @Override visitOneofLazyMessage(boolean minePresent, Object mine, Object other)2091 public Object visitOneofLazyMessage(boolean minePresent, Object mine, Object other) { 2092 if (minePresent) { 2093 LazyFieldLite lazy = (LazyFieldLite) mine; 2094 lazy.merge((LazyFieldLite) other); 2095 return lazy; 2096 } 2097 return other; 2098 } 2099 2100 @Override visitOneofMessage(boolean minePresent, Object mine, Object other)2101 public Object visitOneofMessage(boolean minePresent, Object mine, Object other) { 2102 if (minePresent) { 2103 return visitMessage((MessageLite) mine, (MessageLite) other); 2104 } 2105 return other; 2106 } 2107 2108 @Override visitOneofNotSet(boolean minePresent)2109 public void visitOneofNotSet(boolean minePresent) { 2110 return; 2111 } 2112 2113 @SuppressWarnings("unchecked") // Guaranteed by runtime. 2114 @Override visitMessage(T mine, T other)2115 public <T extends MessageLite> T visitMessage(T mine, T other) { 2116 if (mine != null && other != null) { 2117 return (T) mine.toBuilder().mergeFrom(other).build(); 2118 } 2119 2120 return mine != null ? mine : other; 2121 } 2122 2123 @Override visitLazyMessage( boolean minePresent, LazyFieldLite mine, boolean otherPresent, LazyFieldLite other)2124 public LazyFieldLite visitLazyMessage( 2125 boolean minePresent, LazyFieldLite mine, boolean otherPresent, LazyFieldLite other) { 2126 // LazyFieldLite's are never null so we can just copy across. Necessary to avoid leakage 2127 // from builder into immutable message. 2128 // TODO(dweis): Change to null sentinels? 2129 mine.merge(other); 2130 return mine; 2131 } 2132 2133 @Override visitList(ProtobufList<T> mine, ProtobufList<T> other)2134 public <T> ProtobufList<T> visitList(ProtobufList<T> mine, ProtobufList<T> other) { 2135 int size = mine.size(); 2136 int otherSize = other.size(); 2137 if (size > 0 && otherSize > 0) { 2138 if (!mine.isModifiable()) { 2139 mine = mine.mutableCopyWithCapacity(size + otherSize); 2140 } 2141 mine.addAll(other); 2142 } 2143 2144 return size > 0 ? mine : other; 2145 } 2146 2147 @Override visitBooleanList(BooleanList mine, BooleanList other)2148 public BooleanList visitBooleanList(BooleanList mine, BooleanList other) { 2149 int size = mine.size(); 2150 int otherSize = other.size(); 2151 if (size > 0 && otherSize > 0) { 2152 if (!mine.isModifiable()) { 2153 mine = mine.mutableCopyWithCapacity(size + otherSize); 2154 } 2155 mine.addAll(other); 2156 } 2157 2158 return size > 0 ? mine : other; 2159 } 2160 2161 @Override visitIntList(IntList mine, IntList other)2162 public IntList visitIntList(IntList mine, IntList other) { 2163 int size = mine.size(); 2164 int otherSize = other.size(); 2165 if (size > 0 && otherSize > 0) { 2166 if (!mine.isModifiable()) { 2167 mine = mine.mutableCopyWithCapacity(size + otherSize); 2168 } 2169 mine.addAll(other); 2170 } 2171 2172 return size > 0 ? mine : other; 2173 } 2174 2175 @Override visitDoubleList(DoubleList mine, DoubleList other)2176 public DoubleList visitDoubleList(DoubleList mine, DoubleList other) { 2177 int size = mine.size(); 2178 int otherSize = other.size(); 2179 if (size > 0 && otherSize > 0) { 2180 if (!mine.isModifiable()) { 2181 mine = mine.mutableCopyWithCapacity(size + otherSize); 2182 } 2183 mine.addAll(other); 2184 } 2185 2186 return size > 0 ? mine : other; 2187 } 2188 2189 @Override visitFloatList(FloatList mine, FloatList other)2190 public FloatList visitFloatList(FloatList mine, FloatList other) { 2191 int size = mine.size(); 2192 int otherSize = other.size(); 2193 if (size > 0 && otherSize > 0) { 2194 if (!mine.isModifiable()) { 2195 mine = mine.mutableCopyWithCapacity(size + otherSize); 2196 } 2197 mine.addAll(other); 2198 } 2199 2200 return size > 0 ? mine : other; 2201 } 2202 2203 @Override visitLongList(LongList mine, LongList other)2204 public LongList visitLongList(LongList mine, LongList other) { 2205 int size = mine.size(); 2206 int otherSize = other.size(); 2207 if (size > 0 && otherSize > 0) { 2208 if (!mine.isModifiable()) { 2209 mine = mine.mutableCopyWithCapacity(size + otherSize); 2210 } 2211 mine.addAll(other); 2212 } 2213 2214 return size > 0 ? mine : other; 2215 } 2216 2217 @Override visitExtensions( FieldSet<ExtensionDescriptor> mine, FieldSet<ExtensionDescriptor> other)2218 public FieldSet<ExtensionDescriptor> visitExtensions( 2219 FieldSet<ExtensionDescriptor> mine, 2220 FieldSet<ExtensionDescriptor> other) { 2221 if (mine.isImmutable()) { 2222 mine = mine.clone(); 2223 } 2224 mine.mergeFrom(other); 2225 return mine; 2226 } 2227 2228 @Override visitUnknownFields( UnknownFieldSetLite mine, UnknownFieldSetLite other)2229 public UnknownFieldSetLite visitUnknownFields( 2230 UnknownFieldSetLite mine, 2231 UnknownFieldSetLite other) { 2232 return other == UnknownFieldSetLite.getDefaultInstance() 2233 ? mine : UnknownFieldSetLite.mutableCopyOf(mine, other); 2234 } 2235 2236 @Override visitMap(MapFieldLite<K, V> mine, MapFieldLite<K, V> other)2237 public <K, V> MapFieldLite<K, V> visitMap(MapFieldLite<K, V> mine, MapFieldLite<K, V> other) { 2238 mine.mergeFrom(other); 2239 return mine; 2240 } 2241 } 2242 } 2243