in grpc-gcp/src/main/java/com/google/cloud/grpc/GcpManagedChannel.java [1540:1573]
static List<String> getKeysFromMessage(MessageOrBuilder msg, String name) {
// The field names in a nested message name are splitted by '.'.
int currentLength = name.indexOf('.');
String currentName = name;
if (currentLength != -1) {
currentName = name.substring(0, currentLength);
}
List<String> keys = new ArrayList<>();
Map<FieldDescriptor, Object> obs = msg.getAllFields();
for (Map.Entry<FieldDescriptor, Object> entry : obs.entrySet()) {
if (entry.getKey().getName().equals(currentName)) {
if (currentLength == -1 && entry.getValue() instanceof String) {
// Value of the current field.
keys.add(entry.getValue().toString());
} else if (currentLength != -1 && entry.getValue() instanceof MessageOrBuilder) {
// One nested MessageOrBuilder.
keys.addAll(
getKeysFromMessage(
(MessageOrBuilder) entry.getValue(), name.substring(currentLength + 1)));
} else if (currentLength != -1 && entry.getValue() instanceof List) {
// Repeated nested MessageOrBuilder.
List<?> list = (List<?>) entry.getValue();
if (!list.isEmpty() && list.get(0) instanceof MessageOrBuilder) {
for (Object item : list) {
keys.addAll(
getKeysFromMessage((MessageOrBuilder) item, name.substring(currentLength + 1)));
}
}
}
}
}
return keys;
}