• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Protocol Buffers - Google's data interchange format
2 // Copyright 2008 Google Inc.  All rights reserved.
3 // https://developers.google.com/protocol-buffers/
4 //
5 // Redistribution and use in source and binary forms, with or without
6 // modification, are permitted provided that the following conditions are
7 // met:
8 //
9 //     * Redistributions of source code must retain the above copyright
10 // notice, this list of conditions and the following disclaimer.
11 //     * Redistributions in binary form must reproduce the above
12 // copyright notice, this list of conditions and the following disclaimer
13 // in the documentation and/or other materials provided with the
14 // distribution.
15 //     * Neither the name of Google Inc. nor the names of its
16 // contributors may be used to endorse or promote products derived from
17 // this software without specific prior written permission.
18 //
19 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 
31 package com.google.protobuf;
32 
33 import com.google.protobuf.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