31 package com.google.protobuf;
35 import java.io.IOException;
37 import java.nio.ByteBuffer;
38 import java.util.ArrayList;
39 import java.util.List;
42 @SuppressWarnings(
"unchecked")
43 final class ExtensionSchemaFull extends ExtensionSchema<
FieldDescriptor> {
45 private static final long EXTENSION_FIELD_OFFSET = getExtensionsFieldOffset();
47 private static <T>
long getExtensionsFieldOffset() {
49 Field field = GeneratedMessageV3.ExtendableMessage.class.getDeclaredField(
"extensions");
50 return UnsafeUtil.objectFieldOffset(
field);
51 }
catch (Throwable e) {
52 throw new IllegalStateException(
"Unable to lookup extension field offset");
57 boolean hasExtensions(MessageLite prototype) {
58 return prototype instanceof GeneratedMessageV3.ExtendableMessage;
62 public FieldSet<FieldDescriptor> getExtensions(Object
message) {
63 return (FieldSet<FieldDescriptor>) UnsafeUtil.getObject(
message, EXTENSION_FIELD_OFFSET);
67 void setExtensions(Object
message, FieldSet<FieldDescriptor> extensions) {
68 UnsafeUtil.putObject(
message, EXTENSION_FIELD_OFFSET, extensions);
72 FieldSet<FieldDescriptor> getMutableExtensions(Object
message) {
73 FieldSet<FieldDescriptor> extensions = getExtensions(
message);
74 if (extensions.isImmutable()) {
75 extensions = extensions.clone();
76 setExtensions(
message, extensions);
82 void makeImmutable(Object
message) {
83 getExtensions(
message).makeImmutable();
87 <UT, UB> UB parseExtension(
89 Object extensionObject,
90 ExtensionRegistryLite extensionRegistry,
91 FieldSet<FieldDescriptor> extensions,
93 UnknownFieldSchema<UT, UB> unknownFieldSchema)
95 ExtensionRegistry.ExtensionInfo
extension = (ExtensionRegistry.ExtensionInfo) extensionObject;
100 switch (
extension.descriptor.getLiteType()) {
103 List<Double> list =
new ArrayList<Double>();
104 reader.readDoubleList(list);
110 List<Float> list =
new ArrayList<Float>();
111 reader.readFloatList(list);
117 List<Long> list =
new ArrayList<Long>();
118 reader.readInt64List(list);
124 List<Long> list =
new ArrayList<Long>();
125 reader.readUInt64List(list);
131 List<Integer> list =
new ArrayList<Integer>();
132 reader.readInt32List(list);
138 List<Long> list =
new ArrayList<Long>();
139 reader.readFixed64List(list);
145 List<Integer> list =
new ArrayList<Integer>();
146 reader.readFixed32List(list);
152 List<Boolean> list =
new ArrayList<Boolean>();
153 reader.readBoolList(list);
159 List<Integer> list =
new ArrayList<Integer>();
160 reader.readUInt32List(list);
166 List<Integer> list =
new ArrayList<Integer>();
167 reader.readSFixed32List(list);
173 List<Long> list =
new ArrayList<Long>();
174 reader.readSFixed64List(list);
180 List<Integer> list =
new ArrayList<Integer>();
181 reader.readSInt32List(list);
187 List<Long> list =
new ArrayList<Long>();
188 reader.readSInt64List(list);
194 List<Integer> list =
new ArrayList<Integer>();
195 reader.readEnumList(list);
196 List<EnumValueDescriptor> enumList =
new ArrayList<EnumValueDescriptor>();
200 if (enumDescriptor !=
null) {
201 enumList.add(enumDescriptor);
204 SchemaUtil.storeUnknownEnum(
205 fieldNumber,
number, unknownFields, unknownFieldSchema);
212 throw new IllegalStateException(
213 "Type cannot be packed: " +
extension.descriptor.getLiteType());
219 if (
extension.descriptor.getLiteType() == WireFormat.FieldType.ENUM) {
220 int number = reader.readInt32();
221 Object enumValue =
extension.descriptor.getEnumType().findValueByNumber(
number);
222 if (enumValue ==
null) {
223 return SchemaUtil.storeUnknownEnum(
224 fieldNumber,
number, unknownFields, unknownFieldSchema);
228 switch (
extension.descriptor.getLiteType()) {
230 value = reader.readDouble();
233 value = reader.readFloat();
236 value = reader.readInt64();
239 value = reader.readUInt64();
242 value = reader.readInt32();
245 value = reader.readFixed64();
248 value = reader.readFixed32();
251 value = reader.readBool();
254 value = reader.readBytes();
257 value = reader.readUInt32();
260 value = reader.readSFixed32();
263 value = reader.readSFixed64();
266 value = reader.readSInt32();
269 value = reader.readSInt64();
273 value = reader.readString();
276 value = reader.readGroup(
extension.defaultInstance.getClass(), extensionRegistry);
280 value = reader.readMessage(
extension.defaultInstance.getClass(), extensionRegistry);
284 throw new IllegalStateException(
"Shouldn't reach here.");
290 switch (
extension.descriptor.getLiteType()) {
293 Object oldValue = extensions.getField(
extension.descriptor);
294 if (oldValue !=
null) {
295 value = Internal.mergeMessage(oldValue,
value);
304 return unknownFields;
314 void serializeExtension(Writer writer,
Map.Entry<?, ?>
extension)
throws IOException {
319 SchemaUtil.writeDoubleList(
326 SchemaUtil.writeFloatList(
333 SchemaUtil.writeInt64List(
340 SchemaUtil.writeUInt64List(
347 SchemaUtil.writeInt32List(
354 SchemaUtil.writeFixed64List(
361 SchemaUtil.writeFixed32List(
368 SchemaUtil.writeBoolList(
375 SchemaUtil.writeBytesList(
379 SchemaUtil.writeUInt32List(
386 SchemaUtil.writeSFixed32List(
393 SchemaUtil.writeSFixed64List(
400 SchemaUtil.writeSInt32List(
407 SchemaUtil.writeSInt64List(
415 List<EnumValueDescriptor> enumList = (List<EnumValueDescriptor>)
extension.getValue();
416 List<Integer> list =
new ArrayList<Integer>();
418 list.add(
d.getNumber());
424 SchemaUtil.writeStringList(
431 SchemaUtil.writeMessageList(
497 Object findExtensionByNumber(
498 ExtensionRegistryLite extensionRegistry, MessageLite defaultInstance,
int number) {
499 return ((ExtensionRegistry) extensionRegistry)
500 .findExtensionByNumber(((Message) defaultInstance).getDescriptorForType(),
number);
504 void parseLengthPrefixedMessageSetItem(
507 ExtensionRegistryLite extensionRegistry,
508 FieldSet<FieldDescriptor> extensions)
510 ExtensionRegistry.ExtensionInfo extensionInfo = (ExtensionRegistry.ExtensionInfo)
extension;
512 if (ExtensionRegistryLite.isEagerlyParseMessageSets()) {
514 reader.readMessage(extensionInfo.defaultInstance.getClass(), extensionRegistry);
515 extensions.setField(extensionInfo.descriptor,
value);
518 extensionInfo.descriptor,
519 new LazyField(extensionInfo.defaultInstance, extensionRegistry, reader.readBytes()));
524 void parseMessageSetItem(
527 ExtensionRegistryLite extensionRegistry,
528 FieldSet<FieldDescriptor> extensions)
530 ExtensionRegistry.ExtensionInfo extensionInfo = (ExtensionRegistry.ExtensionInfo)
extension;
531 Object
value = extensionInfo.defaultInstance.newBuilderForType().buildPartial();
533 if (ExtensionRegistryLite.isEagerlyParseMessageSets()) {
534 Reader reader = BinaryReader.newInstance(ByteBuffer.wrap(
data.toByteArray()),
true);
535 Protobuf.getInstance().mergeFrom(
value, reader, extensionRegistry);
536 extensions.setField(extensionInfo.descriptor,
value);
538 if (reader.getFieldNumber() != Reader.READ_DONE) {
539 throw InvalidProtocolBufferException.invalidEndTag();
543 extensionInfo.descriptor,
544 new LazyField(extensionInfo.defaultInstance, extensionRegistry,
data));