ArchiveBasedUpdater.java

package com.olepoeschl.upme;

import org.jspecify.annotations.NullMarked;

import java.io.IOException;
import java.nio.file.Path;
import java.util.Map;
import java.util.function.Consumer;

// TODO: javadoc
@NullMarked
public class ArchiveBasedUpdater implements Updater {

    private final String currentVersionString;
    private final UpdateResolver resolver;
    private final UpdateDownloader downloader;
    private final ArchiveUnpacker unpacker;

    private Map<String, UpdateStrategy> preparedUpdates;

    public ArchiveBasedUpdater(String currentVersionString, UpdateResolver resolver, UpdateDownloader downloader, ArchiveUnpacker unpacker) {
        this.currentVersionString = currentVersionString;
        this.resolver = resolver;
        this.downloader = downloader;
        this.unpacker = unpacker;
    }

    @Override
    public Version[] checkAvailableUpdates() throws IOException {
        return resolver.checkAvailableUpdates(currentVersionString);
    }

    @Override
    public void prepareUpdate(Version version, Consumer<Float> progressCallback) {
        Path updateArchive = downloader.downloadUpdate(version.downloadUrl(), downloadProgress -> progressCallback.accept(downloadProgress * 0.5f));
        Path updateDir = unpacker.unpack(updateArchive, unpackProgress -> progressCallback.accept(unpackProgress * 0.5f + 0.5f));
        // TODO: where is the update strategy specified? this method is responsible for reading and verifying it
        var restartCommand = ""; // TODO
        var updateStrategy = new UpdateStrategy(updateDir, restartCommand);
        preparedUpdates.put(version.versionString(), updateStrategy);
    }

    @Override
    public Process applyUpdateAsync(Version version) {
        // TODO
        return null;
    }

    private record UpdateStrategy(Path updateDir, String restartCommand){}

}