156
158
//@Override (Java 1.6 override semantics, but we must support 1.5)
159
public boolean hasOneof(final OneofDescriptor oneof) {
160
return internalGetFieldAccessorTable().getOneof(oneof).has(this);
163
//@Override (Java 1.6 override semantics, but we must support 1.5)
164
public FieldDescriptor getOneofFieldDescriptor(final OneofDescriptor oneof) {
165
return internalGetFieldAccessorTable().getOneof(oneof).get(this);
168
//@Override (Java 1.6 override semantics, but we must support 1.5)
157
169
public boolean hasField(final FieldDescriptor field) {
158
170
return internalGetFieldAccessorTable().getField(field).has(this);
347
360
//@Override (Java 1.6 override semantics, but we must support 1.5)
361
public boolean hasOneof(final OneofDescriptor oneof) {
362
return internalGetFieldAccessorTable().getOneof(oneof).has(this);
365
//@Override (Java 1.6 override semantics, but we must support 1.5)
366
public FieldDescriptor getOneofFieldDescriptor(final OneofDescriptor oneof) {
367
return internalGetFieldAccessorTable().getOneof(oneof).get(this);
370
//@Override (Java 1.6 override semantics, but we must support 1.5)
348
371
public boolean hasField(final FieldDescriptor field) {
349
372
return internalGetFieldAccessorTable().getField(field).has(this);
508
537
public interface ExtendableMessageOrBuilder<
509
538
MessageType extends ExtendableMessage> extends MessageOrBuilder {
539
// Re-define for return type covariance.
540
Message getDefaultInstanceForType();
511
542
/** Check if a singular extension is present. */
512
543
<Type> boolean hasExtension(
513
GeneratedExtension<MessageType, Type> extension);
544
Extension<MessageType, Type> extension);
515
546
/** Get the number of elements in a repeated extension. */
516
547
<Type> int getExtensionCount(
517
GeneratedExtension<MessageType, List<Type>> extension);
548
Extension<MessageType, List<Type>> extension);
519
550
/** Get the value of an extension. */
520
<Type> Type getExtension(GeneratedExtension<MessageType, Type> extension);
551
<Type> Type getExtension(
552
Extension<MessageType, Type> extension);
522
554
/** Get one element of a repeated extension. */
523
555
<Type> Type getExtension(
524
GeneratedExtension<MessageType, List<Type>> extension,
556
Extension<MessageType, List<Type>> extension,
658
690
UnknownFieldSet.Builder unknownFields,
659
691
ExtensionRegistryLite extensionRegistry,
660
692
int tag) throws IOException {
661
return AbstractMessage.Builder.mergeFieldFrom(
662
input, unknownFields, extensionRegistry, getDescriptorForType(),
663
null, extensions, tag);
693
return MessageReflection.mergeFieldFrom(
694
input, unknownFields, extensionRegistry, getDescriptorForType(),
695
new MessageReflection.ExtensionAdapter(extensions), tag);
667
700
* Used by parsing constructors in generated classes.
1030
1068
final UnknownFieldSet.Builder unknownFields,
1031
1069
final ExtensionRegistryLite extensionRegistry,
1032
1070
final int tag) throws IOException {
1033
return AbstractMessage.Builder.mergeFieldFrom(
1034
input, unknownFields, extensionRegistry, getDescriptorForType(),
1071
return MessageReflection.mergeFieldFrom(
1072
input, unknownFields, extensionRegistry, getDescriptorForType(),
1073
new MessageReflection.BuilderAdapter(this), tag);
1038
1076
// ---------------------------------------------------------------
1187
1225
// the outer class's descriptor, from which the extension descriptor is
1189
1227
return new GeneratedExtension<ContainingType, Type>(
1190
new ExtensionDescriptorRetriever() {
1228
new CachedDescriptorRetriever() {
1191
1229
//@Override (Java 1.6 override semantics, but we must support 1.5)
1192
public FieldDescriptor getDescriptor() {
1230
public FieldDescriptor loadDescriptor() {
1193
1231
return scope.getDescriptorForType().getExtensions()
1194
1232
.get(descriptorIndex);
1237
Extension.ExtensionType.IMMUTABLE);
1201
1240
/** For use by generated code only. */
1209
1248
return new GeneratedExtension<ContainingType, Type>(
1210
1249
null, // ExtensionDescriptorRetriever is initialized in internalInit();
1252
Extension.ExtensionType.IMMUTABLE);
1255
private abstract static class CachedDescriptorRetriever
1256
implements ExtensionDescriptorRetriever {
1257
private volatile FieldDescriptor descriptor;
1258
protected abstract FieldDescriptor loadDescriptor();
1260
public FieldDescriptor getDescriptor() {
1261
if (descriptor == null) {
1262
synchronized (this) {
1263
if (descriptor == null) {
1264
descriptor = loadDescriptor();
1273
* Used in proto1 generated code only.
1275
* After enabling bridge, we can define proto2 extensions (the extended type
1276
* is a proto2 mutable message) in a proto1 .proto file. For these extensions
1277
* we should generate proto2 GeneratedExtensions.
1279
public static <ContainingType extends Message, Type>
1280
GeneratedExtension<ContainingType, Type>
1281
newMessageScopedGeneratedExtension(
1282
final Message scope, final String name,
1283
final Class singularType, final Message defaultInstance) {
1284
// For extensions scoped within a Message, we use the Message to resolve
1285
// the outer class's descriptor, from which the extension descriptor is
1287
return new GeneratedExtension<ContainingType, Type>(
1288
new CachedDescriptorRetriever() {
1289
protected FieldDescriptor loadDescriptor() {
1290
return scope.getDescriptorForType().findFieldByName(name);
1295
Extension.ExtensionType.MUTABLE);
1299
* Used in proto1 generated code only.
1301
* After enabling bridge, we can define proto2 extensions (the extended type
1302
* is a proto2 mutable message) in a proto1 .proto file. For these extensions
1303
* we should generate proto2 GeneratedExtensions.
1305
public static <ContainingType extends Message, Type>
1306
GeneratedExtension<ContainingType, Type>
1307
newFileScopedGeneratedExtension(
1308
final Class singularType, final Message defaultInstance,
1309
final String descriptorOuterClass, final String extensionName) {
1310
// For extensions scoped within a file, we load the descriptor outer
1311
// class and rely on it to get the FileDescriptor which then can be
1312
// used to obtain the extension's FieldDescriptor.
1313
return new GeneratedExtension<ContainingType, Type>(
1314
new CachedDescriptorRetriever() {
1315
protected FieldDescriptor loadDescriptor() {
1318
singularType.getClassLoader().loadClass(descriptorOuterClass);
1319
FileDescriptor file =
1320
(FileDescriptor) clazz.getField("descriptor").get(null);
1321
return file.findExtensionByName(extensionName);
1322
} catch (Exception e) {
1323
throw new RuntimeException(
1324
"Cannot load descriptors: " + descriptorOuterClass +
1325
" is not a valid descriptor class name", e);
1331
Extension.ExtensionType.MUTABLE);
1237
1356
* these static singletons as parameters to the extension accessors defined
1238
1357
* in {@link ExtendableMessage} and {@link ExtendableBuilder}.
1240
public static final class GeneratedExtension<
1241
ContainingType extends Message, Type> {
1359
public static class GeneratedExtension<
1360
ContainingType extends Message, Type> extends
1361
Extension<ContainingType, Type> {
1242
1362
// TODO(kenton): Find ways to avoid using Java reflection within this
1243
1363
// class. Also try to avoid suppressing unchecked warnings.
1254
1374
// In the case of non-nested extensions, we initialize the
1255
1375
// ExtensionDescriptorRetriever to null and rely on the outer class's static
1256
1376
// initializer to call internalInit() after the descriptor has been parsed.
1257
private GeneratedExtension(ExtensionDescriptorRetriever descriptorRetriever,
1259
Message messageDefaultInstance) {
1377
GeneratedExtension(ExtensionDescriptorRetriever descriptorRetriever,
1379
Message messageDefaultInstance,
1380
ExtensionType extensionType) {
1260
1381
if (Message.class.isAssignableFrom(singularType) &&
1261
1382
!singularType.isInstance(messageDefaultInstance)) {
1262
1383
throw new IllegalArgumentException(
1312
1435
return messageDefaultInstance;
1438
protected ExtensionType getExtensionType() {
1439
return extensionType;
1316
1443
* Convert from the type used by the reflection accessors to the type used
1317
1444
* by native accessors. E.g., for enums, the reflection accessors use
1318
1445
* EnumValueDescriptors but the native accessors use the generated enum
1321
1449
@SuppressWarnings("unchecked")
1322
private Object fromReflectionType(final Object value) {
1450
protected Object fromReflectionType(final Object value) {
1323
1451
FieldDescriptor descriptor = getDescriptor();
1324
1452
if (descriptor.isRepeated()) {
1325
1453
if (descriptor.getJavaType() == FieldDescriptor.JavaType.MESSAGE ||
1342
1470
* Like {@link #fromReflectionType(Object)}, but if the type is a repeated
1343
1471
* type, this converts a single element.
1345
private Object singularFromReflectionType(final Object value) {
1474
protected Object singularFromReflectionType(final Object value) {
1346
1475
FieldDescriptor descriptor = getDescriptor();
1347
1476
switch (descriptor.getJavaType()) {
1349
1478
if (singularType.isInstance(value)) {
1352
// It seems the copy of the embedded message stored inside the
1353
// extended message is not of the exact type the user was
1354
// expecting. This can happen if a user defines a
1355
// GeneratedExtension manually and gives it a different type.
1356
// This should not happen in normal use. But, to be nice, we'll
1357
// copy the message to whatever type the caller was expecting.
1358
1481
return messageDefaultInstance.newBuilderForType()
1359
.mergeFrom((Message) value).build();
1482
.mergeFrom((Message) value).build();
1362
1485
return invokeOrDie(enumValueOf, null, (EnumValueDescriptor) value);
1533
public int getNumber() {
1534
return getDescriptor().getNumber();
1538
public WireFormat.FieldType getLiteType() {
1539
return getDescriptor().getLiteType();
1543
public boolean isRepeated() {
1544
return getDescriptor().isRepeated();
1548
@SuppressWarnings("unchecked")
1549
public Type getDefaultValue() {
1551
return (Type) Collections.emptyList();
1553
if (getDescriptor().getJavaType() == FieldDescriptor.JavaType.MESSAGE) {
1554
return (Type) messageDefaultInstance;
1556
return (Type) singularFromReflectionType(
1557
getDescriptor().getDefaultValue());
1408
1561
// =================================================================
1493
1647
if (initialized) { return this; }
1494
1648
synchronized (this) {
1495
1649
if (initialized) { return this; }
1496
for (int i = 0; i < fields.length; i++) {
1650
int fieldsSize = fields.length;
1651
for (int i = 0; i < fieldsSize; i++) {
1497
1652
FieldDescriptor field = descriptor.getFields().get(i);
1653
String containingOneofCamelCaseName = null;
1654
if (field.getContainingOneof() != null) {
1655
containingOneofCamelCaseName =
1656
camelCaseNames[fieldsSize + field.getContainingOneof().getIndex()];
1498
1658
if (field.isRepeated()) {
1499
1659
if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {
1500
1660
fields[i] = new RepeatedMessageFieldAccessor(
1510
1670
if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {
1511
1671
fields[i] = new SingularMessageFieldAccessor(
1512
field, camelCaseNames[i], messageClass, builderClass);
1672
field, camelCaseNames[i], messageClass, builderClass,
1673
containingOneofCamelCaseName);
1513
1674
} else if (field.getJavaType() == FieldDescriptor.JavaType.ENUM) {
1514
1675
fields[i] = new SingularEnumFieldAccessor(
1515
field, camelCaseNames[i], messageClass, builderClass);
1676
field, camelCaseNames[i], messageClass, builderClass,
1677
containingOneofCamelCaseName);
1517
1679
fields[i] = new SingularFieldAccessor(
1518
field, camelCaseNames[i], messageClass, builderClass);
1680
field, camelCaseNames[i], messageClass, builderClass,
1681
containingOneofCamelCaseName);
1686
int oneofsSize = oneofs.length;
1687
for (int i = 0; i < oneofsSize; i++) {
1688
oneofs[i] = new OneofAccessor(
1689
descriptor, camelCaseNames[i + fieldsSize],
1690
messageClass, builderClass);
1522
1692
initialized = true;
1523
1693
camelCaseNames = null;
1566
1746
Message.Builder getBuilder(GeneratedMessage.Builder builder);
1749
/** OneofAccessor provides access to a single oneof. */
1750
private static class OneofAccessor {
1752
final Descriptor descriptor, final String camelCaseName,
1753
final Class<? extends GeneratedMessage> messageClass,
1754
final Class<? extends Builder> builderClass) {
1755
this.descriptor = descriptor;
1757
getMethodOrDie(messageClass, "get" + camelCaseName + "Case");
1759
getMethodOrDie(builderClass, "get" + camelCaseName + "Case");
1760
clearMethod = getMethodOrDie(builderClass, "clear" + camelCaseName);
1763
private final Descriptor descriptor;
1764
private final Method caseMethod;
1765
private final Method caseMethodBuilder;
1766
private final Method clearMethod;
1768
public boolean has(final GeneratedMessage message) {
1769
if (((Internal.EnumLite) invokeOrDie(caseMethod, message)).getNumber() == 0) {
1775
public boolean has(GeneratedMessage.Builder builder) {
1776
if (((Internal.EnumLite) invokeOrDie(caseMethodBuilder, builder)).getNumber() == 0) {
1782
public FieldDescriptor get(final GeneratedMessage message) {
1783
int fieldNumber = ((Internal.EnumLite) invokeOrDie(caseMethod, message)).getNumber();
1784
if (fieldNumber > 0) {
1785
return descriptor.findFieldByNumber(fieldNumber);
1790
public FieldDescriptor get(GeneratedMessage.Builder builder) {
1791
int fieldNumber = ((Internal.EnumLite) invokeOrDie(caseMethodBuilder, builder)).getNumber();
1792
if (fieldNumber > 0) {
1793
return descriptor.findFieldByNumber(fieldNumber);
1798
public void clear(final Builder builder) {
1799
invokeOrDie(clearMethod, builder);
1803
private static boolean supportFieldPresence(FileDescriptor file) {
1569
1807
// ---------------------------------------------------------------
1571
1809
private static class SingularFieldAccessor implements FieldAccessor {
1572
1810
SingularFieldAccessor(
1573
1811
final FieldDescriptor descriptor, final String camelCaseName,
1574
1812
final Class<? extends GeneratedMessage> messageClass,
1575
final Class<? extends Builder> builderClass) {
1813
final Class<? extends Builder> builderClass,
1814
final String containingOneofCamelCaseName) {
1816
isOneofField = descriptor.getContainingOneof() != null;
1817
hasHasMethod = supportFieldPresence(descriptor.getFile())
1818
|| (!isOneofField && descriptor.getJavaType() == FieldDescriptor.JavaType.MESSAGE);
1576
1819
getMethod = getMethodOrDie(messageClass, "get" + camelCaseName);
1577
1820
getMethodBuilder = getMethodOrDie(builderClass, "get" + camelCaseName);
1578
1821
type = getMethod.getReturnType();
1579
1822
setMethod = getMethodOrDie(builderClass, "set" + camelCaseName, type);
1581
getMethodOrDie(messageClass, "has" + camelCaseName);
1824
hasHasMethod ? getMethodOrDie(messageClass, "has" + camelCaseName) : null;
1582
1825
hasMethodBuilder =
1583
getMethodOrDie(builderClass, "has" + camelCaseName);
1826
hasHasMethod ? getMethodOrDie(builderClass, "has" + camelCaseName) : null;
1584
1827
clearMethod = getMethodOrDie(builderClass, "clear" + camelCaseName);
1828
caseMethod = isOneofField ? getMethodOrDie(
1829
messageClass, "get" + containingOneofCamelCaseName + "Case") : null;
1830
caseMethodBuilder = isOneofField ? getMethodOrDie(
1831
builderClass, "get" + containingOneofCamelCaseName + "Case") : null;
1587
1834
// Note: We use Java reflection to call public methods rather than
1594
1841
protected final Method hasMethod;
1595
1842
protected final Method hasMethodBuilder;
1596
1843
protected final Method clearMethod;
1844
protected final Method caseMethod;
1845
protected final Method caseMethodBuilder;
1846
protected final FieldDescriptor field;
1847
protected final boolean isOneofField;
1848
protected final boolean hasHasMethod;
1850
private int getOneofFieldNumber(final GeneratedMessage message) {
1851
return ((Internal.EnumLite) invokeOrDie(caseMethod, message)).getNumber();
1854
private int getOneofFieldNumber(final GeneratedMessage.Builder builder) {
1855
return ((Internal.EnumLite) invokeOrDie(caseMethodBuilder, builder)).getNumber();
1598
1858
public Object get(final GeneratedMessage message) {
1599
1859
return invokeOrDie(getMethod, message);
1623
1883
"addRepeatedField() called on a singular field.");
1625
1885
public boolean has(final GeneratedMessage message) {
1886
if (!hasHasMethod) {
1888
return getOneofFieldNumber(message) == field.getNumber();
1890
return !get(message).equals(field.getDefaultValue());
1626
1892
return (Boolean) invokeOrDie(hasMethod, message);
1628
1894
public boolean has(GeneratedMessage.Builder builder) {
1895
if (!hasHasMethod) {
1897
return getOneofFieldNumber(builder) == field.getNumber();
1899
return !get(builder).equals(field.getDefaultValue());
1629
1901
return (Boolean) invokeOrDie(hasMethodBuilder, builder);
1631
1903
public int getRepeatedCount(final GeneratedMessage message) {
1751
2023
SingularEnumFieldAccessor(
1752
2024
final FieldDescriptor descriptor, final String camelCaseName,
1753
2025
final Class<? extends GeneratedMessage> messageClass,
1754
final Class<? extends Builder> builderClass) {
1755
super(descriptor, camelCaseName, messageClass, builderClass);
2026
final Class<? extends Builder> builderClass,
2027
final String containingOneofCamelCaseName) {
2028
super(descriptor, camelCaseName, messageClass, builderClass, containingOneofCamelCaseName);
1757
2030
valueOfMethod = getMethodOrDie(type, "valueOf",
1758
2031
EnumValueDescriptor.class);
1847
2120
SingularMessageFieldAccessor(
1848
2121
final FieldDescriptor descriptor, final String camelCaseName,
1849
2122
final Class<? extends GeneratedMessage> messageClass,
1850
final Class<? extends Builder> builderClass) {
1851
super(descriptor, camelCaseName, messageClass, builderClass);
2123
final Class<? extends Builder> builderClass,
2124
final String containingOneofCamelCaseName) {
2125
super(descriptor, camelCaseName, messageClass, builderClass, containingOneofCamelCaseName);
1853
2127
newBuilderMethod = getMethodOrDie(type, "newBuilder");
1854
2128
getBuilderMethodBuilder =