Skip to content

Commit bcd08c0

Browse files
authored
Move some initialization steps (especially reflection) to Plugin's static initialization (#166)
1 parent 6e1c5a8 commit bcd08c0

File tree

2 files changed

+23
-7
lines changed

2 files changed

+23
-7
lines changed

src/main/java/de/thetaphi/forbiddenapis/gradle/ForbiddenApisPlugin.java

+22
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,15 @@
2020
import groovy.lang.GroovyCodeSource;
2121
import groovy.util.DelegatingScript;
2222

23+
import java.lang.reflect.Field;
24+
import java.lang.reflect.Modifier;
2325
import java.net.URL;
2426
import java.nio.charset.StandardCharsets;
2527
import java.security.AccessController;
2628
import java.security.PrivilegedAction;
29+
import java.util.ArrayList;
30+
import java.util.Collections;
31+
import java.util.List;
2732

2833
import org.codehaus.groovy.control.CompilerConfiguration;
2934
import org.codehaus.groovy.control.customizers.ImportCustomizer;
@@ -61,6 +66,12 @@ public class ForbiddenApisPlugin implements Plugin<Project> {
6166
/** Minimum Gradle version this plugin requires to run (v3.2). */
6267
public static final GradleVersion MIN_GRADLE_VERSION = GradleVersion.version("3.2");
6368

69+
/** True, if this version of Gradle supports task avoidance API (&gt;=v4.9). */
70+
public static final boolean TASK_AVOIDANCE_AVAILABLE = GradleVersion.current().compareTo(GradleVersion.version("4.9")) >= 0;
71+
72+
/** All properties that our ForbiddenApisExtension provides. Used by plugin init script to create convention mapping. */
73+
public static final List<String> FORBIDDEN_APIS_EXTENSION_PROPS = determineExtensionProps();
74+
6475
/** Java Package that contains the Gradle Daemon (needed to detect it on startup). */
6576
private static final String GRADLE_DAEMON_PACKAGE = "org.gradle.launcher.daemon.";
6677

@@ -97,6 +108,17 @@ public Class<? extends DelegatingScript> run() {
97108
});
98109
}
99110

111+
private static List<String> determineExtensionProps() {
112+
final List<String> props = new ArrayList<>();
113+
for (final Field f : CheckForbiddenApisExtension.class.getDeclaredFields()) {
114+
final int mods = f.getModifiers();
115+
if (Modifier.isPublic(mods) && !f.isSynthetic() && !Modifier.isStatic(mods)) {
116+
props.add(f.getName());
117+
}
118+
}
119+
return Collections.unmodifiableList(props);
120+
}
121+
100122
private static boolean isGradleDaemon() {
101123
// see: http://stackoverflow.com/questions/23265217/how-to-know-whether-you-are-running-inside-a-gradle-daemon
102124
if (System.getProperty("sun.java.command", "").startsWith(GRADLE_DAEMON_PACKAGE)) {

src/main/resources/de/thetaphi/forbiddenapis/gradle/plugin-init.groovy

+1-7
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,10 @@ import java.lang.reflect.Modifier;
2020
import org.gradle.api.plugins.JavaBasePlugin;
2121
import org.gradle.util.GradleVersion;
2222

23-
final boolean TASK_AVOIDANCE_AVAILABLE = GradleVersion.current() >= GradleVersion.version("4.9");
24-
2523
project.plugins.apply(JavaBasePlugin.class);
2624

2725
// create Extension for defaults:
2826
def extension = project.extensions.create(FORBIDDEN_APIS_EXTENSION_NAME, CheckForbiddenApisExtension.class, project);
29-
def extensionProps = CheckForbiddenApisExtension.class.declaredFields.findAll{ f ->
30-
int mods = f.modifiers;
31-
return Modifier.isPublic(mods) && !f.synthetic && !Modifier.isStatic(mods)
32-
}*.name;
3327

3428
// Create a convenience task for all checks (this does not conflict with extension, as it has higher priority in DSL):
3529
def forbiddenTask = TASK_AVOIDANCE_AVAILABLE ? project.tasks.register(FORBIDDEN_APIS_TASK_NAME) : project.tasks.create(FORBIDDEN_APIS_TASK_NAME)
@@ -48,7 +42,7 @@ project.sourceSets.all{ sourceSet ->
4842
dependsOn(sourceSet.output);
4943
outputs.upToDateWhen { true }
5044
conventionMapping.with{
51-
extensionProps.each{ key ->
45+
FORBIDDEN_APIS_EXTENSION_PROPS.each{ key ->
5246
map(key, { extension[key] });
5347
}
5448
classesDirs = { sourceSet.output.hasProperty('classesDirs') ? sourceSet.output.classesDirs : project.files(sourceSet.output.classesDir) }

0 commit comments

Comments
 (0)