2323import net .raphimc .javadowngrader .impl .classtransform .classprovider .LazyFileClassProvider ;
2424import net .raphimc .javadowngrader .impl .classtransform .classprovider .PathClassProvider ;
2525import net .raphimc .javadowngrader .impl .classtransform .util .ClassNameUtil ;
26- import net .raphimc .javadowngrader .impl .classtransform .util .FileSystemUtil ;
2726import net .raphimc .javadowngrader .runtime .RuntimeRoot ;
28- import net .raphimc .javadowngrader .util .Constants ;
2927import org .gradle .api .DefaultTask ;
3028import org .gradle .api .tasks .Internal ;
3129import org .gradle .api .tasks .SourceSet ;
3432
3533import java .io .File ;
3634import java .io .IOException ;
35+ import java .io .InputStream ;
3736import java .io .UncheckedIOException ;
38- import java .net .URISyntaxException ;
39- import java .nio .file .FileSystem ;
4037import java .nio .file .Files ;
4138import java .nio .file .Path ;
39+ import java .util .Collection ;
40+ import java .util .HashSet ;
4241import java .util .Objects ;
4342import java .util .stream .Stream ;
4443
@@ -54,19 +53,24 @@ public class DowngradeSourceSetTask extends DefaultTask {
5453 private boolean copyRuntimeClasses = true ;
5554
5655 @ TaskAction
57- public void run () throws IOException , URISyntaxException {
56+ public void run () throws IOException {
5857 Objects .requireNonNull (this .sourceSet , "sourceSet must be set" );
5958
6059 for (File classesDir : this .sourceSet .getOutput ().getClassesDirs ()) {
6160 System .out .println ("Downgrading source set: " + this .getProject ().getProjectDir ().toPath ().relativize (classesDir .toPath ()));
62-
6361 final Path inRoot = classesDir .toPath ();
62+
63+ final Collection <String > runtimeDeps = new HashSet <>();
6464 final TransformerManager transformerManager = new TransformerManager (
6565 new PathClassProvider (inRoot , new LazyFileClassProvider (this .sourceSet .getCompileClasspath ().getFiles (), new BasicClassProvider ()))
6666 );
67- transformerManager .addBytecodeTransformer (new JavaDowngraderTransformer (
68- transformerManager , this .targetVersion , c -> Files .isRegularFile (inRoot .resolve (ClassNameUtil .toClassFilename (c )))
69- ));
67+ transformerManager .addBytecodeTransformer (
68+ JavaDowngraderTransformer .builder (transformerManager )
69+ .targetVersion (targetVersion )
70+ .classFilter (c -> Files .isRegularFile (inRoot .resolve (ClassNameUtil .toClassFilename (c ))))
71+ .depCollector (runtimeDeps ::add )
72+ .build ()
73+ );
7074
7175 // Downgrade classes
7276 try (Stream <Path > stream = Files .walk (inRoot )) {
@@ -93,21 +97,16 @@ public void run() throws IOException, URISyntaxException {
9397
9498 // Copy runtime classes
9599 if (this .copyRuntimeClasses ) {
96- try (FileSystem runtimeRootFs = FileSystemUtil .getOrCreateFileSystem (RuntimeRoot .class .getResource ("" ).toURI ())) {
97- final Path runtimeRoot = runtimeRootFs .getPath (Constants .JAVADOWNGRADER_RUNTIME_PACKAGE );
98- try (Stream <Path > stream = Files .walk (runtimeRoot )) {
99- stream .filter (Files ::isRegularFile )
100- .filter (p -> !p .getFileName ().toString ().equals (Constants .JAVADOWNGRADER_RUNTIME_ROOT ))
101- .forEach (path -> {
102- final String relative = ClassNameUtil .slashName (runtimeRoot .relativize (path ));
103- final Path dest = inRoot .resolve (Constants .JAVADOWNGRADER_RUNTIME_PACKAGE + relative );
104- try {
105- Files .createDirectories (dest .getParent ());
106- Files .copy (path , dest );
107- } catch (IOException e ) {
108- throw new UncheckedIOException (e );
109- }
110- });
100+ for (final String runtimeDep : runtimeDeps ) {
101+ final String classPath = runtimeDep .concat (".class" );
102+ try (InputStream is = RuntimeRoot .class .getResourceAsStream ("/" + classPath )) {
103+ if (is == null ) continue ;
104+ final Path dest = inRoot .resolve (classPath );
105+ final Path parent = dest .getParent ();
106+ if (parent != null ) {
107+ Files .createDirectories (parent );
108+ }
109+ Files .copy (is , dest );
111110 }
112111 }
113112 }
0 commit comments