1// Protocol Buffers - Google's data interchange format
2// Copyright 2008 Google Inc.  All rights reserved.
3// http://code.google.com/p/protobuf/
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
31package com.google.protobuf;
32
33import com.google.protobuf.Descriptors.Descriptor;
34import com.google.protobuf.Descriptors.EnumValueDescriptor;
35import com.google.protobuf.Descriptors.FieldDescriptor;
36
37import java.io.IOException;
38import java.io.ObjectStreamException;
39import java.io.Serializable;
40import java.lang.reflect.InvocationTargetException;
41import java.lang.reflect.Method;
42import java.util.ArrayList;
43import java.util.Collections;
44import java.util.Iterator;
45import java.util.List;
46import java.util.Map;
47import java.util.TreeMap;
48
49/**
50 * All generated protocol message classes extend this class.  This class
51 * implements most of the Message and Builder interfaces using Java reflection.
52 * Users can ignore this class and pretend that generated messages implement
53 * the Message interface directly.
54 *
55 * @author kenton@google.com Kenton Varda
56 */
57public abstract class GeneratedMessage extends AbstractMessage
58    implements Serializable {
59  private static final long serialVersionUID = 1L;
60
61  /**
62   * For testing. Allows a test to disable the optimization that avoids using
63   * field builders for nested messages until they are requested. By disabling
64   * this optimization, existing tests can be reused to test the field builders.
65   */
66  protected static boolean alwaysUseFieldBuilders = false;
67
68  protected GeneratedMessage() {
69  }
70
71  protected GeneratedMessage(Builder<?> builder) {
72  }
73
74  public Parser<? extends Message> getParserForType() {
75    throw new UnsupportedOperationException(
76        "This is supposed to be overridden by subclasses.");
77  }
78
79 /**
80  * For testing. Allows a test to disable the optimization that avoids using
81  * field builders for nested messages until they are requested. By disabling
82  * this optimization, existing tests can be reused to test the field builders.
83  * See {@link RepeatedFieldBuilder} and {@link SingleFieldBuilder}.
84  */
85  static void enableAlwaysUseFieldBuildersForTesting() {
86    alwaysUseFieldBuilders = true;
87  }
88
89  /**
90   * Get the FieldAccessorTable for this type.  We can't have the message
91   * class pass this in to the constructor because of bootstrapping trouble
92   * with DescriptorProtos.
93   */
94  protected abstract FieldAccessorTable internalGetFieldAccessorTable();
95
96  //@Override (Java 1.6 override semantics, but we must support 1.5)
97  public Descriptor getDescriptorForType() {
98    return internalGetFieldAccessorTable().descriptor;
99  }
100
101  /** Internal helper which returns a mutable map. */
102  private Map<FieldDescriptor, Object> getAllFieldsMutable() {
103    final TreeMap<FieldDescriptor, Object> result =
104      new TreeMap<FieldDescriptor, Object>();
105    final Descriptor descriptor = internalGetFieldAccessorTable().descriptor;
106    for (final FieldDescriptor field : descriptor.getFields()) {
107      if (field.isRepeated()) {
108        final List<?> value = (List<?>) getField(field);
109        if (!value.isEmpty()) {
110          result.put(field, value);
111        }
112      } else {
113        if (hasField(field)) {
114          result.put(field, getField(field));
115        }
116      }
117    }
118    return result;
119  }
120
121  @Override
122  public boolean isInitialized() {
123    for (final FieldDescriptor field : getDescriptorForType().getFields()) {
124      // Check that all required fields are present.
125      if (field.isRequired()) {
126        if (!hasField(field)) {
127          return false;
128        }
129      }
130      // Check that embedded messages are initialized.
131      if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {
132        if (field.isRepeated()) {
133          @SuppressWarnings("unchecked") final
134          List<Message> messageList = (List<Message>) getField(field);
135          for (final Message element : messageList) {
136            if (!element.isInitialized()) {
137              return false;
138            }
139          }
140        } else {
141          if (hasField(field) && !((Message) getField(field)).isInitialized()) {
142            return false;
143          }
144        }
145      }
146    }
147
148    return true;
149  }
150
151  //@Override (Java 1.6 override semantics, but we must support 1.5)
152  public Map<FieldDescriptor, Object> getAllFields() {
153    return Collections.unmodifiableMap(getAllFieldsMutable());
154  }
155
156  //@Override (Java 1.6 override semantics, but we must support 1.5)
157  public boolean hasField(final FieldDescriptor field) {
158    return internalGetFieldAccessorTable().getField(field).has(this);
159  }
160
161  //@Override (Java 1.6 override semantics, but we must support 1.5)
162  public Object getField(final FieldDescriptor field) {
163    return internalGetFieldAccessorTable().getField(field).get(this);
164  }
165
166  //@Override (Java 1.6 override semantics, but we must support 1.5)
167  public int getRepeatedFieldCount(final FieldDescriptor field) {
168    return internalGetFieldAccessorTable().getField(field)
169      .getRepeatedCount(this);
170  }
171
172  //@Override (Java 1.6 override semantics, but we must support 1.5)
173  public Object getRepeatedField(final FieldDescriptor field, final int index) {
174    return internalGetFieldAccessorTable().getField(field)
175      .getRepeated(this, index);
176  }
177
178  //@Override (Java 1.6 override semantics, but we must support 1.5)
179  public UnknownFieldSet getUnknownFields() {
180    throw new UnsupportedOperationException(
181        "This is supposed to be overridden by subclasses.");
182  }
183
184  /**
185   * Called by subclasses to parse an unknown field.
186   * @return {@code true} unless the tag is an end-group tag.
187   */
188  protected boolean parseUnknownField(
189      CodedInputStream input,
190      UnknownFieldSet.Builder unknownFields,
191      ExtensionRegistryLite extensionRegistry,
192      int tag) throws IOException {
193    return unknownFields.mergeFieldFrom(tag, input);
194  }
195
196  /**
197   * Used by parsing constructors in generated classes.
198   */
199  protected void makeExtensionsImmutable() {
200    // Noop for messages without extensions.
201  }
202
203  protected abstract Message.Builder newBuilderForType(BuilderParent parent);
204
205  /**
206   * Interface for the parent of a Builder that allows the builder to
207   * communicate invalidations back to the parent for use when using nested
208   * builders.
209   */
210  protected interface BuilderParent {
211
212    /**
213     * A builder becomes dirty whenever a field is modified -- including fields
214     * in nested builders -- and becomes clean when build() is called.  Thus,
215     * when a builder becomes dirty, all its parents become dirty as well, and
216     * when it becomes clean, all its children become clean.  The dirtiness
217     * state is used to invalidate certain cached values.
218     * <br>
219     * To this end, a builder calls markAsDirty() on its parent whenever it
220     * transitions from clean to dirty.  The parent must propagate this call to
221     * its own parent, unless it was already dirty, in which case the
222     * grandparent must necessarily already be dirty as well.  The parent can
223     * only transition back to "clean" after calling build() on all children.
224     */
225    void markDirty();
226  }
227
228  @SuppressWarnings("unchecked")
229  public abstract static class Builder <BuilderType extends Builder>
230      extends AbstractMessage.Builder<BuilderType> {
231
232    private BuilderParent builderParent;
233
234    private BuilderParentImpl meAsParent;
235
236    // Indicates that we've built a message and so we are now obligated
237    // to dispatch dirty invalidations. See GeneratedMessage.BuilderListener.
238    private boolean isClean;
239
240    private UnknownFieldSet unknownFields =
241        UnknownFieldSet.getDefaultInstance();
242
243    protected Builder() {
244      this(null);
245    }
246
247    protected Builder(BuilderParent builderParent) {
248      this.builderParent = builderParent;
249    }
250
251    void dispose() {
252      builderParent = null;
253    }
254
255    /**
256     * Called by the subclass when a message is built.
257     */
258    protected void onBuilt() {
259      if (builderParent != null) {
260        markClean();
261      }
262    }
263
264    /**
265     * Called by the subclass or a builder to notify us that a message was
266     * built and may be cached and therefore invalidations are needed.
267     */
268    protected void markClean() {
269      this.isClean = true;
270    }
271
272    /**
273     * Gets whether invalidations are needed
274     *
275     * @return whether invalidations are needed
276     */
277    protected boolean isClean() {
278      return isClean;
279    }
280
281    // This is implemented here only to work around an apparent bug in the
282    // Java compiler and/or build system.  See bug #1898463.  The mere presence
283    // of this dummy clone() implementation makes it go away.
284    @Override
285    public BuilderType clone() {
286      throw new UnsupportedOperationException(
287          "This is supposed to be overridden by subclasses.");
288    }
289
290    /**
291     * Called by the initialization and clear code paths to allow subclasses to
292     * reset any of their builtin fields back to the initial values.
293     */
294    public BuilderType clear() {
295      unknownFields = UnknownFieldSet.getDefaultInstance();
296      onChanged();
297      return (BuilderType) this;
298    }
299
300    /**
301     * Get the FieldAccessorTable for this type.  We can't have the message
302     * class pass this in to the constructor because of bootstrapping trouble
303     * with DescriptorProtos.
304     */
305    protected abstract FieldAccessorTable internalGetFieldAccessorTable();
306
307    //@Override (Java 1.6 override semantics, but we must support 1.5)
308    public Descriptor getDescriptorForType() {
309      return internalGetFieldAccessorTable().descriptor;
310    }
311
312    //@Override (Java 1.6 override semantics, but we must support 1.5)
313    public Map<FieldDescriptor, Object> getAllFields() {
314      return Collections.unmodifiableMap(getAllFieldsMutable());
315    }
316
317    /** Internal helper which returns a mutable map. */
318    private Map<FieldDescriptor, Object> getAllFieldsMutable() {
319      final TreeMap<FieldDescriptor, Object> result =
320        new TreeMap<FieldDescriptor, Object>();
321      final Descriptor descriptor = internalGetFieldAccessorTable().descriptor;
322      for (final FieldDescriptor field : descriptor.getFields()) {
323        if (field.isRepeated()) {
324          final List value = (List) getField(field);
325          if (!value.isEmpty()) {
326            result.put(field, value);
327          }
328        } else {
329          if (hasField(field)) {
330            result.put(field, getField(field));
331          }
332        }
333      }
334      return result;
335    }
336
337    public Message.Builder newBuilderForField(
338        final FieldDescriptor field) {
339      return internalGetFieldAccessorTable().getField(field).newBuilder();
340    }
341
342    //@Override (Java 1.6 override semantics, but we must support 1.5)
343    public Message.Builder getFieldBuilder(final FieldDescriptor field) {
344      return internalGetFieldAccessorTable().getField(field).getBuilder(this);
345    }
346
347    //@Override (Java 1.6 override semantics, but we must support 1.5)
348    public boolean hasField(final FieldDescriptor field) {
349      return internalGetFieldAccessorTable().getField(field).has(this);
350    }
351
352    //@Override (Java 1.6 override semantics, but we must support 1.5)
353    public Object getField(final FieldDescriptor field) {
354      Object object = internalGetFieldAccessorTable().getField(field).get(this);
355      if (field.isRepeated()) {
356        // The underlying list object is still modifiable at this point.
357        // Make sure not to expose the modifiable list to the caller.
358        return Collections.unmodifiableList((List) object);
359      } else {
360        return object;
361      }
362    }
363
364    public BuilderType setField(final FieldDescriptor field,
365                                final Object value) {
366      internalGetFieldAccessorTable().getField(field).set(this, value);
367      return (BuilderType) this;
368    }
369
370    //@Override (Java 1.6 override semantics, but we must support 1.5)
371    public BuilderType clearField(final FieldDescriptor field) {
372      internalGetFieldAccessorTable().getField(field).clear(this);
373      return (BuilderType) this;
374    }
375
376    //@Override (Java 1.6 override semantics, but we must support 1.5)
377    public int getRepeatedFieldCount(final FieldDescriptor field) {
378      return internalGetFieldAccessorTable().getField(field)
379          .getRepeatedCount(this);
380    }
381
382    //@Override (Java 1.6 override semantics, but we must support 1.5)
383    public Object getRepeatedField(final FieldDescriptor field,
384                                   final int index) {
385      return internalGetFieldAccessorTable().getField(field)
386          .getRepeated(this, index);
387    }
388
389    public BuilderType setRepeatedField(final FieldDescriptor field,
390                                        final int index, final Object value) {
391      internalGetFieldAccessorTable().getField(field)
392        .setRepeated(this, index, value);
393      return (BuilderType) this;
394    }
395
396    public BuilderType addRepeatedField(final FieldDescriptor field,
397                                        final Object value) {
398      internalGetFieldAccessorTable().getField(field).addRepeated(this, value);
399      return (BuilderType) this;
400    }
401
402    public final BuilderType setUnknownFields(
403        final UnknownFieldSet unknownFields) {
404      this.unknownFields = unknownFields;
405      onChanged();
406      return (BuilderType) this;
407    }
408
409    @Override
410    public final BuilderType mergeUnknownFields(
411        final UnknownFieldSet unknownFields) {
412      this.unknownFields =
413        UnknownFieldSet.newBuilder(this.unknownFields)
414                       .mergeFrom(unknownFields)
415                       .build();
416      onChanged();
417      return (BuilderType) this;
418    }
419
420    //@Override (Java 1.6 override semantics, but we must support 1.5)
421    public boolean isInitialized() {
422      for (final FieldDescriptor field : getDescriptorForType().getFields()) {
423        // Check that all required fields are present.
424        if (field.isRequired()) {
425          if (!hasField(field)) {
426            return false;
427          }
428        }
429        // Check that embedded messages are initialized.
430        if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {
431          if (field.isRepeated()) {
432            @SuppressWarnings("unchecked") final
433            List<Message> messageList = (List<Message>) getField(field);
434            for (final Message element : messageList) {
435              if (!element.isInitialized()) {
436                return false;
437              }
438            }
439          } else {
440            if (hasField(field) &&
441                !((Message) getField(field)).isInitialized()) {
442              return false;
443            }
444          }
445        }
446      }
447      return true;
448    }
449
450    //@Override (Java 1.6 override semantics, but we must support 1.5)
451    public final UnknownFieldSet getUnknownFields() {
452      return unknownFields;
453    }
454
455    /**
456     * Called by subclasses to parse an unknown field.
457     * @return {@code true} unless the tag is an end-group tag.
458     */
459    protected boolean parseUnknownField(
460        final CodedInputStream input,
461        final UnknownFieldSet.Builder unknownFields,
462        final ExtensionRegistryLite extensionRegistry,
463        final int tag) throws IOException {
464      return unknownFields.mergeFieldFrom(tag, input);
465    }
466
467    /**
468     * Implementation of {@link BuilderParent} for giving to our children. This
469     * small inner class makes it so we don't publicly expose the BuilderParent
470     * methods.
471     */
472    private class BuilderParentImpl implements BuilderParent {
473
474      //@Override (Java 1.6 override semantics, but we must support 1.5)
475      public void markDirty() {
476        onChanged();
477      }
478    }
479
480    /**
481     * Gets the {@link BuilderParent} for giving to our children.
482     * @return The builder parent for our children.
483     */
484    protected BuilderParent getParentForChildren() {
485      if (meAsParent == null) {
486        meAsParent = new BuilderParentImpl();
487      }
488      return meAsParent;
489    }
490
491    /**
492     * Called when a the builder or one of its nested children has changed
493     * and any parent should be notified of its invalidation.
494     */
495    protected final void onChanged() {
496      if (isClean && builderParent != null) {
497        builderParent.markDirty();
498
499        // Don't keep dispatching invalidations until build is called again.
500        isClean = false;
501      }
502    }
503  }
504
505  // =================================================================
506  // Extensions-related stuff
507
508  public interface ExtendableMessageOrBuilder<
509      MessageType extends ExtendableMessage> extends MessageOrBuilder {
510
511    /** Check if a singular extension is present. */
512    <Type> boolean hasExtension(
513        GeneratedExtension<MessageType, Type> extension);
514
515    /** Get the number of elements in a repeated extension. */
516    <Type> int getExtensionCount(
517        GeneratedExtension<MessageType, List<Type>> extension);
518
519    /** Get the value of an extension. */
520    <Type> Type getExtension(GeneratedExtension<MessageType, Type> extension);
521
522    /** Get one element of a repeated extension. */
523    <Type> Type getExtension(
524        GeneratedExtension<MessageType, List<Type>> extension,
525        int index);
526  }
527
528  /**
529   * Generated message classes for message types that contain extension ranges
530   * subclass this.
531   *
532   * <p>This class implements type-safe accessors for extensions.  They
533   * implement all the same operations that you can do with normal fields --
534   * e.g. "has", "get", and "getCount" -- but for extensions.  The extensions
535   * are identified using instances of the class {@link GeneratedExtension};
536   * the protocol compiler generates a static instance of this class for every
537   * extension in its input.  Through the magic of generics, all is made
538   * type-safe.
539   *
540   * <p>For example, imagine you have the {@code .proto} file:
541   *
542   * <pre>
543   * option java_class = "MyProto";
544   *
545   * message Foo {
546   *   extensions 1000 to max;
547   * }
548   *
549   * extend Foo {
550   *   optional int32 bar;
551   * }
552   * </pre>
553   *
554   * <p>Then you might write code like:
555   *
556   * <pre>
557   * MyProto.Foo foo = getFoo();
558   * int i = foo.getExtension(MyProto.bar);
559   * </pre>
560   *
561   * <p>See also {@link ExtendableBuilder}.
562   */
563  public abstract static class ExtendableMessage<
564        MessageType extends ExtendableMessage>
565      extends GeneratedMessage
566      implements ExtendableMessageOrBuilder<MessageType> {
567
568    private final FieldSet<FieldDescriptor> extensions;
569
570    protected ExtendableMessage() {
571      this.extensions = FieldSet.newFieldSet();
572    }
573
574    protected ExtendableMessage(
575        ExtendableBuilder<MessageType, ?> builder) {
576      super(builder);
577      this.extensions = builder.buildExtensions();
578    }
579
580    private void verifyExtensionContainingType(
581        final GeneratedExtension<MessageType, ?> extension) {
582      if (extension.getDescriptor().getContainingType() !=
583          getDescriptorForType()) {
584        // This can only happen if someone uses unchecked operations.
585        throw new IllegalArgumentException(
586          "Extension is for type \"" +
587          extension.getDescriptor().getContainingType().getFullName() +
588          "\" which does not match message type \"" +
589          getDescriptorForType().getFullName() + "\".");
590      }
591    }
592
593    /** Check if a singular extension is present. */
594    //@Override (Java 1.6 override semantics, but we must support 1.5)
595    public final <Type> boolean hasExtension(
596        final GeneratedExtension<MessageType, Type> extension) {
597      verifyExtensionContainingType(extension);
598      return extensions.hasField(extension.getDescriptor());
599    }
600
601    /** Get the number of elements in a repeated extension. */
602    //@Override (Java 1.6 override semantics, but we must support 1.5)
603    public final <Type> int getExtensionCount(
604        final GeneratedExtension<MessageType, List<Type>> extension) {
605      verifyExtensionContainingType(extension);
606      final FieldDescriptor descriptor = extension.getDescriptor();
607      return extensions.getRepeatedFieldCount(descriptor);
608    }
609
610    /** Get the value of an extension. */
611    //@Override (Java 1.6 override semantics, but we must support 1.5)
612    @SuppressWarnings("unchecked")
613    public final <Type> Type getExtension(
614        final GeneratedExtension<MessageType, Type> extension) {
615      verifyExtensionContainingType(extension);
616      FieldDescriptor descriptor = extension.getDescriptor();
617      final Object value = extensions.getField(descriptor);
618      if (value == null) {
619        if (descriptor.isRepeated()) {
620          return (Type) Collections.emptyList();
621        } else if (descriptor.getJavaType() ==
622                   FieldDescriptor.JavaType.MESSAGE) {
623          return (Type) extension.getMessageDefaultInstance();
624        } else {
625          return (Type) extension.fromReflectionType(
626              descriptor.getDefaultValue());
627        }
628      } else {
629        return (Type) extension.fromReflectionType(value);
630      }
631    }
632
633    /** Get one element of a repeated extension. */
634    //@Override (Java 1.6 override semantics, but we must support 1.5)
635    @SuppressWarnings("unchecked")
636    public final <Type> Type getExtension(
637        final GeneratedExtension<MessageType, List<Type>> extension,
638        final int index) {
639      verifyExtensionContainingType(extension);
640      FieldDescriptor descriptor = extension.getDescriptor();
641      return (Type) extension.singularFromReflectionType(
642          extensions.getRepeatedField(descriptor, index));
643    }
644
645    /** Called by subclasses to check if all extensions are initialized. */
646    protected boolean extensionsAreInitialized() {
647      return extensions.isInitialized();
648    }
649
650    @Override
651    public boolean isInitialized() {
652      return super.isInitialized() && extensionsAreInitialized();
653    }
654
655    @Override
656    protected boolean parseUnknownField(
657        CodedInputStream input,
658        UnknownFieldSet.Builder unknownFields,
659        ExtensionRegistryLite extensionRegistry,
660        int tag) throws IOException {
661      return AbstractMessage.Builder.mergeFieldFrom(
662        input, unknownFields, extensionRegistry, getDescriptorForType(),
663        null, extensions, tag);
664    }
665
666    /**
667     * Used by parsing constructors in generated classes.
668     */
669    @Override
670    protected void makeExtensionsImmutable() {
671      extensions.makeImmutable();
672    }
673
674    /**
675     * Used by subclasses to serialize extensions.  Extension ranges may be
676     * interleaved with field numbers, but we must write them in canonical
677     * (sorted by field number) order.  ExtensionWriter helps us write
678     * individual ranges of extensions at once.
679     */
680    protected class ExtensionWriter {
681      // Imagine how much simpler this code would be if Java iterators had
682      // a way to get the next element without advancing the iterator.
683
684      private final Iterator<Map.Entry<FieldDescriptor, Object>> iter =
685        extensions.iterator();
686      private Map.Entry<FieldDescriptor, Object> next;
687      private final boolean messageSetWireFormat;
688
689      private ExtensionWriter(final boolean messageSetWireFormat) {
690        if (iter.hasNext()) {
691          next = iter.next();
692        }
693        this.messageSetWireFormat = messageSetWireFormat;
694      }
695
696      public void writeUntil(final int end, final CodedOutputStream output)
697                             throws IOException {
698        while (next != null && next.getKey().getNumber() < end) {
699          FieldDescriptor descriptor = next.getKey();
700          if (messageSetWireFormat && descriptor.getLiteJavaType() ==
701                  WireFormat.JavaType.MESSAGE &&
702              !descriptor.isRepeated()) {
703            if (next instanceof LazyField.LazyEntry<?>) {
704              output.writeRawMessageSetExtension(descriptor.getNumber(),
705                  ((LazyField.LazyEntry<?>) next).getField().toByteString());
706            } else {
707              output.writeMessageSetExtension(descriptor.getNumber(),
708                                              (Message) next.getValue());
709            }
710          } else {
711            // TODO(xiangl): Taken care of following code, it may cause
712            // problem when we use LazyField for normal fields/extensions.
713            // Due to the optional field can be duplicated at the end of
714            // serialized bytes, which will make the serialized size change
715            // after lazy field parsed. So when we use LazyField globally,
716            // we need to change the following write method to write cached
717            // bytes directly rather than write the parsed message.
718            FieldSet.writeField(descriptor, next.getValue(), output);
719          }
720          if (iter.hasNext()) {
721            next = iter.next();
722          } else {
723            next = null;
724          }
725        }
726      }
727    }
728
729    protected ExtensionWriter newExtensionWriter() {
730      return new ExtensionWriter(false);
731    }
732    protected ExtensionWriter newMessageSetExtensionWriter() {
733      return new ExtensionWriter(true);
734    }
735
736    /** Called by subclasses to compute the size of extensions. */
737    protected int extensionsSerializedSize() {
738      return extensions.getSerializedSize();
739    }
740    protected int extensionsSerializedSizeAsMessageSet() {
741      return extensions.getMessageSetSerializedSize();
742    }
743
744    // ---------------------------------------------------------------
745    // Reflection
746
747    protected Map<FieldDescriptor, Object> getExtensionFields() {
748      return extensions.getAllFields();
749    }
750
751    @Override
752    public Map<FieldDescriptor, Object> getAllFields() {
753      final Map<FieldDescriptor, Object> result = super.getAllFieldsMutable();
754      result.putAll(getExtensionFields());
755      return Collections.unmodifiableMap(result);
756    }
757
758    @Override
759    public boolean hasField(final FieldDescriptor field) {
760      if (field.isExtension()) {
761        verifyContainingType(field);
762        return extensions.hasField(field);
763      } else {
764        return super.hasField(field);
765      }
766    }
767
768    @Override
769    public Object getField(final FieldDescriptor field) {
770      if (field.isExtension()) {
771        verifyContainingType(field);
772        final Object value = extensions.getField(field);
773        if (value == null) {
774          if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {
775            // Lacking an ExtensionRegistry, we have no way to determine the
776            // extension's real type, so we return a DynamicMessage.
777            return DynamicMessage.getDefaultInstance(field.getMessageType());
778          } else {
779            return field.getDefaultValue();
780          }
781        } else {
782          return value;
783        }
784      } else {
785        return super.getField(field);
786      }
787    }
788
789    @Override
790    public int getRepeatedFieldCount(final FieldDescriptor field) {
791      if (field.isExtension()) {
792        verifyContainingType(field);
793        return extensions.getRepeatedFieldCount(field);
794      } else {
795        return super.getRepeatedFieldCount(field);
796      }
797    }
798
799    @Override
800    public Object getRepeatedField(final FieldDescriptor field,
801                                   final int index) {
802      if (field.isExtension()) {
803        verifyContainingType(field);
804        return extensions.getRepeatedField(field, index);
805      } else {
806        return super.getRepeatedField(field, index);
807      }
808    }
809
810    private void verifyContainingType(final FieldDescriptor field) {
811      if (field.getContainingType() != getDescriptorForType()) {
812        throw new IllegalArgumentException(
813          "FieldDescriptor does not match message type.");
814      }
815    }
816  }
817
818  /**
819   * Generated message builders for message types that contain extension ranges
820   * subclass this.
821   *
822   * <p>This class implements type-safe accessors for extensions.  They
823   * implement all the same operations that you can do with normal fields --
824   * e.g. "get", "set", and "add" -- but for extensions.  The extensions are
825   * identified using instances of the class {@link GeneratedExtension}; the
826   * protocol compiler generates a static instance of this class for every
827   * extension in its input.  Through the magic of generics, all is made
828   * type-safe.
829   *
830   * <p>For example, imagine you have the {@code .proto} file:
831   *
832   * <pre>
833   * option java_class = "MyProto";
834   *
835   * message Foo {
836   *   extensions 1000 to max;
837   * }
838   *
839   * extend Foo {
840   *   optional int32 bar;
841   * }
842   * </pre>
843   *
844   * <p>Then you might write code like:
845   *
846   * <pre>
847   * MyProto.Foo foo =
848   *   MyProto.Foo.newBuilder()
849   *     .setExtension(MyProto.bar, 123)
850   *     .build();
851   * </pre>
852   *
853   * <p>See also {@link ExtendableMessage}.
854   */
855  @SuppressWarnings("unchecked")
856  public abstract static class ExtendableBuilder<
857        MessageType extends ExtendableMessage,
858        BuilderType extends ExtendableBuilder>
859      extends Builder<BuilderType>
860      implements ExtendableMessageOrBuilder<MessageType> {
861
862    private FieldSet<FieldDescriptor> extensions = FieldSet.emptySet();
863
864    protected ExtendableBuilder() {}
865
866    protected ExtendableBuilder(
867        BuilderParent parent) {
868      super(parent);
869    }
870
871    @Override
872    public BuilderType clear() {
873      extensions = FieldSet.emptySet();
874      return super.clear();
875    }
876
877    // This is implemented here only to work around an apparent bug in the
878    // Java compiler and/or build system.  See bug #1898463.  The mere presence
879    // of this dummy clone() implementation makes it go away.
880    @Override
881    public BuilderType clone() {
882      throw new UnsupportedOperationException(
883          "This is supposed to be overridden by subclasses.");
884    }
885
886    private void ensureExtensionsIsMutable() {
887      if (extensions.isImmutable()) {
888        extensions = extensions.clone();
889      }
890    }
891
892    private void verifyExtensionContainingType(
893        final GeneratedExtension<MessageType, ?> extension) {
894      if (extension.getDescriptor().getContainingType() !=
895          getDescriptorForType()) {
896        // This can only happen if someone uses unchecked operations.
897        throw new IllegalArgumentException(
898          "Extension is for type \"" +
899          extension.getDescriptor().getContainingType().getFullName() +
900          "\" which does not match message type \"" +
901          getDescriptorForType().getFullName() + "\".");
902      }
903    }
904
905    /** Check if a singular extension is present. */
906    //@Override (Java 1.6 override semantics, but we must support 1.5)
907    public final <Type> boolean hasExtension(
908        final GeneratedExtension<MessageType, Type> extension) {
909      verifyExtensionContainingType(extension);
910      return extensions.hasField(extension.getDescriptor());
911    }
912
913    /** Get the number of elements in a repeated extension. */
914    //@Override (Java 1.6 override semantics, but we must support 1.5)
915    public final <Type> int getExtensionCount(
916        final GeneratedExtension<MessageType, List<Type>> extension) {
917      verifyExtensionContainingType(extension);
918      final FieldDescriptor descriptor = extension.getDescriptor();
919      return extensions.getRepeatedFieldCount(descriptor);
920    }
921
922    /** Get the value of an extension. */
923    //@Override (Java 1.6 override semantics, but we must support 1.5)
924    public final <Type> Type getExtension(
925        final GeneratedExtension<MessageType, Type> extension) {
926      verifyExtensionContainingType(extension);
927      FieldDescriptor descriptor = extension.getDescriptor();
928      final Object value = extensions.getField(descriptor);
929      if (value == null) {
930        if (descriptor.isRepeated()) {
931          return (Type) Collections.emptyList();
932        } else if (descriptor.getJavaType() ==
933                   FieldDescriptor.JavaType.MESSAGE) {
934          return (Type) extension.getMessageDefaultInstance();
935        } else {
936          return (Type) extension.fromReflectionType(
937              descriptor.getDefaultValue());
938        }
939      } else {
940        return (Type) extension.fromReflectionType(value);
941      }
942    }
943
944    /** Get one element of a repeated extension. */
945    //@Override (Java 1.6 override semantics, but we must support 1.5)
946    public final <Type> Type getExtension(
947        final GeneratedExtension<MessageType, List<Type>> extension,
948        final int index) {
949      verifyExtensionContainingType(extension);
950      FieldDescriptor descriptor = extension.getDescriptor();
951      return (Type) extension.singularFromReflectionType(
952          extensions.getRepeatedField(descriptor, index));
953    }
954
955    /** Set the value of an extension. */
956    public final <Type> BuilderType setExtension(
957        final GeneratedExtension<MessageType, Type> extension,
958        final Type value) {
959      verifyExtensionContainingType(extension);
960      ensureExtensionsIsMutable();
961      final FieldDescriptor descriptor = extension.getDescriptor();
962      extensions.setField(descriptor, extension.toReflectionType(value));
963      onChanged();
964      return (BuilderType) this;
965    }
966
967    /** Set the value of one element of a repeated extension. */
968    public final <Type> BuilderType setExtension(
969        final GeneratedExtension<MessageType, List<Type>> extension,
970        final int index, final Type value) {
971      verifyExtensionContainingType(extension);
972      ensureExtensionsIsMutable();
973      final FieldDescriptor descriptor = extension.getDescriptor();
974      extensions.setRepeatedField(
975        descriptor, index,
976        extension.singularToReflectionType(value));
977      onChanged();
978      return (BuilderType) this;
979    }
980
981    /** Append a value to a repeated extension. */
982    public final <Type> BuilderType addExtension(
983        final GeneratedExtension<MessageType, List<Type>> extension,
984        final Type value) {
985      verifyExtensionContainingType(extension);
986      ensureExtensionsIsMutable();
987      final FieldDescriptor descriptor = extension.getDescriptor();
988      extensions.addRepeatedField(
989          descriptor, extension.singularToReflectionType(value));
990      onChanged();
991      return (BuilderType) this;
992    }
993
994    /** Clear an extension. */
995    public final <Type> BuilderType clearExtension(
996        final GeneratedExtension<MessageType, ?> extension) {
997      verifyExtensionContainingType(extension);
998      ensureExtensionsIsMutable();
999      extensions.clearField(extension.getDescriptor());
1000      onChanged();
1001      return (BuilderType) this;
1002    }
1003
1004    /** Called by subclasses to check if all extensions are initialized. */
1005    protected boolean extensionsAreInitialized() {
1006      return extensions.isInitialized();
1007    }
1008
1009    /**
1010     * Called by the build code path to create a copy of the extensions for
1011     * building the message.
1012     */
1013    private FieldSet<FieldDescriptor> buildExtensions() {
1014      extensions.makeImmutable();
1015      return extensions;
1016    }
1017
1018    @Override
1019    public boolean isInitialized() {
1020      return super.isInitialized() && extensionsAreInitialized();
1021    }
1022
1023    /**
1024     * Called by subclasses to parse an unknown field or an extension.
1025     * @return {@code true} unless the tag is an end-group tag.
1026     */
1027    @Override
1028    protected boolean parseUnknownField(
1029        final CodedInputStream input,
1030        final UnknownFieldSet.Builder unknownFields,
1031        final ExtensionRegistryLite extensionRegistry,
1032        final int tag) throws IOException {
1033      return AbstractMessage.Builder.mergeFieldFrom(
1034        input, unknownFields, extensionRegistry, getDescriptorForType(),
1035        this, null, tag);
1036    }
1037
1038    // ---------------------------------------------------------------
1039    // Reflection
1040
1041    @Override
1042    public Map<FieldDescriptor, Object> getAllFields() {
1043      final Map<FieldDescriptor, Object> result = super.getAllFieldsMutable();
1044      result.putAll(extensions.getAllFields());
1045      return Collections.unmodifiableMap(result);
1046    }
1047
1048    @Override
1049    public Object getField(final FieldDescriptor field) {
1050      if (field.isExtension()) {
1051        verifyContainingType(field);
1052        final Object value = extensions.getField(field);
1053        if (value == null) {
1054          if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {
1055            // Lacking an ExtensionRegistry, we have no way to determine the
1056            // extension's real type, so we return a DynamicMessage.
1057            return DynamicMessage.getDefaultInstance(field.getMessageType());
1058          } else {
1059            return field.getDefaultValue();
1060          }
1061        } else {
1062          return value;
1063        }
1064      } else {
1065        return super.getField(field);
1066      }
1067    }
1068
1069    @Override
1070    public int getRepeatedFieldCount(final FieldDescriptor field) {
1071      if (field.isExtension()) {
1072        verifyContainingType(field);
1073        return extensions.getRepeatedFieldCount(field);
1074      } else {
1075        return super.getRepeatedFieldCount(field);
1076      }
1077    }
1078
1079    @Override
1080    public Object getRepeatedField(final FieldDescriptor field,
1081                                   final int index) {
1082      if (field.isExtension()) {
1083        verifyContainingType(field);
1084        return extensions.getRepeatedField(field, index);
1085      } else {
1086        return super.getRepeatedField(field, index);
1087      }
1088    }
1089
1090    @Override
1091    public boolean hasField(final FieldDescriptor field) {
1092      if (field.isExtension()) {
1093        verifyContainingType(field);
1094        return extensions.hasField(field);
1095      } else {
1096        return super.hasField(field);
1097      }
1098    }
1099
1100    @Override
1101    public BuilderType setField(final FieldDescriptor field,
1102                                final Object value) {
1103      if (field.isExtension()) {
1104        verifyContainingType(field);
1105        ensureExtensionsIsMutable();
1106        extensions.setField(field, value);
1107        onChanged();
1108        return (BuilderType) this;
1109      } else {
1110        return super.setField(field, value);
1111      }
1112    }
1113
1114    @Override
1115    public BuilderType clearField(final FieldDescriptor field) {
1116      if (field.isExtension()) {
1117        verifyContainingType(field);
1118        ensureExtensionsIsMutable();
1119        extensions.clearField(field);
1120        onChanged();
1121        return (BuilderType) this;
1122      } else {
1123        return super.clearField(field);
1124      }
1125    }
1126
1127    @Override
1128    public BuilderType setRepeatedField(final FieldDescriptor field,
1129                                        final int index, final Object value) {
1130      if (field.isExtension()) {
1131        verifyContainingType(field);
1132        ensureExtensionsIsMutable();
1133        extensions.setRepeatedField(field, index, value);
1134        onChanged();
1135        return (BuilderType) this;
1136      } else {
1137        return super.setRepeatedField(field, index, value);
1138      }
1139    }
1140
1141    @Override
1142    public BuilderType addRepeatedField(final FieldDescriptor field,
1143                                        final Object value) {
1144      if (field.isExtension()) {
1145        verifyContainingType(field);
1146        ensureExtensionsIsMutable();
1147        extensions.addRepeatedField(field, value);
1148        onChanged();
1149        return (BuilderType) this;
1150      } else {
1151        return super.addRepeatedField(field, value);
1152      }
1153    }
1154
1155    protected final void mergeExtensionFields(final ExtendableMessage other) {
1156      ensureExtensionsIsMutable();
1157      extensions.mergeFrom(other.extensions);
1158      onChanged();
1159    }
1160
1161    private void verifyContainingType(final FieldDescriptor field) {
1162      if (field.getContainingType() != getDescriptorForType()) {
1163        throw new IllegalArgumentException(
1164          "FieldDescriptor does not match message type.");
1165      }
1166    }
1167  }
1168
1169  // -----------------------------------------------------------------
1170
1171  /**
1172   * Gets the descriptor for an extension. The implementation depends on whether
1173   * the extension is scoped in the top level of a file or scoped in a Message.
1174   */
1175  private static interface ExtensionDescriptorRetriever {
1176    FieldDescriptor getDescriptor();
1177  }
1178
1179  /** For use by generated code only. */
1180  public static <ContainingType extends Message, Type>
1181      GeneratedExtension<ContainingType, Type>
1182      newMessageScopedGeneratedExtension(final Message scope,
1183                                         final int descriptorIndex,
1184                                         final Class singularType,
1185                                         final Message defaultInstance) {
1186    // For extensions scoped within a Message, we use the Message to resolve
1187    // the outer class's descriptor, from which the extension descriptor is
1188    // obtained.
1189    return new GeneratedExtension<ContainingType, Type>(
1190        new ExtensionDescriptorRetriever() {
1191          //@Override (Java 1.6 override semantics, but we must support 1.5)
1192          public FieldDescriptor getDescriptor() {
1193            return scope.getDescriptorForType().getExtensions()
1194                .get(descriptorIndex);
1195          }
1196        },
1197        singularType,
1198        defaultInstance);
1199  }
1200
1201  /** For use by generated code only. */
1202  public static <ContainingType extends Message, Type>
1203     GeneratedExtension<ContainingType, Type>
1204     newFileScopedGeneratedExtension(final Class singularType,
1205                                     final Message defaultInstance) {
1206    // For extensions scoped within a file, we rely on the outer class's
1207    // static initializer to call internalInit() on the extension when the
1208    // descriptor is available.
1209    return new GeneratedExtension<ContainingType, Type>(
1210        null,  // ExtensionDescriptorRetriever is initialized in internalInit();
1211        singularType,
1212        defaultInstance);
1213  }
1214
1215  /**
1216   * Type used to represent generated extensions.  The protocol compiler
1217   * generates a static singleton instance of this class for each extension.
1218   *
1219   * <p>For example, imagine you have the {@code .proto} file:
1220   *
1221   * <pre>
1222   * option java_class = "MyProto";
1223   *
1224   * message Foo {
1225   *   extensions 1000 to max;
1226   * }
1227   *
1228   * extend Foo {
1229   *   optional int32 bar;
1230   * }
1231   * </pre>
1232   *
1233   * <p>Then, {@code MyProto.Foo.bar} has type
1234   * {@code GeneratedExtension<MyProto.Foo, Integer>}.
1235   *
1236   * <p>In general, users should ignore the details of this type, and simply use
1237   * these static singletons as parameters to the extension accessors defined
1238   * in {@link ExtendableMessage} and {@link ExtendableBuilder}.
1239   */
1240  public static final class GeneratedExtension<
1241      ContainingType extends Message, Type> {
1242    // TODO(kenton):  Find ways to avoid using Java reflection within this
1243    //   class.  Also try to avoid suppressing unchecked warnings.
1244
1245    // We can't always initialize the descriptor of a GeneratedExtension when
1246    // we first construct it due to initialization order difficulties (namely,
1247    // the descriptor may not have been constructed yet, since it is often
1248    // constructed by the initializer of a separate module).
1249    //
1250    // In the case of nested extensions, we initialize the
1251    // ExtensionDescriptorRetriever with an instance that uses the scoping
1252    // Message's default instance to retrieve the extension's descriptor.
1253    //
1254    // In the case of non-nested extensions, we initialize the
1255    // ExtensionDescriptorRetriever to null and rely on the outer class's static
1256    // initializer to call internalInit() after the descriptor has been parsed.
1257    private GeneratedExtension(ExtensionDescriptorRetriever descriptorRetriever,
1258                               Class singularType,
1259                               Message messageDefaultInstance) {
1260      if (Message.class.isAssignableFrom(singularType) &&
1261          !singularType.isInstance(messageDefaultInstance)) {
1262        throw new IllegalArgumentException(
1263            "Bad messageDefaultInstance for " + singularType.getName());
1264      }
1265      this.descriptorRetriever = descriptorRetriever;
1266      this.singularType = singularType;
1267      this.messageDefaultInstance = messageDefaultInstance;
1268
1269      if (ProtocolMessageEnum.class.isAssignableFrom(singularType)) {
1270        this.enumValueOf = getMethodOrDie(singularType, "valueOf",
1271                                          EnumValueDescriptor.class);
1272        this.enumGetValueDescriptor =
1273            getMethodOrDie(singularType, "getValueDescriptor");
1274      } else {
1275        this.enumValueOf = null;
1276        this.enumGetValueDescriptor = null;
1277      }
1278    }
1279
1280    /** For use by generated code only. */
1281    public void internalInit(final FieldDescriptor descriptor) {
1282      if (descriptorRetriever != null) {
1283        throw new IllegalStateException("Already initialized.");
1284      }
1285      descriptorRetriever = new ExtensionDescriptorRetriever() {
1286          //@Override (Java 1.6 override semantics, but we must support 1.5)
1287          public FieldDescriptor getDescriptor() {
1288            return descriptor;
1289          }
1290        };
1291    }
1292
1293    private ExtensionDescriptorRetriever descriptorRetriever;
1294    private final Class singularType;
1295    private final Message messageDefaultInstance;
1296    private final Method enumValueOf;
1297    private final Method enumGetValueDescriptor;
1298
1299    public FieldDescriptor getDescriptor() {
1300      if (descriptorRetriever == null) {
1301        throw new IllegalStateException(
1302            "getDescriptor() called before internalInit()");
1303      }
1304      return descriptorRetriever.getDescriptor();
1305    }
1306
1307    /**
1308     * If the extension is an embedded message or group, returns the default
1309     * instance of the message.
1310     */
1311    public Message getMessageDefaultInstance() {
1312      return messageDefaultInstance;
1313    }
1314
1315    /**
1316     * Convert from the type used by the reflection accessors to the type used
1317     * by native accessors.  E.g., for enums, the reflection accessors use
1318     * EnumValueDescriptors but the native accessors use the generated enum
1319     * type.
1320     */
1321    @SuppressWarnings("unchecked")
1322    private Object fromReflectionType(final Object value) {
1323      FieldDescriptor descriptor = getDescriptor();
1324      if (descriptor.isRepeated()) {
1325        if (descriptor.getJavaType() == FieldDescriptor.JavaType.MESSAGE ||
1326            descriptor.getJavaType() == FieldDescriptor.JavaType.ENUM) {
1327          // Must convert the whole list.
1328          final List result = new ArrayList();
1329          for (final Object element : (List) value) {
1330            result.add(singularFromReflectionType(element));
1331          }
1332          return result;
1333        } else {
1334          return value;
1335        }
1336      } else {
1337        return singularFromReflectionType(value);
1338      }
1339    }
1340
1341    /**
1342     * Like {@link #fromReflectionType(Object)}, but if the type is a repeated
1343     * type, this converts a single element.
1344     */
1345    private Object singularFromReflectionType(final Object value) {
1346      FieldDescriptor descriptor = getDescriptor();
1347      switch (descriptor.getJavaType()) {
1348        case MESSAGE:
1349          if (singularType.isInstance(value)) {
1350            return value;
1351          } else {
1352            // It seems the copy of the embedded message stored inside the
1353            // extended message is not of the exact type the user was
1354            // expecting.  This can happen if a user defines a
1355            // GeneratedExtension manually and gives it a different type.
1356            // This should not happen in normal use.  But, to be nice, we'll
1357            // copy the message to whatever type the caller was expecting.
1358            return messageDefaultInstance.newBuilderForType()
1359                           .mergeFrom((Message) value).build();
1360          }
1361        case ENUM:
1362          return invokeOrDie(enumValueOf, null, (EnumValueDescriptor) value);
1363        default:
1364          return value;
1365      }
1366    }
1367
1368    /**
1369     * Convert from the type used by the native accessors to the type used
1370     * by reflection accessors.  E.g., for enums, the reflection accessors use
1371     * EnumValueDescriptors but the native accessors use the generated enum
1372     * type.
1373     */
1374    @SuppressWarnings("unchecked")
1375    private Object toReflectionType(final Object value) {
1376      FieldDescriptor descriptor = getDescriptor();
1377      if (descriptor.isRepeated()) {
1378        if (descriptor.getJavaType() == FieldDescriptor.JavaType.ENUM) {
1379          // Must convert the whole list.
1380          final List result = new ArrayList();
1381          for (final Object element : (List) value) {
1382            result.add(singularToReflectionType(element));
1383          }
1384          return result;
1385        } else {
1386          return value;
1387        }
1388      } else {
1389        return singularToReflectionType(value);
1390      }
1391    }
1392
1393    /**
1394     * Like {@link #toReflectionType(Object)}, but if the type is a repeated
1395     * type, this converts a single element.
1396     */
1397    private Object singularToReflectionType(final Object value) {
1398      FieldDescriptor descriptor = getDescriptor();
1399      switch (descriptor.getJavaType()) {
1400        case ENUM:
1401          return invokeOrDie(enumGetValueDescriptor, value);
1402        default:
1403          return value;
1404      }
1405    }
1406  }
1407
1408  // =================================================================
1409
1410  /** Calls Class.getMethod and throws a RuntimeException if it fails. */
1411  @SuppressWarnings("unchecked")
1412  private static Method getMethodOrDie(
1413      final Class clazz, final String name, final Class... params) {
1414    try {
1415      return clazz.getMethod(name, params);
1416    } catch (NoSuchMethodException e) {
1417      throw new RuntimeException(
1418        "Generated message class \"" + clazz.getName() +
1419        "\" missing method \"" + name + "\".", e);
1420    }
1421  }
1422
1423  /** Calls invoke and throws a RuntimeException if it fails. */
1424  private static Object invokeOrDie(
1425      final Method method, final Object object, final Object... params) {
1426    try {
1427      return method.invoke(object, params);
1428    } catch (IllegalAccessException e) {
1429      throw new RuntimeException(
1430        "Couldn't use Java reflection to implement protocol message " +
1431        "reflection.", e);
1432    } catch (InvocationTargetException e) {
1433      final Throwable cause = e.getCause();
1434      if (cause instanceof RuntimeException) {
1435        throw (RuntimeException) cause;
1436      } else if (cause instanceof Error) {
1437        throw (Error) cause;
1438      } else {
1439        throw new RuntimeException(
1440          "Unexpected exception thrown by generated accessor method.", cause);
1441      }
1442    }
1443  }
1444
1445  /**
1446   * Users should ignore this class.  This class provides the implementation
1447   * with access to the fields of a message object using Java reflection.
1448   */
1449  public static final class FieldAccessorTable {
1450
1451    /**
1452     * Construct a FieldAccessorTable for a particular message class.  Only
1453     * one FieldAccessorTable should ever be constructed per class.
1454     *
1455     * @param descriptor     The type's descriptor.
1456     * @param camelCaseNames The camelcase names of all fields in the message.
1457     *                       These are used to derive the accessor method names.
1458     * @param messageClass   The message type.
1459     * @param builderClass   The builder type.
1460     */
1461    public FieldAccessorTable(
1462        final Descriptor descriptor,
1463        final String[] camelCaseNames,
1464        final Class<? extends GeneratedMessage> messageClass,
1465        final Class<? extends Builder> builderClass) {
1466      this(descriptor, camelCaseNames);
1467      ensureFieldAccessorsInitialized(messageClass, builderClass);
1468    }
1469
1470    /**
1471     * Construct a FieldAccessorTable for a particular message class without
1472     * initializing FieldAccessors.
1473     */
1474    public FieldAccessorTable(
1475        final Descriptor descriptor,
1476        final String[] camelCaseNames) {
1477      this.descriptor = descriptor;
1478      this.camelCaseNames = camelCaseNames;
1479      fields = new FieldAccessor[descriptor.getFields().size()];
1480      initialized = false;
1481    }
1482
1483    /**
1484     * Ensures the field accessors are initialized. This method is thread-safe.
1485     *
1486     * @param messageClass   The message type.
1487     * @param builderClass   The builder type.
1488     * @return this
1489     */
1490    public FieldAccessorTable ensureFieldAccessorsInitialized(
1491        Class<? extends GeneratedMessage> messageClass,
1492        Class<? extends Builder> builderClass) {
1493      if (initialized) { return this; }
1494      synchronized (this) {
1495        if (initialized) { return this; }
1496        for (int i = 0; i < fields.length; i++) {
1497          FieldDescriptor field = descriptor.getFields().get(i);
1498          if (field.isRepeated()) {
1499            if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {
1500              fields[i] = new RepeatedMessageFieldAccessor(
1501                  field, camelCaseNames[i], messageClass, builderClass);
1502            } else if (field.getJavaType() == FieldDescriptor.JavaType.ENUM) {
1503              fields[i] = new RepeatedEnumFieldAccessor(
1504                  field, camelCaseNames[i], messageClass, builderClass);
1505            } else {
1506              fields[i] = new RepeatedFieldAccessor(
1507                  field, camelCaseNames[i], messageClass, builderClass);
1508            }
1509          } else {
1510            if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {
1511              fields[i] = new SingularMessageFieldAccessor(
1512                  field, camelCaseNames[i], messageClass, builderClass);
1513            } else if (field.getJavaType() == FieldDescriptor.JavaType.ENUM) {
1514              fields[i] = new SingularEnumFieldAccessor(
1515                  field, camelCaseNames[i], messageClass, builderClass);
1516            } else {
1517              fields[i] = new SingularFieldAccessor(
1518                  field, camelCaseNames[i], messageClass, builderClass);
1519            }
1520          }
1521        }
1522        initialized = true;
1523        camelCaseNames = null;
1524        return this;
1525      }
1526    }
1527
1528    private final Descriptor descriptor;
1529    private final FieldAccessor[] fields;
1530    private String[] camelCaseNames;
1531    private volatile boolean initialized;
1532
1533    /** Get the FieldAccessor for a particular field. */
1534    private FieldAccessor getField(final FieldDescriptor field) {
1535      if (field.getContainingType() != descriptor) {
1536        throw new IllegalArgumentException(
1537          "FieldDescriptor does not match message type.");
1538      } else if (field.isExtension()) {
1539        // If this type had extensions, it would subclass ExtendableMessage,
1540        // which overrides the reflection interface to handle extensions.
1541        throw new IllegalArgumentException(
1542          "This type does not have extensions.");
1543      }
1544      return fields[field.getIndex()];
1545    }
1546
1547    /**
1548     * Abstract interface that provides access to a single field.  This is
1549     * implemented differently depending on the field type and cardinality.
1550     */
1551    private interface FieldAccessor {
1552      Object get(GeneratedMessage message);
1553      Object get(GeneratedMessage.Builder builder);
1554      void set(Builder builder, Object value);
1555      Object getRepeated(GeneratedMessage message, int index);
1556      Object getRepeated(GeneratedMessage.Builder builder, int index);
1557      void setRepeated(Builder builder,
1558                       int index, Object value);
1559      void addRepeated(Builder builder, Object value);
1560      boolean has(GeneratedMessage message);
1561      boolean has(GeneratedMessage.Builder builder);
1562      int getRepeatedCount(GeneratedMessage message);
1563      int getRepeatedCount(GeneratedMessage.Builder builder);
1564      void clear(Builder builder);
1565      Message.Builder newBuilder();
1566      Message.Builder getBuilder(GeneratedMessage.Builder builder);
1567    }
1568
1569    // ---------------------------------------------------------------
1570
1571    private static class SingularFieldAccessor implements FieldAccessor {
1572      SingularFieldAccessor(
1573          final FieldDescriptor descriptor, final String camelCaseName,
1574          final Class<? extends GeneratedMessage> messageClass,
1575          final Class<? extends Builder> builderClass) {
1576        getMethod = getMethodOrDie(messageClass, "get" + camelCaseName);
1577        getMethodBuilder = getMethodOrDie(builderClass, "get" + camelCaseName);
1578        type = getMethod.getReturnType();
1579        setMethod = getMethodOrDie(builderClass, "set" + camelCaseName, type);
1580        hasMethod =
1581            getMethodOrDie(messageClass, "has" + camelCaseName);
1582        hasMethodBuilder =
1583            getMethodOrDie(builderClass, "has" + camelCaseName);
1584        clearMethod = getMethodOrDie(builderClass, "clear" + camelCaseName);
1585      }
1586
1587      // Note:  We use Java reflection to call public methods rather than
1588      //   access private fields directly as this avoids runtime security
1589      //   checks.
1590      protected final Class<?> type;
1591      protected final Method getMethod;
1592      protected final Method getMethodBuilder;
1593      protected final Method setMethod;
1594      protected final Method hasMethod;
1595      protected final Method hasMethodBuilder;
1596      protected final Method clearMethod;
1597
1598      public Object get(final GeneratedMessage message) {
1599        return invokeOrDie(getMethod, message);
1600      }
1601      public Object get(GeneratedMessage.Builder builder) {
1602        return invokeOrDie(getMethodBuilder, builder);
1603      }
1604      public void set(final Builder builder, final Object value) {
1605        invokeOrDie(setMethod, builder, value);
1606      }
1607      public Object getRepeated(final GeneratedMessage message,
1608                                final int index) {
1609        throw new UnsupportedOperationException(
1610          "getRepeatedField() called on a singular field.");
1611      }
1612      public Object getRepeated(GeneratedMessage.Builder builder, int index) {
1613        throw new UnsupportedOperationException(
1614          "getRepeatedField() called on a singular field.");
1615      }
1616      public void setRepeated(final Builder builder,
1617                              final int index, final Object value) {
1618        throw new UnsupportedOperationException(
1619          "setRepeatedField() called on a singular field.");
1620      }
1621      public void addRepeated(final Builder builder, final Object value) {
1622        throw new UnsupportedOperationException(
1623          "addRepeatedField() called on a singular field.");
1624      }
1625      public boolean has(final GeneratedMessage message) {
1626        return (Boolean) invokeOrDie(hasMethod, message);
1627      }
1628      public boolean has(GeneratedMessage.Builder builder) {
1629        return (Boolean) invokeOrDie(hasMethodBuilder, builder);
1630      }
1631      public int getRepeatedCount(final GeneratedMessage message) {
1632        throw new UnsupportedOperationException(
1633          "getRepeatedFieldSize() called on a singular field.");
1634      }
1635      public int getRepeatedCount(GeneratedMessage.Builder builder) {
1636        throw new UnsupportedOperationException(
1637          "getRepeatedFieldSize() called on a singular field.");
1638      }
1639      public void clear(final Builder builder) {
1640        invokeOrDie(clearMethod, builder);
1641      }
1642      public Message.Builder newBuilder() {
1643        throw new UnsupportedOperationException(
1644          "newBuilderForField() called on a non-Message type.");
1645      }
1646      public Message.Builder getBuilder(GeneratedMessage.Builder builder) {
1647        throw new UnsupportedOperationException(
1648          "getFieldBuilder() called on a non-Message type.");
1649      }
1650    }
1651
1652    private static class RepeatedFieldAccessor implements FieldAccessor {
1653      protected final Class type;
1654      protected final Method getMethod;
1655      protected final Method getMethodBuilder;
1656      protected final Method getRepeatedMethod;
1657      protected final Method getRepeatedMethodBuilder;
1658      protected final Method setRepeatedMethod;
1659      protected final Method addRepeatedMethod;
1660      protected final Method getCountMethod;
1661      protected final Method getCountMethodBuilder;
1662      protected final Method clearMethod;
1663
1664      RepeatedFieldAccessor(
1665          final FieldDescriptor descriptor, final String camelCaseName,
1666          final Class<? extends GeneratedMessage> messageClass,
1667          final Class<? extends Builder> builderClass) {
1668        getMethod = getMethodOrDie(messageClass,
1669                                   "get" + camelCaseName + "List");
1670        getMethodBuilder = getMethodOrDie(builderClass,
1671                                   "get" + camelCaseName + "List");
1672        getRepeatedMethod =
1673            getMethodOrDie(messageClass, "get" + camelCaseName, Integer.TYPE);
1674        getRepeatedMethodBuilder =
1675            getMethodOrDie(builderClass, "get" + camelCaseName, Integer.TYPE);
1676        type = getRepeatedMethod.getReturnType();
1677        setRepeatedMethod =
1678            getMethodOrDie(builderClass, "set" + camelCaseName,
1679                           Integer.TYPE, type);
1680        addRepeatedMethod =
1681            getMethodOrDie(builderClass, "add" + camelCaseName, type);
1682        getCountMethod =
1683            getMethodOrDie(messageClass, "get" + camelCaseName + "Count");
1684        getCountMethodBuilder =
1685            getMethodOrDie(builderClass, "get" + camelCaseName + "Count");
1686
1687        clearMethod = getMethodOrDie(builderClass, "clear" + camelCaseName);
1688      }
1689
1690      public Object get(final GeneratedMessage message) {
1691        return invokeOrDie(getMethod, message);
1692      }
1693      public Object get(GeneratedMessage.Builder builder) {
1694        return invokeOrDie(getMethodBuilder, builder);
1695      }
1696      public void set(final Builder builder, final Object value) {
1697        // Add all the elements individually.  This serves two purposes:
1698        // 1) Verifies that each element has the correct type.
1699        // 2) Insures that the caller cannot modify the list later on and
1700        //    have the modifications be reflected in the message.
1701        clear(builder);
1702        for (final Object element : (List<?>) value) {
1703          addRepeated(builder, element);
1704        }
1705      }
1706      public Object getRepeated(final GeneratedMessage message,
1707                                final int index) {
1708        return invokeOrDie(getRepeatedMethod, message, index);
1709      }
1710      public Object getRepeated(GeneratedMessage.Builder builder, int index) {
1711        return invokeOrDie(getRepeatedMethodBuilder, builder, index);
1712      }
1713      public void setRepeated(final Builder builder,
1714                              final int index, final Object value) {
1715        invokeOrDie(setRepeatedMethod, builder, index, value);
1716      }
1717      public void addRepeated(final Builder builder, final Object value) {
1718        invokeOrDie(addRepeatedMethod, builder, value);
1719      }
1720      public boolean has(final GeneratedMessage message) {
1721        throw new UnsupportedOperationException(
1722          "hasField() called on a repeated field.");
1723      }
1724      public boolean has(GeneratedMessage.Builder builder) {
1725        throw new UnsupportedOperationException(
1726          "hasField() called on a repeated field.");
1727      }
1728      public int getRepeatedCount(final GeneratedMessage message) {
1729        return (Integer) invokeOrDie(getCountMethod, message);
1730      }
1731      public int getRepeatedCount(GeneratedMessage.Builder builder) {
1732        return (Integer) invokeOrDie(getCountMethodBuilder, builder);
1733      }
1734      public void clear(final Builder builder) {
1735        invokeOrDie(clearMethod, builder);
1736      }
1737      public Message.Builder newBuilder() {
1738        throw new UnsupportedOperationException(
1739          "newBuilderForField() called on a non-Message type.");
1740      }
1741      public Message.Builder getBuilder(GeneratedMessage.Builder builder) {
1742        throw new UnsupportedOperationException(
1743          "getFieldBuilder() called on a non-Message type.");
1744      }
1745    }
1746
1747    // ---------------------------------------------------------------
1748
1749    private static final class SingularEnumFieldAccessor
1750        extends SingularFieldAccessor {
1751      SingularEnumFieldAccessor(
1752          final FieldDescriptor descriptor, final String camelCaseName,
1753          final Class<? extends GeneratedMessage> messageClass,
1754          final Class<? extends Builder> builderClass) {
1755        super(descriptor, camelCaseName, messageClass, builderClass);
1756
1757        valueOfMethod = getMethodOrDie(type, "valueOf",
1758                                       EnumValueDescriptor.class);
1759        getValueDescriptorMethod =
1760          getMethodOrDie(type, "getValueDescriptor");
1761      }
1762
1763      private Method valueOfMethod;
1764      private Method getValueDescriptorMethod;
1765
1766      @Override
1767      public Object get(final GeneratedMessage message) {
1768        return invokeOrDie(getValueDescriptorMethod, super.get(message));
1769      }
1770
1771      @Override
1772      public Object get(final GeneratedMessage.Builder builder) {
1773        return invokeOrDie(getValueDescriptorMethod, super.get(builder));
1774      }
1775
1776      @Override
1777      public void set(final Builder builder, final Object value) {
1778        super.set(builder, invokeOrDie(valueOfMethod, null, value));
1779      }
1780    }
1781
1782    private static final class RepeatedEnumFieldAccessor
1783        extends RepeatedFieldAccessor {
1784      RepeatedEnumFieldAccessor(
1785          final FieldDescriptor descriptor, final String camelCaseName,
1786          final Class<? extends GeneratedMessage> messageClass,
1787          final Class<? extends Builder> builderClass) {
1788        super(descriptor, camelCaseName, messageClass, builderClass);
1789
1790        valueOfMethod = getMethodOrDie(type, "valueOf",
1791                                       EnumValueDescriptor.class);
1792        getValueDescriptorMethod =
1793          getMethodOrDie(type, "getValueDescriptor");
1794      }
1795
1796      private final Method valueOfMethod;
1797      private final Method getValueDescriptorMethod;
1798
1799      @Override
1800      @SuppressWarnings("unchecked")
1801      public Object get(final GeneratedMessage message) {
1802        final List newList = new ArrayList();
1803        for (final Object element : (List) super.get(message)) {
1804          newList.add(invokeOrDie(getValueDescriptorMethod, element));
1805        }
1806        return Collections.unmodifiableList(newList);
1807      }
1808
1809      @Override
1810      @SuppressWarnings("unchecked")
1811      public Object get(final GeneratedMessage.Builder builder) {
1812        final List newList = new ArrayList();
1813        for (final Object element : (List) super.get(builder)) {
1814          newList.add(invokeOrDie(getValueDescriptorMethod, element));
1815        }
1816        return Collections.unmodifiableList(newList);
1817      }
1818
1819      @Override
1820      public Object getRepeated(final GeneratedMessage message,
1821                                final int index) {
1822        return invokeOrDie(getValueDescriptorMethod,
1823          super.getRepeated(message, index));
1824      }
1825      @Override
1826      public Object getRepeated(final GeneratedMessage.Builder builder,
1827                                final int index) {
1828        return invokeOrDie(getValueDescriptorMethod,
1829          super.getRepeated(builder, index));
1830      }
1831      @Override
1832      public void setRepeated(final Builder builder,
1833                              final int index, final Object value) {
1834        super.setRepeated(builder, index, invokeOrDie(valueOfMethod, null,
1835                          value));
1836      }
1837      @Override
1838      public void addRepeated(final Builder builder, final Object value) {
1839        super.addRepeated(builder, invokeOrDie(valueOfMethod, null, value));
1840      }
1841    }
1842
1843    // ---------------------------------------------------------------
1844
1845    private static final class SingularMessageFieldAccessor
1846        extends SingularFieldAccessor {
1847      SingularMessageFieldAccessor(
1848          final FieldDescriptor descriptor, final String camelCaseName,
1849          final Class<? extends GeneratedMessage> messageClass,
1850          final Class<? extends Builder> builderClass) {
1851        super(descriptor, camelCaseName, messageClass, builderClass);
1852
1853        newBuilderMethod = getMethodOrDie(type, "newBuilder");
1854        getBuilderMethodBuilder =
1855            getMethodOrDie(builderClass, "get" + camelCaseName + "Builder");
1856      }
1857
1858      private final Method newBuilderMethod;
1859      private final Method getBuilderMethodBuilder;
1860
1861      private Object coerceType(final Object value) {
1862        if (type.isInstance(value)) {
1863          return value;
1864        } else {
1865          // The value is not the exact right message type.  However, if it
1866          // is an alternative implementation of the same type -- e.g. a
1867          // DynamicMessage -- we should accept it.  In this case we can make
1868          // a copy of the message.
1869          return ((Message.Builder) invokeOrDie(newBuilderMethod, null))
1870                  .mergeFrom((Message) value).buildPartial();
1871        }
1872      }
1873
1874      @Override
1875      public void set(final Builder builder, final Object value) {
1876        super.set(builder, coerceType(value));
1877      }
1878      @Override
1879      public Message.Builder newBuilder() {
1880        return (Message.Builder) invokeOrDie(newBuilderMethod, null);
1881      }
1882      @Override
1883      public Message.Builder getBuilder(GeneratedMessage.Builder builder) {
1884        return (Message.Builder) invokeOrDie(getBuilderMethodBuilder, builder);
1885      }
1886    }
1887
1888    private static final class RepeatedMessageFieldAccessor
1889        extends RepeatedFieldAccessor {
1890      RepeatedMessageFieldAccessor(
1891          final FieldDescriptor descriptor, final String camelCaseName,
1892          final Class<? extends GeneratedMessage> messageClass,
1893          final Class<? extends Builder> builderClass) {
1894        super(descriptor, camelCaseName, messageClass, builderClass);
1895
1896        newBuilderMethod = getMethodOrDie(type, "newBuilder");
1897      }
1898
1899      private final Method newBuilderMethod;
1900
1901      private Object coerceType(final Object value) {
1902        if (type.isInstance(value)) {
1903          return value;
1904        } else {
1905          // The value is not the exact right message type.  However, if it
1906          // is an alternative implementation of the same type -- e.g. a
1907          // DynamicMessage -- we should accept it.  In this case we can make
1908          // a copy of the message.
1909          return ((Message.Builder) invokeOrDie(newBuilderMethod, null))
1910                  .mergeFrom((Message) value).build();
1911        }
1912      }
1913
1914      @Override
1915      public void setRepeated(final Builder builder,
1916                              final int index, final Object value) {
1917        super.setRepeated(builder, index, coerceType(value));
1918      }
1919      @Override
1920      public void addRepeated(final Builder builder, final Object value) {
1921        super.addRepeated(builder, coerceType(value));
1922      }
1923      @Override
1924      public Message.Builder newBuilder() {
1925        return (Message.Builder) invokeOrDie(newBuilderMethod, null);
1926      }
1927    }
1928  }
1929
1930  /**
1931   * Replaces this object in the output stream with a serialized form.
1932   * Part of Java's serialization magic.  Generated sub-classes must override
1933   * this method by calling {@code return super.writeReplace();}
1934   * @return a SerializedForm of this message
1935   */
1936  protected Object writeReplace() throws ObjectStreamException {
1937    return new GeneratedMessageLite.SerializedForm(this);
1938  }
1939}
1940