Skip to content

Commit cfc5d82

Browse files
authored
Refactor Util.validImportType() and add unit tests (#230)
* Refactor Util.validImportType() and add unit tests * Format only ProcessingContext and add package-info
1 parent ec02856 commit cfc5d82

File tree

5 files changed

+58
-36
lines changed

5 files changed

+58
-36
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
/**
2+
* Constraint annotations for Avaje Validation.
3+
*/
4+
package io.avaje.validation.constraints;

validator-generator/src/main/java/io/avaje/validation/generator/ComponentMetaData.java

+4-5
Original file line numberDiff line numberDiff line change
@@ -87,13 +87,12 @@ Collection<String> allImports() {
8787
for (final var adapter : annotationAdapters) {
8888
final var adapterFullName = adapter.getQualifiedName().toString();
8989
packageImports.add(adapterFullName);
90-
packageImports.add(
91-
ProcessorUtils.extractEnclosingFQN(Util.baseTypeOfAdapter(adapterFullName)));
90+
packageImports.add(ProcessorUtils.extractEnclosingFQN(Util.baseTypeOfAdapter(adapterFullName)));
9291

9392
ConstraintAdapterPrism.getInstanceOn(adapter)
94-
.value()
95-
.toString()
96-
.transform(packageImports::add);
93+
.value()
94+
.toString()
95+
.transform(packageImports::add);
9796
}
9897

9998
return packageImports;

validator-generator/src/main/java/io/avaje/validation/generator/ProcessingContext.java

+12-15
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,6 @@
99
import java.io.BufferedReader;
1010
import java.io.IOException;
1111
import java.io.InputStreamReader;
12-
import java.net.URI;
13-
import java.net.URISyntaxException;
1412
import java.util.Set;
1513
import java.util.TreeSet;
1614

@@ -33,7 +31,6 @@ private static final class Ctx {
3331

3432
Ctx(ProcessingEnvironment env) {
3533
var elements = env.getElementUtils();
36-
3734
this.injectPresent = elements.getTypeElement(Constants.COMPONENT) != null;
3835
this.warnHttp = elements.getTypeElement("io.avaje.http.api.Controller") != null;
3936

@@ -78,22 +75,22 @@ static void validateModule() {
7875

7976
var buildPluginAvailable = buildPluginAvailable();
8077
var requireSet =
81-
moduleInfo.requires().stream()
82-
.map(Requires::getDependency)
83-
.map(m -> m.getQualifiedName().toString())
84-
.collect(toSet());
78+
moduleInfo.requires().stream()
79+
.map(Requires::getDependency)
80+
.map(m -> m.getQualifiedName().toString())
81+
.collect(toSet());
8582

8683
boolean noHttpPlugin =
87-
injectPresent
88-
&& (!buildPluginAvailable || !requireSet.contains("io.avaje.http.api"))
89-
&& warnHttp
90-
&& !moduleInfo.containsOnModulePath("io.avaje.validation.http");
84+
injectPresent
85+
&& (!buildPluginAvailable || !requireSet.contains("io.avaje.http.api"))
86+
&& warnHttp
87+
&& !moduleInfo.containsOnModulePath("io.avaje.validation.http");
9188

9289
boolean noInjectPlugin =
93-
noHttpPlugin
94-
&& injectPresent
95-
&& (!buildPluginAvailable || !requireSet.contains("io.avaje.validation"))
96-
&& !moduleInfo.containsOnModulePath("io.avaje.validation.plugin");
90+
noHttpPlugin
91+
&& injectPresent
92+
&& (!buildPluginAvailable || !requireSet.contains("io.avaje.validation"))
93+
&& !moduleInfo.containsOnModulePath("io.avaje.validation.plugin");
9794

9895
if (noHttpPlugin) {
9996
logWarn(module, "`requires io.avaje.validation.http` must be explicity added or else avaje-inject may fail to detect the default http validator, validator, and method AOP validator");

validator-generator/src/main/java/io/avaje/validation/generator/Util.java

+24-16
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,16 @@
11
package io.avaje.validation.generator;
22

3-
import static io.avaje.validation.generator.APContext.logError;
4-
import static io.avaje.validation.generator.APContext.typeElement;
5-
6-
import java.util.Optional;
7-
import java.util.Set;
8-
import java.util.function.Supplier;
9-
import java.util.regex.Pattern;
10-
113
import javax.lang.model.element.AnnotationMirror;
124
import javax.lang.model.element.Element;
135
import javax.lang.model.element.Modifier;
146
import javax.lang.model.element.TypeElement;
15-
import javax.lang.model.element.VariableElement;
167
import javax.lang.model.type.TypeMirror;
8+
import java.util.Optional;
9+
import java.util.Set;
10+
import java.util.function.Supplier;
11+
12+
import static io.avaje.validation.generator.APContext.logError;
13+
import static io.avaje.validation.generator.APContext.typeElement;
1714

1815
final class Util {
1916

@@ -27,7 +24,9 @@ static boolean isValid(Element e) {
2724
|| JakartaValidPrism.isPresent(e);
2825
}
2926

30-
/** Return true if the element has a Nullable annotation. */
27+
/**
28+
* Return true if the element has a Nullable annotation.
29+
*/
3130
public static boolean isNullable(Element p) {
3231
for (final AnnotationMirror mirror : p.getAnnotationMirrors()) {
3332
if ("Nullable".equalsIgnoreCase(shortName(mirror.getAnnotationType().toString()))) {
@@ -37,12 +36,19 @@ public static boolean isNullable(Element p) {
3736
return false;
3837
}
3938

40-
static boolean validImportType(String type, String adapterPackage) {
39+
static boolean validImportType(String type, String packageName) {
4140
return type.indexOf('.') > -1
42-
&& !type.startsWith("java.lang.")
43-
&& type.replace(adapterPackage + ".", "").transform(s -> s.contains("."))
44-
|| (type.startsWith("java.lang.")
45-
&& type.replace("java.lang.", "").transform(s -> s.contains(".")));
41+
&& !type.startsWith("java.lang.")
42+
&& importDifferentPackage(type, packageName)
43+
|| importJavaLangSubpackage(type);
44+
}
45+
46+
private static boolean importDifferentPackage(String type, String packageName) {
47+
return type.replace(packageName + '.', "").indexOf('.') > 0;
48+
}
49+
50+
private static boolean importJavaLangSubpackage(String type) {
51+
return type.startsWith("java.lang.") && importDifferentPackage(type, "java.lang");
4652
}
4753

4854
static String shortName(String fullType) {
@@ -78,7 +84,9 @@ static String initLower(String name) {
7884
return sb.toString();
7985
}
8086

81-
/** Return the base type given the ValidationAdapter type. */
87+
/**
88+
* Return the base type given the ValidationAdapter type.
89+
*/
8290
static String baseTypeOfAdapter(String adapterFullName) {
8391
final var element = typeElement(adapterFullName);
8492
if (element == null) {

validator-generator/src/test/java/io/avaje/validation/generator/UtilTest.java

+14
Original file line numberDiff line numberDiff line change
@@ -31,4 +31,18 @@ void initLower() {
3131
assertEquals("url", Util.initLower("URL"));
3232
assertEquals("initCap", Util.initLower("InitCap"));
3333
}
34+
35+
@Test
36+
void validImportType_expect_false() {
37+
assertFalse(Util.validImportType("int", "org.foo"));
38+
assertFalse(Util.validImportType("java.lang.Integer", "org.foo"));
39+
assertFalse(Util.validImportType("org.foo.Bar", "org.foo"));
40+
}
41+
42+
@Test
43+
void validImportType_expect_true() {
44+
assertTrue(Util.validImportType("java.lang.something.Foo", "org.foo"));
45+
assertTrue(Util.validImportType("org.foo.some.Bar", "org.foo"));
46+
assertTrue(Util.validImportType("org.other.Bar", "org.foo"));
47+
}
3448
}

0 commit comments

Comments
 (0)