31 package com.google.protobuf;
57 import java.io.IOException;
58 import java.io.InputStream;
59 import java.io.ObjectStreamException;
60 import java.io.Serializable;
63 import java.util.ArrayList;
64 import java.util.Arrays;
65 import java.util.Collections;
66 import java.util.Iterator;
67 import java.util.List;
69 import java.util.TreeMap;
80 implements Serializable {
103 throw new UnsupportedOperationException(
104 "This is supposed to be overridden by subclasses.");
113 static void enableAlwaysUseFieldBuildersForTesting() {
132 Schema<GeneratedMessageV3> schema =
133 (Schema<GeneratedMessageV3>) Protobuf.getInstance().schemaFor(
this);
135 schema.mergeFrom(
this, CodedInputStreamReader.forCodedInput(
input), extensionRegistry);
138 }
catch (IOException e) {
141 schema.makeImmutable(
this);
152 boolean getBytesForString) {
153 final TreeMap<FieldDescriptor, Object> result =
154 new TreeMap<FieldDescriptor, Object>();
158 for (
int i = 0;
i <
fields.size();
i++) {
166 if (oneofDescriptor !=
null) {
177 if (
field.isRepeated()) {
179 if (!
value.isEmpty()) {
202 if (
field.isRequired()) {
209 if (
field.isRepeated()) {
210 @SuppressWarnings(
"unchecked")
final
212 for (
final Message element : messageList) {
213 if (!element.isInitialized()) {
230 return Collections.unmodifiableMap(
244 Map<FieldDescriptor, Object> getAllFieldsRaw() {
245 return Collections.unmodifiableMap(
295 throw new UnsupportedOperationException(
296 "This is supposed to be overridden by subclasses.");
310 if (
input.shouldDiscardUnknownFields()) {
311 return input.skipField(tag);
366 InputStream
input)
throws IOException {
377 return parser.parseDelimitedFrom(
input, extensions);
384 return UnsafeUtil.hasUnsafeArrayOperations() && UnsafeUtil.hasUnsafeByteBufferOperations();
388 return IntArrayList.emptyList();
392 return new IntArrayList();
396 int size = list.size();
398 size == 0 ? AbstractProtobufList.DEFAULT_CAPACITY :
size * 2);
402 return LongArrayList.emptyList();
406 return new LongArrayList();
410 int size = list.size();
412 size == 0 ? AbstractProtobufList.DEFAULT_CAPACITY :
size * 2);
416 return FloatArrayList.emptyList();
420 return new FloatArrayList();
424 int size = list.size();
426 size == 0 ? AbstractProtobufList.DEFAULT_CAPACITY :
size * 2);
430 return DoubleArrayList.emptyList();
434 return new DoubleArrayList();
438 int size = list.size();
440 size == 0 ? AbstractProtobufList.DEFAULT_CAPACITY :
size * 2);
444 return BooleanArrayList.emptyList();
448 return new BooleanArrayList();
452 int size = list.size();
454 size == 0 ? AbstractProtobufList.DEFAULT_CAPACITY :
size * 2);
460 MessageReflection.writeMessageTo(
this, getAllFieldsRaw(),
output,
false);
471 this, getAllFieldsRaw());
495 @SuppressWarnings({
"unused"})
497 throw new UnsupportedOperationException(
"This method must be overridden by the subclass.");
524 public void markDirty() {
531 @SuppressWarnings(
"unchecked")
551 this.builderParent = builderParent;
556 builderParent =
null;
563 if (builderParent !=
null) {
588 BuilderType builder =
602 return (BuilderType)
this;
624 final TreeMap<FieldDescriptor, Object> result =
625 new TreeMap<FieldDescriptor, Object>();
629 for (
int i = 0;
i <
fields.size();
i++) {
637 if (oneofDescriptor !=
null) {
648 if (
field.isRepeated()) {
650 if (!
value.isEmpty()) {
699 if (
field.isRepeated()) {
702 return Collections.unmodifiableList((List)
object);
711 return (BuilderType)
this;
717 return (BuilderType)
this;
723 return (BuilderType)
this;
743 return (BuilderType)
this;
749 return (BuilderType)
this;
755 return (BuilderType)
this;
774 return setUnknownFields(
785 if (
field.isRequired()) {
792 if (
field.isRepeated()) {
793 @SuppressWarnings(
"unchecked")
final
795 for (
final Message element : messageList) {
796 if (!element.isInitialized()) {
834 if (meAsParent ==
null) {
835 meAsParent =
new BuilderParentImpl();
845 if (isClean && builderParent !=
null) {
864 @SuppressWarnings({
"unused",
"rawtypes"})
868 throw new RuntimeException(
869 "No map fields found in " + getClass().
getName());
873 @SuppressWarnings({
"unused",
"rawtypes"})
877 throw new RuntimeException(
878 "No map fields found in " + getClass().
getName());
981 this.extensions = FieldSet.newFieldSet();
992 if (
extension.getDescriptor().getContainingType() !=
995 throw new IllegalArgumentException(
996 "Extension is for type \"" +
997 extension.getDescriptor().getContainingType().getFullName() +
998 "\" which does not match message type \"" +
1005 @SuppressWarnings(
"unchecked")
1015 @SuppressWarnings(
"unchecked")
1027 @SuppressWarnings(
"unchecked")
1034 if (
value ==
null) {
1036 return (
Type) Collections.emptyList();
1051 @SuppressWarnings(
"unchecked")
1124 int tag)
throws IOException {
1125 return MessageReflection.mergeFieldFrom(
1139 int tag)
throws IOException {
1168 if (
iter.hasNext()) {
1175 throws IOException {
1176 while (
next !=
null &&
next.getKey().getNumber() <
end) {
1198 if (
iter.hasNext()) {
1219 return extensions.getMessageSetSerializedSize();
1231 final Map<FieldDescriptor, Object> result =
1232 super.getAllFieldsMutable(
false);
1234 return Collections.unmodifiableMap(result);
1239 final Map<FieldDescriptor, Object> result =
1240 super.getAllFieldsMutable(
false);
1242 return Collections.unmodifiableMap(result);
1247 if (
field.isExtension()) {
1251 return super.hasField(
field);
1257 if (
field.isExtension()) {
1260 if (
value ==
null) {
1261 if (
field.isRepeated()) {
1262 return Collections.emptyList();
1268 return field.getDefaultValue();
1274 return super.getField(
field);
1280 if (
field.isExtension()) {
1284 return super.getRepeatedFieldCount(
field);
1291 if (
field.isExtension()) {
1301 throw new IllegalArgumentException(
1302 "FieldDescriptor does not match message type.");
1344 @SuppressWarnings(
"unchecked")
1351 private FieldSet<FieldDescriptor> extensions = FieldSet.emptySet();
1361 void internalSetExtensionSet(FieldSet<FieldDescriptor> extensions) {
1362 this.extensions = extensions;
1367 extensions = FieldSet.emptySet();
1368 return super.clear();
1372 if (extensions.isImmutable()) {
1373 extensions = extensions.clone();
1379 if (
extension.getDescriptor().getContainingType() !=
1382 throw new IllegalArgumentException(
1383 "Extension is for type \"" +
1384 extension.getDescriptor().getContainingType().getFullName() +
1385 "\" which does not match message type \"" +
1395 verifyExtensionContainingType(
extension);
1396 return extensions.hasField(
extension.getDescriptor());
1402 final ExtensionLite<MessageType, List<Type>> extensionLite) {
1405 verifyExtensionContainingType(
extension);
1407 return extensions.getRepeatedFieldCount(
descriptor);
1415 verifyExtensionContainingType(
extension);
1418 if (
value ==
null) {
1420 return (
Type) Collections.emptyList();
1439 verifyExtensionContainingType(
extension);
1451 verifyExtensionContainingType(
extension);
1452 ensureExtensionsIsMutable();
1456 return (BuilderType)
this;
1465 verifyExtensionContainingType(
extension);
1466 ensureExtensionsIsMutable();
1468 extensions.setRepeatedField(
1472 return (BuilderType)
this;
1481 verifyExtensionContainingType(
extension);
1482 ensureExtensionsIsMutable();
1484 extensions.addRepeatedField(
1487 return (BuilderType)
this;
1495 verifyExtensionContainingType(
extension);
1496 ensureExtensionsIsMutable();
1497 extensions.clearField(
extension.getDescriptor());
1499 return (BuilderType)
this;
1554 public <Type> BuilderType setExtension(
1565 public <Type> BuilderType setExtension(
1576 public <Type> BuilderType addExtension(
1586 public <Type> BuilderType clearExtension(
1593 return extensions.isInitialized();
1601 extensions.makeImmutable();
1607 return super.isInitialized() && extensionsAreInitialized();
1615 final Map<FieldDescriptor, Object> result = super.getAllFieldsMutable();
1616 result.putAll(extensions.getAllFields());
1617 return Collections.unmodifiableMap(result);
1622 if (
field.isExtension()) {
1623 verifyContainingType(
field);
1624 final Object
value = extensions.getField(
field);
1625 if (
value ==
null) {
1631 return field.getDefaultValue();
1637 return super.getField(
field);
1643 if (
field.isExtension()) {
1644 verifyContainingType(
field);
1645 return extensions.getRepeatedFieldCount(
field);
1647 return super.getRepeatedFieldCount(
field);
1654 if (
field.isExtension()) {
1655 verifyContainingType(
field);
1656 return extensions.getRepeatedField(
field,
index);
1664 if (
field.isExtension()) {
1665 verifyContainingType(
field);
1666 return extensions.hasField(
field);
1668 return super.hasField(
field);
1674 final Object
value) {
1675 if (
field.isExtension()) {
1676 verifyContainingType(
field);
1677 ensureExtensionsIsMutable();
1680 return (BuilderType)
this;
1688 if (
field.isExtension()) {
1689 verifyContainingType(
field);
1690 ensureExtensionsIsMutable();
1691 extensions.clearField(
field);
1693 return (BuilderType)
this;
1695 return super.clearField(
field);
1702 if (
field.isExtension()) {
1703 verifyContainingType(
field);
1704 ensureExtensionsIsMutable();
1707 return (BuilderType)
this;
1715 final Object
value) {
1716 if (
field.isExtension()) {
1717 verifyContainingType(
field);
1718 ensureExtensionsIsMutable();
1721 return (BuilderType)
this;
1729 if (
field.isExtension()) {
1737 ensureExtensionsIsMutable();
1744 throw new IllegalArgumentException(
1745 "FieldDescriptor does not match message type.");
1756 static interface ExtensionDescriptorRetriever {
1764 @SuppressWarnings(
"unchecked")
1766 final Class clazz, final String
name, final Class...
params) {
1769 }
catch (NoSuchMethodException e) {
1770 throw new RuntimeException(
1771 "Generated message class \"" + clazz.getName() +
1772 "\" missing method \"" +
name +
"\".", e);
1781 }
catch (IllegalAccessException e) {
1782 throw new RuntimeException(
1783 "Couldn't use Java reflection to implement protocol message " +
1785 }
catch (InvocationTargetException e) {
1786 final Throwable cause = e.getCause();
1787 if (cause instanceof RuntimeException) {
1788 throw (RuntimeException) cause;
1789 }
else if (cause instanceof
Error) {
1790 throw (
Error) cause;
1792 throw new RuntimeException(
1793 "Unexpected exception thrown by generated accessor method.", cause);
1809 @SuppressWarnings({
"rawtypes",
"unused"})
1813 throw new RuntimeException(
1814 "No map fields found in " + getClass().
getName());
1836 final Class<? extends GeneratedMessageV3> messageClass,
1837 final Class<? extends Builder> builderClass) {
1864 Class<? extends GeneratedMessageV3> messageClass,
1865 Class<? extends Builder> builderClass) {
1867 synchronized (
this) {
1869 int fieldsSize =
fields.length;
1870 for (
int i = 0;
i < fieldsSize;
i++) {
1872 String containingOneofCamelCaseName =
null;
1873 if (
field.getContainingOneof() !=
null) {
1874 containingOneofCamelCaseName =
1877 if (
field.isRepeated()) {
1879 if (
field.isMapField()) {
1897 containingOneofCamelCaseName);
1901 containingOneofCamelCaseName);
1905 containingOneofCamelCaseName);
1909 containingOneofCamelCaseName);
1914 int oneofsSize =
oneofs.length;
1915 for (
int i = 0;
i < oneofsSize;
i++) {
1918 messageClass, builderClass);
1935 throw new IllegalArgumentException(
1936 "FieldDescriptor does not match message type.");
1937 }
else if (
field.isExtension()) {
1940 throw new IllegalArgumentException(
1941 "This type does not have extensions.");
1949 throw new IllegalArgumentException(
1950 "OneofDescriptor does not match message type.");
1987 final Class<? extends GeneratedMessageV3> messageClass,
1988 final Class<? extends Builder> builderClass) {
2018 if (fieldNumber > 0) {
2026 if (fieldNumber > 0) {
2046 final Class<? extends GeneratedMessageV3> messageClass,
2047 final Class<? extends Builder> builderClass,
2048 final String containingOneofCamelCaseName) {
2063 messageClass,
"get" + containingOneofCamelCaseName +
"Case") :
null;
2065 builderClass,
"get" + containingOneofCamelCaseName +
"Case") :
null;
2106 return get(builder);
2114 throw new UnsupportedOperationException(
2115 "getRepeatedField() called on a singular field.");
2119 throw new UnsupportedOperationException(
2120 "getRepeatedFieldRaw() called on a singular field.");
2124 throw new UnsupportedOperationException(
2125 "getRepeatedField() called on a singular field.");
2129 throw new UnsupportedOperationException(
2130 "getRepeatedFieldRaw() called on a singular field.");
2134 throw new UnsupportedOperationException(
2135 "setRepeatedField() called on a singular field.");
2139 throw new UnsupportedOperationException(
2140 "addRepeatedField() called on a singular field.");
2164 throw new UnsupportedOperationException(
2165 "getRepeatedFieldSize() called on a singular field.");
2169 throw new UnsupportedOperationException(
2170 "getRepeatedFieldSize() called on a singular field.");
2178 throw new UnsupportedOperationException(
2179 "newBuilderForField() called on a non-Message type.");
2183 throw new UnsupportedOperationException(
2184 "getFieldBuilder() called on a non-Message type.");
2188 throw new UnsupportedOperationException(
2189 "getRepeatedFieldBuilder() called on a non-Message type.");
2207 final Class<? extends GeneratedMessageV3> messageClass,
2208 final Class<? extends Builder> builderClass) {
2210 "get" + camelCaseName +
"List");
2212 "get" + camelCaseName +
"List");
2214 getMethodOrDie(messageClass,
"get" + camelCaseName, Integer.TYPE);
2216 getMethodOrDie(builderClass,
"get" + camelCaseName, Integer.TYPE);
2220 Integer.TYPE,
type);
2245 return get(builder);
2254 for (
final Object element : (List<?>)
value) {
2284 throw new UnsupportedOperationException(
2285 "hasField() called on a repeated field.");
2289 throw new UnsupportedOperationException(
2290 "hasField() called on a repeated field.");
2306 throw new UnsupportedOperationException(
2307 "newBuilderForField() called on a non-Message type.");
2311 throw new UnsupportedOperationException(
2312 "getFieldBuilder() called on a non-Message type.");
2316 throw new UnsupportedOperationException(
2317 "getRepeatedFieldBuilder() called on a non-Message type.");
2324 final Class<? extends GeneratedMessageV3> messageClass,
2325 final Class<? extends Builder> builderClass) {
2327 Method getDefaultInstanceMethod =
2332 defaultMapField.getMapEntryMessageDefaultInstance();
2353 if (
value ==
null) {
2367 @SuppressWarnings(
"unchecked")
2369 List result =
new ArrayList();
2373 return Collections.unmodifiableList(result);
2377 @SuppressWarnings(
"unchecked")
2379 List result =
new ArrayList();
2383 return Collections.unmodifiableList(result);
2393 return get(builder);
2399 for (Object entry : (List)
value) {
2436 throw new UnsupportedOperationException(
2437 "hasField() is not supported for repeated fields.");
2442 throw new UnsupportedOperationException(
2443 "hasField() is not supported for repeated fields.");
2468 throw new UnsupportedOperationException(
2469 "Nested builder not supported for map fields.");
2474 throw new UnsupportedOperationException(
2475 "Nested builder not supported for map fields.");
2485 final Class<? extends GeneratedMessageV3> messageClass,
2486 final Class<? extends Builder> builderClass,
2487 final String containingOneofCamelCaseName) {
2488 super(
descriptor, camelCaseName, messageClass, builderClass, containingOneofCamelCaseName);
2504 getMethodOrDie(builderClass,
"set" + camelCaseName +
"Value",
int.
class);
2551 final Class<? extends GeneratedMessageV3> messageClass,
2552 final Class<? extends Builder> builderClass) {
2553 super(
descriptor, camelCaseName, messageClass, builderClass);
2565 getMethodOrDie(messageClass,
"get" + camelCaseName +
"Value",
int.
class);
2567 getMethodOrDie(builderClass,
"get" + camelCaseName +
"Value",
int.
class);
2569 getMethodOrDie(builderClass,
"set" + camelCaseName +
"Value",
int.
class,
int.
class);
2571 getMethodOrDie(builderClass,
"add" + camelCaseName +
"Value",
int.
class);
2586 @SuppressWarnings(
"unchecked")
2588 final List newList =
new ArrayList();
2590 for (
int i = 0;
i <
size;
i++) {
2593 return Collections.unmodifiableList(newList);
2597 @SuppressWarnings(
"unchecked")
2599 final List newList =
new ArrayList();
2601 for (
int i = 0;
i <
size;
i++) {
2604 return Collections.unmodifiableList(newList);
2625 super.getRepeated(builder,
index));
2666 final Class<? extends GeneratedMessageV3> messageClass,
2667 final Class<? extends Builder> builderClass,
2668 final String containingOneofCamelCaseName) {
2669 super(
descriptor, camelCaseName, messageClass, builderClass,
2670 containingOneofCamelCaseName);
2672 "get" + camelCaseName +
"Bytes");
2674 "get" + camelCaseName +
"Bytes");
2676 "set" + camelCaseName +
"Bytes",
ByteString.class);
2698 super.set(builder,
value);
2709 final Class<? extends GeneratedMessageV3> messageClass,
2710 final Class<? extends Builder> builderClass,
2711 final String containingOneofCamelCaseName) {
2712 super(
descriptor, camelCaseName, messageClass, builderClass,
2713 containingOneofCamelCaseName);
2754 final Class<? extends GeneratedMessageV3> messageClass,
2755 final Class<? extends Builder> builderClass) {
2756 super(
descriptor, camelCaseName, messageClass, builderClass);
2760 "get" + camelCaseName +
"Builder", Integer.TYPE);
2815 private static <MessageType extends ExtendableMessage<MessageType>,
T>
2819 throw new IllegalArgumentException(
"Expected non-lite extension.");
2826 if (
value instanceof String) {
2834 if (
value instanceof String) {
2843 if (
value instanceof String) {
2852 if (
value instanceof String) {
2863 int fieldNumber)
throws IOException {
2864 Map<Integer, V>
m =
field.getMap();
2865 if (!out.isSerializationDeterministic()) {
2871 int[] keys =
new int[
m.size()];
2873 for (
int k :
m.keySet()) {
2877 for (
int key : keys) {
2878 out.writeMessage(fieldNumber,
2879 defaultEntry.newBuilderForType()
2881 .setValue(
m.get(
key))
2891 throws IOException {
2892 Map<Long, V>
m =
field.getMap();
2893 if (!out.isSerializationDeterministic()) {
2898 long[] keys =
new long[
m.size()];
2900 for (
long k :
m.keySet()) {
2904 for (
long key : keys) {
2905 out.writeMessage(fieldNumber,
2906 defaultEntry.newBuilderForType()
2908 .setValue(
m.get(
key))
2918 throws IOException {
2919 Map<String, V>
m =
field.getMap();
2920 if (!out.isSerializationDeterministic()) {
2927 String[] keys =
new String[
m.size()];
2928 keys =
m.keySet().toArray(keys);
2930 for (String
key : keys) {
2931 out.writeMessage(fieldNumber,
2932 defaultEntry.newBuilderForType()
2934 .setValue(
m.get(
key))
2944 throws IOException {
2945 Map<Boolean, V>
m =
field.getMap();
2946 if (!out.isSerializationDeterministic()) {
2960 throws IOException {
2961 if (
m.containsKey(
key)) {
2962 out.writeMessage(fieldNumber,
2963 defaultEntry.newBuilderForType()
2965 .setValue(
m.get(
key))
2976 throws IOException {
2977 for (
Map.Entry<
K, V> entry :
m.entrySet()) {
2978 out.writeMessage(fieldNumber,
2979 defaultEntry.newBuilderForType()
2980 .setKey(entry.getKey())
2981 .setValue(entry.getValue())