diff options
author | Feng Xiao <xfxyjwf@gmail.com> | 2014-11-14 11:50:31 -0800 |
---|---|---|
committer | Feng Xiao <xfxyjwf@gmail.com> | 2014-11-14 11:50:31 -0800 |
commit | f157a5651c79a7a36e242af216a5d5b383ba8af2 (patch) | |
tree | 368bb0ca0e89ab7514302e4df00435a4ef461a28 /java/src | |
parent | faf581d20866ad5e586b3e515f6c547d2dcec2c1 (diff) | |
download | protobuf-f157a5651c79a7a36e242af216a5d5b383ba8af2.tar.gz protobuf-f157a5651c79a7a36e242af216a5d5b383ba8af2.tar.bz2 protobuf-f157a5651c79a7a36e242af216a5d5b383ba8af2.zip |
Down-integrate from internal code base (C++ maps support).
Diffstat (limited to 'java/src')
6 files changed, 49 insertions, 17 deletions
diff --git a/java/src/main/java/com/google/protobuf/GeneratedMessageLite.java b/java/src/main/java/com/google/protobuf/GeneratedMessageLite.java index 8fe33bc6..06492cc9 100644 --- a/java/src/main/java/com/google/protobuf/GeneratedMessageLite.java +++ b/java/src/main/java/com/google/protobuf/GeneratedMessageLite.java @@ -81,22 +81,18 @@ public abstract class GeneratedMessageLite extends AbstractMessageLite return unknownFields.mergeFieldFrom(tag, input); } - /** - * Used by parsing constructors in generated classes. - */ - protected void makeExtensionsImmutable() { - // Noop for messages without extensions. - } - @SuppressWarnings("unchecked") public abstract static class Builder<MessageType extends GeneratedMessageLite, BuilderType extends Builder> extends AbstractMessageLite.Builder<BuilderType> { + private final MessageType defaultInstance; private UnknownFieldSetLite unknownFields = UnknownFieldSetLite.getDefaultInstance(); - protected Builder() {} + protected Builder(MessageType defaultInstance) { + this.defaultInstance = defaultInstance; + } //@Override (Java 1.6 override semantics, but we must support 1.5) public BuilderType clear() { @@ -111,15 +107,25 @@ public abstract class GeneratedMessageLite extends AbstractMessageLite builder.mergeFrom(buildPartial()); return builder; } - + /** All subclasses implement this. */ public abstract MessageType buildPartial(); + //@Override (Java 1.6 override semantics, but we must support 1.5) + public final MessageType build() { + MessageType result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + /** All subclasses implement this. */ public abstract BuilderType mergeFrom(MessageType message); - - // Defined here for return type covariance. - public abstract MessageType getDefaultInstanceForType(); + + public MessageType getDefaultInstanceForType() { + return defaultInstance; + } /** * Called by subclasses to parse an unknown field. @@ -288,8 +294,8 @@ public abstract class GeneratedMessageLite extends AbstractMessageLite /** * Used by parsing constructors in generated classes. */ - @Override - protected void makeExtensionsImmutable() { + protected static void makeExtensionsImmutable( + FieldSet<ExtensionDescriptor> extensions) { extensions.makeImmutable(); } @@ -361,7 +367,9 @@ public abstract class GeneratedMessageLite extends AbstractMessageLite BuilderType extends ExtendableBuilder<MessageType, BuilderType>> extends Builder<MessageType, BuilderType> implements ExtendableMessageOrBuilder<MessageType> { - protected ExtendableBuilder() {} + protected ExtendableBuilder(MessageType defaultInstance) { + super(defaultInstance); + } private FieldSet<ExtensionDescriptor> extensions = FieldSet.emptySet(); private boolean extensionsIsMutable; diff --git a/java/src/main/java/com/google/protobuf/MapEntry.java b/java/src/main/java/com/google/protobuf/MapEntry.java index 8e3551b6..31414bb4 100644 --- a/java/src/main/java/com/google/protobuf/MapEntry.java +++ b/java/src/main/java/com/google/protobuf/MapEntry.java @@ -282,7 +282,7 @@ public final class MapEntry<K, V> extends AbstractMessage { @Override public MapEntry<K, V> buildPartial() { if (dataBuilder != null) { - data = dataBuilder.build(); + data = dataBuilder.buildPartial(); dataBuilder = null; } return new MapEntry<K, V>(metadata, data); diff --git a/java/src/main/java/com/google/protobuf/MapField.java b/java/src/main/java/com/google/protobuf/MapField.java index 5bd70dbb..82906d37 100644 --- a/java/src/main/java/com/google/protobuf/MapField.java +++ b/java/src/main/java/com/google/protobuf/MapField.java @@ -91,7 +91,7 @@ public class MapField<K, V> { } public Message convertKeyAndValueToMessage(K key, V value) { - return defaultEntry.newBuilderForType().setKey(key).setValue(value).build(); + return defaultEntry.newBuilderForType().setKey(key).setValue(value).buildPartial(); } public void convertMessageToKeyAndValue(Message message, Map<K, V> map) { diff --git a/java/src/test/java/com/google/protobuf/MapForProto2Test.java b/java/src/test/java/com/google/protobuf/MapForProto2Test.java index d78c0d94..33ba7150 100644 --- a/java/src/test/java/com/google/protobuf/MapForProto2Test.java +++ b/java/src/test/java/com/google/protobuf/MapForProto2Test.java @@ -33,6 +33,7 @@ package com.google.protobuf; import com.google.protobuf.Descriptors.FieldDescriptor; import map_test.MapForProto2TestProto.TestMap; import map_test.MapForProto2TestProto.TestMap.MessageValue; +import map_test.MapForProto2TestProto.TestMap.MessageWithRequiredFields; import map_test.MapForProto2TestProto.TestUnknownEnumValue; import junit.framework.TestCase; @@ -485,4 +486,17 @@ public class MapForProto2Test extends TestCase { assertEquals(54321, messageWithUnknownEnums.getInt32ToInt32Field().get(2).intValue()); } + + public void testRequiredMessage() throws Exception { + TestMap.Builder builder = TestMap.newBuilder(); + builder.getMutableRequiredMessageMap().put(0, + MessageWithRequiredFields.newBuilder().buildPartial()); + TestMap message = builder.buildPartial(); + assertFalse(message.isInitialized()); + + builder.getMutableRequiredMessageMap().put(0, + MessageWithRequiredFields.newBuilder().setValue(1).build()); + message = builder.build(); + assertTrue(message.isInitialized()); + } } diff --git a/java/src/test/java/com/google/protobuf/map_for_proto2_lite_test.proto b/java/src/test/java/com/google/protobuf/map_for_proto2_lite_test.proto index 4f23a4a8..a1fe856c 100644 --- a/java/src/test/java/com/google/protobuf/map_for_proto2_lite_test.proto +++ b/java/src/test/java/com/google/protobuf/map_for_proto2_lite_test.proto @@ -51,6 +51,11 @@ message TestMap { map<int32, EnumValue> int32_to_enum_field = 4; map<int32, MessageValue> int32_to_message_field = 5; map<string, int32> string_to_int32_field = 6; + + message MessageWithRequiredFields { + required int32 value = 1; + } + map<int32, MessageWithRequiredFields> required_message_map = 11; } message TestUnknownEnumValue { diff --git a/java/src/test/java/com/google/protobuf/map_for_proto2_test.proto b/java/src/test/java/com/google/protobuf/map_for_proto2_test.proto index 36dfbd10..a0ec7ac5 100644 --- a/java/src/test/java/com/google/protobuf/map_for_proto2_test.proto +++ b/java/src/test/java/com/google/protobuf/map_for_proto2_test.proto @@ -53,6 +53,11 @@ message TestMap { map<int32, EnumValue> int32_to_enum_field = 4; map<int32, MessageValue> int32_to_message_field = 5; map<string, int32> string_to_int32_field = 6; + + message MessageWithRequiredFields { + required int32 value = 1; + } + map<int32, MessageWithRequiredFields> required_message_map = 11; } message TestUnknownEnumValue { |