package io.ripc.protocol.tcp; import java.util.concurrent.atomic.AtomicBoolean; public abstract class TcpServer<R, W> { protected final TcpHandler<R, W> thisHandler; protected final AtomicBoolean started; protected TcpServer() { thisHandler = null; this.started = new AtomicBoolean(); } public final TcpServer<R, W> start(TcpHandler<R, W> handler) { if (!started.compareAndSet(false, true)) { throw new IllegalStateException("Server already started"); } doStart(handler); return this; } public final void startAndAwait(TcpHandler<R, W> handler) { start(handler); awaitShutdown(); } public final boolean shutdown() { return !started.compareAndSet(true, false) || doShutdown(); } public abstract void awaitShutdown(); public abstract boolean doShutdown(); protected abstract TcpServer<R, W> doStart(TcpHandler<R, W> handler); public abstract int getPort(); }