Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(428)

Unified Diff: third_party/protobuf/java/src/main/java/com/google/protobuf/AbstractMessage.java

Issue 556933002: Remove protobuf lite for java. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase before submit Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/protobuf/java/src/main/java/com/google/protobuf/AbstractMessage.java
diff --git a/third_party/protobuf/java/src/main/java/com/google/protobuf/AbstractMessage.java b/third_party/protobuf/java/src/main/java/com/google/protobuf/AbstractMessage.java
deleted file mode 100644
index f4d115de253faa617c1eb44974881f736c928979..0000000000000000000000000000000000000000
--- a/third_party/protobuf/java/src/main/java/com/google/protobuf/AbstractMessage.java
+++ /dev/null
@@ -1,930 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc. All rights reserved.
-// http://code.google.com/p/protobuf/
-//
-// 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.Descriptor;
-import com.google.protobuf.Descriptors.FieldDescriptor;
-import com.google.protobuf.GeneratedMessage.ExtendableBuilder;
-import com.google.protobuf.Internal.EnumLite;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-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 extends AbstractMessageLite
- implements Message {
- @SuppressWarnings("unchecked")
- public boolean isInitialized() {
- // Check that all required fields are present.
- for (final FieldDescriptor field : getDescriptorForType().getFields()) {
- if (field.isRequired()) {
- if (!hasField(field)) {
- return false;
- }
- }
- }
-
- // Check that embedded messages are initialized.
- for (final Map.Entry<FieldDescriptor, Object> entry :
- getAllFields().entrySet()) {
- final FieldDescriptor field = entry.getKey();
- if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {
- if (field.isRepeated()) {
- for (final Message element : (List<Message>) entry.getValue()) {
- if (!element.isInitialized()) {
- return false;
- }
- }
- } else {
- if (!((Message) entry.getValue()).isInitialized()) {
- return false;
- }
- }
- }
- }
-
- return true;
- }
-
- public List<String> findInitializationErrors() {
- return Builder.findMissingFields(this);
- }
-
- public String getInitializationErrorString() {
- return delimitWithCommas(findInitializationErrors());
- }
-
- private static String delimitWithCommas(List<String> parts) {
- StringBuilder result = new StringBuilder();
- for (String part : parts) {
- if (result.length() > 0) {
- result.append(", ");
- }
- result.append(part);
- }
- return result.toString();
- }
-
- @Override
- public final String toString() {
- return TextFormat.printToString(this);
- }
-
- public void writeTo(final CodedOutputStream output) throws IOException {
- final boolean isMessageSet =
- getDescriptorForType().getOptions().getMessageSetWireFormat();
-
- for (final Map.Entry<FieldDescriptor, Object> entry :
- getAllFields().entrySet()) {
- final FieldDescriptor field = entry.getKey();
- final Object value = entry.getValue();
- if (isMessageSet && field.isExtension() &&
- field.getType() == FieldDescriptor.Type.MESSAGE &&
- !field.isRepeated()) {
- output.writeMessageSetExtension(field.getNumber(), (Message) value);
- } else {
- FieldSet.writeField(field, value, output);
- }
- }
-
- final UnknownFieldSet unknownFields = getUnknownFields();
- if (isMessageSet) {
- unknownFields.writeAsMessageSetTo(output);
- } else {
- unknownFields.writeTo(output);
- }
- }
-
- private int memoizedSize = -1;
-
- public int getSerializedSize() {
- int size = memoizedSize;
- if (size != -1) {
- return size;
- }
-
- size = 0;
- final boolean isMessageSet =
- getDescriptorForType().getOptions().getMessageSetWireFormat();
-
- for (final Map.Entry<FieldDescriptor, Object> entry :
- getAllFields().entrySet()) {
- final FieldDescriptor field = entry.getKey();
- final Object value = entry.getValue();
- if (isMessageSet && field.isExtension() &&
- field.getType() == FieldDescriptor.Type.MESSAGE &&
- !field.isRepeated()) {
- size += CodedOutputStream.computeMessageSetExtensionSize(
- field.getNumber(), (Message) value);
- } else {
- size += FieldSet.computeFieldSize(field, value);
- }
- }
-
- final UnknownFieldSet unknownFields = getUnknownFields();
- if (isMessageSet) {
- size += unknownFields.getSerializedSizeAsMessageSet();
- } else {
- size += unknownFields.getSerializedSize();
- }
-
- memoizedSize = size;
- return size;
- }
-
- @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 getAllFields().equals(otherMessage.getAllFields()) &&
- getUnknownFields().equals(otherMessage.getUnknownFields());
- }
-
- @Override
- public int hashCode() {
- int hash = 41;
- hash = (19 * hash) + getDescriptorForType().hashCode();
- hash = hashFields(hash, getAllFields());
- hash = (29 * hash) + getUnknownFields().hashCode();
- return hash;
- }
-
- /** Get a hash code for given fields and values, using the given seed. */
- @SuppressWarnings("unchecked")
- protected 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.getType() != FieldDescriptor.Type.ENUM){
- hash = (53 * hash) + value.hashCode();
- } else if (field.isRepeated()) {
- List<? extends EnumLite> list = (List<? extends EnumLite>) value;
- hash = (53 * hash) + hashEnumList(list);
- } else {
- hash = (53 * hash) + hashEnum((EnumLite) value);
- }
- }
- return hash;
- }
-
- /**
- * Helper method for implementing {@link Message#hashCode()}.
- * @see Boolean#hashCode()
- */
- protected static int hashLong(long n) {
- return (int) (n ^ (n >>> 32));
- }
-
- /**
- * Helper method for implementing {@link Message#hashCode()}.
- * @see Boolean#hashCode()
- */
- protected static int hashBoolean(boolean b) {
- return b ? 1231 : 1237;
- }
-
- /**
- * Package private helper method for AbstractParser to create
- * UninitializedMessageException with missing field information.
- */
- @Override
- UninitializedMessageException newUninitializedMessageException() {
- return Builder.newUninitializedMessageException(this);
- }
-
- /**
- * Helper method for implementing {@link Message#hashCode()}.
- * <p>
- * This is needed because {@link java.lang.Enum#hashCode()} is final, but we
- * need to use the field number as the hash code to ensure compatibility
- * between statically and dynamically generated enum objects.
- */
- protected static int hashEnum(EnumLite e) {
- return e.getNumber();
- }
-
- /** Helper method for implementing {@link Message#hashCode()}. */
- protected static int hashEnumList(List<? extends EnumLite> list) {
- int hash = 1;
- for (EnumLite e : list) {
- hash = 31 * hash + hashEnum(e);
- }
- return hash;
- }
-
- // =================================================================
-
- /**
- * 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>
- extends AbstractMessageLite.Builder<BuilderType>
- implements Message.Builder {
- // The compiler produces an error if this is not declared explicitly.
- @Override
- public abstract BuilderType clone();
-
- public BuilderType clear() {
- for (final Map.Entry<FieldDescriptor, Object> entry :
- getAllFields().entrySet()) {
- clearField(entry.getKey());
- }
- return (BuilderType) this;
- }
-
- public List<String> findInitializationErrors() {
- return findMissingFields(this);
- }
-
- public String getInitializationErrorString() {
- return delimitWithCommas(findInitializationErrors());
- }
-
- 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;
- }
-
- if (!mergeFieldFrom(input, unknownFields, extensionRegistry,
- getDescriptorForType(), this, null, tag)) {
- // end group tag
- break;
- }
- }
- setUnknownFields(unknownFields.build());
- return (BuilderType) this;
- }
-
- /** helper method to handle {@code builder} and {@code extensions}. */
- private static void addRepeatedField(
- Message.Builder builder,
- FieldSet<FieldDescriptor> extensions,
- FieldDescriptor field,
- Object value) {
- if (builder != null) {
- builder.addRepeatedField(field, value);
- } else {
- extensions.addRepeatedField(field, value);
- }
- }
-
- /** helper method to handle {@code builder} and {@code extensions}. */
- private static void setField(
- Message.Builder builder,
- FieldSet<FieldDescriptor> extensions,
- FieldDescriptor field,
- Object value) {
- if (builder != null) {
- builder.setField(field, value);
- } else {
- extensions.setField(field, value);
- }
- }
-
- /** helper method to handle {@code builder} and {@code extensions}. */
- private static boolean hasOriginalMessage(
- Message.Builder builder,
- FieldSet<FieldDescriptor> extensions,
- FieldDescriptor field) {
- if (builder != null) {
- return builder.hasField(field);
- } else {
- return extensions.hasField(field);
- }
- }
-
- /** helper method to handle {@code builder} and {@code extensions}. */
- private static Message getOriginalMessage(
- Message.Builder builder,
- FieldSet<FieldDescriptor> extensions,
- FieldDescriptor field) {
- if (builder != null) {
- return (Message) builder.getField(field);
- } else {
- return (Message) extensions.getField(field);
- }
- }
-
- /** helper method to handle {@code builder} and {@code extensions}. */
- private static void mergeOriginalMessage(
- Message.Builder builder,
- FieldSet<FieldDescriptor> extensions,
- FieldDescriptor field,
- Message.Builder subBuilder) {
- Message originalMessage = getOriginalMessage(builder, extensions, field);
- if (originalMessage != null) {
- subBuilder.mergeFrom(originalMessage);
- }
- }
-
- /**
- * Like {@link #mergeFrom(CodedInputStream, ExtensionRegistryLite)}, but
- * parses a single field.
- *
- * When {@code builder} is not null, the method will parse and merge the
- * field into {@code builder}. Otherwise, it will try to parse the field
- * into {@code extensions}, when it's called by the parsing constructor in
- * generated classes.
- *
- * Package-private because it is used by GeneratedMessage.ExtendableMessage.
- * @param tag The tag, which should have already been read.
- * @return {@code true} unless the tag is an end-group tag.
- */
- static boolean mergeFieldFrom(
- CodedInputStream input,
- UnknownFieldSet.Builder unknownFields,
- ExtensionRegistryLite extensionRegistry,
- Descriptor type,
- Message.Builder builder,
- FieldSet<FieldDescriptor> extensions,
- int tag) throws IOException {
- if (type.getOptions().getMessageSetWireFormat() &&
- tag == WireFormat.MESSAGE_SET_ITEM_TAG) {
- mergeMessageSetExtensionFromCodedStream(
- input, unknownFields, extensionRegistry, type, builder, extensions);
- return true;
- }
-
- final int wireType = WireFormat.getTagWireType(tag);
- final int fieldNumber = WireFormat.getTagFieldNumber(tag);
-
- final FieldDescriptor field;
- Message defaultInstance = null;
-
- if (type.isExtensionNumber(fieldNumber)) {
- // extensionRegistry may be either ExtensionRegistry or
- // ExtensionRegistryLite. Since the type we are parsing is a full
- // message, only a full ExtensionRegistry could possibly contain
- // extensions of it. Otherwise we will treat the registry as if it
- // were empty.
- if (extensionRegistry instanceof ExtensionRegistry) {
- final ExtensionRegistry.ExtensionInfo extension =
- ((ExtensionRegistry) extensionRegistry)
- .findExtensionByNumber(type, fieldNumber);
- if (extension == null) {
- field = null;
- } else {
- field = extension.descriptor;
- defaultInstance = extension.defaultInstance;
- if (defaultInstance == null &&
- field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {
- throw new IllegalStateException(
- "Message-typed extension lacked default instance: " +
- field.getFullName());
- }
- }
- } else {
- field = null;
- }
- } else if (builder != null) {
- field = type.findFieldByNumber(fieldNumber);
- } else {
- field = null;
- }
-
- boolean unknown = false;
- boolean packed = false;
- if (field == null) {
- unknown = true; // Unknown field.
- } else if (wireType == FieldSet.getWireFormatForFieldType(
- field.getLiteType(),
- false /* isPacked */)) {
- packed = false;
- } else if (field.isPackable() &&
- wireType == FieldSet.getWireFormatForFieldType(
- field.getLiteType(),
- true /* isPacked */)) {
- packed = true;
- } else {
- unknown = true; // Unknown wire type.
- }
-
- if (unknown) { // Unknown field or wrong wire type. Skip.
- return unknownFields.mergeFieldFrom(tag, input);
- }
-
- if (packed) {
- final int length = input.readRawVarint32();
- final int limit = input.pushLimit(length);
- if (field.getLiteType() == WireFormat.FieldType.ENUM) {
- while (input.getBytesUntilLimit() > 0) {
- final int rawValue = input.readEnum();
- final Object value = field.getEnumType().findValueByNumber(rawValue);
- if (value == null) {
- // If the number isn't recognized as a valid value for this
- // enum, drop it (don't even add it to unknownFields).
- return true;
- }
- addRepeatedField(builder, extensions, field, value);
- }
- } else {
- while (input.getBytesUntilLimit() > 0) {
- final Object value =
- FieldSet.readPrimitiveField(input, field.getLiteType());
- addRepeatedField(builder, extensions, field, value);
- }
- }
- input.popLimit(limit);
- } else {
- final Object value;
- switch (field.getType()) {
- case GROUP: {
- final Message.Builder subBuilder;
- if (defaultInstance != null) {
- subBuilder = defaultInstance.newBuilderForType();
- } else {
- subBuilder = builder.newBuilderForField(field);
- }
- if (!field.isRepeated()) {
- mergeOriginalMessage(builder, extensions, field, subBuilder);
- }
- input.readGroup(field.getNumber(), subBuilder, extensionRegistry);
- value = subBuilder.buildPartial();
- break;
- }
- case MESSAGE: {
- final Message.Builder subBuilder;
- if (defaultInstance != null) {
- subBuilder = defaultInstance.newBuilderForType();
- } else {
- subBuilder = builder.newBuilderForField(field);
- }
- if (!field.isRepeated()) {
- mergeOriginalMessage(builder, extensions, field, subBuilder);
- }
- input.readMessage(subBuilder, extensionRegistry);
- value = subBuilder.buildPartial();
- break;
- }
- case ENUM:
- final int rawValue = input.readEnum();
- value = field.getEnumType().findValueByNumber(rawValue);
- // If the number isn't recognized as a valid value for this enum,
- // drop it.
- if (value == null) {
- unknownFields.mergeVarintField(fieldNumber, rawValue);
- return true;
- }
- break;
- default:
- value = FieldSet.readPrimitiveField(input, field.getLiteType());
- break;
- }
-
- if (field.isRepeated()) {
- addRepeatedField(builder, extensions, field, value);
- } else {
- setField(builder, extensions, field, value);
- }
- }
-
- return true;
- }
-
- /**
- * Called by {@code #mergeFieldFrom()} to parse a MessageSet extension.
- * If {@code builder} is not null, this method will merge MessageSet into
- * the builder. Otherwise, it will merge the MessageSet into {@code
- * extensions}.
- */
- private static void mergeMessageSetExtensionFromCodedStream(
- CodedInputStream input,
- UnknownFieldSet.Builder unknownFields,
- ExtensionRegistryLite extensionRegistry,
- Descriptor type,
- Message.Builder builder,
- FieldSet<FieldDescriptor> extensions) throws IOException {
-
- // The wire format for MessageSet is:
- // message MessageSet {
- // repeated group Item = 1 {
- // required int32 typeId = 2;
- // required bytes message = 3;
- // }
- // }
- // "typeId" is the extension's field number. The extension can only be
- // a message type, where "message" contains the encoded bytes of that
- // message.
- //
- // In practice, we will probably never see a MessageSet item in which
- // the message appears before the type ID, or where either field does not
- // appear exactly once. However, in theory such cases are valid, so we
- // should be prepared to accept them.
-
- int typeId = 0;
- ByteString rawBytes = null; // If we encounter "message" before "typeId"
- ExtensionRegistry.ExtensionInfo extension = null;
-
- // Read bytes from input, if we get it's type first then parse it eagerly,
- // otherwise we store the raw bytes in a local variable.
- while (true) {
- final int tag = input.readTag();
- if (tag == 0) {
- break;
- }
-
- if (tag == WireFormat.MESSAGE_SET_TYPE_ID_TAG) {
- typeId = input.readUInt32();
- if (typeId != 0) {
- // extensionRegistry may be either ExtensionRegistry or
- // ExtensionRegistryLite. Since the type we are parsing is a full
- // message, only a full ExtensionRegistry could possibly contain
- // extensions of it. Otherwise we will treat the registry as if it
- // were empty.
- if (extensionRegistry instanceof ExtensionRegistry) {
- extension = ((ExtensionRegistry) extensionRegistry)
- .findExtensionByNumber(type, typeId);
- }
- }
-
- } else if (tag == WireFormat.MESSAGE_SET_MESSAGE_TAG) {
- if (typeId != 0) {
- if (extension != null && ExtensionRegistryLite.isEagerlyParseMessageSets()) {
- // We already know the type, so we can parse directly from the
- // input with no copying. Hooray!
- eagerlyMergeMessageSetExtension(
- input, extension, extensionRegistry, builder, extensions);
- rawBytes = null;
- continue;
- }
- }
- // We haven't seen a type ID yet or we want parse message lazily.
- rawBytes = input.readBytes();
-
- } else { // Unknown tag. Skip it.
- if (!input.skipField(tag)) {
- break; // End of group
- }
- }
- }
- input.checkLastTagWas(WireFormat.MESSAGE_SET_ITEM_END_TAG);
-
- // Process the raw bytes.
- if (rawBytes != null && typeId != 0) { // Zero is not a valid type ID.
- if (extension != null) { // We known the type
- mergeMessageSetExtensionFromBytes(
- rawBytes, extension, extensionRegistry, builder, extensions);
- } else { // We don't know how to parse this. Ignore it.
- if (rawBytes != null) {
- unknownFields.mergeField(typeId, UnknownFieldSet.Field.newBuilder()
- .addLengthDelimited(rawBytes).build());
- }
- }
- }
- }
-
- private static void eagerlyMergeMessageSetExtension(
- CodedInputStream input,
- ExtensionRegistry.ExtensionInfo extension,
- ExtensionRegistryLite extensionRegistry,
- Message.Builder builder,
- FieldSet<FieldDescriptor> extensions) throws IOException {
-
- FieldDescriptor field = extension.descriptor;
- Message value = null;
- if (hasOriginalMessage(builder, extensions, field)) {
- Message originalMessage =
- getOriginalMessage(builder, extensions, field);
- Message.Builder subBuilder = originalMessage.toBuilder();
- input.readMessage(subBuilder, extensionRegistry);
- value = subBuilder.buildPartial();
- } else {
- value = input.readMessage(extension.defaultInstance.getParserForType(),
- extensionRegistry);
- }
-
- if (builder != null) {
- builder.setField(field, value);
- } else {
- extensions.setField(field, value);
- }
- }
-
- private static void mergeMessageSetExtensionFromBytes(
- ByteString rawBytes,
- ExtensionRegistry.ExtensionInfo extension,
- ExtensionRegistryLite extensionRegistry,
- Message.Builder builder,
- FieldSet<FieldDescriptor> extensions) throws IOException {
-
- FieldDescriptor field = extension.descriptor;
- boolean hasOriginalValue = hasOriginalMessage(builder, extensions, field);
-
- if (hasOriginalValue || ExtensionRegistryLite.isEagerlyParseMessageSets()) {
- // If the field already exists, we just parse the field.
- Message value = null;
- if (hasOriginalValue) {
- Message originalMessage =
- getOriginalMessage(builder, extensions, field);
- Message.Builder subBuilder= originalMessage.toBuilder();
- subBuilder.mergeFrom(rawBytes, extensionRegistry);
- value = subBuilder.buildPartial();
- } else {
- value = extension.defaultInstance.getParserForType()
- .parsePartialFrom(rawBytes, extensionRegistry);
- }
- setField(builder, extensions, field, value);
- } else {
- // Use LazyField to load MessageSet lazily.
- LazyField lazyField = new LazyField(
- extension.defaultInstance, extensionRegistry, rawBytes);
- if (builder != null) {
- // TODO(xiangl): it looks like this method can only be invoked by
- // ExtendableBuilder, but I'm not sure. So I double check the type of
- // builder here. It may be useless and need more investigation.
- if (builder instanceof ExtendableBuilder) {
- builder.setField(field, lazyField);
- } else {
- builder.setField(field, lazyField.getValue());
- }
- } else {
- extensions.setField(field, lazyField);
- }
- }
- }
-
- public BuilderType mergeUnknownFields(final UnknownFieldSet unknownFields) {
- setUnknownFields(
- UnknownFieldSet.newBuilder(getUnknownFields())
- .mergeFrom(unknownFields)
- .build());
- return (BuilderType) this;
- }
-
- public Message.Builder getFieldBuilder(final FieldDescriptor field) {
- throw new UnsupportedOperationException(
- "getFieldBuilder() called on an unsupported message type.");
- }
-
- /**
- * Construct an UninitializedMessageException reporting missing fields in
- * the given message.
- */
- protected static UninitializedMessageException
- newUninitializedMessageException(Message message) {
- return new UninitializedMessageException(findMissingFields(message));
- }
-
- /**
- * Populates {@code this.missingFields} with the full "path" of each
- * missing required field in the given message.
- */
- private static List<String> findMissingFields(
- final MessageOrBuilder message) {
- final List<String> results = new ArrayList<String>();
- findMissingFields(message, "", results);
- return results;
- }
-
- /** Recursive helper implementing {@link #findMissingFields(Message)}. */
- private static void findMissingFields(final MessageOrBuilder message,
- final String prefix,
- final List<String> results) {
- for (final FieldDescriptor field :
- message.getDescriptorForType().getFields()) {
- if (field.isRequired() && !message.hasField(field)) {
- results.add(prefix + field.getName());
- }
- }
-
- for (final Map.Entry<FieldDescriptor, Object> entry :
- message.getAllFields().entrySet()) {
- final FieldDescriptor field = entry.getKey();
- final Object value = entry.getValue();
-
- if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {
- if (field.isRepeated()) {
- int i = 0;
- for (final Object element : (List) value) {
- findMissingFields((MessageOrBuilder) element,
- subMessagePrefix(prefix, field, i++),
- results);
- }
- } else {
- if (message.hasField(field)) {
- findMissingFields((MessageOrBuilder) value,
- subMessagePrefix(prefix, field, -1),
- results);
- }
- }
- }
- }
- }
-
- private static String subMessagePrefix(final String prefix,
- final FieldDescriptor field,
- final int index) {
- final StringBuilder result = new StringBuilder(prefix);
- if (field.isExtension()) {
- result.append('(')
- .append(field.getFullName())
- .append(')');
- } else {
- result.append(field.getName());
- }
- if (index != -1) {
- result.append('[')
- .append(index)
- .append(']');
- }
- result.append('.');
- return result.toString();
- }
-
- // ===============================================================
- // 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 super.mergeFrom(data);
- }
-
- @Override
- public BuilderType mergeFrom(
- final ByteString data,
- final ExtensionRegistryLite extensionRegistry)
- throws InvalidProtocolBufferException {
- return super.mergeFrom(data, extensionRegistry);
- }
-
- @Override
- public BuilderType mergeFrom(final byte[] data)
- throws InvalidProtocolBufferException {
- return super.mergeFrom(data);
- }
-
- @Override
- public BuilderType mergeFrom(
- final byte[] data, final int off, final int len)
- throws InvalidProtocolBufferException {
- return super.mergeFrom(data, off, len);
- }
-
- @Override
- public BuilderType mergeFrom(
- final byte[] data,
- final ExtensionRegistryLite extensionRegistry)
- throws InvalidProtocolBufferException {
- return super.mergeFrom(data, extensionRegistry);
- }
-
- @Override
- public BuilderType mergeFrom(
- final byte[] data, final int off, final int len,
- final ExtensionRegistryLite extensionRegistry)
- throws InvalidProtocolBufferException {
- return super.mergeFrom(data, off, len, extensionRegistry);
- }
-
- @Override
- public BuilderType mergeFrom(final InputStream input)
- throws IOException {
- return super.mergeFrom(input);
- }
-
- @Override
- public BuilderType mergeFrom(
- final InputStream input,
- final ExtensionRegistryLite extensionRegistry)
- throws IOException {
- return 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);
- }
-
- }
-}

Powered by Google App Engine
This is Rietveld 408576698