/** Recursively crawls the proto message while clearing each field of type {@link Source}. */ @VisibleForTesting static void stripSourceReferences(Message.Builder msg) { for (FieldDescriptor fieldDesc : msg.getAllFields().keySet()) { if (!fieldDesc.getJavaType().equals(JavaType.MESSAGE)) { continue; } if (fieldDesc.getMessageType().getFullName().equals(Source.getDescriptor().getFullName())) { msg.clearField(fieldDesc); } else { if (fieldDesc.isRepeated()) { int repeatCount = msg.getRepeatedFieldCount(fieldDesc); for (int i = 0; i < repeatCount; i++) { stripSourceReferences(msg.getRepeatedFieldBuilder(fieldDesc, i)); } } else { stripSourceReferences(msg.getFieldBuilder(fieldDesc)); } } } } }
public static void setFieldSafely(Message.Builder builder, String path, List<String> value) throws InvalidProtocolBufferException { Descriptors.Descriptor descriptor = builder.getDescriptorForType(); ImmutableList<Descriptors.FieldDescriptor> fieldDescriptors = ProtobufDescriptorJavaUtil.fieldPath(descriptor, path); Message.Builder fieldBuilder = builder; for (Descriptors.FieldDescriptor fieldDescriptor : fieldDescriptors) { if (fieldDescriptor.getType() == Descriptors.FieldDescriptor.Type.MESSAGE) { fieldBuilder = fieldBuilder.getFieldBuilder(fieldDescriptor); } } if (fieldDescriptors.isEmpty()) { throw new IllegalArgumentException("Path " + path + " doesn't exist from root: " + builder.getDescriptorForType().getName()); } setFieldSafely(fieldBuilder, fieldDescriptors.get(fieldDescriptors.size() - 1), value); }
@Override public Object getValue(final ELContext context, final Object base, final Object property) { if (context == null) { throw new NullPointerException(); } if ((property != null) && resolveType(base)) { context.setPropertyResolved(base, property); final Message.Builder builder = (Message.Builder) base; final FieldDescriptor field = getPropertyFieldDescriptor(builder, property); if (field.isRepeated()) { return getBuilderForRepeatedField(builder, field); } else { if (field.getJavaType() == JavaType.MESSAGE) { return builder.getFieldBuilder(field); } else { return builder.getField(field); } } } return null; }
childPath, (Message) source.getField(field), destination.getFieldBuilder(field), options); continue; destination.getFieldBuilder(field).mergeFrom((Message) source.getField(field));
for (Descriptors.FieldDescriptor fd : fieldDescriptors) { if (fd.getType() == Descriptors.FieldDescriptor.Type.MESSAGE) { toMerge = toMerge.getFieldBuilder(fd);