Skip to content

Commit 11c489e

Browse files
authored
Allow preserveExisting existing to be combined with other features (#224)
- removePackage: remove exports of package from existing module-info - ignoreServiceProvider: remove ignored providers from module-info
1 parent ff6beda commit 11c489e

File tree

3 files changed

+86
-7
lines changed

3 files changed

+86
-7
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# Extra Java Module Info Gradle Plugin - Changelog
22

3+
## Version 1.13.2
4+
* [Fixed] [#219](https://github.com/gradlex-org/extra-java-module-info/issues/219) - Combine 'preserveExisting' and 'removePackage'
5+
* [Fixed] [#223](https://github.com/gradlex-org/extra-java-module-info/issues/223) - Combine 'preserveExisting' and 'ignoreServiceProvider'
6+
37
## Version 1.13.1
48
* [Fixed] [#197](https://github.com/gradlex-org/extra-java-module-info/issues/197) - Slightly adjust Gradle API usage for better 9.0.0 compatibility
59

src/main/java/org/gradlex/javamodule/moduleinfo/ExtraJavaModuleInfoTransform.java

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// SPDX-License-Identifier: Apache-2.0
22
package org.gradlex.javamodule.moduleinfo;
33

4+
import static java.util.Collections.emptySet;
45
import static org.gradlex.javamodule.moduleinfo.FilePathToModuleCoordinates.gaCoordinatesFromFilePathMatch;
56
import static org.gradlex.javamodule.moduleinfo.FilePathToModuleCoordinates.versionFromFilePath;
67
import static org.gradlex.javamodule.moduleinfo.ModuleNameUtil.automaticModulNameFromFileName;
@@ -17,6 +18,7 @@
1718
import java.nio.charset.StandardCharsets;
1819
import java.nio.file.Files;
1920
import java.util.ArrayList;
21+
import java.util.Arrays;
2022
import java.util.Calendar;
2123
import java.util.Collection;
2224
import java.util.Collections;
@@ -337,7 +339,9 @@ private void addModuleDescriptor(File originalJar, File moduleJar, ModuleInfo mo
337339
moduleInfo,
338340
providers,
339341
versionFromFilePath(originalJar.toPath()),
340-
moduleInfo.exportAllPackages ? packages : Collections.emptySet(),
342+
moduleInfo.exportAllPackages ? packages : emptySet(),
343+
moduleInfo.getRemovedPackages(),
344+
moduleInfo.ignoreServiceProviders,
341345
existingModuleInfo));
342346
outputStream.closeEntry();
343347
}
@@ -428,6 +432,8 @@ private byte[] addModuleInfo(
428432
Map<String, List<String>> providers,
429433
@Nullable String version,
430434
Set<String> autoExportedPackages,
435+
List<String> removedPackages,
436+
Map<String, Set<String>> ignoreServiceProviders,
431437
@Nullable byte[] existingModuleInfo) {
432438
ClassReader classReader =
433439
moduleInfo.preserveExisting && existingModuleInfo != null ? new ClassReader(existingModuleInfo) : null;
@@ -449,6 +455,42 @@ private byte[] addModuleInfo(
449455
public ModuleVisitor visitModule(String name, int access, String version) {
450456
ModuleVisitor moduleVisitor = super.visitModule(name, access, version);
451457
return new ModuleVisitor(Opcodes.ASM9, moduleVisitor) {
458+
459+
@Override
460+
public void visitPackage(String packaze) {
461+
if (!removedPackages.contains(pathToPackage(packaze))) {
462+
super.visitPackage(packaze);
463+
}
464+
}
465+
466+
@Override
467+
public void visitExport(String packaze, int access, String... modules) {
468+
if (!removedPackages.contains(pathToPackage(packaze))) {
469+
super.visitExport(packaze, access, modules);
470+
}
471+
}
472+
473+
@Override
474+
public void visitUse(String service) {
475+
String packaze = service.substring(0, service.lastIndexOf("/"));
476+
// if package is removed, also remove 'use' directives based on the package
477+
if (!removedPackages.contains(pathToPackage(packaze))) {
478+
super.visitUse(service);
479+
}
480+
}
481+
482+
@Override
483+
public void visitProvide(String service, String... providers) {
484+
String[] filteredProviders = Arrays.stream(providers)
485+
.filter(p -> ignoreServiceProviders
486+
.getOrDefault(service, emptySet())
487+
.contains(p))
488+
.toArray(String[]::new);
489+
if (filteredProviders.length > 0) {
490+
super.visitProvide(service, filteredProviders);
491+
}
492+
}
493+
452494
@Override
453495
public void visitEnd() {
454496
addModuleInfoEntires(moduleInfo, Collections.emptyMap(), autoExportedPackages, this);

src/test/groovy/org/gradlex/javamodule/moduleinfo/test/RemovePackageFunctionalTest.groovy

Lines changed: 39 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,13 @@
11
package org.gradlex.javamodule.moduleinfo.test
22

33
import org.gradlex.javamodule.moduleinfo.test.fixture.GradleBuild
4-
import org.gradlex.javamodule.moduleinfo.test.fixture.LegacyLibraries
54
import spock.lang.Specification
65

76
class RemovePackageFunctionalTest extends Specification {
87

98
@Delegate
109
GradleBuild build = new GradleBuild()
1110

12-
LegacyLibraries libs = new LegacyLibraries(false)
13-
1411
def setup() {
1512
settingsFile << 'rootProject.name = "test-project"'
1613
buildFile << '''
@@ -23,6 +20,10 @@ class RemovePackageFunctionalTest extends Specification {
2320
mainClass.set("org.example.app.Main")
2421
}
2522
'''
23+
}
24+
25+
def "can remove duplicated packages"() {
26+
given:
2627
file("src/main/java/module-info.java") << """
2728
module org.example.app {
2829
requires jdk.xml.dom;
@@ -37,10 +38,7 @@ class RemovePackageFunctionalTest extends Specification {
3738
}
3839
}
3940
"""
40-
}
4141

42-
def "can remove duplicated packages"() {
43-
given:
4442
buildFile << """
4543
dependencies {
4644
implementation("xerces:xercesImpl:2.12.2") { isTransitive = false }
@@ -58,4 +56,39 @@ class RemovePackageFunctionalTest extends Specification {
5856
run()
5957
}
6058

59+
def "removes package from module-info if removePackage and preserveExisting are used together"() {
60+
given:
61+
file("src/main/java/module-info.java") << """
62+
module org.example.app {
63+
requires jakarta.el;
64+
requires org.apache.tomcat.embed.el;
65+
}
66+
"""
67+
file("src/main/java/org/gradle/sample/app/Main.java") << """
68+
package org.example.app;
69+
public class Main {
70+
public static void main(String[] args) {
71+
jakarta.el.ELContext context; // from original jakarta.el-api module
72+
org.apache.el.ValueExpressionLiteral exp; // from apache embedded module
73+
}
74+
}
75+
"""
76+
77+
buildFile << """
78+
dependencies {
79+
implementation("jakarta.el:jakarta.el-api:5.0.1")
80+
implementation("org.apache.tomcat.embed:tomcat-embed-el:10.1.50")
81+
}
82+
extraJavaModuleInfo {
83+
module("org.apache.tomcat.embed:tomcat-embed-el", "org.apache.tomcat.embed.el") {
84+
preserveExisting()
85+
removePackage("jakarta.el")
86+
}
87+
}
88+
"""
89+
90+
expect:
91+
run()
92+
}
93+
6194
}

0 commit comments

Comments
 (0)