package net.horizoncode.tickettest.manager; import lombok.Builder; import lombok.Getter; import lombok.Setter; import net.horizoncode.tickettest.TicketTest; import java.util.UUID; import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; @Builder( toBuilder = true, builderClassName = "InternalTicketBuilder", builderMethodName = "internalBuilder") public class Ticket extends CompletableFuture { @Getter private UUID ticketID; @Getter private Long timeTicketCreated; private TicketManager ticketManager; @Getter @Setter private Runnable onExpire; void init() { ticketID = UUID.randomUUID(); } public void use() { ticketManager.getTicketSet().add(this); ticketManager .getService() .submit( () -> { TimeUnit.MILLISECONDS.sleep(ticketManager.getTicketLifespan()); TicketTest.getInstance().getLogger().info("ticket with UUID " + getTicketID() + " expired."); ticketManager.getTicketSet().remove(this); getOnExpire().run(); return null; }); } public static Ticket.Builder builder() { return new Ticket.Builder(); } public static class Builder extends InternalTicketBuilder { Builder() { super(); } @Override public Ticket build() { Ticket ticket = super.build(); ticket.init(); return ticket; } } }