|
@@ -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();
|