diff --git a/src/main/java/com/r35157/nenjim/kicker/impl/ref/KickerImpl.java b/src/main/java/com/r35157/nenjim/kicker/impl/ref/KickerImpl.java index 383adaf..4f2a314 100644 --- a/src/main/java/com/r35157/nenjim/kicker/impl/ref/KickerImpl.java +++ b/src/main/java/com/r35157/nenjim/kicker/impl/ref/KickerImpl.java @@ -2,17 +2,61 @@ package com.r35157.nenjim.kicker.impl.ref; import com.r35157.nenjim.kicker.Kicker; import com.r35157.nenjim.kicker.NenjimProcess; +import com.r35157.nenjim.hubd.Context; +import org.jetbrains.annotations.NotNull; import java.util.HashMap; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicInteger; public class KickerImpl implements Kicker { + + private final ConcurrentHashMap processes = new ConcurrentHashMap<>(); + private final ConcurrentHashMap processThreads = new ConcurrentHashMap<>(); + private final AtomicInteger nextProcessId = new AtomicInteger(1); + @Override - public void startProcess(String s) { + public void startProcess(@NotNull String fqInterfaceName) { + ClassLoader loader = ClassLoader.getSystemClassLoader(); + int processId = nextProcessId.getAndIncrement(); + + Thread t = Thread.startVirtualThread(() -> { + try { + Class clazz = loader.loadClass(fqInterfaceName); + + if (!NenjimProcess.class.isAssignableFrom(clazz)) { + throw new IllegalArgumentException("'" + fqInterfaceName + "' does NOT implement NenjimProcess"); + } + + NenjimProcess proc = (NenjimProcess) clazz.getDeclaredConstructor().newInstance(); + + processes.put(processId, proc); + + // TODO: lav dine rigtige typer her + var context = new Context() {}; + //proc.setNenjimProcessContext(context); + //proc.setNenjimHub(this); + + //Thread.currentThread().setName(proc.getProcessName()); + //System.out.println(" Starter Nenjim process '" + proc.getProcessName() + "' (#" + processId + ")"); + + proc.run(); + + } catch (Throwable e) { + System.err.println(" Process #" + processId + " crashed: " + e); + e.printStackTrace(); + } finally { + processThreads.remove(processId); + processes.remove(processId); + } + }); + + processThreads.put(processId, t); } @Override - public HashMap getRunningProcesses() { - return null; + public @NotNull HashMap getRunningProcesses() { + return new HashMap<>(processes); } @Override