aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/ch/fhnw/thga/gradleplugins/SetupFregeTask.java
blob: 7f9205319e2440bc39fb6f5d77bdbc2f8098e9e9 (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
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 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
    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();
        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());
        }
    }
}