Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(27)

Side by Side Diff: third_party/protobuf/java/src/main/java/com/google/protobuf/GeneratedMessage.java

Issue 21208003: Update protobuf to r428, part 1. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 7 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
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
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
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
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
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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698