diff options
Diffstat (limited to 'core/src')
9 files changed, 128 insertions, 7 deletions
diff --git a/core/src/main/java/dev/figboot/launcher/core/Launcher.java b/core/src/main/java/dev/figboot/launcher/core/Launcher.java index a95fed4..d6c7758 100644 --- a/core/src/main/java/dev/figboot/launcher/core/Launcher.java +++ b/core/src/main/java/dev/figboot/launcher/core/Launcher.java @@ -1,11 +1,12 @@ package dev.figboot.launcher.core; +import dev.figboot.launcher.core.task.LauncherExecutorService; +import dev.figboot.launcher.core.task.TaskUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.ScheduledThreadPoolExecutor; public class Launcher { private static final Logger LOGGER = LoggerFactory.getLogger(Launcher.class); @@ -15,10 +16,12 @@ public class Launcher { public Launcher(LauncherInterfaceAccess iface) { this.iface = iface; - service = new ScheduledThreadPoolExecutor(4); + service = new LauncherExecutorService(iface); } public void loadVersions() throws IOException { - + service.execute(TaskUtil.taskRunnable((task) -> { + task.setLabel("sussy"); + })); } } diff --git a/core/src/main/java/dev/figboot/launcher/core/LauncherInterfaceAccess.java b/core/src/main/java/dev/figboot/launcher/core/LauncherInterfaceAccess.java index b1292ae..fc97d92 100644 --- a/core/src/main/java/dev/figboot/launcher/core/LauncherInterfaceAccess.java +++ b/core/src/main/java/dev/figboot/launcher/core/LauncherInterfaceAccess.java @@ -3,5 +3,5 @@ package dev.figboot.launcher.core; import dev.figboot.launcher.core.task.Task; public interface LauncherInterfaceAccess { - Task createTask(String description); + Task createTask(String label); } diff --git a/core/src/main/java/dev/figboot/launcher/core/config/SimpleLauncherConfiguration.java b/core/src/main/java/dev/figboot/launcher/core/config/SimpleLauncherConfiguration.java index c5260bb..254a9c3 100644 --- a/core/src/main/java/dev/figboot/launcher/core/config/SimpleLauncherConfiguration.java +++ b/core/src/main/java/dev/figboot/launcher/core/config/SimpleLauncherConfiguration.java @@ -27,9 +27,10 @@ public class SimpleLauncherConfiguration implements LauncherConfiguration { throw new SystemException("unable to determine sensible launcher home directory"); } - return new SimpleLauncherConfiguration(new CacheLauncherDirectories(new PropertyLauncherDirectories(DIR_PROP_ROOT) - .mapNull(osDirs) - .mapNull(new DefaultLauncherDirectories(home)), + return new SimpleLauncherConfiguration(new CacheLauncherDirectories( + new PropertyLauncherDirectories(DIR_PROP_ROOT) + .mapNull(osDirs) + .mapNull(new DefaultLauncherDirectories(home)), (dir) -> new SystemException(String.format("Couldn't determine directory %1$s! Try defining %2$s.%1$s.", dir.name(), DIR_PROP_ROOT)))); } diff --git a/core/src/main/java/dev/figboot/launcher/core/task/LauncherExecutorService.java b/core/src/main/java/dev/figboot/launcher/core/task/LauncherExecutorService.java new file mode 100644 index 0000000..81d9768 --- /dev/null +++ b/core/src/main/java/dev/figboot/launcher/core/task/LauncherExecutorService.java @@ -0,0 +1,34 @@ +package dev.figboot.launcher.core.task; + +import dev.figboot.launcher.core.LauncherInterfaceAccess; + +import java.util.concurrent.Callable; +import java.util.concurrent.RunnableScheduledFuture; +import java.util.concurrent.ScheduledThreadPoolExecutor; + +public class LauncherExecutorService extends ScheduledThreadPoolExecutor { + private final LauncherInterfaceAccess iface; + + public LauncherExecutorService(LauncherInterfaceAccess iface) { + super(4); + this.iface = iface; + } + + @Override + protected <V> RunnableScheduledFuture<V> decorateTask(Runnable runnable, RunnableScheduledFuture<V> task) { + if (runnable instanceof TaskConsumingRunnable) { + ((TaskConsumingRunnable)runnable).consumeTask(iface.createTask(null)); + } + + return task; + } + + @Override + protected <V> RunnableScheduledFuture<V> decorateTask(Callable<V> callable, RunnableScheduledFuture<V> task) { + if (callable instanceof TaskConsumingCallable) { + ((TaskConsumingCallable<V>)callable).consumeTask(iface.createTask(null)); + } + + return super.decorateTask(callable, task); + } +} diff --git a/core/src/main/java/dev/figboot/launcher/core/task/Task.java b/core/src/main/java/dev/figboot/launcher/core/task/Task.java index 9fb603a..de025c1 100644 --- a/core/src/main/java/dev/figboot/launcher/core/task/Task.java +++ b/core/src/main/java/dev/figboot/launcher/core/task/Task.java @@ -1,5 +1,6 @@ package dev.figboot.launcher.core.task; public interface Task { + void setLabel(String label); void complete(); } diff --git a/core/src/main/java/dev/figboot/launcher/core/task/TaskCallable.java b/core/src/main/java/dev/figboot/launcher/core/task/TaskCallable.java new file mode 100644 index 0000000..6cc37ee --- /dev/null +++ b/core/src/main/java/dev/figboot/launcher/core/task/TaskCallable.java @@ -0,0 +1,6 @@ +package dev.figboot.launcher.core.task; + +@FunctionalInterface +public interface TaskCallable<V> { + V call(Task task) throws Exception; +} diff --git a/core/src/main/java/dev/figboot/launcher/core/task/TaskConsumingCallable.java b/core/src/main/java/dev/figboot/launcher/core/task/TaskConsumingCallable.java new file mode 100644 index 0000000..3080bfc --- /dev/null +++ b/core/src/main/java/dev/figboot/launcher/core/task/TaskConsumingCallable.java @@ -0,0 +1,30 @@ +package dev.figboot.launcher.core.task; + +import lombok.AccessLevel; +import lombok.RequiredArgsConstructor; + +import java.util.concurrent.Callable; + +@RequiredArgsConstructor(access = AccessLevel.PACKAGE) +class TaskConsumingCallable<V> implements Callable<V> { + private final TaskCallable<V> delegate; + + private Task task = null; + private boolean taskAssigned = false; + + void consumeTask(Task task) { + this.task = task; + taskAssigned = true; + } + + @Override + public V call() throws Exception { + if (!taskAssigned) throw new IllegalStateException("task not assigned"); + + try { + return delegate.call(task); + } finally { + task.complete(); + } + } +} diff --git a/core/src/main/java/dev/figboot/launcher/core/task/TaskConsumingRunnable.java b/core/src/main/java/dev/figboot/launcher/core/task/TaskConsumingRunnable.java new file mode 100644 index 0000000..63464e1 --- /dev/null +++ b/core/src/main/java/dev/figboot/launcher/core/task/TaskConsumingRunnable.java @@ -0,0 +1,30 @@ +package dev.figboot.launcher.core.task; + +import lombok.AccessLevel; +import lombok.RequiredArgsConstructor; + +import java.util.function.Consumer; + +@RequiredArgsConstructor(access = AccessLevel.PACKAGE) +class TaskConsumingRunnable implements Runnable { + private final Consumer<Task> delegate; + + private Task task; + private boolean taskAssigned; + + void consumeTask(Task task) { + this.task = task; + taskAssigned = true; + } + + @Override + public void run() { + if (!taskAssigned) throw new IllegalStateException("task not assigned"); + + try { + delegate.accept(task); + } finally { + task.complete(); + } + } +} diff --git a/core/src/main/java/dev/figboot/launcher/core/task/TaskUtil.java b/core/src/main/java/dev/figboot/launcher/core/task/TaskUtil.java new file mode 100644 index 0000000..ffa0f9a --- /dev/null +++ b/core/src/main/java/dev/figboot/launcher/core/task/TaskUtil.java @@ -0,0 +1,16 @@ +package dev.figboot.launcher.core.task; + +import java.util.concurrent.Callable; +import java.util.function.Consumer; + +public final class TaskUtil { + private TaskUtil() { } + + public static Runnable taskRunnable(Consumer<Task> command) { + return new TaskConsumingRunnable(command); + } + + public static <V> Callable<V> taskCallable(TaskCallable<V> callable) { + return new TaskConsumingCallable<>(callable); + } +} |
