diff options
Diffstat (limited to 'java/src/main/java/com/google/protobuf/DynamicMessage.java')
-rw-r--r-- | java/src/main/java/com/google/protobuf/DynamicMessage.java | 27 |
1 files changed, 23 insertions, 4 deletions
diff --git a/java/src/main/java/com/google/protobuf/DynamicMessage.java b/java/src/main/java/com/google/protobuf/DynamicMessage.java index cb44766..c9ce667 100644 --- a/java/src/main/java/com/google/protobuf/DynamicMessage.java +++ b/java/src/main/java/com/google/protobuf/DynamicMessage.java @@ -1,6 +1,6 @@ // Protocol Buffers - Google's data interchange format // Copyright 2008 Google Inc. All rights reserved. -// http://code.google.com/p/protobuf/ +// 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 @@ -38,6 +38,7 @@ import com.google.protobuf.Descriptors.OneofDescriptor; import java.io.InputStream; import java.io.IOException; import java.util.Collections; +import java.util.List; import java.util.Map; /** @@ -483,8 +484,13 @@ public final class DynamicMessage extends AbstractMessage { public Builder setField(FieldDescriptor field, Object value) { verifyContainingType(field); ensureIsMutable(); + // TODO(xiaofeng): This check should really be put in FieldSet.setField() + // where all other such checks are done. However, currently + // FieldSet.setField() permits Integer value for enum fields probably + // because of some internal features we support. Should figure it out + // and move this check to a more appropriate place. if (field.getType() == FieldDescriptor.Type.ENUM) { - verifyEnumType(field, value); + ensureEnumValueDescriptor(field, value); } OneofDescriptor oneofDescriptor = field.getContainingOneof(); if (oneofDescriptor != null) { @@ -572,8 +578,9 @@ public final class DynamicMessage extends AbstractMessage { } } - /** Verifies that the value is EnumValueDescriptor and matchs Enum Type. */ - private void verifyEnumType(FieldDescriptor field, Object value) { + /** Verifies that the value is EnumValueDescriptor and matches Enum Type. */ + private void ensureSingularEnumValueDescriptor( + FieldDescriptor field, Object value) { if (value == null) { throw new NullPointerException(); } @@ -587,6 +594,18 @@ public final class DynamicMessage extends AbstractMessage { } } + /** Verifies the value for an enum field. */ + private void ensureEnumValueDescriptor( + FieldDescriptor field, Object value) { + if (field.isRepeated()) { + for (Object item : (List) value) { + ensureSingularEnumValueDescriptor(field, item); + } + } else { + ensureSingularEnumValueDescriptor(field, value); + } + } + private void ensureIsMutable() { if (fields.isImmutable()) { fields = fields.clone(); |