Skip to content

Commit d47c883

Browse files
committed
[Fix #1351] Generating native file
Signed-off-by: fjtirado <ftirados@redhat.com>
1 parent b6c7557 commit d47c883

6 files changed

Lines changed: 140 additions & 15 deletions

File tree

‎api/pom.xml‎

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -75,9 +75,13 @@
7575
<scope>test</scope>
7676
</dependency>
7777
</dependencies>
78-
<build>
78+
<build>
79+
<resources>
80+
<resource>
81+
<directory>${project.build.directory}/generated-resources</directory>
82+
</resource>
83+
</resources>
7984
<plugins>
80-
8185
<plugin>
8286
<groupId>io.serverlessworkflow</groupId>
8387
<artifactId>serverless-workflow-jackson-generator</artifactId>
@@ -118,4 +122,4 @@
118122
</plugin>
119123
</plugins>
120124
</build>
121-
</project>
125+
</project>
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
/*
2+
* Copyright 2020-Present The Serverless Workflow Specification Authors
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package io.serverlessworkflow.generator.graalvm;
17+
18+
import com.fasterxml.jackson.databind.JsonNode;
19+
import com.fasterxml.jackson.databind.ObjectMapper;
20+
import com.fasterxml.jackson.databind.node.ArrayNode;
21+
import java.io.IOException;
22+
import java.io.Writer;
23+
import java.nio.file.Files;
24+
import java.nio.file.Path;
25+
import java.nio.file.StandardOpenOption;
26+
import java.util.stream.Stream;
27+
28+
public class ReflectNativeFileHandler {
29+
30+
private final String groupId;
31+
private final String artifactId;
32+
private final ArrayNode rootObject;
33+
private static final ObjectMapper objectMapper = new ObjectMapper();
34+
35+
public ReflectNativeFileHandler(String groupId, String artifactId) {
36+
this.groupId = groupId;
37+
this.artifactId = artifactId;
38+
this.rootObject = objectMapper.createArrayNode();
39+
}
40+
41+
public ReflectNativeFileHandler addClasses(Stream<String> classNames) {
42+
classNames.forEach(this::addClass);
43+
return this;
44+
}
45+
46+
public ReflectNativeFileHandler addClasses(Iterable<String> classNames) {
47+
classNames.forEach(this::addClass);
48+
return this;
49+
}
50+
51+
public ReflectNativeFileHandler addClass(String refClassName) {
52+
rootObject.add(buildObjectFromClass(refClassName));
53+
return this;
54+
}
55+
56+
private static JsonNode buildObjectFromClass(String refClassName) {
57+
return objectMapper
58+
.createObjectNode()
59+
.put("name", refClassName)
60+
.put("queryAllPublicConstructors", true)
61+
.put("queryAllDeclaredConstructors", true)
62+
.put("queryAllDeclaredConstructors", true)
63+
.put("queryAllPublicMethods", true)
64+
.put("queryAllDeclaredMethods", true)
65+
.put("allPublicConstructors", true)
66+
.put("allDeclaredConstructors", true)
67+
.put("allPublicMethods", true)
68+
.put("allDeclaredMethods", true)
69+
.put("allPublicFields", true)
70+
.put("allDeclaredFields", true)
71+
.put("allPublicClasses", true)
72+
.put("allDeclaredClasses", true);
73+
}
74+
75+
public void generate(Path rootPath) throws IOException {
76+
try (Writer out =
77+
Files.newBufferedWriter(
78+
Files.createDirectories(
79+
rootPath
80+
.resolve("META-INF")
81+
.resolve("native-image")
82+
.resolve(groupId)
83+
.resolve(artifactId))
84+
.resolve("reflect-config.json"),
85+
StandardOpenOption.CREATE)) {
86+
objectMapper.writeValue(out, rootObject);
87+
}
88+
}
89+
}

‎generators/jackson/src/main/java/io/serverlessworkflow/generator/jackson/GeneratorUtils.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ public static void fillDeserializer(
8383
private static JDefinedClass createClass(
8484
JPackage jPackage, JClass relatedClass, Class<?> serializerClass, String suffix)
8585
throws JClassAlreadyExistsException {
86-
JDefinedClass definedClass = jPackage._class(JMod.NONE, relatedClass.name() + suffix);
86+
JDefinedClass definedClass = jPackage._class(JMod.PUBLIC, relatedClass.name() + suffix);
8787
definedClass._extends(definedClass.owner().ref(serializerClass).narrow(relatedClass));
8888
return definedClass;
8989
}

‎generators/jackson/src/main/java/io/serverlessworkflow/generator/jackson/JacksonMixInPojo.java‎

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
import io.serverlessworkflow.annotations.Item;
5151
import io.serverlessworkflow.annotations.ItemKey;
5252
import io.serverlessworkflow.annotations.ItemValue;
53+
import io.serverlessworkflow.generator.graalvm.ReflectNativeFileHandler;
5354
import java.io.File;
5455
import java.io.IOException;
5556
import java.io.PrintStream;
@@ -78,6 +79,17 @@ public class JacksonMixInPojo extends AbstractMojo {
7879
defaultValue = "${project.build.directory}/generated-sources/jacksonmixinpojo")
7980
private File outputDirectory;
8081

82+
@Parameter(defaultValue = "${project.groupId}", readonly = true, required = true)
83+
private String groupId;
84+
85+
@Parameter(defaultValue = "${project.artifactId}", readonly = true, required = true)
86+
private String artifactId;
87+
88+
@Parameter(
89+
property = "jacksonmixinpojo.outputResources",
90+
defaultValue = "${project.build.directory}/generated-resources")
91+
private File outputResources;
92+
8193
@Parameter(property = "jacksonmixinpojo.srcPackage")
8294
private String srcPackage;
8395

@@ -90,6 +102,7 @@ public class JacksonMixInPojo extends AbstractMojo {
90102
private JCodeModel codeModel;
91103
private JPackage rootPackage;
92104
private JMethod setupMethod;
105+
private ReflectNativeFileHandler nativeHandler;
93106

94107
@FunctionalInterface
95108
interface AnnotationProcessor {
@@ -107,12 +120,14 @@ public void execute() throws MojoExecutionException, MojoFailureException {
107120
.acceptPackages(srcPackage)
108121
.scan()) {
109122
codeModel = new JCodeModel();
123+
nativeHandler = new ReflectNativeFileHandler(groupId, artifactId);
110124
rootPackage = codeModel._package(targetPackage);
111125
setupMethod =
112126
rootPackage
113127
._class("JacksonMixInModule")
114128
._extends(SimpleModule.class)
115129
.method(JMod.PUBLIC, codeModel.VOID, SETUP_METHOD);
130+
nativeHandler.addClasses(result.getAllClasses().stream().map(c -> c.getName()));
116131
processAnnotatedClasses(result, ExclusiveUnion.class, this::buildExclusiveUnionMixIn);
117132
processAnnotatedClasses(result, InclusiveUnion.class, this::buildInclusiveUnionMixIn);
118133
processAnnotatedClasses(result, AdditionalProperties.class, this::buildAdditionalPropsMixIn);
@@ -124,6 +139,8 @@ public void execute() throws MojoExecutionException, MojoFailureException {
124139
.arg(setupMethod.param(SetupContext.class, "context"));
125140
Files.createDirectories(outputDirectory.toPath());
126141
codeModel.build(outputDirectory, (PrintStream) null);
142+
143+
nativeHandler.generate(outputResources.toPath());
127144
} catch (JClassAlreadyExistsException | IOException e) {
128145
getLog().error(e);
129146
}
@@ -179,17 +196,15 @@ private void buildItemMixIn(ClassInfo classInfo, JDefinedClass mixClass)
179196
classInfo.getMethodInfo().filter(m -> m.hasAnnotation(ItemKey.class)).get(0);
180197
MethodInfo valueMethod =
181198
classInfo.getMethodInfo().filter(m -> m.hasAnnotation(ItemValue.class)).get(0);
182-
mixClass
183-
.annotate(JsonSerialize.class)
184-
.param(
185-
"using",
186-
GeneratorUtils.generateSerializer(
187-
rootPackage, relClass, keyMethod.getName(), valueMethod.getName()));
188-
mixClass
189-
.annotate(JsonDeserialize.class)
190-
.param(
191-
"using",
192-
GeneratorUtils.generateDeserializer(rootPackage, relClass, getReturnType(valueMethod)));
199+
JDefinedClass serializerClass =
200+
GeneratorUtils.generateSerializer(
201+
rootPackage, relClass, keyMethod.getName(), valueMethod.getName());
202+
nativeHandler.addClass(serializerClass.fullName());
203+
mixClass.annotate(JsonSerialize.class).param("using", serializerClass);
204+
JDefinedClass deserializerClass =
205+
GeneratorUtils.generateDeserializer(rootPackage, relClass, getReturnType(valueMethod));
206+
nativeHandler.addClass(deserializerClass.fullName());
207+
mixClass.annotate(JsonDeserialize.class).param("using", deserializerClass);
193208
}
194209

195210
private void buildExclusiveUnionMixIn(ClassInfo unionClassInfo, JDefinedClass unionMixClass)
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
[
2+
{"name":"io.serverlessworkflow.impl.WorkflowError","queryAllPublicConstructors":true,"queryAllDeclaredConstructors":true,"queryAllPublicMethods":true,"queryAllDeclaredMethods":true,"allPublicConstructors":true,"allDeclaredConstructors":true,"allPublicMethods":true,"allDeclaredMethods":true,"allPublicFields":true,"allDeclaredFields":true,"allPublicClasses":true,"allDeclaredClasses":true}
3+
]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
[
2+
{"name":"io.serverlessworkflow.impl.executors.UnifiedOpenAPI","queryAllPublicConstructors":true,"queryAllDeclaredConstructors":true,"queryAllPublicMethods":true,"queryAllDeclaredMethods":true,"allPublicConstructors":true,"allDeclaredConstructors":true,"allPublicMethods":true,"allDeclaredMethods":true,"allPublicFields":true,"allDeclaredFields":true,"allPublicClasses":true,"allDeclaredClasses":true},
3+
{"name":"io.serverlessworkflow.impl.executors.UnifiedOpenAPI$Components","queryAllPublicConstructors":true,"queryAllDeclaredConstructors":true,"queryAllPublicMethods":true,"queryAllDeclaredMethods":true,"allPublicConstructors":true,"allDeclaredConstructors":true,"allPublicMethods":true,"allDeclaredMethods":true,"allPublicFields":true,"allDeclaredFields":true,"allPublicClasses":true,"allDeclaredClasses":true},
4+
{"name":"io.serverlessworkflow.impl.executors.UnifiedOpenAPI$Content","queryAllPublicConstructors":true,"queryAllDeclaredConstructors":true,"queryAllPublicMethods":true,"queryAllDeclaredMethods":true,"allPublicConstructors":true,"allDeclaredConstructors":true,"allPublicMethods":true,"allDeclaredMethods":true,"allPublicFields":true,"allDeclaredFields":true,"allPublicClasses":true,"allDeclaredClasses":true},
5+
{"name":"io.serverlessworkflow.impl.executors.UnifiedOpenAPI$HttpOperation","queryAllPublicConstructors":true,"queryAllDeclaredConstructors":true,"queryAllPublicMethods":true,"queryAllDeclaredMethods":true,"allPublicConstructors":true,"allDeclaredConstructors":true,"allPublicMethods":true,"allDeclaredMethods":true,"allPublicFields":true,"allDeclaredFields":true,"allPublicClasses":true,"allDeclaredClasses":true},
6+
{"name":"io.serverlessworkflow.impl.executors.UnifiedOpenAPI$MediaType","queryAllPublicConstructors":true,"queryAllDeclaredConstructors":true,"queryAllPublicMethods":true,"queryAllDeclaredMethods":true,"allPublicConstructors":true,"allDeclaredConstructors":true,"allPublicMethods":true,"allDeclaredMethods":true,"allPublicFields":true,"allDeclaredFields":true,"allPublicClasses":true,"allDeclaredClasses":true},
7+
{"name":"io.serverlessworkflow.impl.executors.UnifiedOpenAPI$Operation","queryAllPublicConstructors":true,"queryAllDeclaredConstructors":true,"queryAllPublicMethods":true,"queryAllDeclaredMethods":true,"allPublicConstructors":true,"allDeclaredConstructors":true,"allPublicMethods":true,"allDeclaredMethods":true,"allPublicFields":true,"allDeclaredFields":true,"allPublicClasses":true,"allDeclaredClasses":true},
8+
{"name":"io.serverlessworkflow.impl.executors.UnifiedOpenAPI$Parameter","queryAllPublicConstructors":true,"queryAllDeclaredConstructors":true,"queryAllPublicMethods":true,"queryAllDeclaredMethods":true,"allPublicConstructors":true,"allDeclaredConstructors":true,"allPublicMethods":true,"allDeclaredMethods":true,"allPublicFields":true,"allDeclaredFields":true,"allPublicClasses":true,"allDeclaredClasses":true},
9+
{"name":"io.serverlessworkflow.impl.executors.UnifiedOpenAPI$PathItem","queryAllPublicConstructors":true,"queryAllDeclaredConstructors":true,"queryAllPublicMethods":true,"queryAllDeclaredMethods":true,"allPublicConstructors":true,"allDeclaredConstructors":true,"allPublicMethods":true,"allDeclaredMethods":true,"allPublicFields":true,"allDeclaredFields":true,"allPublicClasses":true,"allDeclaredClasses":true},
10+
{"name":"io.serverlessworkflow.impl.executors.UnifiedOpenAPI$RequestBody","queryAllPublicConstructors":true,"queryAllDeclaredConstructors":true,"queryAllPublicMethods":true,"queryAllDeclaredMethods":true,"allPublicConstructors":true,"allDeclaredConstructors":true,"allPublicMethods":true,"allDeclaredMethods":true,"allPublicFields":true,"allDeclaredFields":true,"allPublicClasses":true,"allDeclaredClasses":true},
11+
{"name":"io.serverlessworkflow.impl.executors.UnifiedOpenAPI$Schema","queryAllPublicConstructors":true,"queryAllDeclaredConstructors":true,"queryAllPublicMethods":true,"queryAllDeclaredMethods":true,"allPublicConstructors":true,"allDeclaredConstructors":true,"allPublicMethods":true,"allDeclaredMethods":true,"allPublicFields":true,"allDeclaredFields":true,"allPublicClasses":true,"allDeclaredClasses":true},
12+
{"name":"io.serverlessworkflow.impl.executors.UnifiedOpenAPI$Server","queryAllPublicConstructors":true,"queryAllDeclaredConstructors":true,"queryAllPublicMethods":true,"queryAllDeclaredMethods":true,"allPublicConstructors":true,"allDeclaredConstructors":true,"allPublicMethods":true,"allDeclaredMethods":true,"allPublicFields":true,"allDeclaredFields":true,"allPublicClasses":true,"allDeclaredClasses":true},
13+
{"name":"io.serverlessworkflow.impl.executors.UnifiedOpenAPI$SwaggerVersion","queryAllPublicConstructors":true,"queryAllDeclaredConstructors":true,"queryAllPublicMethods":true,"queryAllDeclaredMethods":true,"allPublicConstructors":true,"allDeclaredConstructors":true,"allPublicMethods":true,"allDeclaredMethods":true,"allPublicFields":true,"allDeclaredFields":true,"allPublicClasses":true,"allDeclaredClasses":true}
14+
]

0 commit comments

Comments
 (0)