Skip to content

Commit 97ba0af

Browse files
committed
Testing and fixing third parties reflect file generation
1 parent a556d89 commit 97ba0af

File tree

8 files changed

+267
-87
lines changed

8 files changed

+267
-87
lines changed

aptools/src/main/java/com/mageddo/aptools/ClassUtils.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ public static boolean doPackageOwnClass(String packageName, String className) {
2020
return getClassPackage(className).contains(packageName);
2121
}
2222

23-
public static List<Class<?>> findNestClasses(Class<?> clazz) {
24-
throw new UnsupportedOperationException();
23+
public static List<String> findNestClasses(String clazz) {
24+
throw new UnsupportedOperationException("Not able to find class nested classes yet");
2525
}
2626

2727
public static Class<?> forName(String className) {

build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,14 @@ subprojects {
2727
mavenCentral()
2828
}
2929

30-
sourceCompatibility = JavaVersion.VERSION_1_7
30+
sourceCompatibility = JavaVersion.VERSION_1_8
3131

3232
tasks.withType(JavaCompile) {
3333
options.encoding = 'UTF-8'
3434
}
3535

3636
compileTestJava {
37-
sourceCompatibility = JavaVersion.VERSION_1_7
37+
sourceCompatibility = JavaVersion.VERSION_1_8
3838
}
3939

4040
test {

reflection-config-generator/acceptance-tests/src/main/java/com/acme/ReflectionConfig.java

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,30 @@
44
import nativeimage.Reflections;
55

66
@Reflections({
7-
@Reflection(
8-
scanClass = Fruit.class,
9-
declaredFields = true, publicFields = true,
10-
declaredMethods = true, publicMethods = true,
11-
declaredConstructors = true, publicConstructors = true
12-
),
13-
@Reflection(
14-
scanClassName = "com.acme.Car",
15-
declaredConstructors = true, declaredFields = true, declaredMethods = true
16-
),
17-
@Reflection(
18-
scanPackage = "com.acme.subpackage",
19-
declaredFields = true
20-
)
7+
@Reflection(
8+
scanClass = Fruit.class,
9+
declaredFields = true,
10+
publicFields = true,
11+
declaredMethods = true,
12+
publicMethods = true,
13+
declaredConstructors = true,
14+
publicConstructors = true
15+
),
16+
@Reflection(
17+
scanClassName = "com.acme.Car",
18+
declaredConstructors = true,
19+
declaredFields = true,
20+
declaredMethods = true
21+
),
22+
@Reflection(
23+
scanPackage = "com.acme.subpackage",
24+
declaredFields = true
25+
),
26+
@Reflection(
27+
// scanPackage = "org.apache.commons.io.monitor",
28+
scanPackage = "com.fasterxml.jackson.core.util",
29+
scanLibs = true
30+
)
2131
})
2232
public class ReflectionConfig {
2333
}

reflection-config-generator/acceptance-tests/src/test/java/com/acme/ReflectionConfigGenerationTest.java

Lines changed: 39 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717

1818
class ReflectionConfigGenerationTest {
1919

20-
private final ObjectMapper objectMapper = new ObjectMapper()
20+
private static final ObjectMapper objectMapper = new ObjectMapper()
2121
.enable(SerializationFeature.INDENT_OUTPUT)
2222
;
2323

@@ -26,28 +26,32 @@ void mustConfigureReflectJson() throws JsonProcessingException {
2626
// arrange
2727

2828
// act
29-
final List<JsonNode> items = readReflectConfig();
29+
final List<JsonNode> items = readReflectConfig("reflect.json");
3030

3131
// assert
3232
assertEquals(13, items.size());
33-
assertEquals(getResourceAsString("/reflection-config-generation-test/001.json"), objectMapper.writeValueAsString(items));
33+
assertEquals(
34+
getResourceAsString("/reflection-config-generation-test/001.json"),
35+
objectMapper.writeValueAsString(items)
36+
);
3437
}
3538

36-
private List<JsonNode> readReflectConfig() throws JsonProcessingException {
37-
List<JsonNode> items = new ArrayList<>();
38-
final JsonNode reflectItems = objectMapper.readTree(getResourceAsString("/META-INF/native-image/com.acme/reflect.json"));
39-
for (JsonNode jsonNode : reflectItems) {
40-
items.add(jsonNode);
41-
}
42-
Collections.sort(items, new Comparator<JsonNode>() {
43-
@Override
44-
public int compare(JsonNode a, JsonNode b) {
45-
return a.at("/name").asText().compareTo(b.at("/name").asText());
46-
}
47-
});
48-
return items;
39+
@Test
40+
void mustConfigureThirdPartyReflectJson() throws JsonProcessingException {
41+
// arrange
42+
43+
// act
44+
final List<JsonNode> items = readReflectConfig("reflect-third-party.json");
45+
46+
// assert
47+
assertEquals(14, items.size());
48+
assertEquals(
49+
getResourceAsString("/reflection-config-generation-test/002.json"),
50+
objectMapper.writeValueAsString(items)
51+
);
4952
}
5053

54+
5155
@Test
5256
void mustConfigureNativeImagePropertiesFile(){
5357
// arrange
@@ -58,4 +62,23 @@ void mustConfigureNativeImagePropertiesFile(){
5862
// assert
5963
assertEquals(getResourceAsString("/reflection-config-generation-test/002.properties"), propsContent);
6064
}
65+
66+
67+
private List<JsonNode> readReflectConfig(final String fileName) throws JsonProcessingException {
68+
final List<JsonNode> items = new ArrayList<>();
69+
final JsonNode reflectItems = this.objectMapper.readTree(
70+
getResourceAsString("/META-INF/native-image/com.acme/" + fileName)
71+
);
72+
for (JsonNode jsonNode : reflectItems) {
73+
items.add(jsonNode);
74+
}
75+
Collections.sort(items, new Comparator<JsonNode>() {
76+
@Override
77+
public int compare(JsonNode a, JsonNode b) {
78+
return a.at("/name").asText().compareTo(b.at("/name").asText());
79+
}
80+
});
81+
return items;
82+
}
83+
6184
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package com.acme;
2+
3+
public class ThirdPartyGenerationTest {
4+
}
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
[ {
2+
"name" : "com.fasterxml.jackson.core.util.ByteArrayBuilder",
3+
"allDeclaredConstructors" : false,
4+
"allPublicConstructors" : false,
5+
"allDeclaredMethods" : false,
6+
"allPublicMethods" : false,
7+
"allPublicFields" : false,
8+
"allDeclaredFields" : false
9+
}, {
10+
"name" : "com.fasterxml.jackson.core.util.DefaultIndenter",
11+
"allDeclaredConstructors" : false,
12+
"allPublicConstructors" : false,
13+
"allDeclaredMethods" : false,
14+
"allPublicMethods" : false,
15+
"allPublicFields" : false,
16+
"allDeclaredFields" : false
17+
}, {
18+
"name" : "com.fasterxml.jackson.core.util.DefaultPrettyPrinter",
19+
"allDeclaredConstructors" : false,
20+
"allPublicConstructors" : false,
21+
"allDeclaredMethods" : false,
22+
"allPublicMethods" : false,
23+
"allPublicFields" : false,
24+
"allDeclaredFields" : false
25+
}, {
26+
"name" : "com.fasterxml.jackson.core.util.DefaultPrettyPrinter$FixedSpaceIndenter",
27+
"allDeclaredConstructors" : false,
28+
"allPublicConstructors" : false,
29+
"allDeclaredMethods" : false,
30+
"allPublicMethods" : false,
31+
"allPublicFields" : false,
32+
"allDeclaredFields" : false
33+
}, {
34+
"name" : "com.fasterxml.jackson.core.util.DefaultPrettyPrinter$Indenter",
35+
"allDeclaredConstructors" : false,
36+
"allPublicConstructors" : false,
37+
"allDeclaredMethods" : false,
38+
"allPublicMethods" : false,
39+
"allPublicFields" : false,
40+
"allDeclaredFields" : false
41+
}, {
42+
"name" : "com.fasterxml.jackson.core.util.DefaultPrettyPrinter$NopIndenter",
43+
"allDeclaredConstructors" : false,
44+
"allPublicConstructors" : false,
45+
"allDeclaredMethods" : false,
46+
"allPublicMethods" : false,
47+
"allPublicFields" : false,
48+
"allDeclaredFields" : false
49+
}, {
50+
"name" : "com.fasterxml.jackson.core.util.Instantiatable",
51+
"allDeclaredConstructors" : false,
52+
"allPublicConstructors" : false,
53+
"allDeclaredMethods" : false,
54+
"allPublicMethods" : false,
55+
"allPublicFields" : false,
56+
"allDeclaredFields" : false
57+
}, {
58+
"name" : "com.fasterxml.jackson.core.util.InternCache",
59+
"allDeclaredConstructors" : false,
60+
"allPublicConstructors" : false,
61+
"allDeclaredMethods" : false,
62+
"allPublicMethods" : false,
63+
"allPublicFields" : false,
64+
"allDeclaredFields" : false
65+
}, {
66+
"name" : "com.fasterxml.jackson.core.util.JsonGeneratorDelegate",
67+
"allDeclaredConstructors" : false,
68+
"allPublicConstructors" : false,
69+
"allDeclaredMethods" : false,
70+
"allPublicMethods" : false,
71+
"allPublicFields" : false,
72+
"allDeclaredFields" : false
73+
}, {
74+
"name" : "com.fasterxml.jackson.core.util.JsonParserDelegate",
75+
"allDeclaredConstructors" : false,
76+
"allPublicConstructors" : false,
77+
"allDeclaredMethods" : false,
78+
"allPublicMethods" : false,
79+
"allPublicFields" : false,
80+
"allDeclaredFields" : false
81+
}, {
82+
"name" : "com.fasterxml.jackson.core.util.JsonParserSequence",
83+
"allDeclaredConstructors" : false,
84+
"allPublicConstructors" : false,
85+
"allDeclaredMethods" : false,
86+
"allPublicMethods" : false,
87+
"allPublicFields" : false,
88+
"allDeclaredFields" : false
89+
}, {
90+
"name" : "com.fasterxml.jackson.core.util.MinimalPrettyPrinter",
91+
"allDeclaredConstructors" : false,
92+
"allPublicConstructors" : false,
93+
"allDeclaredMethods" : false,
94+
"allPublicMethods" : false,
95+
"allPublicFields" : false,
96+
"allDeclaredFields" : false
97+
}, {
98+
"name" : "com.fasterxml.jackson.core.util.RequestPayload",
99+
"allDeclaredConstructors" : false,
100+
"allPublicConstructors" : false,
101+
"allDeclaredMethods" : false,
102+
"allPublicMethods" : false,
103+
"allPublicFields" : false,
104+
"allDeclaredFields" : false
105+
}, {
106+
"name" : "com.fasterxml.jackson.core.util.Separators",
107+
"allDeclaredConstructors" : false,
108+
"allPublicConstructors" : false,
109+
"allDeclaredMethods" : false,
110+
"allPublicMethods" : false,
111+
"allPublicFields" : false,
112+
"allDeclaredFields" : false
113+
} ]

reflection-config-generator/src/main/java/nativeimage/core/NativeImageReflectionConfigGenerator.java

Lines changed: 21 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
*/
3434
public class NativeImageReflectionConfigGenerator implements Processor {
3535

36-
private final Logger logger = LoggerFactory.getLogger();
36+
private final Logger log = LoggerFactory.getLogger();
3737
private final ProcessingEnvironment processingEnv;
3838
private final Set<ReflectionConfig> classes;
3939
private final Set<ReflectionConfig> thirdPartyClasses;
@@ -78,6 +78,10 @@ void processElementsForAnnotation(RoundEnvironment roundEnv) {
7878
void processElementsForAnnotation(
7979
RoundEnvironment roundEnv, Element element, Reflection reflection
8080
) {
81+
log.debug(
82+
"m=processElementsForAnnotation, scanLibs=%b, reflection=%s",
83+
reflection.scanLibs(), reflection
84+
);
8185
if (reflection.scanLibs()) {
8286
this.addMatchingProjectLibsClasses(reflection);
8387
} else {
@@ -87,33 +91,27 @@ void processElementsForAnnotation(
8791

8892
void addMatchingProjectLibsClasses(Reflection reflection) {
8993
if (reflection.scanPackage().isEmpty()) {
90-
this.addClassAndNested(reflection, chooseClass(reflection));
94+
this.addClassAndNested(reflection, ReflectionUtils.getClassName(reflection));
9195
} else {
92-
final Set<Class<?>> classes = findPackageClasses(reflection.scanPackage());
93-
for (final Class<?> clazz : classes) {
94-
this.addClassAndNested(reflection, clazz);
96+
final Set<String> classes = findPackageClasses(reflection.scanPackage());
97+
for (final String clazz : classes) {
98+
this.addClass(clazz, reflection);
9599
}
96100
}
97101
}
98102

99-
static Class<?> chooseClass(Reflection reflection) {
100-
return ReflectionUtils.isVoid(reflection)
101-
? ClassUtils.forName(reflection.scanClassName())
102-
: reflection.scanClass();
103-
}
104-
105-
void addClassAndNested(Reflection reflection, Class<?> clazz) {
103+
void addClassAndNested(Reflection reflection, String clazz) {
106104
this.addClass(clazz, reflection);
107-
for (final Class<?> innerClass : ClassUtils.findNestClasses(clazz)) {
105+
for (final String innerClass : ClassUtils.findNestClasses(clazz)) {
108106
this.addClass(innerClass, reflection);
109-
logger.debug("m=addMatchingProjectLibsClasses, innerClass=%s", innerClass);
107+
log.debug("m=addMatchingProjectLibsClasses, innerClass=%s", innerClass);
110108
}
111109
}
112110

113-
void addClass(Class<?> clazz, Reflection reflection) {
114-
logger.debug("m=addClass, clazz=%s", clazz, clazz.getName());
111+
void addClass(String clazz, Reflection reflection) {
112+
log.debug("m=addClass, clazz=%s", clazz, clazz);
115113
// todo check if the name is correct
116-
for (ReflectionConfig config : ReflectionConfigBuilder.of(reflection, clazz.getName())) { //
114+
for (final ReflectionConfig config : ReflectionConfigBuilder.of(reflection, clazz)) {
117115
this.thirdPartyClasses.remove(config);
118116
this.thirdPartyClasses.add(config);
119117
}
@@ -155,20 +153,20 @@ private Element findElementAndNested(String className, RoundEnvironment roundEnv
155153
}
156154
}
157155
}
158-
logger.info("status=classNotFound, class={}", className);
156+
log.info("status=classNotFound, class={}", className);
159157
return null;
160158
}
161159

162160
private void addToElementAndNested(Reflection reflection, Element element) {
163161
this.addElement(element, reflection);
164162
for (final Element innerClass : ElementFinder.findNestedClasses(element)) {
165163
this.addElement(innerClass, reflection);
166-
logger.debug("m=addMatchingProjectSourceElements, innerClass=%s", innerClass);
164+
log.debug("m=addMatchingProjectSourceElements, innerClass=%s", innerClass);
167165
}
168166
}
169167

170168
private void addElement(Element element, Reflection annotation) {
171-
logger.debug(
169+
log.debug(
172170
"m=addElement, asType=%s, kind=%s, simpleName=%s, enclosing=%s, clazz=%s",
173171
element.asType(), element.getKind(), element.getSimpleName(),
174172
element.getEnclosingElement(), element.getClass()
@@ -203,13 +201,13 @@ private void writeObjects() {
203201
final URI nativeImageFile = NativeImagePropertiesWriter.write(
204202
this.processingEnv, classPackage, reflectFile, reflectFileThirdParty
205203
);
206-
logger.info(
204+
log.info(
207205
"status=reflect-generation-done, objects=%d, 3rdObjects=%s, path=%s",
208206
this.classes.size(), this.thirdPartyClasses.size(), nativeImageFile
209207
);
210208

211-
logger.debug("objects=%s", this.classes);
212-
logger.debug("3rdObjects=%s", this.classes);
209+
log.debug("objects=%s", this.classes);
210+
log.debug("3rdObjects=%s", this.classes);
213211
} catch (IOException e) {
214212
throw new RuntimeException(e);
215213
}

0 commit comments

Comments
 (0)