Skip to content

Commit edf5453

Browse files
SentryManrbygrave
andauthored
Disable Module Validation when the Avaje Build Plugin is Detected (#513)
* disable validation when avaje build plugin is detected * Update Processor.java * gradle * Update Processor.java * Update README.md * clean up resources * Update ExternalProvider.java * Update ExternalProvider.java * Update ExternalProvider.java * Update Processor.java * Update code formatting, rename using performModuleValidation --------- Co-authored-by: Rob Bygrave <[email protected]>
1 parent 871e201 commit edf5453

File tree

4 files changed

+61
-46
lines changed

4 files changed

+61
-46
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ public final class ExampleModule implements Module {
143143

144144
## Differences to Dagger
145145

146-
- Specifically Aimed for server-side development (rather than Android)
146+
- Specifically aimed for server-side development (rather than Android)
147147
- Provides API to obtain all bean instances that implement an interface
148148
- Lifecycle methods with `@PostConstruct` and `@PreDestroy`
149149
- Spring-like factory classes with `@Factory` and `@Bean`

inject-generator/src/main/java/io/avaje/inject/generator/ExternalProvider.java

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package io.avaje.inject.generator;
22

33
import static java.util.Map.entry;
4+
5+
import java.net.URI;
6+
import java.nio.file.Paths;
47
import static java.util.List.of;
58

69
import java.util.List;
@@ -9,6 +12,8 @@
912
import java.util.ServiceLoader;
1013
import java.util.Set;
1114

15+
import javax.tools.StandardLocation;
16+
1217
import io.avaje.inject.spi.Module;
1318
import io.avaje.inject.spi.Plugin;
1419

@@ -43,13 +48,16 @@ private static boolean moduleCP() {
4348

4449
static void registerModuleProvidedTypes(Set<String> providedTypes) {
4550
if (!injectAvailable) {
46-
System.out.println("Unable to detect Avaje Inject in Annotation Processor ClassPath, use the Avaje Inject Maven/Gradle plugin for detecting Inject Modules from dependencies");
51+
if (!pluginExists("build/avaje-plugin-exists.txt")
52+
&& !pluginExists("target/avaje-plugin-exists.txt")) {
53+
APContext.logNote("Unable to detect Avaje Inject in Annotation Processor ClassPath, use the Avaje Inject Maven/Gradle plugin for detecting Inject Modules from dependencies");
54+
}
4755
return;
4856
}
4957

5058
final var iterator = ServiceLoader.load(Module.class, ExternalProvider.class.getClassLoader()).iterator();
5159
if (!iterator.hasNext()) {
52-
System.out.println("No external modules detected");
60+
APContext.logNote("No external modules detected");
5361
return;
5462
}
5563
while (iterator.hasNext()) {
@@ -78,7 +86,7 @@ static void registerModuleProvidedTypes(Set<String> providedTypes) {
7886
static void registerPluginProvidedTypes(ScopeInfo defaultScope) {
7987
avajePlugins.forEach((k, v) -> {
8088
if (APContext.typeElement(k) != null) {
81-
System.out.println("Loaded Plugin: " + k);
89+
APContext.logNote("Loaded Plugin: " + k);
8290
v.forEach(defaultScope::pluginProvided);
8391
}
8492
});
@@ -90,7 +98,7 @@ static void registerPluginProvidedTypes(ScopeInfo defaultScope) {
9098
if (avajePlugins.containsKey(name)) {
9199
continue;
92100
}
93-
System.out.println("Loaded Plugin: " + plugin.getClass().getCanonicalName());
101+
APContext.logNote("Loaded Plugin: " + plugin.getClass().getCanonicalName());
94102
for (final Class<?> provide : plugin.provides()) {
95103
defaultScope.pluginProvided(provide.getCanonicalName());
96104
}
@@ -99,4 +107,19 @@ static void registerPluginProvidedTypes(ScopeInfo defaultScope) {
99107
}
100108
}
101109
}
110+
111+
private static boolean pluginExists(String relativeName) {
112+
try {
113+
final String resource =
114+
APContext.filer()
115+
.getResource(StandardLocation.CLASS_OUTPUT, "", relativeName)
116+
.toUri()
117+
.toString()
118+
.replaceFirst("/target/classes", "")
119+
.replaceFirst("/build/classes/java/main", "");
120+
return Paths.get(new URI(resource)).toFile().exists();
121+
} catch (final Exception e) {
122+
return false;
123+
}
124+
}
102125
}

inject-generator/src/main/java/io/avaje/inject/generator/ProcessingContext.java

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package io.avaje.inject.generator;
22

33
import javax.annotation.processing.FilerException;
4-
import javax.annotation.processing.ProcessingEnvironment;
54
import javax.lang.model.element.TypeElement;
65
import javax.lang.model.type.TypeMirror;
76
import javax.tools.FileObject;
@@ -19,9 +18,9 @@ final class ProcessingContext {
1918

2019
private static final ThreadLocal<Ctx> CTX = new ThreadLocal<>();
2120
private static boolean processingOver;
21+
private static boolean moduleValidation;
2222

23-
private ProcessingContext() {
24-
}
23+
private ProcessingContext() {}
2524

2625
static final class Ctx {
2726
private final Set<String> uniqueModuleNames = new HashSet<>();
@@ -31,21 +30,20 @@ static final class Ctx {
3130
private final List<TypeElement> delayQueue = new ArrayList<>();
3231
private boolean validated;
3332

34-
public Ctx(Set<String> moduleFileProvided) {
33+
Ctx(Set<String> moduleFileProvided) {
3534
ExternalProvider.registerModuleProvidedTypes(providedTypes);
3635
providedTypes.addAll(moduleFileProvided);
3736
}
3837

39-
public Ctx() {
40-
}
38+
Ctx() {}
4139
}
4240

43-
public static void init(ProcessingEnvironment processingEnv, Set<String> moduleFileProvided) {
41+
static void init(Set<String> moduleFileProvided, boolean performModuleValidation) {
42+
ProcessingContext.moduleValidation = performModuleValidation;
4443
CTX.set(new Ctx(moduleFileProvided));
45-
APContext.init(processingEnv);
4644
}
4745

48-
public static void testInit() {
46+
static void testInit() {
4947
CTX.set(new Ctx());
5048
}
5149

@@ -142,18 +140,13 @@ static void addImportedAspects(Map<String, AspectImportPrism> importedMap) {
142140

143141
static void validateModule(String injectFQN) {
144142
var module = getProjectModuleElement();
145-
if (module != null && !CTX.get().validated && !module.isUnnamed()) {
146-
143+
if (moduleValidation && module != null && !CTX.get().validated && !module.isUnnamed()) {
147144
CTX.get().validated = true;
148-
149145
try (var reader = getModuleInfoReader()) {
150-
151146
var noProvides = reader.lines().noneMatch(s -> s.contains(injectFQN));
152-
153147
if (noProvides) {
154148
logError(module, "Missing \"provides io.avaje.inject.spi.Module with %s;\"", injectFQN);
155149
}
156-
157150
} catch (Exception e) {
158151
// can't read module
159152
}

inject-generator/src/main/java/io/avaje/inject/generator/Processor.java

Lines changed: 25 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,10 @@
1313
import javax.lang.model.util.ElementFilter;
1414
import javax.lang.model.util.Elements;
1515
import javax.tools.StandardLocation;
16-
import java.io.BufferedReader;
1716
import java.io.IOException;
18-
import java.io.InputStreamReader;
1917
import java.net.URI;
18+
import java.nio.file.Files;
19+
import java.nio.file.Paths;
2020
import java.util.*;
2121
import java.util.stream.Collectors;
2222

@@ -47,6 +47,7 @@ public final class Processor extends AbstractProcessor {
4747
private boolean readModuleInfo;
4848
private final Set<String> pluginFileProvided = new HashSet<>();
4949
private final Set<String> moduleFileProvided = new HashSet<>();
50+
private boolean performModuleValidation;
5051

5152
@Override
5253
public SourceVersion getSupportedSourceVersion() {
@@ -56,45 +57,43 @@ public SourceVersion getSupportedSourceVersion() {
5657
@Override
5758
public synchronized void init(ProcessingEnvironment processingEnv) {
5859
super.init(processingEnv);
59-
loadProvidedFiles(processingEnv.getFiler());
60-
ProcessingContext.init(processingEnv, moduleFileProvided);
60+
APContext.init(processingEnv);
61+
loadProvidedFiles();
62+
ProcessingContext.init(moduleFileProvided, performModuleValidation);
6163
this.elementUtils = processingEnv.getElementUtils();
6264
this.allScopes = new AllScopes();
6365
this.defaultScope = allScopes.defaultScope();
6466
ExternalProvider.registerPluginProvidedTypes(defaultScope);
6567
pluginFileProvided.forEach(defaultScope::pluginProvided);
6668
}
6769

68-
/**
69-
* Loads provider files generated by avaje-inject-maven-plugin
70-
*/
71-
void loadProvidedFiles(Filer filer) {
72-
pluginFileProvided.addAll(lines(filer, "target/avaje-plugin-provides.txt", "/target/classes"));
73-
moduleFileProvided.addAll(lines(filer, "target/avaje-module-provides.txt", "/target/classes"));
74-
pluginFileProvided.addAll(lines(filer, "build/avaje-plugin-provides.txt", "/build/classes/java/main"));
75-
moduleFileProvided.addAll(lines(filer, "build/avaje-module-provides.txt", "/build/classes/java/main"));
70+
/** Loads provider files generated by avaje-inject-maven-plugin */
71+
void loadProvidedFiles() {
72+
this.performModuleValidation =
73+
lines("target/avaje-plugin-exists.txt").isEmpty()
74+
&& lines("build/avaje-plugin-exists.txt").isEmpty();
75+
pluginFileProvided.addAll(lines("target/avaje-plugin-provides.txt"));
76+
moduleFileProvided.addAll(lines("target/avaje-module-provides.txt"));
77+
pluginFileProvided.addAll(lines("build/avaje-plugin-provides.txt"));
78+
moduleFileProvided.addAll(lines("build/avaje-module-provides.txt"));
7679
}
7780

78-
private static List<String> lines(Filer filer, String relativeName, String replace) {
81+
private List<String> lines(String relativeName) {
7982
try {
80-
final String resource = resource(filer, relativeName, replace);
81-
try (var inputStream = new URI(resource).toURL().openStream();
82-
var reader = new BufferedReader(new InputStreamReader(inputStream))) {
83-
return reader.lines().collect(Collectors.toList());
84-
}
83+
final String resource =
84+
processingEnv
85+
.getFiler()
86+
.getResource(StandardLocation.CLASS_OUTPUT, "", relativeName)
87+
.toUri()
88+
.toString()
89+
.replaceFirst("/target/classes", "")
90+
.replaceFirst("/build/classes/java/main", "");
91+
return Files.readAllLines(Paths.get(new URI(resource)));
8592
} catch (final Exception e) {
8693
return Collections.emptyList();
8794
}
8895
}
8996

90-
private static String resource(Filer filer, String relativeName, String replace) throws IOException {
91-
return filer
92-
.getResource(StandardLocation.CLASS_OUTPUT, "", relativeName)
93-
.toUri()
94-
.toString()
95-
.replace(replace, "");
96-
}
97-
9897
@Override
9998
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
10099
APContext.setProjectModuleElement(annotations, roundEnv);

0 commit comments

Comments
 (0)