]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.util/src/org/argeo/util/register/Singleton.java
Use latest release of Argeo Maven parent
[lgpl/argeo-commons.git] / org.argeo.util / src / org / argeo / util / register / Singleton.java
1 package org.argeo.util.register;
2
3 import java.util.ArrayList;
4 import java.util.List;
5 import java.util.concurrent.CompletableFuture;
6 import java.util.concurrent.CompletionStage;
7 import java.util.concurrent.Future;
8 import java.util.function.Consumer;
9
10 public class Singleton<T> {
11 private final Class<T> clss;
12 private final CompletableFuture<T> registrationStage;
13 private final List<Consumer<T>> unregistrationHooks = new ArrayList<>();
14
15 public Singleton(Class<T> clss, CompletableFuture<T> registrationStage) {
16 this.clss = clss;
17 this.registrationStage = registrationStage;
18 }
19
20 CompletionStage<T> getRegistrationStage() {
21 return registrationStage.minimalCompletionStage();
22 }
23
24 public void addUnregistrationHook(Consumer<T> todo) {
25 unregistrationHooks.add(todo);
26 }
27
28 public Future<T> getValue() {
29 return registrationStage.copy();
30 }
31
32 public CompletableFuture<Void> prepareUnregistration(Void v) {
33 List<CompletableFuture<Void>> lst = new ArrayList<>();
34 for (Consumer<T> hook : unregistrationHooks) {
35 lst.add(registrationStage.thenAcceptAsync(hook));
36 }
37 CompletableFuture<Void> prepareUnregistrationStage = CompletableFuture
38 .allOf(lst.toArray(new CompletableFuture<?>[lst.size()]));
39 return prepareUnregistrationStage;
40 }
41 }