Skip to content

Commit 41c1696

Browse files
authored
add builders (apache#26)
1 parent e09e9e5 commit 41c1696

File tree

2 files changed

+125
-11
lines changed

2 files changed

+125
-11
lines changed

client/generator/src/main/java/io/openlineage/client/JavaPoetGenerator.java

+65-11
Original file line numberDiff line numberDiff line change
@@ -58,32 +58,32 @@ public JavaPoetGenerator(TypeResolver typeResolver, String baseURL) {
5858

5959
public void generate(PrintWriter printWriter) throws IOException {
6060

61-
TypeSpec.Builder builder = TypeSpec.classBuilder(CONTAINER_CLASS_NAME)
61+
TypeSpec.Builder containerTypeBuilder = TypeSpec.classBuilder(CONTAINER_CLASS_NAME)
6262
.addModifiers(PUBLIC, FINAL);
6363
if (baseURL.equals("")) {
64-
builder.addJavadoc("$S", "Warning: this class was generated from a local file and will not provide absolute _schemaURL fields in facets");
64+
containerTypeBuilder.addJavadoc("$S", "Warning: this class was generated from a local file and will not provide absolute _schemaURL fields in facets");
6565

6666
}
6767

68-
builder.addField(FieldSpec.builder(ClassName.get(URI.class), "producer", PRIVATE, FINAL).build());
69-
builder.addMethod(MethodSpec.constructorBuilder()
68+
containerTypeBuilder.addField(FieldSpec.builder(ClassName.get(URI.class), "producer", PRIVATE, FINAL).build());
69+
containerTypeBuilder.addMethod(MethodSpec.constructorBuilder()
7070
.addModifiers(PUBLIC)
7171
.addParameter(
7272
ParameterSpec.builder(ClassName.get(URI.class), "producer").build()
7373
)
7474
.addCode("this.producer = producer;\n")
7575
.build());
7676

77-
generateTypes(builder);
78-
TypeSpec openLineage = builder.build();
77+
generateTypes(containerTypeBuilder);
78+
TypeSpec openLineage = containerTypeBuilder.build();
7979

8080
JavaFile javaFile = JavaFile.builder(PACKAGE, openLineage)
8181
.build();
8282

8383
javaFile.writeTo(printWriter);
8484
}
8585

86-
private void generateTypes(TypeSpec.Builder builder) {
86+
private void generateTypes(TypeSpec.Builder containerTypeBuilder) {
8787
Collection<ObjectType> types = typeResolver.getTypes();
8888
for (ObjectType type : types) {
8989

@@ -97,8 +97,12 @@ private void generateTypes(TypeSpec.Builder builder) {
9797
interfaceBuilder.addMethod(getter);
9898
}
9999
TypeSpec intrfc = interfaceBuilder.build();
100-
builder.addType(intrfc);
100+
containerTypeBuilder.addType(intrfc);
101101
} else {
102+
TypeSpec.Builder builderClassBuilder = TypeSpec.classBuilder(type.getName() + "Builder")
103+
.addModifiers(PUBLIC, FINAL);
104+
List<CodeBlock> builderParams = new ArrayList<>();
105+
102106
TypeSpec.Builder classBuilder = TypeSpec.classBuilder(type.getName())
103107
.addModifiers(STATIC, PUBLIC, FINAL);
104108
for (String parent : type.getParents()) {
@@ -119,6 +123,20 @@ private void generateTypes(TypeSpec.Builder builder) {
119123
String schemaURL = baseURL + "#/definitions/" + type.getName();
120124
constructor.addCode("this.$N = URI.create($S);\n", f.getName(), schemaURL);
121125
} else {
126+
if (!(f.getName().equals("_producer") || f.getName().equals("producer"))) {
127+
builderClassBuilder.addField(getTypeName(f.getType()), f.getName(), PRIVATE);
128+
builderClassBuilder.addMethod(
129+
MethodSpec
130+
.methodBuilder("set" + titleCase(f.getName()))
131+
.addParameter(getTypeName(f.getType()), f.getName())
132+
.addJavadoc("@param $N $N\n", f.getName(), f.getDescription() == null ? "the " + f.getName() : f.getDescription())
133+
.addModifiers(PUBLIC)
134+
.returns(ClassName.get(CONTAINER_CLASS, type.getName() + "Builder"))
135+
.addJavadoc("@return this\n")
136+
.addCode("this.$N = $N;\n", f.getName(), f.getName())
137+
.addCode("return this;")
138+
.build());
139+
}
122140
constructor.addJavadoc("@param $N $N\n", f.getName(), f.getDescription() == null ? "the " + f.getName() : f.getDescription());
123141
constructor.addParameter(
124142
ParameterSpec.builder(getTypeName(f.getType()), f.getName())
@@ -127,10 +145,12 @@ private void generateTypes(TypeSpec.Builder builder) {
127145
constructor.addCode("this.$N = $N;\n", f.getName(), f.getName());
128146
if (f.getName().equals("_producer") || f.getName().equals("producer")) {
129147
factoryParams.add(CodeBlock.of("this.producer"));
148+
builderParams.add(CodeBlock.of("OpenLineage.this.producer"));
130149
} else {
131150
factory.addParameter(ParameterSpec.builder(getTypeName(f.getType()), f.getName()).build());
132151
factory.addJavadoc("@param $N $N\n", f.getName(), f.getDescription() == null ? "the " + f.getName() : f.getDescription());
133152
factoryParams.add(CodeBlock.of("$N", f.getName()));
153+
builderParams.add(CodeBlock.of("$N", f.getName()));
134154
}
135155
}
136156
MethodSpec getter = getter(f)
@@ -143,7 +163,21 @@ private void generateTypes(TypeSpec.Builder builder) {
143163
factory.addCode("return new $N(", type.getName());
144164
factory.addCode(CodeBlock.join(factoryParams, ", "));
145165
factory.addCode(");\n");
146-
builder.addMethod(factory.build());
166+
containerTypeBuilder.addMethod(factory.build());
167+
168+
containerTypeBuilder.addMethod(MethodSpec.methodBuilder("new" + type.getName() + "Builder")
169+
.addModifiers(PUBLIC)
170+
.returns(ClassName.get(CONTAINER_CLASS, type.getName() + "Builder"))
171+
.addCode("return new $N();", type.getName() + "Builder")
172+
.build());
173+
174+
Builder build = MethodSpec
175+
.methodBuilder("build")
176+
.addModifiers(PUBLIC)
177+
.returns(getTypeName(type))
178+
.addCode("var __result = new $N(", type.getName())
179+
.addCode(CodeBlock.join(builderParams, ", "))
180+
.addCode(");\n");
147181

148182
// additionalFields
149183
if (type.isHasAdditionalProperties()) {
@@ -163,12 +197,32 @@ private void generateTypes(TypeSpec.Builder builder) {
163197
.addAnnotation(JsonAnySetter.class)
164198
.build());
165199

200+
builderClassBuilder.addField(
201+
FieldSpec.builder(additionalPropertiesType, fieldName, PRIVATE, FINAL)
202+
.initializer("new $T<>()", HashMap.class)
203+
.build());
204+
builderClassBuilder.addMethod(MethodSpec
205+
.methodBuilder("put")
206+
.addModifiers(PUBLIC)
207+
.addParameter(TypeName.get(String.class), "key")
208+
.addParameter(additionalPropertiesValueType, "value")
209+
.addCode("this.$N.put(key, value);", fieldName)
210+
.build());
211+
212+
build.addCode("__result.getAdditionalProperties().putAll(additionalProperties);\n");
213+
166214
constructor.addCode(CodeBlock.builder().addStatement("this.$N = new $T<>()", fieldName, HashMap.class).build());
167215
}
168216

217+
218+
builderClassBuilder.addMethod(
219+
build
220+
.addCode("return __result;\n")
221+
.build());
222+
169223
classBuilder.addMethod(constructor.build());
170-
TypeSpec clss = classBuilder.build();
171-
builder.addType(clss);
224+
containerTypeBuilder.addType(classBuilder.build());
225+
containerTypeBuilder.addType(builderClassBuilder.build());
172226
}
173227
}
174228

client/src/test/java/io/openlineage/client/OpenLineageTest.java

+60
Original file line numberDiff line numberDiff line change
@@ -70,5 +70,65 @@ public void jsonSerialization() throws JsonProcessingException {
7070
assertEquals(json, mapper.writeValueAsString(read));
7171

7272

73+
}
74+
75+
@Test
76+
public void factory() throws JsonProcessingException {
77+
ZonedDateTime now = ZonedDateTime.now(ZoneId.of("UTC"));
78+
79+
URI producer = URI.create("producer");
80+
OpenLineage ol = new OpenLineage(producer);
81+
String runId = "runId";
82+
RunFacets runFacets =
83+
ol.newRunFacetsBuilder()
84+
.setNominalTime(
85+
ol.newNominalTimeRunFacetBuilder()
86+
.setNominalEndTime(now)
87+
.setNominalEndTime(now)
88+
.build())
89+
.build();
90+
Run run = ol.newRunBuilder().setRunId(runId).setFacets(runFacets).build();
91+
String name = "jobName";
92+
String namespace = "namespace";
93+
JobFacets jobFacets = ol.newJobFacetsBuilder().build();
94+
Job job = ol.newJobBuilder().setNamespace(namespace).setName(name).setFacets(jobFacets).build();
95+
List<InputDataset> inputs = Arrays.asList(ol.newInputDatasetBuilder().setNamespace("ins").setName("input").build());
96+
List<OutputDataset> outputs = Arrays.asList(ol.newOutputDatasetBuilder().setNamespace("ons").setName("output").build());
97+
RunEvent runStateUpdate = ol.newRunEventBuilder()
98+
.setEventType("START")
99+
.setEventTime(now)
100+
.setRun(run)
101+
.setJob(job)
102+
.setInputs(inputs)
103+
.setOutputs(outputs)
104+
.build();
105+
106+
ObjectMapper mapper = new ObjectMapper();
107+
mapper.registerModule(new JavaTimeModule());
108+
mapper.setSerializationInclusion(Include.NON_NULL);
109+
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
110+
mapper.configure(SerializationFeature.INDENT_OUTPUT, true);
111+
String json = mapper.writeValueAsString(runStateUpdate);
112+
RunEvent read = mapper.readValue(json, RunEvent.class);
113+
114+
assertEquals(producer,read.getProducer());
115+
assertEquals(runId,read.getRun().getRunId());
116+
assertEquals(name,read.getJob().getName());
117+
assertEquals(namespace,read.getJob().getNamespace());
118+
assertEquals(runStateUpdate.getEventType(),read.getEventType());
119+
assertEquals(runStateUpdate.getEventTime(),read.getEventTime());
120+
assertEquals(1, runStateUpdate.getInputs().size());
121+
InputDataset inputDataset = runStateUpdate.getInputs().get(0);
122+
assertEquals("ins", inputDataset.getNamespace());
123+
assertEquals("input", inputDataset.getName());
124+
assertEquals(1, runStateUpdate.getOutputs().size());
125+
OutputDataset outputDataset = runStateUpdate.getOutputs().get(0);
126+
assertEquals("ons", outputDataset.getNamespace());
127+
assertEquals("output", outputDataset.getName());
128+
129+
130+
assertEquals(json, mapper.writeValueAsString(read));
131+
132+
73133
}
74134
}

0 commit comments

Comments
 (0)