aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/ch/fhnw/thga/gradleplugins/SetupFregeTask.java
blob: c4e17d332e5b3ed7d4252cbfe4c3ea2258aaf82f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
package ch.fhnw.thga.gradleplugins;

import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URL;
import java.nio.channels.Channels;
import java.nio.channels.FileChannel;
import java.nio.channels.ReadableByteChannel;
import java.nio.file.Paths;

import org.gradle.api.DefaultTask;
import org.gradle.api.GradleException;
import org.gradle.api.file.DirectoryProperty;
import org.gradle.api.file.RegularFile;
import org.gradle.api.logging.Logger;
import org.gradle.api.logging.Logging;
import org.gradle.api.provider.Property;
import org.gradle.api.provider.Provider;
import org.gradle.api.tasks.Input;
import org.gradle.api.tasks.Internal;
import org.gradle.api.tasks.OutputFile;
import org.gradle.api.tasks.TaskAction;

public abstract class SetupFregeTask extends DefaultTask {
    public static final Logger LOGGER                   = Logging.getLogger(SetupFregeTask.class);

    private static final String FREGE_GITHUB_URL_PREFIX =
                                               "https://github.com/Frege/frege/releases/download";

    @Input
    public abstract Property<String> getVersion();

    @Input
    public abstract Property<String> getRelease();

    @Internal
    public abstract DirectoryProperty getDownloadDir();

    @Internal
    public Provider<String> getFregeVersionJarName()
    {
        return getVersion().map(version -> "frege" + version + ".jar");
    }

    @Internal
    final public Provider<String> getDownloadUrl()
    {
        return getFregeVersionJarName()
            .map(name -> String.join("/", FREGE_GITHUB_URL_PREFIX, getRelease().get(), name));
    }

    @OutputFile
    public Provider<RegularFile> getFregeCompilerOutputPath()
    {
        return getDownloadDir().file(getFregeVersionJarName());
    }

    @TaskAction
    public void downloadFregeCompiler() {
        String fregeCompilerOutputPath = getFregeCompilerOutputPath()
            .get()
            .getAsFile()
            .getAbsolutePath();
        if (Paths
            .get(fregeCompilerOutputPath)
            .toFile()
            .exists()
        )
        return;

        try (ReadableByteChannel readChannel = Channels
                .newChannel(new URL(getDownloadUrl().get())
                .openStream()
            );
            FileOutputStream fregeCompilerOutputStream = new FileOutputStream(
                fregeCompilerOutputPath))
            {
                FileChannel writeChannel = fregeCompilerOutputStream.getChannel();
                writeChannel.transferFrom(
                    readChannel,
                    0,
                    Long.MAX_VALUE);
                LOGGER.lifecycle(
                    String.format(
                        "Successfully downloaded %s to: %s",
                        getFregeVersionJarName().get(),
                        fregeCompilerOutputPath
                    )
                );
        } catch (IOException e)
        {
            throw new GradleException(e.getMessage());
        }
    }
}