|
|
|
@ -62,6 +62,9 @@ import java.util.List; |
|
|
|
|
import java.util.Map; |
|
|
|
|
|
|
|
|
|
public class RubyMessage extends RubyObject { |
|
|
|
|
private final String DEFAULT_VALUE = "google.protobuf.FieldDescriptorProto.default_value"; |
|
|
|
|
private final String TYPE = "type"; |
|
|
|
|
|
|
|
|
|
public RubyMessage(Ruby runtime, RubyClass klazz, Descriptor descriptor) { |
|
|
|
|
super(runtime, klazz); |
|
|
|
|
|
|
|
|
@ -677,6 +680,8 @@ public class RubyMessage extends RubyObject { |
|
|
|
|
throw context.runtime.newRuntimeError("Recursion limit exceeded during encoding."); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
RubySymbol typeBytesSymbol = RubySymbol.newSymbol(context.runtime, "TYPE_BYTES"); |
|
|
|
|
|
|
|
|
|
// Handle the typical case where the fields.keySet contain the fieldDescriptors
|
|
|
|
|
for (FieldDescriptor fieldDescriptor : fields.keySet()) { |
|
|
|
|
IRubyObject value = fields.get(fieldDescriptor); |
|
|
|
@ -707,14 +712,13 @@ public class RubyMessage extends RubyObject { |
|
|
|
|
* stringDefaultValue}. |
|
|
|
|
*/ |
|
|
|
|
boolean isDefaultStringForBytes = false; |
|
|
|
|
if (DEFAULT_VALUE.equals(fieldDescriptor.getFullName())) { |
|
|
|
|
FieldDescriptor enumFieldDescriptorForType = |
|
|
|
|
this.builder.getDescriptorForType().findFieldByName("type"); |
|
|
|
|
String type = enumFieldDescriptorForType == null ? |
|
|
|
|
null : fields.get(enumFieldDescriptorForType).toString(); |
|
|
|
|
if (type != null && type.equals("TYPE_BYTES") && |
|
|
|
|
fieldDescriptor.getFullName().equals("google.protobuf.FieldDescriptorProto.default_value")) { |
|
|
|
|
this.builder.getDescriptorForType().findFieldByName(TYPE); |
|
|
|
|
if (typeBytesSymbol.equals(fields.get(enumFieldDescriptorForType))) { |
|
|
|
|
isDefaultStringForBytes = true; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
builder.setField(fieldDescriptor, convert(context, fieldDescriptor, value, depth, recursionLimit, isDefaultStringForBytes)); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|