|  | @@ -1,646 +0,0 @@
 | 
	
		
			
				|  |  | -// Protocol Buffers - Google's data interchange format
 | 
	
		
			
				|  |  | -// Copyright 2008 Google Inc.  All rights reserved.
 | 
	
		
			
				|  |  | -// https://developers.google.com/protocol-buffers/
 | 
	
		
			
				|  |  | -//
 | 
	
		
			
				|  |  | -// Redistribution and use in source and binary forms, with or without
 | 
	
		
			
				|  |  | -// modification, are permitted provided that the following conditions are
 | 
	
		
			
				|  |  | -// met:
 | 
	
		
			
				|  |  | -//
 | 
	
		
			
				|  |  | -//     * Redistributions of source code must retain the above copyright
 | 
	
		
			
				|  |  | -// notice, this list of conditions and the following disclaimer.
 | 
	
		
			
				|  |  | -//     * Redistributions in binary form must reproduce the above
 | 
	
		
			
				|  |  | -// copyright notice, this list of conditions and the following disclaimer
 | 
	
		
			
				|  |  | -// in the documentation and/or other materials provided with the
 | 
	
		
			
				|  |  | -// distribution.
 | 
	
		
			
				|  |  | -//     * Neither the name of Google Inc. nor the names of its
 | 
	
		
			
				|  |  | -// contributors may be used to endorse or promote products derived from
 | 
	
		
			
				|  |  | -// this software without specific prior written permission.
 | 
	
		
			
				|  |  | -//
 | 
	
		
			
				|  |  | -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
	
		
			
				|  |  | -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
	
		
			
				|  |  | -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
	
		
			
				|  |  | -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | 
	
		
			
				|  |  | -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
	
		
			
				|  |  | -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
	
		
			
				|  |  | -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
	
		
			
				|  |  | -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
	
		
			
				|  |  | -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
	
		
			
				|  |  | -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
	
		
			
				|  |  | -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -package com.google.protobuf;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -import com.google.protobuf.Descriptors.EnumValueDescriptor;
 | 
	
		
			
				|  |  | -import com.google.protobuf.Descriptors.FieldDescriptor;
 | 
	
		
			
				|  |  | -import com.google.protobuf.Descriptors.OneofDescriptor;
 | 
	
		
			
				|  |  | -import com.google.protobuf.Internal.EnumLite;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -import java.io.IOException;
 | 
	
		
			
				|  |  | -import java.io.InputStream;
 | 
	
		
			
				|  |  | -import java.util.Arrays;
 | 
	
		
			
				|  |  | -import java.util.Collections;
 | 
	
		
			
				|  |  | -import java.util.HashMap;
 | 
	
		
			
				|  |  | -import java.util.Iterator;
 | 
	
		
			
				|  |  | -import java.util.List;
 | 
	
		
			
				|  |  | -import java.util.Map;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -/**
 | 
	
		
			
				|  |  | - * A partial implementation of the {@link Message} interface which implements
 | 
	
		
			
				|  |  | - * as many methods of that interface as possible in terms of other methods.
 | 
	
		
			
				|  |  | - *
 | 
	
		
			
				|  |  | - * @author kenton@google.com Kenton Varda
 | 
	
		
			
				|  |  | - */
 | 
	
		
			
				|  |  | -public abstract class AbstractMessage
 | 
	
		
			
				|  |  | -    // TODO(dweis): Update GeneratedMessage to parameterize with MessageType and BuilderType.
 | 
	
		
			
				|  |  | -    extends AbstractMessageLite
 | 
	
		
			
				|  |  | -    implements Message {
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  @Override
 | 
	
		
			
				|  |  | -  public boolean isInitialized() {
 | 
	
		
			
				|  |  | -    return MessageReflection.isInitialized(this);
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  /**
 | 
	
		
			
				|  |  | -   * Interface for the parent of a Builder that allows the builder to
 | 
	
		
			
				|  |  | -   * communicate invalidations back to the parent for use when using nested
 | 
	
		
			
				|  |  | -   * builders.
 | 
	
		
			
				|  |  | -   */
 | 
	
		
			
				|  |  | -  protected interface BuilderParent {
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    /**
 | 
	
		
			
				|  |  | -     * A builder becomes dirty whenever a field is modified -- including fields
 | 
	
		
			
				|  |  | -     * in nested builders -- and becomes clean when build() is called.  Thus,
 | 
	
		
			
				|  |  | -     * when a builder becomes dirty, all its parents become dirty as well, and
 | 
	
		
			
				|  |  | -     * when it becomes clean, all its children become clean.  The dirtiness
 | 
	
		
			
				|  |  | -     * state is used to invalidate certain cached values.
 | 
	
		
			
				|  |  | -     * <br>
 | 
	
		
			
				|  |  | -     * To this end, a builder calls markDirty() on its parent whenever it
 | 
	
		
			
				|  |  | -     * transitions from clean to dirty.  The parent must propagate this call to
 | 
	
		
			
				|  |  | -     * its own parent, unless it was already dirty, in which case the
 | 
	
		
			
				|  |  | -     * grandparent must necessarily already be dirty as well.  The parent can
 | 
	
		
			
				|  |  | -     * only transition back to "clean" after calling build() on all children.
 | 
	
		
			
				|  |  | -     */
 | 
	
		
			
				|  |  | -    void markDirty();
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  /** Create a nested builder. */
 | 
	
		
			
				|  |  | -  protected Message.Builder newBuilderForType(BuilderParent parent) {
 | 
	
		
			
				|  |  | -    throw new UnsupportedOperationException("Nested builder is not supported for this type.");
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  @Override
 | 
	
		
			
				|  |  | -  public List<String> findInitializationErrors() {
 | 
	
		
			
				|  |  | -    return MessageReflection.findMissingFields(this);
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  @Override
 | 
	
		
			
				|  |  | -  public String getInitializationErrorString() {
 | 
	
		
			
				|  |  | -    return MessageReflection.delimitWithCommas(findInitializationErrors());
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  /** TODO(jieluo): Clear it when all subclasses have implemented this method. */
 | 
	
		
			
				|  |  | -  @Override
 | 
	
		
			
				|  |  | -  public boolean hasOneof(OneofDescriptor oneof) {
 | 
	
		
			
				|  |  | -    throw new UnsupportedOperationException("hasOneof() is not implemented.");
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  /** TODO(jieluo): Clear it when all subclasses have implemented this method. */
 | 
	
		
			
				|  |  | -  @Override
 | 
	
		
			
				|  |  | -  public FieldDescriptor getOneofFieldDescriptor(OneofDescriptor oneof) {
 | 
	
		
			
				|  |  | -    throw new UnsupportedOperationException(
 | 
	
		
			
				|  |  | -        "getOneofFieldDescriptor() is not implemented.");
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  @Override
 | 
	
		
			
				|  |  | -  public final String toString() {
 | 
	
		
			
				|  |  | -    return TextFormat.printToString(this);
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  @Override
 | 
	
		
			
				|  |  | -  public void writeTo(final CodedOutputStream output) throws IOException {
 | 
	
		
			
				|  |  | -    MessageReflection.writeMessageTo(this, getAllFields(), output, false);
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  protected int memoizedSize = -1;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  @Override
 | 
	
		
			
				|  |  | -  public int getSerializedSize() {
 | 
	
		
			
				|  |  | -    int size = memoizedSize;
 | 
	
		
			
				|  |  | -    if (size != -1) {
 | 
	
		
			
				|  |  | -      return size;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    memoizedSize = MessageReflection.getSerializedSize(this, getAllFields());
 | 
	
		
			
				|  |  | -    return memoizedSize;
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  @Override
 | 
	
		
			
				|  |  | -  public boolean equals(final Object other) {
 | 
	
		
			
				|  |  | -    if (other == this) {
 | 
	
		
			
				|  |  | -      return true;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    if (!(other instanceof Message)) {
 | 
	
		
			
				|  |  | -      return false;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    final Message otherMessage = (Message) other;
 | 
	
		
			
				|  |  | -    if (getDescriptorForType() != otherMessage.getDescriptorForType()) {
 | 
	
		
			
				|  |  | -      return false;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    return compareFields(getAllFields(), otherMessage.getAllFields()) &&
 | 
	
		
			
				|  |  | -        getUnknownFields().equals(otherMessage.getUnknownFields());
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  @Override
 | 
	
		
			
				|  |  | -  public int hashCode() {
 | 
	
		
			
				|  |  | -    int hash = memoizedHashCode;
 | 
	
		
			
				|  |  | -    if (hash == 0) {
 | 
	
		
			
				|  |  | -      hash = 41;
 | 
	
		
			
				|  |  | -      hash = (19 * hash) + getDescriptorForType().hashCode();
 | 
	
		
			
				|  |  | -      hash = hashFields(hash, getAllFields());
 | 
	
		
			
				|  |  | -      hash = (29 * hash) + getUnknownFields().hashCode();
 | 
	
		
			
				|  |  | -      memoizedHashCode = hash;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    return hash;
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -  
 | 
	
		
			
				|  |  | -  private static ByteString toByteString(Object value) {
 | 
	
		
			
				|  |  | -    if (value instanceof byte[]) {
 | 
	
		
			
				|  |  | -      return ByteString.copyFrom((byte[]) value);
 | 
	
		
			
				|  |  | -    } else {
 | 
	
		
			
				|  |  | -      return (ByteString) value;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | - 
 | 
	
		
			
				|  |  | -  /**
 | 
	
		
			
				|  |  | -   * Compares two bytes fields. The parameters must be either a byte array or a
 | 
	
		
			
				|  |  | -   * ByteString object. They can be of different type though.
 | 
	
		
			
				|  |  | -   */
 | 
	
		
			
				|  |  | -  private static boolean compareBytes(Object a, Object b) {
 | 
	
		
			
				|  |  | -    if (a instanceof byte[] && b instanceof byte[]) {
 | 
	
		
			
				|  |  | -      return Arrays.equals((byte[])a, (byte[])b);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    return toByteString(a).equals(toByteString(b));
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -  
 | 
	
		
			
				|  |  | -  /**
 | 
	
		
			
				|  |  | -   * Converts a list of MapEntry messages into a Map used for equals() and
 | 
	
		
			
				|  |  | -   * hashCode().
 | 
	
		
			
				|  |  | -   */
 | 
	
		
			
				|  |  | -  @SuppressWarnings({"rawtypes", "unchecked"})
 | 
	
		
			
				|  |  | -  private static Map convertMapEntryListToMap(List list) {
 | 
	
		
			
				|  |  | -    if (list.isEmpty()) {
 | 
	
		
			
				|  |  | -      return Collections.emptyMap();
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    Map result = new HashMap();
 | 
	
		
			
				|  |  | -    Iterator iterator = list.iterator();
 | 
	
		
			
				|  |  | -    Message entry = (Message) iterator.next();
 | 
	
		
			
				|  |  | -    Descriptors.Descriptor descriptor = entry.getDescriptorForType();
 | 
	
		
			
				|  |  | -    Descriptors.FieldDescriptor key = descriptor.findFieldByName("key");
 | 
	
		
			
				|  |  | -    Descriptors.FieldDescriptor value = descriptor.findFieldByName("value");
 | 
	
		
			
				|  |  | -    Object fieldValue = entry.getField(value);
 | 
	
		
			
				|  |  | -    if (fieldValue instanceof EnumValueDescriptor) {
 | 
	
		
			
				|  |  | -      fieldValue = ((EnumValueDescriptor) fieldValue).getNumber();
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    result.put(entry.getField(key), fieldValue);
 | 
	
		
			
				|  |  | -    while (iterator.hasNext()) {
 | 
	
		
			
				|  |  | -      entry = (Message) iterator.next();
 | 
	
		
			
				|  |  | -      fieldValue = entry.getField(value);
 | 
	
		
			
				|  |  | -      if (fieldValue instanceof EnumValueDescriptor) {
 | 
	
		
			
				|  |  | -        fieldValue = ((EnumValueDescriptor) fieldValue).getNumber();
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | -      result.put(entry.getField(key), fieldValue);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    return result;
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -  
 | 
	
		
			
				|  |  | -  /**
 | 
	
		
			
				|  |  | -   * Compares two map fields. The parameters must be a list of MapEntry
 | 
	
		
			
				|  |  | -   * messages.
 | 
	
		
			
				|  |  | -   */
 | 
	
		
			
				|  |  | -  @SuppressWarnings({"rawtypes", "unchecked"})
 | 
	
		
			
				|  |  | -  private static boolean compareMapField(Object a, Object b) {
 | 
	
		
			
				|  |  | -    Map ma = convertMapEntryListToMap((List) a);
 | 
	
		
			
				|  |  | -    Map mb = convertMapEntryListToMap((List) b);
 | 
	
		
			
				|  |  | -    return MapFieldLite.equals(ma, mb);
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -  
 | 
	
		
			
				|  |  | -  /**
 | 
	
		
			
				|  |  | -   * Compares two set of fields.
 | 
	
		
			
				|  |  | -   * This method is used to implement {@link AbstractMessage#equals(Object)}
 | 
	
		
			
				|  |  | -   * and {@link AbstractMutableMessage#equals(Object)}. It takes special care
 | 
	
		
			
				|  |  | -   * of bytes fields because immutable messages and mutable messages use
 | 
	
		
			
				|  |  | -   * different Java type to reprensent a bytes field and this method should be
 | 
	
		
			
				|  |  | -   * able to compare immutable messages, mutable messages and also an immutable
 | 
	
		
			
				|  |  | -   * message to a mutable message.
 | 
	
		
			
				|  |  | -   */
 | 
	
		
			
				|  |  | -  static boolean compareFields(Map<FieldDescriptor, Object> a,
 | 
	
		
			
				|  |  | -      Map<FieldDescriptor, Object> b) {
 | 
	
		
			
				|  |  | -    if (a.size() != b.size()) {
 | 
	
		
			
				|  |  | -      return false;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    for (FieldDescriptor descriptor : a.keySet()) {
 | 
	
		
			
				|  |  | -      if (!b.containsKey(descriptor)) {
 | 
	
		
			
				|  |  | -        return false;
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | -      Object value1 = a.get(descriptor);
 | 
	
		
			
				|  |  | -      Object value2 = b.get(descriptor);
 | 
	
		
			
				|  |  | -      if (descriptor.getType() == FieldDescriptor.Type.BYTES) {
 | 
	
		
			
				|  |  | -        if (descriptor.isRepeated()) {
 | 
	
		
			
				|  |  | -          List list1 = (List) value1;
 | 
	
		
			
				|  |  | -          List list2 = (List) value2;
 | 
	
		
			
				|  |  | -          if (list1.size() != list2.size()) {
 | 
	
		
			
				|  |  | -            return false;
 | 
	
		
			
				|  |  | -          }
 | 
	
		
			
				|  |  | -          for (int i = 0; i < list1.size(); i++) {
 | 
	
		
			
				|  |  | -            if (!compareBytes(list1.get(i), list2.get(i))) {
 | 
	
		
			
				|  |  | -              return false;
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -          }
 | 
	
		
			
				|  |  | -        } else {
 | 
	
		
			
				|  |  | -          // Compares a singular bytes field.
 | 
	
		
			
				|  |  | -          if (!compareBytes(value1, value2)) {
 | 
	
		
			
				|  |  | -            return false;
 | 
	
		
			
				|  |  | -          }
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -      } else if (descriptor.isMapField()) {
 | 
	
		
			
				|  |  | -        if (!compareMapField(value1, value2)) {
 | 
	
		
			
				|  |  | -          return false;
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -      } else {
 | 
	
		
			
				|  |  | -        // Compare non-bytes fields.
 | 
	
		
			
				|  |  | -        if (!value1.equals(value2)) {
 | 
	
		
			
				|  |  | -          return false;
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    return true;
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -  
 | 
	
		
			
				|  |  | -  /**
 | 
	
		
			
				|  |  | -   * Calculates the hash code of a map field. {@code value} must be a list of
 | 
	
		
			
				|  |  | -   * MapEntry messages.
 | 
	
		
			
				|  |  | -   */
 | 
	
		
			
				|  |  | -  @SuppressWarnings("unchecked")
 | 
	
		
			
				|  |  | -  private static int hashMapField(Object value) {
 | 
	
		
			
				|  |  | -    return MapFieldLite.calculateHashCodeForMap(convertMapEntryListToMap((List) value));
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  /** Get a hash code for given fields and values, using the given seed. */
 | 
	
		
			
				|  |  | -  @SuppressWarnings("unchecked")
 | 
	
		
			
				|  |  | -  protected static int hashFields(int hash, Map<FieldDescriptor, Object> map) {
 | 
	
		
			
				|  |  | -    for (Map.Entry<FieldDescriptor, Object> entry : map.entrySet()) {
 | 
	
		
			
				|  |  | -      FieldDescriptor field = entry.getKey();
 | 
	
		
			
				|  |  | -      Object value = entry.getValue();
 | 
	
		
			
				|  |  | -      hash = (37 * hash) + field.getNumber();
 | 
	
		
			
				|  |  | -      if (field.isMapField()) {
 | 
	
		
			
				|  |  | -        hash = (53 * hash) + hashMapField(value);
 | 
	
		
			
				|  |  | -      } else if (field.getType() != FieldDescriptor.Type.ENUM){
 | 
	
		
			
				|  |  | -        hash = (53 * hash) + value.hashCode();
 | 
	
		
			
				|  |  | -      } else if (field.isRepeated()) {
 | 
	
		
			
				|  |  | -        List<? extends EnumLite> list = (List<? extends EnumLite>) value;
 | 
	
		
			
				|  |  | -        hash = (53 * hash) + Internal.hashEnumList(list);
 | 
	
		
			
				|  |  | -      } else {
 | 
	
		
			
				|  |  | -        hash = (53 * hash) + Internal.hashEnum((EnumLite) value);
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    return hash;
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  /**
 | 
	
		
			
				|  |  | -   * Package private helper method for AbstractParser to create
 | 
	
		
			
				|  |  | -   * UninitializedMessageException with missing field information.
 | 
	
		
			
				|  |  | -   */
 | 
	
		
			
				|  |  | -  @Override
 | 
	
		
			
				|  |  | -  UninitializedMessageException newUninitializedMessageException() {
 | 
	
		
			
				|  |  | -    return Builder.newUninitializedMessageException(this);
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  // =================================================================
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  /**
 | 
	
		
			
				|  |  | -   * A partial implementation of the {@link Message.Builder} interface which
 | 
	
		
			
				|  |  | -   * implements as many methods of that interface as possible in terms of
 | 
	
		
			
				|  |  | -   * other methods.
 | 
	
		
			
				|  |  | -   */
 | 
	
		
			
				|  |  | -  @SuppressWarnings("unchecked")
 | 
	
		
			
				|  |  | -  public static abstract class Builder<BuilderType extends Builder<BuilderType>>
 | 
	
		
			
				|  |  | -      extends AbstractMessageLite.Builder
 | 
	
		
			
				|  |  | -      implements Message.Builder {
 | 
	
		
			
				|  |  | -    // The compiler produces an error if this is not declared explicitly.
 | 
	
		
			
				|  |  | -    @Override
 | 
	
		
			
				|  |  | -    public abstract BuilderType clone();
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    /** TODO(jieluo): Clear it when all subclasses have implemented this method. */
 | 
	
		
			
				|  |  | -    @Override
 | 
	
		
			
				|  |  | -    public boolean hasOneof(OneofDescriptor oneof) {
 | 
	
		
			
				|  |  | -      throw new UnsupportedOperationException("hasOneof() is not implemented.");
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    /** TODO(jieluo): Clear it when all subclasses have implemented this method. */
 | 
	
		
			
				|  |  | -    @Override
 | 
	
		
			
				|  |  | -    public FieldDescriptor getOneofFieldDescriptor(OneofDescriptor oneof) {
 | 
	
		
			
				|  |  | -      throw new UnsupportedOperationException(
 | 
	
		
			
				|  |  | -          "getOneofFieldDescriptor() is not implemented.");
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    /** TODO(jieluo): Clear it when all subclasses have implemented this method. */
 | 
	
		
			
				|  |  | -    @Override
 | 
	
		
			
				|  |  | -    public BuilderType clearOneof(OneofDescriptor oneof) {
 | 
	
		
			
				|  |  | -      throw new UnsupportedOperationException("clearOneof() is not implemented.");
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    @Override
 | 
	
		
			
				|  |  | -    public BuilderType clear() {
 | 
	
		
			
				|  |  | -      for (final Map.Entry<FieldDescriptor, Object> entry :
 | 
	
		
			
				|  |  | -           getAllFields().entrySet()) {
 | 
	
		
			
				|  |  | -        clearField(entry.getKey());
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | -      return (BuilderType) this;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    @Override
 | 
	
		
			
				|  |  | -    public List<String> findInitializationErrors() {
 | 
	
		
			
				|  |  | -      return MessageReflection.findMissingFields(this);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    @Override
 | 
	
		
			
				|  |  | -    public String getInitializationErrorString() {
 | 
	
		
			
				|  |  | -      return MessageReflection.delimitWithCommas(findInitializationErrors());
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    
 | 
	
		
			
				|  |  | -    @Override
 | 
	
		
			
				|  |  | -    protected BuilderType internalMergeFrom(AbstractMessageLite other) {
 | 
	
		
			
				|  |  | -      return mergeFrom((Message) other);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    @Override
 | 
	
		
			
				|  |  | -    public BuilderType mergeFrom(final Message other) {
 | 
	
		
			
				|  |  | -      if (other.getDescriptorForType() != getDescriptorForType()) {
 | 
	
		
			
				|  |  | -        throw new IllegalArgumentException(
 | 
	
		
			
				|  |  | -          "mergeFrom(Message) can only merge messages of the same type.");
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -      // Note:  We don't attempt to verify that other's fields have valid
 | 
	
		
			
				|  |  | -      //   types.  Doing so would be a losing battle.  We'd have to verify
 | 
	
		
			
				|  |  | -      //   all sub-messages as well, and we'd have to make copies of all of
 | 
	
		
			
				|  |  | -      //   them to insure that they don't change after verification (since
 | 
	
		
			
				|  |  | -      //   the Message interface itself cannot enforce immutability of
 | 
	
		
			
				|  |  | -      //   implementations).
 | 
	
		
			
				|  |  | -      // TODO(kenton):  Provide a function somewhere called makeDeepCopy()
 | 
	
		
			
				|  |  | -      //   which allows people to make secure deep copies of messages.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -      for (final Map.Entry<FieldDescriptor, Object> entry :
 | 
	
		
			
				|  |  | -           other.getAllFields().entrySet()) {
 | 
	
		
			
				|  |  | -        final FieldDescriptor field = entry.getKey();
 | 
	
		
			
				|  |  | -        if (field.isRepeated()) {
 | 
	
		
			
				|  |  | -          for (final Object element : (List)entry.getValue()) {
 | 
	
		
			
				|  |  | -            addRepeatedField(field, element);
 | 
	
		
			
				|  |  | -          }
 | 
	
		
			
				|  |  | -        } else if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {
 | 
	
		
			
				|  |  | -          final Message existingValue = (Message)getField(field);
 | 
	
		
			
				|  |  | -          if (existingValue == existingValue.getDefaultInstanceForType()) {
 | 
	
		
			
				|  |  | -            setField(field, entry.getValue());
 | 
	
		
			
				|  |  | -          } else {
 | 
	
		
			
				|  |  | -            setField(field,
 | 
	
		
			
				|  |  | -              existingValue.newBuilderForType()
 | 
	
		
			
				|  |  | -                .mergeFrom(existingValue)
 | 
	
		
			
				|  |  | -                .mergeFrom((Message)entry.getValue())
 | 
	
		
			
				|  |  | -                .build());
 | 
	
		
			
				|  |  | -          }
 | 
	
		
			
				|  |  | -        } else {
 | 
	
		
			
				|  |  | -          setField(field, entry.getValue());
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -      mergeUnknownFields(other.getUnknownFields());
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -      return (BuilderType) this;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    @Override
 | 
	
		
			
				|  |  | -    public BuilderType mergeFrom(final CodedInputStream input)
 | 
	
		
			
				|  |  | -                                 throws IOException {
 | 
	
		
			
				|  |  | -      return mergeFrom(input, ExtensionRegistry.getEmptyRegistry());
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    @Override
 | 
	
		
			
				|  |  | -    public BuilderType mergeFrom(
 | 
	
		
			
				|  |  | -        final CodedInputStream input,
 | 
	
		
			
				|  |  | -        final ExtensionRegistryLite extensionRegistry)
 | 
	
		
			
				|  |  | -        throws IOException {
 | 
	
		
			
				|  |  | -      final UnknownFieldSet.Builder unknownFields =
 | 
	
		
			
				|  |  | -        UnknownFieldSet.newBuilder(getUnknownFields());
 | 
	
		
			
				|  |  | -      while (true) {
 | 
	
		
			
				|  |  | -        final int tag = input.readTag();
 | 
	
		
			
				|  |  | -        if (tag == 0) {
 | 
	
		
			
				|  |  | -          break;
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        MessageReflection.BuilderAdapter builderAdapter =
 | 
	
		
			
				|  |  | -            new MessageReflection.BuilderAdapter(this);
 | 
	
		
			
				|  |  | -        if (!MessageReflection.mergeFieldFrom(input, unknownFields,
 | 
	
		
			
				|  |  | -                                              extensionRegistry,
 | 
	
		
			
				|  |  | -                                              getDescriptorForType(),
 | 
	
		
			
				|  |  | -                                              builderAdapter,
 | 
	
		
			
				|  |  | -                                              tag)) {
 | 
	
		
			
				|  |  | -          // end group tag
 | 
	
		
			
				|  |  | -          break;
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | -      setUnknownFields(unknownFields.build());
 | 
	
		
			
				|  |  | -      return (BuilderType) this;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    @Override
 | 
	
		
			
				|  |  | -    public BuilderType mergeUnknownFields(final UnknownFieldSet unknownFields) {
 | 
	
		
			
				|  |  | -      setUnknownFields(
 | 
	
		
			
				|  |  | -        UnknownFieldSet.newBuilder(getUnknownFields())
 | 
	
		
			
				|  |  | -                       .mergeFrom(unknownFields)
 | 
	
		
			
				|  |  | -                       .build());
 | 
	
		
			
				|  |  | -      return (BuilderType) this;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    @Override
 | 
	
		
			
				|  |  | -    public Message.Builder getFieldBuilder(final FieldDescriptor field) {
 | 
	
		
			
				|  |  | -      throw new UnsupportedOperationException(
 | 
	
		
			
				|  |  | -          "getFieldBuilder() called on an unsupported message type.");
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    @Override
 | 
	
		
			
				|  |  | -    public Message.Builder getRepeatedFieldBuilder(final FieldDescriptor field, int index) {
 | 
	
		
			
				|  |  | -      throw new UnsupportedOperationException(
 | 
	
		
			
				|  |  | -          "getRepeatedFieldBuilder() called on an unsupported message type.");
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    @Override
 | 
	
		
			
				|  |  | -    public String toString() {
 | 
	
		
			
				|  |  | -      return TextFormat.printToString(this);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    /**
 | 
	
		
			
				|  |  | -     * Construct an UninitializedMessageException reporting missing fields in
 | 
	
		
			
				|  |  | -     * the given message.
 | 
	
		
			
				|  |  | -     */
 | 
	
		
			
				|  |  | -    protected static UninitializedMessageException
 | 
	
		
			
				|  |  | -        newUninitializedMessageException(Message message) {
 | 
	
		
			
				|  |  | -      return new UninitializedMessageException(
 | 
	
		
			
				|  |  | -          MessageReflection.findMissingFields(message));
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    /**
 | 
	
		
			
				|  |  | -     * Used to support nested builders and called to mark this builder as clean.
 | 
	
		
			
				|  |  | -     * Clean builders will propagate the {@link BuilderParent#markDirty()} event
 | 
	
		
			
				|  |  | -     * to their parent builders, while dirty builders will not, as their parents
 | 
	
		
			
				|  |  | -     * should be dirty already.
 | 
	
		
			
				|  |  | -     *
 | 
	
		
			
				|  |  | -     * NOTE: Implementations that don't support nested builders don't need to
 | 
	
		
			
				|  |  | -     * override this method.
 | 
	
		
			
				|  |  | -     */
 | 
	
		
			
				|  |  | -    void markClean() {
 | 
	
		
			
				|  |  | -      throw new IllegalStateException("Should be overridden by subclasses.");
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    /**
 | 
	
		
			
				|  |  | -     * Used to support nested builders and called when this nested builder is
 | 
	
		
			
				|  |  | -     * no longer used by its parent builder and should release the reference
 | 
	
		
			
				|  |  | -     * to its parent builder.
 | 
	
		
			
				|  |  | -     *
 | 
	
		
			
				|  |  | -     * NOTE: Implementations that don't support nested builders don't need to
 | 
	
		
			
				|  |  | -     * override this method.
 | 
	
		
			
				|  |  | -     */
 | 
	
		
			
				|  |  | -    void dispose() {
 | 
	
		
			
				|  |  | -      throw new IllegalStateException("Should be overridden by subclasses.");
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    // ===============================================================
 | 
	
		
			
				|  |  | -    // The following definitions seem to be required in order to make javac
 | 
	
		
			
				|  |  | -    // not produce weird errors like:
 | 
	
		
			
				|  |  | -    //
 | 
	
		
			
				|  |  | -    // java/com/google/protobuf/DynamicMessage.java:203: types
 | 
	
		
			
				|  |  | -    //   com.google.protobuf.AbstractMessage.Builder<
 | 
	
		
			
				|  |  | -    //     com.google.protobuf.DynamicMessage.Builder> and
 | 
	
		
			
				|  |  | -    //   com.google.protobuf.AbstractMessage.Builder<
 | 
	
		
			
				|  |  | -    //     com.google.protobuf.DynamicMessage.Builder> are incompatible; both
 | 
	
		
			
				|  |  | -    //   define mergeFrom(com.google.protobuf.ByteString), but with unrelated
 | 
	
		
			
				|  |  | -    //   return types.
 | 
	
		
			
				|  |  | -    //
 | 
	
		
			
				|  |  | -    // Strangely, these lines are only needed if javac is invoked separately
 | 
	
		
			
				|  |  | -    // on AbstractMessage.java and AbstractMessageLite.java.  If javac is
 | 
	
		
			
				|  |  | -    // invoked on both simultaneously, it works.  (Or maybe the important
 | 
	
		
			
				|  |  | -    // point is whether or not DynamicMessage.java is compiled together with
 | 
	
		
			
				|  |  | -    // AbstractMessageLite.java -- not sure.)  I suspect this is a compiler
 | 
	
		
			
				|  |  | -    // bug.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    @Override
 | 
	
		
			
				|  |  | -    public BuilderType mergeFrom(final ByteString data)
 | 
	
		
			
				|  |  | -        throws InvalidProtocolBufferException {
 | 
	
		
			
				|  |  | -      return (BuilderType) super.mergeFrom(data);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    @Override
 | 
	
		
			
				|  |  | -    public BuilderType mergeFrom(
 | 
	
		
			
				|  |  | -        final ByteString data,
 | 
	
		
			
				|  |  | -        final ExtensionRegistryLite extensionRegistry)
 | 
	
		
			
				|  |  | -        throws InvalidProtocolBufferException {
 | 
	
		
			
				|  |  | -      return (BuilderType) super.mergeFrom(data, extensionRegistry);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    @Override
 | 
	
		
			
				|  |  | -    public BuilderType mergeFrom(final byte[] data)
 | 
	
		
			
				|  |  | -        throws InvalidProtocolBufferException {
 | 
	
		
			
				|  |  | -      return (BuilderType) super.mergeFrom(data);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    @Override
 | 
	
		
			
				|  |  | -    public BuilderType mergeFrom(
 | 
	
		
			
				|  |  | -        final byte[] data, final int off, final int len)
 | 
	
		
			
				|  |  | -        throws InvalidProtocolBufferException {
 | 
	
		
			
				|  |  | -      return (BuilderType) super.mergeFrom(data, off, len);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    @Override
 | 
	
		
			
				|  |  | -    public BuilderType mergeFrom(
 | 
	
		
			
				|  |  | -        final byte[] data,
 | 
	
		
			
				|  |  | -        final ExtensionRegistryLite extensionRegistry)
 | 
	
		
			
				|  |  | -        throws InvalidProtocolBufferException {
 | 
	
		
			
				|  |  | -      return (BuilderType) super.mergeFrom(data, extensionRegistry);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    @Override
 | 
	
		
			
				|  |  | -    public BuilderType mergeFrom(
 | 
	
		
			
				|  |  | -        final byte[] data, final int off, final int len,
 | 
	
		
			
				|  |  | -        final ExtensionRegistryLite extensionRegistry)
 | 
	
		
			
				|  |  | -        throws InvalidProtocolBufferException {
 | 
	
		
			
				|  |  | -      return (BuilderType) super.mergeFrom(data, off, len, extensionRegistry);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    @Override
 | 
	
		
			
				|  |  | -    public BuilderType mergeFrom(final InputStream input)
 | 
	
		
			
				|  |  | -        throws IOException {
 | 
	
		
			
				|  |  | -      return (BuilderType) super.mergeFrom(input);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    @Override
 | 
	
		
			
				|  |  | -    public BuilderType mergeFrom(
 | 
	
		
			
				|  |  | -        final InputStream input,
 | 
	
		
			
				|  |  | -        final ExtensionRegistryLite extensionRegistry)
 | 
	
		
			
				|  |  | -        throws IOException {
 | 
	
		
			
				|  |  | -      return (BuilderType) super.mergeFrom(input, extensionRegistry);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    @Override
 | 
	
		
			
				|  |  | -    public boolean mergeDelimitedFrom(final InputStream input)
 | 
	
		
			
				|  |  | -        throws IOException {
 | 
	
		
			
				|  |  | -      return super.mergeDelimitedFrom(input);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    @Override
 | 
	
		
			
				|  |  | -    public boolean mergeDelimitedFrom(
 | 
	
		
			
				|  |  | -        final InputStream input,
 | 
	
		
			
				|  |  | -        final ExtensionRegistryLite extensionRegistry)
 | 
	
		
			
				|  |  | -        throws IOException {
 | 
	
		
			
				|  |  | -      return super.mergeDelimitedFrom(input, extensionRegistry);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  /**
 | 
	
		
			
				|  |  | -   * @deprecated from v3.0.0-beta-3+, for compatibility with v2.5.0 and v2.6.1
 | 
	
		
			
				|  |  | -   * generated code.
 | 
	
		
			
				|  |  | -   */
 | 
	
		
			
				|  |  | -  @Deprecated
 | 
	
		
			
				|  |  | -  protected static int hashLong(long n) {
 | 
	
		
			
				|  |  | -    return (int) (n ^ (n >>> 32));
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -  //
 | 
	
		
			
				|  |  | -  /**
 | 
	
		
			
				|  |  | -   * @deprecated from v3.0.0-beta-3+, for compatibility with v2.5.0 and v2.6.1
 | 
	
		
			
				|  |  | -   * generated code.
 | 
	
		
			
				|  |  | -   */
 | 
	
		
			
				|  |  | -  @Deprecated
 | 
	
		
			
				|  |  | -  protected static int hashBoolean(boolean b) {
 | 
	
		
			
				|  |  | -    return b ? 1231 : 1237;
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -  //
 | 
	
		
			
				|  |  | -  /**
 | 
	
		
			
				|  |  | -   * @deprecated from v3.0.0-beta-3+, for compatibility with v2.5.0 and v2.6.1
 | 
	
		
			
				|  |  | -   * generated code.
 | 
	
		
			
				|  |  | -   */
 | 
	
		
			
				|  |  | -  @Deprecated
 | 
	
		
			
				|  |  | -  protected static int hashEnum(EnumLite e) {
 | 
	
		
			
				|  |  | -    return e.getNumber();
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -  //
 | 
	
		
			
				|  |  | -  /**
 | 
	
		
			
				|  |  | -   * @deprecated from v3.0.0-beta-3+, for compatibility with v2.5.0 and v2.6.1
 | 
	
		
			
				|  |  | -   * generated code.
 | 
	
		
			
				|  |  | -   */
 | 
	
		
			
				|  |  | -  @Deprecated
 | 
	
		
			
				|  |  | -  protected static int hashEnumList(List<? extends EnumLite> list) {
 | 
	
		
			
				|  |  | -    int hash = 1;
 | 
	
		
			
				|  |  | -    for (EnumLite e : list) {
 | 
	
		
			
				|  |  | -      hash = 31 * hash + hashEnum(e);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    return hash;
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -}
 |