16
16
17
17
package de .thetaphi .forbiddenapis .gradle ;
18
18
19
- import groovy .lang .GroovyClassLoader ;
20
- import groovy .lang .GroovyCodeSource ;
21
- import groovy .util .DelegatingScript ;
22
-
23
19
import java .lang .reflect .Field ;
24
20
import java .lang .reflect .Modifier ;
25
- import java .net .URL ;
26
- import java .nio .charset .StandardCharsets ;
27
- import java .security .AccessController ;
28
- import java .security .PrivilegedAction ;
29
21
import java .util .ArrayList ;
30
22
import java .util .Collections ;
31
23
import java .util .List ;
32
24
33
- import org .codehaus .groovy .control .CompilerConfiguration ;
34
- import org .codehaus .groovy .control .customizers .ImportCustomizer ;
35
- import org .gradle .api .GradleException ;
36
25
import org .gradle .api .Plugin ;
37
26
import org .gradle .api .Project ;
38
27
import org .gradle .api .logging .Logger ;
39
28
import org .gradle .api .logging .Logging ;
40
29
import org .gradle .util .GradleVersion ;
41
30
42
- /**
43
- * Forbiddenapis Gradle Plugin (requires at least Gradle v3.2)
44
- * @since 2.0
45
- */
46
- public class ForbiddenApisPlugin implements Plugin <Project > {
31
+ abstract class ForbiddenApisPluginBase implements Plugin <Project > {
47
32
48
- private static final Logger LOG = Logging .getLogger (ForbiddenApisPlugin .class );
33
+ private static final Logger LOG = Logging .getLogger (ForbiddenApisPluginBase .class );
49
34
50
35
/** Name of the base task that depends on one for every SourceSet. */
51
36
public static final String FORBIDDEN_APIS_TASK_NAME = "forbiddenApis" ;
@@ -69,45 +54,12 @@ public class ForbiddenApisPlugin implements Plugin<Project> {
69
54
/** True, if this version of Gradle supports task avoidance API (>=v4.9). */
70
55
public static final boolean TASK_AVOIDANCE_AVAILABLE = GradleVersion .current ().compareTo (GradleVersion .version ("4.9" )) >= 0 ;
71
56
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 ();
57
+ /** All properties that our ForbiddenApisExtension provides. Used to create convention mapping. */
58
+ protected static final List <String > FORBIDDEN_APIS_EXTENSION_PROPS = determineExtensionProps ();
74
59
75
60
/** Java Package that contains the Gradle Daemon (needed to detect it on startup). */
76
61
private static final String GRADLE_DAEMON_PACKAGE = "org.gradle.launcher.daemon." ;
77
62
78
- /** Resource with Groovy script that initializes the plugin. */
79
- private static final String PLUGIN_INIT_SCRIPT = "plugin-init.groovy" ;
80
-
81
- /** Compiled class instance of the plugin init script, an instance is executed per {@link #apply(Project)} */
82
- private static final Class <? extends DelegatingScript > COMPILED_SCRIPT = loadScript ();
83
-
84
- private static Class <? extends DelegatingScript > loadScript () {
85
- final ImportCustomizer importCustomizer = new ImportCustomizer ().addStarImports (ForbiddenApisPlugin .class .getPackage ().getName ());
86
- final CompilerConfiguration configuration = new CompilerConfiguration ().addCompilationCustomizers (importCustomizer );
87
- configuration .setScriptBaseClass (DelegatingScript .class .getName ());
88
- configuration .setSourceEncoding (StandardCharsets .UTF_8 .name ());
89
- final URL scriptUrl = ForbiddenApisPlugin .class .getResource (PLUGIN_INIT_SCRIPT );
90
- if (scriptUrl == null ) {
91
- throw new RuntimeException ("Cannot find resource with script: " + PLUGIN_INIT_SCRIPT );
92
- }
93
- return AccessController .doPrivileged (new PrivilegedAction <Class <? extends DelegatingScript >>() {
94
- @ Override
95
- public Class <? extends DelegatingScript > run () {
96
- try {
97
- // We don't close the classloader, as we may need it later when loading other classes from inside script:
98
- @ SuppressWarnings ("resource" ) final GroovyClassLoader loader =
99
- new GroovyClassLoader (ForbiddenApisPlugin .class .getClassLoader (), configuration );
100
- final GroovyCodeSource csrc = new GroovyCodeSource (scriptUrl );
101
- @ SuppressWarnings ("unchecked" ) final Class <? extends DelegatingScript > clazz =
102
- loader .parseClass (csrc , false ).asSubclass (DelegatingScript .class );
103
- return clazz ;
104
- } catch (Exception e ) {
105
- throw new RuntimeException ("Cannot compile Groovy script: " + PLUGIN_INIT_SCRIPT , e );
106
- }
107
- }
108
- });
109
- }
110
-
111
63
private static List <String > determineExtensionProps () {
112
64
final List <String > props = new ArrayList <>();
113
65
for (final Field f : CheckForbiddenApisExtension .class .getDeclaredFields ()) {
@@ -140,20 +92,4 @@ private static boolean detectAndLogGradleDaemon() {
140
92
return daemon ;
141
93
}
142
94
143
- @ Override
144
- public void apply (Project project ) {
145
- if (GradleVersion .current ().compareTo (MIN_GRADLE_VERSION ) < 0 ) {
146
- throw new GradleException ("Forbiddenapis plugin requires at least " + MIN_GRADLE_VERSION + ", running version is " + GradleVersion .current ());
147
- }
148
- final DelegatingScript script ;
149
- try {
150
- script = COMPILED_SCRIPT .newInstance ();
151
- } catch (Exception e ) {
152
- throw new GradleException ("Cannot instantiate Groovy script to apply forbiddenapis plugin." , e );
153
- }
154
- script .setDelegate (this );
155
- script .setProperty ("project" , project );
156
- script .run ();
157
- }
158
-
159
95
}
0 commit comments