31 package com.google.protobuf;
33 import java.io.IOException;
34 import java.util.Iterator;
35 import java.util.Map.Entry;
38 final class MessageSetSchema<
T>
implements Schema<T> {
39 private final MessageLite defaultInstance;
40 private final UnknownFieldSchema<?, ?> unknownFieldSchema;
41 private final boolean hasExtensions;
42 private final ExtensionSchema<?> extensionSchema;
44 private MessageSetSchema(
45 UnknownFieldSchema<?, ?> unknownFieldSchema,
46 ExtensionSchema<?> extensionSchema,
47 MessageLite defaultInstance) {
48 this.unknownFieldSchema = unknownFieldSchema;
49 this.hasExtensions = extensionSchema.hasExtensions(defaultInstance);
50 this.extensionSchema = extensionSchema;
51 this.defaultInstance = defaultInstance;
54 static <T> MessageSetSchema<T> newSchema(
55 UnknownFieldSchema<?, ?> unknownFieldSchema,
56 ExtensionSchema<?> extensionSchema,
57 MessageLite defaultInstance) {
58 return new MessageSetSchema<T>(unknownFieldSchema, extensionSchema, defaultInstance);
61 @SuppressWarnings(
"unchecked")
63 public T newInstance() {
64 return (
T) defaultInstance.newBuilderForType().buildPartial();
68 public boolean equals(
T message,
T other) {
69 Object messageUnknown = unknownFieldSchema.getFromMessage(
message);
70 Object otherUnknown = unknownFieldSchema.getFromMessage(other);
71 if (!messageUnknown.equals(otherUnknown)) {
75 FieldSet<?> messageExtensions = extensionSchema.getExtensions(
message);
76 FieldSet<?> otherExtensions = extensionSchema.getExtensions(other);
77 return messageExtensions.equals(otherExtensions);
84 int hashCode = unknownFieldSchema.getFromMessage(
message).hashCode();
86 FieldSet<?> extensions = extensionSchema.getExtensions(
message);
87 hashCode = (hashCode * 53) + extensions.hashCode();
93 public void mergeFrom(
T message,
T other) {
94 SchemaUtil.mergeUnknownFields(unknownFieldSchema,
message, other);
96 SchemaUtil.mergeExtensions(extensionSchema,
message, other);
100 @SuppressWarnings(
"unchecked")
102 public void writeTo(
T message, Writer writer)
throws IOException {
103 FieldSet<?> extensions = extensionSchema.getExtensions(
message);
104 Iterator<?> iterator = extensions.iterator();
105 while (iterator.hasNext()) {
106 Entry<?, ?>
extension = (Entry<?, ?>) iterator.next();
107 FieldSet.FieldDescriptorLite<?> fd = (FieldSet.FieldDescriptorLite<?>)
extension.getKey();
108 if (fd.getLiteJavaType() != WireFormat.JavaType.MESSAGE || fd.isRepeated() || fd.isPacked()) {
109 throw new IllegalStateException(
"Found invalid MessageSet item.");
111 if (
extension instanceof LazyField.LazyEntry) {
112 writer.writeMessageSetItem(
113 fd.getNumber(), ((LazyField.LazyEntry)
extension).getField().toByteString());
115 writer.writeMessageSetItem(fd.getNumber(),
extension.getValue());
118 writeUnknownFieldsHelper(unknownFieldSchema,
message, writer);
125 private <UT, UB>
void writeUnknownFieldsHelper(
126 UnknownFieldSchema<UT, UB> unknownFieldSchema,
T message, Writer writer)
throws IOException {
127 unknownFieldSchema.writeAsMessageSetTo(unknownFieldSchema.getFromMessage(
message), writer);
130 @SuppressWarnings(
"ReferenceEquality")
132 public void mergeFrom(
135 UnknownFieldSetLite unknownFields = ((GeneratedMessageLite)
message).unknownFields;
136 if (unknownFields == UnknownFieldSetLite.getDefaultInstance()) {
137 unknownFields = UnknownFieldSetLite.newInstance();
138 ((GeneratedMessageLite)
message).unknownFields = unknownFields;
140 final FieldSet<GeneratedMessageLite.ExtensionDescriptor> extensions =
141 ((GeneratedMessageLite.ExtendableMessage<?, ?>)
message).ensureExtensionsAreMutable();
142 GeneratedMessageLite.GeneratedExtension<?, ?>
extension =
null;
145 final int startTag = registers.int1;
146 if (startTag != WireFormat.MESSAGE_SET_ITEM_TAG) {
147 if (WireFormat.getTagWireType(startTag) == WireFormat.WIRETYPE_LENGTH_DELIMITED) {
149 (GeneratedMessageLite.GeneratedExtension<?, ?>) extensionSchema.findExtensionByNumber(
150 registers.extensionRegistry, defaultInstance,
151 WireFormat.getTagFieldNumber(startTag));
154 ArrayDecoders.decodeMessageField(
155 Protobuf.getInstance().schemaFor(
156 extension.getMessageDefaultInstance().getClass()),
158 extensions.setField(
extension.descriptor, registers.object1);
161 ArrayDecoders.decodeUnknownField(
162 startTag,
data,
position, limit, unknownFields, registers);
171 ByteString rawBytes =
null;
175 final int tag = registers.int1;
176 final int number = WireFormat.getTagFieldNumber(tag);
177 final int wireType = WireFormat.getTagWireType(tag);
179 case WireFormat.MESSAGE_SET_TYPE_ID:
180 if (wireType == WireFormat.WIRETYPE_VARINT) {
182 typeId = registers.int1;
184 (GeneratedMessageLite.GeneratedExtension<?, ?>) extensionSchema
185 .findExtensionByNumber(registers.extensionRegistry, defaultInstance, typeId);
189 case WireFormat.MESSAGE_SET_MESSAGE:
191 position = ArrayDecoders.decodeMessageField(
192 Protobuf.getInstance().schemaFor(
193 extension.getMessageDefaultInstance().getClass()),
195 extensions.setField(
extension.descriptor, registers.object1);
198 if (wireType == WireFormat.WIRETYPE_LENGTH_DELIMITED) {
200 rawBytes = (ByteString) registers.object1;
208 if (tag == WireFormat.MESSAGE_SET_ITEM_END_TAG) {
214 if (rawBytes !=
null) {
215 unknownFields.storeField(
216 WireFormat.makeTag(typeId, WireFormat.WIRETYPE_LENGTH_DELIMITED), rawBytes);
220 throw InvalidProtocolBufferException.parseFailure();
225 public void mergeFrom(
T message, Reader reader, ExtensionRegistryLite extensionRegistry)
227 mergeFromHelper(unknownFieldSchema, extensionSchema,
message, reader, extensionRegistry);
234 @SuppressWarnings(
"unchecked")
235 private <UT, UB, ET extends FieldSet.FieldDescriptorLite<ET>>
void mergeFromHelper(
236 UnknownFieldSchema<UT, UB> unknownFieldSchema,
237 ExtensionSchema<ET> extensionSchema,
240 ExtensionRegistryLite extensionRegistry)
242 UB unknownFields = unknownFieldSchema.getBuilderFromMessage(
message);
243 FieldSet<ET> extensions = extensionSchema.getMutableExtensions(
message);
246 final int number = reader.getFieldNumber();
247 if (
number == Reader.READ_DONE) {
250 if (parseMessageSetItemOrUnknownField(
263 unknownFieldSchema.setBuilderToMessage(
message, unknownFields);
268 public void makeImmutable(
T message) {
269 unknownFieldSchema.makeImmutable(
message);
270 extensionSchema.makeImmutable(
message);
273 private <UT, UB, ET extends FieldSet.FieldDescriptorLite<ET>>
274 boolean parseMessageSetItemOrUnknownField(
276 ExtensionRegistryLite extensionRegistry,
277 ExtensionSchema<ET> extensionSchema,
278 FieldSet<ET> extensions,
279 UnknownFieldSchema<UT, UB> unknownFieldSchema,
282 int startTag = reader.getTag();
283 if (startTag != WireFormat.MESSAGE_SET_ITEM_TAG) {
284 if (WireFormat.getTagWireType(startTag) == WireFormat.WIRETYPE_LENGTH_DELIMITED) {
286 extensionSchema.findExtensionByNumber(
287 extensionRegistry, defaultInstance, WireFormat.getTagFieldNumber(startTag));
289 extensionSchema.parseLengthPrefixedMessageSetItem(
290 reader,
extension, extensionRegistry, extensions);
293 return unknownFieldSchema.mergeOneFieldFrom(unknownFields, reader);
296 return reader.skipField();
317 ByteString rawBytes =
null;
324 final int number = reader.getFieldNumber();
325 if (
number == Reader.READ_DONE) {
329 final int tag = reader.getTag();
330 if (tag == WireFormat.MESSAGE_SET_TYPE_ID_TAG) {
331 typeId = reader.readUInt32();
333 extensionSchema.findExtensionByNumber(extensionRegistry, defaultInstance, typeId);
335 }
else if (tag == WireFormat.MESSAGE_SET_MESSAGE_TAG) {
337 extensionSchema.parseLengthPrefixedMessageSetItem(
338 reader,
extension, extensionRegistry, extensions);
342 rawBytes = reader.readBytes();
345 if (!reader.skipField()) {
351 if (reader.getTag() != WireFormat.MESSAGE_SET_ITEM_END_TAG) {
352 throw InvalidProtocolBufferException.invalidEndTag();
356 if (rawBytes !=
null) {
360 extensionSchema.parseMessageSetItem(rawBytes,
extension, extensionRegistry, extensions);
362 unknownFieldSchema.addLengthDelimited(unknownFields, typeId, rawBytes);
370 FieldSet<?> extensions = extensionSchema.getExtensions(
message);
371 return extensions.isInitialized();
375 public int getSerializedSize(
T message) {
378 size += getUnknownFieldsSerializedSize(unknownFieldSchema,
message);
381 size += extensionSchema.getExtensions(
message).getMessageSetSerializedSize();
387 private <UT, UB>
int getUnknownFieldsSerializedSize(
388 UnknownFieldSchema<UT, UB> schema,
T message) {
389 UT unknowns = schema.getFromMessage(
message);
390 return schema.getSerializedSizeAsMessageSet(unknowns);