|
@@ -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;
|
|
|
- }
|
|
|
-}
|