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) { ensureEnumValueDescriptor(field, value); } OneofDescriptor oneofDescriptor = field.getContainingOneof(); if (oneofDescriptor != null) { int index = oneofDescriptor.getIndex(); FieldDescriptor oldField = oneofCases[index]; if ((oldField != null) && (oldField != field)) { fields.clearField(oldField); } oneofCases[index] = field; } fields.setField(field, value); return this; }
@Override 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) { ensureEnumValueDescriptor(field, value); } OneofDescriptor oneofDescriptor = field.getContainingOneof(); if (oneofDescriptor != null) { int index = oneofDescriptor.getIndex(); FieldDescriptor oldField = oneofCases[index]; if ((oldField != null) && (oldField != field)) { fields.clearField(oldField); } oneofCases[index] = field; } fields.setField(field, value); return this; }
public Builder setField(FieldDescriptor field, Object value) { verifyContainingType(field); ensureIsMutable(); if (field.getType() == FieldDescriptor.Type.ENUM) { verifyEnumType(field, value); } OneofDescriptor oneofDescriptor = field.getContainingOneof(); if (oneofDescriptor != null) { int index = oneofDescriptor.getIndex(); FieldDescriptor oldField = oneofCases[index]; if ((oldField != null) && (oldField != field)) { fields.clearField(oldField); } oneofCases[index] = field; } fields.setField(field, value); return this; }
public boolean hasOneof(OneofDescriptor oneof) { verifyOneofContainingType(oneof); FieldDescriptor field = oneofCases[oneof.getIndex()]; if (field == null) { return false; } return true; }
/** Verifies that the oneof is an oneof of this message. */ private void verifyOneofContainingType(OneofDescriptor oneof) { if (oneof.getContainingType() != type) { throw new IllegalArgumentException( "OneofDescriptor does not match message type."); } }
public Builder clearOneof(OneofDescriptor oneof) { verifyOneofContainingType(oneof); FieldDescriptor field = oneofCases[oneof.getIndex()]; if (field != null) { clearField(field); } return this; }
public Builder clearField(FieldDescriptor field) { verifyContainingType(field); ensureIsMutable(); OneofDescriptor oneofDescriptor = field.getContainingOneof(); if (oneofDescriptor != null) { int index = oneofDescriptor.getIndex(); if (oneofCases[index] == field) { oneofCases[index] = null; } } fields.clearField(field); return this; }
/** Get the OneofAccessor for a particular oneof. */ private OneofAccessor getOneof(final OneofDescriptor oneof) { if (oneof.getContainingType() != descriptor) { throw new IllegalArgumentException( "OneofDescriptor does not match message type."); } return oneofs[oneof.getIndex()]; }
@Override public boolean hasOneof(OneofDescriptor oneof) { verifyOneofContainingType(oneof); FieldDescriptor field = oneofCases[oneof.getIndex()]; if (field == null) { return false; } return true; }
@Override public Builder clearOneof(OneofDescriptor oneof) { verifyOneofContainingType(oneof); FieldDescriptor field = oneofCases[oneof.getIndex()]; if (field != null) { clearField(field); } return this; }
@Override public Builder clearField(FieldDescriptor field) { verifyContainingType(field); ensureIsMutable(); OneofDescriptor oneofDescriptor = field.getContainingOneof(); if (oneofDescriptor != null) { int index = oneofDescriptor.getIndex(); if (oneofCases[index] == field) { oneofCases[index] = null; } } fields.clearField(field); return this; }
public void testDynamicOneofMessage() throws Exception { DynamicMessage.Builder builder = DynamicMessage.newBuilder(TestAllTypes.getDescriptor()); OneofDescriptor oneof = TestAllTypes.getDescriptor().getOneofs().get(0); assertFalse(builder.hasOneof(oneof)); assertSame(null, builder.getOneofFieldDescriptor(oneof)); reflectionTester.setAllFieldsViaReflection(builder); assertTrue(builder.hasOneof(oneof)); FieldDescriptor field = oneof.getField(3); assertSame(field, builder.getOneofFieldDescriptor(oneof)); DynamicMessage message = builder.buildPartial(); assertTrue(message.hasOneof(oneof)); DynamicMessage.Builder mergedBuilder = DynamicMessage.newBuilder(TestAllTypes.getDescriptor()); FieldDescriptor mergedField = oneof.getField(0); mergedBuilder.setField(mergedField, 123); assertTrue(mergedBuilder.hasField(mergedField)); mergedBuilder.mergeFrom(message); assertTrue(mergedBuilder.hasField(field)); assertFalse(mergedBuilder.hasField(mergedField)); builder.clearOneof(oneof); assertSame(null, builder.getOneofFieldDescriptor(oneof)); message = builder.build(); assertSame(null, message.getOneofFieldDescriptor(oneof)); }