| OLD | NEW |
| 1 // Protocol Buffers - Google's data interchange format | 1 // Protocol Buffers - Google's data interchange format |
| 2 // Copyright 2008 Google Inc. All rights reserved. | 2 // Copyright 2008 Google Inc. All rights reserved. |
| 3 // http://code.google.com/p/protobuf/ | 3 // http://code.google.com/p/protobuf/ |
| 4 // | 4 // |
| 5 // Redistribution and use in source and binary forms, with or without | 5 // Redistribution and use in source and binary forms, with or without |
| 6 // modification, are permitted provided that the following conditions are | 6 // modification, are permitted provided that the following conditions are |
| 7 // met: | 7 // met: |
| 8 // | 8 // |
| 9 // * Redistributions of source code must retain the above copyright | 9 // * Redistributions of source code must retain the above copyright |
| 10 // notice, this list of conditions and the following disclaimer. | 10 // notice, this list of conditions and the following disclaimer. |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 51 * implements most of the Message and Builder interfaces using Java reflection. | 51 * implements most of the Message and Builder interfaces using Java reflection. |
| 52 * Users can ignore this class and pretend that generated messages implement | 52 * Users can ignore this class and pretend that generated messages implement |
| 53 * the Message interface directly. | 53 * the Message interface directly. |
| 54 * | 54 * |
| 55 * @author kenton@google.com Kenton Varda | 55 * @author kenton@google.com Kenton Varda |
| 56 */ | 56 */ |
| 57 public abstract class GeneratedMessage extends AbstractMessage | 57 public abstract class GeneratedMessage extends AbstractMessage |
| 58 implements Serializable { | 58 implements Serializable { |
| 59 private static final long serialVersionUID = 1L; | 59 private static final long serialVersionUID = 1L; |
| 60 | 60 |
| 61 private final UnknownFieldSet unknownFields; | |
| 62 | |
| 63 /** | 61 /** |
| 64 * For testing. Allows a test to disable the optimization that avoids using | 62 * For testing. Allows a test to disable the optimization that avoids using |
| 65 * field builders for nested messages until they are requested. By disabling | 63 * field builders for nested messages until they are requested. By disabling |
| 66 * this optimization, existing tests can be reused to test the field builders. | 64 * this optimization, existing tests can be reused to test the field builders. |
| 67 */ | 65 */ |
| 68 protected static boolean alwaysUseFieldBuilders = false; | 66 protected static boolean alwaysUseFieldBuilders = false; |
| 69 | 67 |
| 70 protected GeneratedMessage() { | 68 protected GeneratedMessage() { |
| 71 this.unknownFields = UnknownFieldSet.getDefaultInstance(); | |
| 72 } | 69 } |
| 73 | 70 |
| 74 protected GeneratedMessage(Builder<?> builder) { | 71 protected GeneratedMessage(Builder<?> builder) { |
| 75 this.unknownFields = builder.getUnknownFields(); | 72 } |
| 73 |
| 74 public Parser<? extends Message> getParserForType() { |
| 75 throw new UnsupportedOperationException( |
| 76 "This is supposed to be overridden by subclasses."); |
| 76 } | 77 } |
| 77 | 78 |
| 78 /** | 79 /** |
| 79 * For testing. Allows a test to disable the optimization that avoids using | 80 * For testing. Allows a test to disable the optimization that avoids using |
| 80 * field builders for nested messages until they are requested. By disabling | 81 * field builders for nested messages until they are requested. By disabling |
| 81 * this optimization, existing tests can be reused to test the field builders. | 82 * this optimization, existing tests can be reused to test the field builders. |
| 82 * See {@link RepeatedFieldBuilder} and {@link SingleFieldBuilder}. | 83 * See {@link RepeatedFieldBuilder} and {@link SingleFieldBuilder}. |
| 83 */ | 84 */ |
| 84 static void enableAlwaysUseFieldBuildersForTesting() { | 85 static void enableAlwaysUseFieldBuildersForTesting() { |
| 85 alwaysUseFieldBuilders = true; | 86 alwaysUseFieldBuilders = true; |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 168 .getRepeatedCount(this); | 169 .getRepeatedCount(this); |
| 169 } | 170 } |
| 170 | 171 |
| 171 //@Override (Java 1.6 override semantics, but we must support 1.5) | 172 //@Override (Java 1.6 override semantics, but we must support 1.5) |
| 172 public Object getRepeatedField(final FieldDescriptor field, final int index) { | 173 public Object getRepeatedField(final FieldDescriptor field, final int index) { |
| 173 return internalGetFieldAccessorTable().getField(field) | 174 return internalGetFieldAccessorTable().getField(field) |
| 174 .getRepeated(this, index); | 175 .getRepeated(this, index); |
| 175 } | 176 } |
| 176 | 177 |
| 177 //@Override (Java 1.6 override semantics, but we must support 1.5) | 178 //@Override (Java 1.6 override semantics, but we must support 1.5) |
| 178 public final UnknownFieldSet getUnknownFields() { | 179 public UnknownFieldSet getUnknownFields() { |
| 179 return unknownFields; | 180 throw new UnsupportedOperationException( |
| 181 "This is supposed to be overridden by subclasses."); |
| 182 } |
| 183 |
| 184 /** |
| 185 * Called by subclasses to parse an unknown field. |
| 186 * @return {@code true} unless the tag is an end-group tag. |
| 187 */ |
| 188 protected boolean parseUnknownField( |
| 189 CodedInputStream input, |
| 190 UnknownFieldSet.Builder unknownFields, |
| 191 ExtensionRegistryLite extensionRegistry, |
| 192 int tag) throws IOException { |
| 193 return unknownFields.mergeFieldFrom(tag, input); |
| 194 } |
| 195 |
| 196 /** |
| 197 * Used by parsing constructors in generated classes. |
| 198 */ |
| 199 protected void makeExtensionsImmutable() { |
| 200 // Noop for messages without extensions. |
| 180 } | 201 } |
| 181 | 202 |
| 182 protected abstract Message.Builder newBuilderForType(BuilderParent parent); | 203 protected abstract Message.Builder newBuilderForType(BuilderParent parent); |
| 183 | 204 |
| 184 /** | 205 /** |
| 185 * Interface for the parent of a Builder that allows the builder to | 206 * Interface for the parent of a Builder that allows the builder to |
| 186 * communicate invalidations back to the parent for use when using nested | 207 * communicate invalidations back to the parent for use when using nested |
| 187 * builders. | 208 * builders. |
| 188 */ | 209 */ |
| 189 protected interface BuilderParent { | 210 protected interface BuilderParent { |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 312 } | 333 } |
| 313 return result; | 334 return result; |
| 314 } | 335 } |
| 315 | 336 |
| 316 public Message.Builder newBuilderForField( | 337 public Message.Builder newBuilderForField( |
| 317 final FieldDescriptor field) { | 338 final FieldDescriptor field) { |
| 318 return internalGetFieldAccessorTable().getField(field).newBuilder(); | 339 return internalGetFieldAccessorTable().getField(field).newBuilder(); |
| 319 } | 340 } |
| 320 | 341 |
| 321 //@Override (Java 1.6 override semantics, but we must support 1.5) | 342 //@Override (Java 1.6 override semantics, but we must support 1.5) |
| 343 public Message.Builder getFieldBuilder(final FieldDescriptor field) { |
| 344 return internalGetFieldAccessorTable().getField(field).getBuilder(this); |
| 345 } |
| 346 |
| 347 //@Override (Java 1.6 override semantics, but we must support 1.5) |
| 322 public boolean hasField(final FieldDescriptor field) { | 348 public boolean hasField(final FieldDescriptor field) { |
| 323 return internalGetFieldAccessorTable().getField(field).has(this); | 349 return internalGetFieldAccessorTable().getField(field).has(this); |
| 324 } | 350 } |
| 325 | 351 |
| 326 //@Override (Java 1.6 override semantics, but we must support 1.5) | 352 //@Override (Java 1.6 override semantics, but we must support 1.5) |
| 327 public Object getField(final FieldDescriptor field) { | 353 public Object getField(final FieldDescriptor field) { |
| 328 Object object = internalGetFieldAccessorTable().getField(field).get(this); | 354 Object object = internalGetFieldAccessorTable().getField(field).get(this); |
| 329 if (field.isRepeated()) { | 355 if (field.isRepeated()) { |
| 330 // The underlying list object is still modifiable at this point. | 356 // The underlying list object is still modifiable at this point. |
| 331 // Make sure not to expose the modifiable list to the caller. | 357 // Make sure not to expose the modifiable list to the caller. |
| (...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 619 /** Called by subclasses to check if all extensions are initialized. */ | 645 /** Called by subclasses to check if all extensions are initialized. */ |
| 620 protected boolean extensionsAreInitialized() { | 646 protected boolean extensionsAreInitialized() { |
| 621 return extensions.isInitialized(); | 647 return extensions.isInitialized(); |
| 622 } | 648 } |
| 623 | 649 |
| 624 @Override | 650 @Override |
| 625 public boolean isInitialized() { | 651 public boolean isInitialized() { |
| 626 return super.isInitialized() && extensionsAreInitialized(); | 652 return super.isInitialized() && extensionsAreInitialized(); |
| 627 } | 653 } |
| 628 | 654 |
| 655 @Override |
| 656 protected boolean parseUnknownField( |
| 657 CodedInputStream input, |
| 658 UnknownFieldSet.Builder unknownFields, |
| 659 ExtensionRegistryLite extensionRegistry, |
| 660 int tag) throws IOException { |
| 661 return AbstractMessage.Builder.mergeFieldFrom( |
| 662 input, unknownFields, extensionRegistry, getDescriptorForType(), |
| 663 null, extensions, tag); |
| 664 } |
| 665 |
| 666 /** |
| 667 * Used by parsing constructors in generated classes. |
| 668 */ |
| 669 @Override |
| 670 protected void makeExtensionsImmutable() { |
| 671 extensions.makeImmutable(); |
| 672 } |
| 673 |
| 629 /** | 674 /** |
| 630 * Used by subclasses to serialize extensions. Extension ranges may be | 675 * Used by subclasses to serialize extensions. Extension ranges may be |
| 631 * interleaved with field numbers, but we must write them in canonical | 676 * interleaved with field numbers, but we must write them in canonical |
| 632 * (sorted by field number) order. ExtensionWriter helps us write | 677 * (sorted by field number) order. ExtensionWriter helps us write |
| 633 * individual ranges of extensions at once. | 678 * individual ranges of extensions at once. |
| 634 */ | 679 */ |
| 635 protected class ExtensionWriter { | 680 protected class ExtensionWriter { |
| 636 // Imagine how much simpler this code would be if Java iterators had | 681 // Imagine how much simpler this code would be if Java iterators had |
| 637 // a way to get the next element without advancing the iterator. | 682 // a way to get the next element without advancing the iterator. |
| 638 | 683 |
| 639 private final Iterator<Map.Entry<FieldDescriptor, Object>> iter = | 684 private final Iterator<Map.Entry<FieldDescriptor, Object>> iter = |
| 640 extensions.iterator(); | 685 extensions.iterator(); |
| 641 private Map.Entry<FieldDescriptor, Object> next; | 686 private Map.Entry<FieldDescriptor, Object> next; |
| 642 private final boolean messageSetWireFormat; | 687 private final boolean messageSetWireFormat; |
| 643 | 688 |
| 644 private ExtensionWriter(final boolean messageSetWireFormat) { | 689 private ExtensionWriter(final boolean messageSetWireFormat) { |
| 645 if (iter.hasNext()) { | 690 if (iter.hasNext()) { |
| 646 next = iter.next(); | 691 next = iter.next(); |
| 647 } | 692 } |
| 648 this.messageSetWireFormat = messageSetWireFormat; | 693 this.messageSetWireFormat = messageSetWireFormat; |
| 649 } | 694 } |
| 650 | 695 |
| 651 public void writeUntil(final int end, final CodedOutputStream output) | 696 public void writeUntil(final int end, final CodedOutputStream output) |
| 652 throws IOException { | 697 throws IOException { |
| 653 while (next != null && next.getKey().getNumber() < end) { | 698 while (next != null && next.getKey().getNumber() < end) { |
| 654 FieldDescriptor descriptor = next.getKey(); | 699 FieldDescriptor descriptor = next.getKey(); |
| 655 if (messageSetWireFormat && descriptor.getLiteJavaType() == | 700 if (messageSetWireFormat && descriptor.getLiteJavaType() == |
| 656 WireFormat.JavaType.MESSAGE && | 701 WireFormat.JavaType.MESSAGE && |
| 657 !descriptor.isRepeated()) { | 702 !descriptor.isRepeated()) { |
| 658 output.writeMessageSetExtension(descriptor.getNumber(), | 703 if (next instanceof LazyField.LazyEntry<?>) { |
| 659 (Message) next.getValue()); | 704 output.writeRawMessageSetExtension(descriptor.getNumber(), |
| 705 ((LazyField.LazyEntry<?>) next).getField().toByteString()); |
| 706 } else { |
| 707 output.writeMessageSetExtension(descriptor.getNumber(), |
| 708 (Message) next.getValue()); |
| 709 } |
| 660 } else { | 710 } else { |
| 711 // TODO(xiangl): Taken care of following code, it may cause |
| 712 // problem when we use LazyField for normal fields/extensions. |
| 713 // Due to the optional field can be duplicated at the end of |
| 714 // serialized bytes, which will make the serialized size change |
| 715 // after lazy field parsed. So when we use LazyField globally, |
| 716 // we need to change the following write method to write cached |
| 717 // bytes directly rather than write the parsed message. |
| 661 FieldSet.writeField(descriptor, next.getValue(), output); | 718 FieldSet.writeField(descriptor, next.getValue(), output); |
| 662 } | 719 } |
| 663 if (iter.hasNext()) { | 720 if (iter.hasNext()) { |
| 664 next = iter.next(); | 721 next = iter.next(); |
| 665 } else { | 722 } else { |
| 666 next = null; | 723 next = null; |
| 667 } | 724 } |
| 668 } | 725 } |
| 669 } | 726 } |
| 670 } | 727 } |
| (...skipping 296 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 967 * Called by subclasses to parse an unknown field or an extension. | 1024 * Called by subclasses to parse an unknown field or an extension. |
| 968 * @return {@code true} unless the tag is an end-group tag. | 1025 * @return {@code true} unless the tag is an end-group tag. |
| 969 */ | 1026 */ |
| 970 @Override | 1027 @Override |
| 971 protected boolean parseUnknownField( | 1028 protected boolean parseUnknownField( |
| 972 final CodedInputStream input, | 1029 final CodedInputStream input, |
| 973 final UnknownFieldSet.Builder unknownFields, | 1030 final UnknownFieldSet.Builder unknownFields, |
| 974 final ExtensionRegistryLite extensionRegistry, | 1031 final ExtensionRegistryLite extensionRegistry, |
| 975 final int tag) throws IOException { | 1032 final int tag) throws IOException { |
| 976 return AbstractMessage.Builder.mergeFieldFrom( | 1033 return AbstractMessage.Builder.mergeFieldFrom( |
| 977 input, unknownFields, extensionRegistry, this, tag); | 1034 input, unknownFields, extensionRegistry, getDescriptorForType(), |
| 1035 this, null, tag); |
| 978 } | 1036 } |
| 979 | 1037 |
| 980 // --------------------------------------------------------------- | 1038 // --------------------------------------------------------------- |
| 981 // Reflection | 1039 // Reflection |
| 982 | 1040 |
| 983 @Override | 1041 @Override |
| 984 public Map<FieldDescriptor, Object> getAllFields() { | 1042 public Map<FieldDescriptor, Object> getAllFields() { |
| 985 final Map<FieldDescriptor, Object> result = super.getAllFieldsMutable(); | 1043 final Map<FieldDescriptor, Object> result = super.getAllFieldsMutable(); |
| 986 result.putAll(extensions.getAllFields()); | 1044 result.putAll(extensions.getAllFields()); |
| 987 return Collections.unmodifiableMap(result); | 1045 return Collections.unmodifiableMap(result); |
| (...skipping 410 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1398 * @param camelCaseNames The camelcase names of all fields in the message. | 1456 * @param camelCaseNames The camelcase names of all fields in the message. |
| 1399 * These are used to derive the accessor method names. | 1457 * These are used to derive the accessor method names. |
| 1400 * @param messageClass The message type. | 1458 * @param messageClass The message type. |
| 1401 * @param builderClass The builder type. | 1459 * @param builderClass The builder type. |
| 1402 */ | 1460 */ |
| 1403 public FieldAccessorTable( | 1461 public FieldAccessorTable( |
| 1404 final Descriptor descriptor, | 1462 final Descriptor descriptor, |
| 1405 final String[] camelCaseNames, | 1463 final String[] camelCaseNames, |
| 1406 final Class<? extends GeneratedMessage> messageClass, | 1464 final Class<? extends GeneratedMessage> messageClass, |
| 1407 final Class<? extends Builder> builderClass) { | 1465 final Class<? extends Builder> builderClass) { |
| 1466 this(descriptor, camelCaseNames); |
| 1467 ensureFieldAccessorsInitialized(messageClass, builderClass); |
| 1468 } |
| 1469 |
| 1470 /** |
| 1471 * Construct a FieldAccessorTable for a particular message class without |
| 1472 * initializing FieldAccessors. |
| 1473 */ |
| 1474 public FieldAccessorTable( |
| 1475 final Descriptor descriptor, |
| 1476 final String[] camelCaseNames) { |
| 1408 this.descriptor = descriptor; | 1477 this.descriptor = descriptor; |
| 1478 this.camelCaseNames = camelCaseNames; |
| 1409 fields = new FieldAccessor[descriptor.getFields().size()]; | 1479 fields = new FieldAccessor[descriptor.getFields().size()]; |
| 1480 initialized = false; |
| 1481 } |
| 1410 | 1482 |
| 1411 for (int i = 0; i < fields.length; i++) { | 1483 /** |
| 1412 final FieldDescriptor field = descriptor.getFields().get(i); | 1484 * Ensures the field accessors are initialized. This method is thread-safe. |
| 1413 if (field.isRepeated()) { | 1485 * |
| 1414 if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) { | 1486 * @param messageClass The message type. |
| 1415 fields[i] = new RepeatedMessageFieldAccessor( | 1487 * @param builderClass The builder type. |
| 1416 field, camelCaseNames[i], messageClass, builderClass); | 1488 * @return this |
| 1417 } else if (field.getJavaType() == FieldDescriptor.JavaType.ENUM) { | 1489 */ |
| 1418 fields[i] = new RepeatedEnumFieldAccessor( | 1490 public FieldAccessorTable ensureFieldAccessorsInitialized( |
| 1419 field, camelCaseNames[i], messageClass, builderClass); | 1491 Class<? extends GeneratedMessage> messageClass, |
| 1492 Class<? extends Builder> builderClass) { |
| 1493 if (initialized) { return this; } |
| 1494 synchronized (this) { |
| 1495 if (initialized) { return this; } |
| 1496 for (int i = 0; i < fields.length; i++) { |
| 1497 FieldDescriptor field = descriptor.getFields().get(i); |
| 1498 if (field.isRepeated()) { |
| 1499 if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) { |
| 1500 fields[i] = new RepeatedMessageFieldAccessor( |
| 1501 field, camelCaseNames[i], messageClass, builderClass); |
| 1502 } else if (field.getJavaType() == FieldDescriptor.JavaType.ENUM) { |
| 1503 fields[i] = new RepeatedEnumFieldAccessor( |
| 1504 field, camelCaseNames[i], messageClass, builderClass); |
| 1505 } else { |
| 1506 fields[i] = new RepeatedFieldAccessor( |
| 1507 field, camelCaseNames[i], messageClass, builderClass); |
| 1508 } |
| 1420 } else { | 1509 } else { |
| 1421 fields[i] = new RepeatedFieldAccessor( | 1510 if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) { |
| 1422 field, camelCaseNames[i], messageClass, builderClass); | 1511 fields[i] = new SingularMessageFieldAccessor( |
| 1423 } | 1512 field, camelCaseNames[i], messageClass, builderClass); |
| 1424 } else { | 1513 } else if (field.getJavaType() == FieldDescriptor.JavaType.ENUM) { |
| 1425 if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) { | 1514 fields[i] = new SingularEnumFieldAccessor( |
| 1426 fields[i] = new SingularMessageFieldAccessor( | 1515 field, camelCaseNames[i], messageClass, builderClass); |
| 1427 field, camelCaseNames[i], messageClass, builderClass); | 1516 } else { |
| 1428 } else if (field.getJavaType() == FieldDescriptor.JavaType.ENUM) { | 1517 fields[i] = new SingularFieldAccessor( |
| 1429 fields[i] = new SingularEnumFieldAccessor( | 1518 field, camelCaseNames[i], messageClass, builderClass); |
| 1430 field, camelCaseNames[i], messageClass, builderClass); | 1519 } |
| 1431 } else { | |
| 1432 fields[i] = new SingularFieldAccessor( | |
| 1433 field, camelCaseNames[i], messageClass, builderClass); | |
| 1434 } | 1520 } |
| 1435 } | 1521 } |
| 1522 initialized = true; |
| 1523 camelCaseNames = null; |
| 1524 return this; |
| 1436 } | 1525 } |
| 1437 } | 1526 } |
| 1438 | 1527 |
| 1439 private final Descriptor descriptor; | 1528 private final Descriptor descriptor; |
| 1440 private final FieldAccessor[] fields; | 1529 private final FieldAccessor[] fields; |
| 1530 private String[] camelCaseNames; |
| 1531 private volatile boolean initialized; |
| 1441 | 1532 |
| 1442 /** Get the FieldAccessor for a particular field. */ | 1533 /** Get the FieldAccessor for a particular field. */ |
| 1443 private FieldAccessor getField(final FieldDescriptor field) { | 1534 private FieldAccessor getField(final FieldDescriptor field) { |
| 1444 if (field.getContainingType() != descriptor) { | 1535 if (field.getContainingType() != descriptor) { |
| 1445 throw new IllegalArgumentException( | 1536 throw new IllegalArgumentException( |
| 1446 "FieldDescriptor does not match message type."); | 1537 "FieldDescriptor does not match message type."); |
| 1447 } else if (field.isExtension()) { | 1538 } else if (field.isExtension()) { |
| 1448 // If this type had extensions, it would subclass ExtendableMessage, | 1539 // If this type had extensions, it would subclass ExtendableMessage, |
| 1449 // which overrides the reflection interface to handle extensions. | 1540 // which overrides the reflection interface to handle extensions. |
| 1450 throw new IllegalArgumentException( | 1541 throw new IllegalArgumentException( |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1465 Object getRepeated(GeneratedMessage.Builder builder, int index); | 1556 Object getRepeated(GeneratedMessage.Builder builder, int index); |
| 1466 void setRepeated(Builder builder, | 1557 void setRepeated(Builder builder, |
| 1467 int index, Object value); | 1558 int index, Object value); |
| 1468 void addRepeated(Builder builder, Object value); | 1559 void addRepeated(Builder builder, Object value); |
| 1469 boolean has(GeneratedMessage message); | 1560 boolean has(GeneratedMessage message); |
| 1470 boolean has(GeneratedMessage.Builder builder); | 1561 boolean has(GeneratedMessage.Builder builder); |
| 1471 int getRepeatedCount(GeneratedMessage message); | 1562 int getRepeatedCount(GeneratedMessage message); |
| 1472 int getRepeatedCount(GeneratedMessage.Builder builder); | 1563 int getRepeatedCount(GeneratedMessage.Builder builder); |
| 1473 void clear(Builder builder); | 1564 void clear(Builder builder); |
| 1474 Message.Builder newBuilder(); | 1565 Message.Builder newBuilder(); |
| 1566 Message.Builder getBuilder(GeneratedMessage.Builder builder); |
| 1475 } | 1567 } |
| 1476 | 1568 |
| 1477 // --------------------------------------------------------------- | 1569 // --------------------------------------------------------------- |
| 1478 | 1570 |
| 1479 private static class SingularFieldAccessor implements FieldAccessor { | 1571 private static class SingularFieldAccessor implements FieldAccessor { |
| 1480 SingularFieldAccessor( | 1572 SingularFieldAccessor( |
| 1481 final FieldDescriptor descriptor, final String camelCaseName, | 1573 final FieldDescriptor descriptor, final String camelCaseName, |
| 1482 final Class<? extends GeneratedMessage> messageClass, | 1574 final Class<? extends GeneratedMessage> messageClass, |
| 1483 final Class<? extends Builder> builderClass) { | 1575 final Class<? extends Builder> builderClass) { |
| 1484 getMethod = getMethodOrDie(messageClass, "get" + camelCaseName); | 1576 getMethod = getMethodOrDie(messageClass, "get" + camelCaseName); |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1544 throw new UnsupportedOperationException( | 1636 throw new UnsupportedOperationException( |
| 1545 "getRepeatedFieldSize() called on a singular field."); | 1637 "getRepeatedFieldSize() called on a singular field."); |
| 1546 } | 1638 } |
| 1547 public void clear(final Builder builder) { | 1639 public void clear(final Builder builder) { |
| 1548 invokeOrDie(clearMethod, builder); | 1640 invokeOrDie(clearMethod, builder); |
| 1549 } | 1641 } |
| 1550 public Message.Builder newBuilder() { | 1642 public Message.Builder newBuilder() { |
| 1551 throw new UnsupportedOperationException( | 1643 throw new UnsupportedOperationException( |
| 1552 "newBuilderForField() called on a non-Message type."); | 1644 "newBuilderForField() called on a non-Message type."); |
| 1553 } | 1645 } |
| 1646 public Message.Builder getBuilder(GeneratedMessage.Builder builder) { |
| 1647 throw new UnsupportedOperationException( |
| 1648 "getFieldBuilder() called on a non-Message type."); |
| 1649 } |
| 1554 } | 1650 } |
| 1555 | 1651 |
| 1556 private static class RepeatedFieldAccessor implements FieldAccessor { | 1652 private static class RepeatedFieldAccessor implements FieldAccessor { |
| 1557 protected final Class type; | 1653 protected final Class type; |
| 1558 protected final Method getMethod; | 1654 protected final Method getMethod; |
| 1559 protected final Method getMethodBuilder; | 1655 protected final Method getMethodBuilder; |
| 1560 protected final Method getRepeatedMethod; | 1656 protected final Method getRepeatedMethod; |
| 1561 protected final Method getRepeatedMethodBuilder; | 1657 protected final Method getRepeatedMethodBuilder; |
| 1562 protected final Method setRepeatedMethod; | 1658 protected final Method setRepeatedMethod; |
| 1563 protected final Method addRepeatedMethod; | 1659 protected final Method addRepeatedMethod; |
| 1564 protected final Method getCountMethod; | 1660 protected final Method getCountMethod; |
| 1565 protected final Method getCountMethodBuilder; | 1661 protected final Method getCountMethodBuilder; |
| 1566 protected final Method clearMethod; | 1662 protected final Method clearMethod; |
| 1567 | 1663 |
| 1568 RepeatedFieldAccessor( | 1664 RepeatedFieldAccessor( |
| 1569 final FieldDescriptor descriptor, final String camelCaseName, | 1665 final FieldDescriptor descriptor, final String camelCaseName, |
| 1570 final Class<? extends GeneratedMessage> messageClass, | 1666 final Class<? extends GeneratedMessage> messageClass, |
| 1571 final Class<? extends Builder> builderClass) { | 1667 final Class<? extends Builder> builderClass) { |
| 1572 getMethod = getMethodOrDie(messageClass, | 1668 getMethod = getMethodOrDie(messageClass, |
| 1573 "get" + camelCaseName + "List"); | 1669 "get" + camelCaseName + "List"); |
| 1574 getMethodBuilder = getMethodOrDie(builderClass, | 1670 getMethodBuilder = getMethodOrDie(builderClass, |
| 1575 "get" + camelCaseName + "List"); | 1671 "get" + camelCaseName + "List"); |
| 1576 | |
| 1577 | |
| 1578 getRepeatedMethod = | 1672 getRepeatedMethod = |
| 1579 getMethodOrDie(messageClass, "get" + camelCaseName, Integer.TYPE); | 1673 getMethodOrDie(messageClass, "get" + camelCaseName, Integer.TYPE); |
| 1580 getRepeatedMethodBuilder = | 1674 getRepeatedMethodBuilder = |
| 1581 getMethodOrDie(builderClass, "get" + camelCaseName, Integer.TYPE); | 1675 getMethodOrDie(builderClass, "get" + camelCaseName, Integer.TYPE); |
| 1582 type = getRepeatedMethod.getReturnType(); | 1676 type = getRepeatedMethod.getReturnType(); |
| 1583 setRepeatedMethod = | 1677 setRepeatedMethod = |
| 1584 getMethodOrDie(builderClass, "set" + camelCaseName, | 1678 getMethodOrDie(builderClass, "set" + camelCaseName, |
| 1585 Integer.TYPE, type); | 1679 Integer.TYPE, type); |
| 1586 addRepeatedMethod = | 1680 addRepeatedMethod = |
| 1587 getMethodOrDie(builderClass, "add" + camelCaseName, type); | 1681 getMethodOrDie(builderClass, "add" + camelCaseName, type); |
| (...skipping 30 matching lines...) Expand all Loading... |
| 1618 } | 1712 } |
| 1619 public void setRepeated(final Builder builder, | 1713 public void setRepeated(final Builder builder, |
| 1620 final int index, final Object value) { | 1714 final int index, final Object value) { |
| 1621 invokeOrDie(setRepeatedMethod, builder, index, value); | 1715 invokeOrDie(setRepeatedMethod, builder, index, value); |
| 1622 } | 1716 } |
| 1623 public void addRepeated(final Builder builder, final Object value) { | 1717 public void addRepeated(final Builder builder, final Object value) { |
| 1624 invokeOrDie(addRepeatedMethod, builder, value); | 1718 invokeOrDie(addRepeatedMethod, builder, value); |
| 1625 } | 1719 } |
| 1626 public boolean has(final GeneratedMessage message) { | 1720 public boolean has(final GeneratedMessage message) { |
| 1627 throw new UnsupportedOperationException( | 1721 throw new UnsupportedOperationException( |
| 1628 "hasField() called on a singular field."); | 1722 "hasField() called on a repeated field."); |
| 1629 } | 1723 } |
| 1630 public boolean has(GeneratedMessage.Builder builder) { | 1724 public boolean has(GeneratedMessage.Builder builder) { |
| 1631 throw new UnsupportedOperationException( | 1725 throw new UnsupportedOperationException( |
| 1632 "hasField() called on a singular field."); | 1726 "hasField() called on a repeated field."); |
| 1633 } | 1727 } |
| 1634 public int getRepeatedCount(final GeneratedMessage message) { | 1728 public int getRepeatedCount(final GeneratedMessage message) { |
| 1635 return (Integer) invokeOrDie(getCountMethod, message); | 1729 return (Integer) invokeOrDie(getCountMethod, message); |
| 1636 } | 1730 } |
| 1637 public int getRepeatedCount(GeneratedMessage.Builder builder) { | 1731 public int getRepeatedCount(GeneratedMessage.Builder builder) { |
| 1638 return (Integer) invokeOrDie(getCountMethodBuilder, builder); | 1732 return (Integer) invokeOrDie(getCountMethodBuilder, builder); |
| 1639 } | 1733 } |
| 1640 public void clear(final Builder builder) { | 1734 public void clear(final Builder builder) { |
| 1641 invokeOrDie(clearMethod, builder); | 1735 invokeOrDie(clearMethod, builder); |
| 1642 } | 1736 } |
| 1643 public Message.Builder newBuilder() { | 1737 public Message.Builder newBuilder() { |
| 1644 throw new UnsupportedOperationException( | 1738 throw new UnsupportedOperationException( |
| 1645 "newBuilderForField() called on a non-Message type."); | 1739 "newBuilderForField() called on a non-Message type."); |
| 1646 } | 1740 } |
| 1741 public Message.Builder getBuilder(GeneratedMessage.Builder builder) { |
| 1742 throw new UnsupportedOperationException( |
| 1743 "getFieldBuilder() called on a non-Message type."); |
| 1744 } |
| 1647 } | 1745 } |
| 1648 | 1746 |
| 1649 // --------------------------------------------------------------- | 1747 // --------------------------------------------------------------- |
| 1650 | 1748 |
| 1651 private static final class SingularEnumFieldAccessor | 1749 private static final class SingularEnumFieldAccessor |
| 1652 extends SingularFieldAccessor { | 1750 extends SingularFieldAccessor { |
| 1653 SingularEnumFieldAccessor( | 1751 SingularEnumFieldAccessor( |
| 1654 final FieldDescriptor descriptor, final String camelCaseName, | 1752 final FieldDescriptor descriptor, final String camelCaseName, |
| 1655 final Class<? extends GeneratedMessage> messageClass, | 1753 final Class<? extends GeneratedMessage> messageClass, |
| 1656 final Class<? extends Builder> builderClass) { | 1754 final Class<? extends Builder> builderClass) { |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1746 | 1844 |
| 1747 private static final class SingularMessageFieldAccessor | 1845 private static final class SingularMessageFieldAccessor |
| 1748 extends SingularFieldAccessor { | 1846 extends SingularFieldAccessor { |
| 1749 SingularMessageFieldAccessor( | 1847 SingularMessageFieldAccessor( |
| 1750 final FieldDescriptor descriptor, final String camelCaseName, | 1848 final FieldDescriptor descriptor, final String camelCaseName, |
| 1751 final Class<? extends GeneratedMessage> messageClass, | 1849 final Class<? extends GeneratedMessage> messageClass, |
| 1752 final Class<? extends Builder> builderClass) { | 1850 final Class<? extends Builder> builderClass) { |
| 1753 super(descriptor, camelCaseName, messageClass, builderClass); | 1851 super(descriptor, camelCaseName, messageClass, builderClass); |
| 1754 | 1852 |
| 1755 newBuilderMethod = getMethodOrDie(type, "newBuilder"); | 1853 newBuilderMethod = getMethodOrDie(type, "newBuilder"); |
| 1854 getBuilderMethodBuilder = |
| 1855 getMethodOrDie(builderClass, "get" + camelCaseName + "Builder"); |
| 1756 } | 1856 } |
| 1757 | 1857 |
| 1758 private final Method newBuilderMethod; | 1858 private final Method newBuilderMethod; |
| 1859 private final Method getBuilderMethodBuilder; |
| 1759 | 1860 |
| 1760 private Object coerceType(final Object value) { | 1861 private Object coerceType(final Object value) { |
| 1761 if (type.isInstance(value)) { | 1862 if (type.isInstance(value)) { |
| 1762 return value; | 1863 return value; |
| 1763 } else { | 1864 } else { |
| 1764 // The value is not the exact right message type. However, if it | 1865 // The value is not the exact right message type. However, if it |
| 1765 // is an alternative implementation of the same type -- e.g. a | 1866 // is an alternative implementation of the same type -- e.g. a |
| 1766 // DynamicMessage -- we should accept it. In this case we can make | 1867 // DynamicMessage -- we should accept it. In this case we can make |
| 1767 // a copy of the message. | 1868 // a copy of the message. |
| 1768 return ((Message.Builder) invokeOrDie(newBuilderMethod, null)) | 1869 return ((Message.Builder) invokeOrDie(newBuilderMethod, null)) |
| 1769 .mergeFrom((Message) value).build(); | 1870 .mergeFrom((Message) value).buildPartial(); |
| 1770 } | 1871 } |
| 1771 } | 1872 } |
| 1772 | 1873 |
| 1773 @Override | 1874 @Override |
| 1774 public void set(final Builder builder, final Object value) { | 1875 public void set(final Builder builder, final Object value) { |
| 1775 super.set(builder, coerceType(value)); | 1876 super.set(builder, coerceType(value)); |
| 1776 } | 1877 } |
| 1777 @Override | 1878 @Override |
| 1778 public Message.Builder newBuilder() { | 1879 public Message.Builder newBuilder() { |
| 1779 return (Message.Builder) invokeOrDie(newBuilderMethod, null); | 1880 return (Message.Builder) invokeOrDie(newBuilderMethod, null); |
| 1780 } | 1881 } |
| 1882 @Override |
| 1883 public Message.Builder getBuilder(GeneratedMessage.Builder builder) { |
| 1884 return (Message.Builder) invokeOrDie(getBuilderMethodBuilder, builder); |
| 1885 } |
| 1781 } | 1886 } |
| 1782 | 1887 |
| 1783 private static final class RepeatedMessageFieldAccessor | 1888 private static final class RepeatedMessageFieldAccessor |
| 1784 extends RepeatedFieldAccessor { | 1889 extends RepeatedFieldAccessor { |
| 1785 RepeatedMessageFieldAccessor( | 1890 RepeatedMessageFieldAccessor( |
| 1786 final FieldDescriptor descriptor, final String camelCaseName, | 1891 final FieldDescriptor descriptor, final String camelCaseName, |
| 1787 final Class<? extends GeneratedMessage> messageClass, | 1892 final Class<? extends GeneratedMessage> messageClass, |
| 1788 final Class<? extends Builder> builderClass) { | 1893 final Class<? extends Builder> builderClass) { |
| 1789 super(descriptor, camelCaseName, messageClass, builderClass); | 1894 super(descriptor, camelCaseName, messageClass, builderClass); |
| 1790 | 1895 |
| (...skipping 27 matching lines...) Expand all Loading... |
| 1818 @Override | 1923 @Override |
| 1819 public Message.Builder newBuilder() { | 1924 public Message.Builder newBuilder() { |
| 1820 return (Message.Builder) invokeOrDie(newBuilderMethod, null); | 1925 return (Message.Builder) invokeOrDie(newBuilderMethod, null); |
| 1821 } | 1926 } |
| 1822 } | 1927 } |
| 1823 } | 1928 } |
| 1824 | 1929 |
| 1825 /** | 1930 /** |
| 1826 * Replaces this object in the output stream with a serialized form. | 1931 * Replaces this object in the output stream with a serialized form. |
| 1827 * Part of Java's serialization magic. Generated sub-classes must override | 1932 * Part of Java's serialization magic. Generated sub-classes must override |
| 1828 * this method by calling <code>return super.writeReplace();</code> | 1933 * this method by calling {@code return super.writeReplace();} |
| 1829 * @return a SerializedForm of this message | 1934 * @return a SerializedForm of this message |
| 1830 */ | 1935 */ |
| 1831 protected Object writeReplace() throws ObjectStreamException { | 1936 protected Object writeReplace() throws ObjectStreamException { |
| 1832 return new GeneratedMessageLite.SerializedForm(this); | 1937 return new GeneratedMessageLite.SerializedForm(this); |
| 1833 } | 1938 } |
| 1834 } | 1939 } |
| OLD | NEW |