Skip to content

Commit 79921c4

Browse files
authored
feat(java-client): find descriptors by proto fullname (#122)
1 parent 1b98914 commit 79921c4

3 files changed

Lines changed: 49 additions & 10 deletions

File tree

clients/java/src/main/java/io/odpf/stencil/DescriptorMapBuilder.java

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -51,24 +51,27 @@ public static Map<String, Descriptors.Descriptor> buildFrom(InputStream stream)
5151
fileDescriptors.forEach(fd -> {
5252
String javaPackage = fd.getOptions().getJavaPackage();
5353
String protoPackage = fd.getPackage();
54-
fd.getMessageTypes().stream().forEach(desc -> descriptorMap.putAll(getFlattenedDescriptors(desc, javaPackage, protoPackage, "", new HashMap<>())));
54+
fd.getMessageTypes().stream().forEach(desc -> descriptorMap.putAll(getFlattenedDescriptors(desc, javaPackage, protoPackage, new HashMap<>())));
5555
});
5656

5757
return descriptorMap;
5858
}
5959

60-
private static Map<String, Descriptors.Descriptor> getFlattenedDescriptors(Descriptors.Descriptor descriptor, String javaPackage, String protoPackage, String parentClassName, Map<String, Descriptors.Descriptor> initialDescriptorMap) {
61-
String className = getClassName(descriptor, parentClassName);
62-
String javaClassName = javaPackage.isEmpty() ? className : String.format("%s.%s", javaPackage, className);
63-
initialDescriptorMap.put(javaClassName, descriptor);
60+
private static Map<String, Descriptors.Descriptor> getFlattenedDescriptors(Descriptors.Descriptor descriptor, String javaPackage, String protoPackage, Map<String, Descriptors.Descriptor> initialDescriptorMap) {
61+
String fullName = descriptor.getFullName();
62+
initialDescriptorMap.put(fullName, descriptor);
63+
if (!javaPackage.isEmpty() && !javaPackage.equals(protoPackage)) {
64+
initialDescriptorMap.put(getClassName(descriptor, protoPackage, javaPackage), descriptor);
65+
}
6466
descriptor.getNestedTypes()
65-
.forEach(desc -> getFlattenedDescriptors(desc, javaPackage, protoPackage, className, initialDescriptorMap));
67+
.forEach(desc -> getFlattenedDescriptors(desc, javaPackage, protoPackage, initialDescriptorMap));
6668
return initialDescriptorMap;
6769
}
6870

69-
70-
private static String getClassName(Descriptors.Descriptor descriptor, String parentClassName) {
71-
return parentClassName.isEmpty() ? descriptor.getName() : parentClassName + "." + descriptor.getName();
71+
private static String getClassName(Descriptors.Descriptor descriptor, String protoPackage, String javaPackage) {
72+
if (protoPackage.isEmpty()) {
73+
return String.format("%s.%s", javaPackage, descriptor.getFullName());
74+
}
75+
return descriptor.getFullName().replaceFirst(protoPackage, javaPackage);
7276
}
73-
7477
}

clients/java/src/test/java/io/odpf/stencil/DescriptorMapBuilderTest.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,4 +65,30 @@ public void TestDescriptorsWithoutPackageName() throws IOException, Descriptors.
6565
assertEquals(".RootField", String.format(".%s", protoWithoutPackage.getFullName()));
6666
}
6767

68+
@Test
69+
public void TestDescriptorsByProtoFullName() throws IOException, Descriptors.DescriptorValidationException {
70+
ClassLoader classLoader = getClass().getClassLoader();
71+
String descriptorFilePath = "__files/descriptors.bin";
72+
InputStream fileInputStream = new FileInputStream(Objects.requireNonNull(classLoader.getResource(descriptorFilePath)).getFile());
73+
Map<String, Descriptors.Descriptor> descriptorMap = DescriptorMapBuilder.buildFrom(fileInputStream);
74+
75+
final Descriptors.Descriptor protoWithoutJavaPackage = descriptorMap.get("io.odpf.stencil.ImplicitOuterClass");
76+
assertNotNull(protoWithoutJavaPackage);
77+
assertEquals("io.odpf.stencil.ImplicitOuterClass", protoWithoutJavaPackage.getFullName());
78+
}
79+
80+
@Test
81+
public void TestDescriptorsByProtoFullNameOrJavaName() throws IOException, Descriptors.DescriptorValidationException {
82+
ClassLoader classLoader = getClass().getClassLoader();
83+
String descriptorFilePath = "__files/descriptors.bin";
84+
InputStream fileInputStream = new FileInputStream(Objects.requireNonNull(classLoader.getResource(descriptorFilePath)).getFile());
85+
Map<String, Descriptors.Descriptor> descriptorMap = DescriptorMapBuilder.buildFrom(fileInputStream);
86+
87+
Descriptors.Descriptor protoWithoutPackage = descriptorMap.get("io.odpf.stencil.RootField");
88+
assertEquals("RootField", protoWithoutPackage.getFullName());
89+
Descriptors.Descriptor descriptorByProtoName = descriptorMap.get("RootField");
90+
assertNotNull(descriptorByProtoName);
91+
assertEquals(protoWithoutPackage, descriptorByProtoName);
92+
}
93+
6894
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
syntax = "proto3";
2+
3+
package io.odpf.stencil;
4+
5+
message ImplicitOuterClass {
6+
string sample_string = 1;
7+
message Inner {
8+
string one = 1;
9+
}
10+
}

0 commit comments

Comments
 (0)