Skip to content

Commit a21ce78

Browse files
committed
Use own processor for @extension (as pf4j does not work properly for us)
1 parent a1f52ba commit a21ce78

File tree

7 files changed

+79
-6
lines changed

7 files changed

+79
-6
lines changed

Diff for: annotation-processor/build.gradle.kts

+4
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@ plugins {
33
`maven-publish`
44
}
55

6+
dependencies {
7+
// implementation(libs.pf4j)
8+
}
9+
610
publishing {
711
publications {
812
create<MavenPublication>("maven") {

Diff for: annotation-processor/src/main/java/dev/arbjerg/lavalink/processor/LavalinkAnnotationProcessor.java renamed to annotation-processor/src/main/java/dev/arbjerg/lavalink/processor/ConfigurationAnnotationProcessor.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@
1313
import java.util.Set;
1414

1515
@SupportedSourceVersion(SourceVersion.RELEASE_17)
16-
@SupportedAnnotationTypes(LavalinkAnnotationProcessor.SPRING_CONFIGURATION)
17-
public class LavalinkAnnotationProcessor extends AbstractProcessor {
16+
@SupportedAnnotationTypes(ConfigurationAnnotationProcessor.SPRING_CONFIGURATION)
17+
public class ConfigurationAnnotationProcessor extends AbstractProcessor {
1818

1919
public static final String SPRING_CONFIGURATION = "org.springframework.context.annotation.Configuration";
2020
private TypeElement springConfigurationElement;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package dev.arbjerg.lavalink.processor;
2+
3+
import javax.annotation.processing.*;
4+
import javax.lang.model.SourceVersion;
5+
import javax.lang.model.element.Element;
6+
import javax.lang.model.element.ElementKind;
7+
import javax.lang.model.element.TypeElement;
8+
import javax.tools.Diagnostic;
9+
import javax.tools.StandardLocation;
10+
import java.io.BufferedWriter;
11+
import java.io.IOException;
12+
import java.util.ArrayList;
13+
import java.util.List;
14+
import java.util.Set;
15+
16+
@SupportedAnnotationTypes({"org.pf4j.Extension"})
17+
@SupportedSourceVersion(SourceVersion.RELEASE_17)
18+
public class ExtensionAnnotationProcessor extends AbstractProcessor {
19+
private List<CharSequence> metaAnnotations = new ArrayList<>(List.of("org.pf4j.Extension"));
20+
private List<CharSequence> extensions = new ArrayList<>();
21+
22+
@Override
23+
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
24+
var extension = processingEnv.getElementUtils().getTypeElement("org.pf4j.Extension");
25+
var metaAnnotations = roundEnv.getElementsAnnotatedWith(extension)
26+
.stream()
27+
.filter(element -> element.getKind() == ElementKind.ANNOTATION_TYPE)
28+
.map(element -> {
29+
processingEnv.getMessager().printMessage(Diagnostic.Kind.NOTE, "Found new extension meta class: " + element.getSimpleName());
30+
return processingEnv.getElementUtils().getBinaryName((TypeElement) element);
31+
})
32+
.toList();
33+
34+
this.metaAnnotations.addAll(metaAnnotations);
35+
36+
var extensions = roundEnv.getRootElements()
37+
.stream()
38+
.filter(this::checkAnnotations)
39+
.map(element -> {
40+
processingEnv.getMessager().printMessage(Diagnostic.Kind.NOTE, "Found new extension: " + element.getSimpleName());
41+
return processingEnv.getElementUtils().getBinaryName((TypeElement) element).toString();
42+
})
43+
.toList();
44+
this.extensions.addAll(extensions);
45+
46+
if (roundEnv.processingOver()) {
47+
writeStorage();
48+
return false;
49+
}
50+
return false;
51+
}
52+
53+
private boolean checkAnnotations(Element element) {
54+
return element.getAnnotationMirrors().stream()
55+
.map(annotation -> processingEnv.getElementUtils().getBinaryName((TypeElement) annotation.getAnnotationType().asElement()))
56+
.anyMatch(annotation -> metaAnnotations.contains(annotation.toString()));
57+
}
58+
59+
private void writeStorage() {
60+
try (var resource = new BufferedWriter(processingEnv.getFiler().createResource(StandardLocation.CLASS_OUTPUT, "", "META-INF/extensions.idx").openWriter())) {
61+
for (CharSequence className : extensions) {
62+
resource.write(className.toString());
63+
resource.newLine();
64+
}
65+
} catch (IOException e) {
66+
processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, e.getMessage());
67+
throw new RuntimeException(e);
68+
}
69+
}
70+
}
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
1-
dev.arbjerg.lavalink.processor.LavalinkAnnotationProcessor
1+
dev.arbjerg.lavalink.processor.ConfigurationAnnotationProcessor
2+
dev.arbjerg.lavalink.processor.ExtensionAnnotationProcessor

Diff for: example/src/main/java/dev/arbjerg/lavalink/example/Plugin.java

-2
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,8 @@
55
import org.jetbrains.annotations.NotNull;
66
import org.slf4j.Logger;
77
import org.slf4j.LoggerFactory;
8-
import org.springframework.context.annotation.Configuration;
98
import org.springframework.stereotype.Service;
109

11-
@Configuration
1210
@Service
1311
public class Plugin extends PluginEventHandler {
1412

Diff for: gradle/libs.versions.toml

+1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ ksp = "2.0.21-1.0.27"
33

44
[libraries]
55
ksp-api = { group = "com.google.devtools.ksp", name = "symbol-processing-api", version.ref = "ksp" }
6+
pf4j = { group = "org.pf4j", name = "pf4j", version = "3.12.1" }
67

78
[plugins]
89
gradle-publish = { id = "com.gradle.plugin-publish", version = "1.3.0" }

Diff for: src/main/kotlin/LavalinkGradlePlugin.kt

-1
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,6 @@ private fun Project.configureDependencies(): Provider<Dependency> {
7676
add("compileOnly", lavalink("plugin-api"))
7777
if (plugins.hasPlugin("org.gradle.java")) {
7878
add("annotationProcessor", "dev.arbjerg.lavalink:annotation-processor:${BuildConfig.VERSION}")
79-
add("annotationProcessor", "org.pf4j:pf4j:3.12.1")
8079
}
8180
if (plugins.hasPlugin("org.jetbrains.kotlin")) {
8281
if (plugins.hasPlugin("com.google.devtools.ksp")) {

0 commit comments

Comments
 (0)