X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Ffcp%2Fquelaton%2FActiveSubscriptions.java;fp=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Ffcp%2Fquelaton%2FActiveSubscriptions.java;h=241253d7496b5cee4d5ca65bb1bac40ad53b43b0;hb=db815b5a0f70dcc602fc33b27c39e05a4e2fe57c;hp=0000000000000000000000000000000000000000;hpb=7f2aac0c599e683ea50b6b41e85d3ca76e1c1f55;p=jFCPlib.git diff --git a/src/main/java/net/pterodactylus/fcp/quelaton/ActiveSubscriptions.java b/src/main/java/net/pterodactylus/fcp/quelaton/ActiveSubscriptions.java new file mode 100644 index 0000000..241253d --- /dev/null +++ b/src/main/java/net/pterodactylus/fcp/quelaton/ActiveSubscriptions.java @@ -0,0 +1,104 @@ +package net.pterodactylus.fcp.quelaton; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ExecutionException; +import java.util.function.Consumer; +import java.util.function.Supplier; + +import net.pterodactylus.fcp.FcpAdapter; +import net.pterodactylus.fcp.FcpConnection; +import net.pterodactylus.fcp.FcpListener; +import net.pterodactylus.fcp.Priority; +import net.pterodactylus.fcp.SubscribeUSK; +import net.pterodactylus.fcp.SubscribedUSKUpdate; + +/** + * Maintains a record of active subscriptions. + * + * @author David ‘Bombe’ Roden + */ +public class ActiveSubscriptions { + + private final Map subscriptions = Collections.synchronizedMap(new HashMap<>()); + + public void renew(Consumer fcpEventSender, Supplier subscribeUskCommandSupplier) + throws ExecutionException, InterruptedException { + fcpEventSender.accept(createFcpListener()); + for (UskSubscription uskSubscription : subscriptions.values()) { + subscribeUskCommandSupplier.get().uri(uskSubscription.getUri()).execute().get(); + } + } + + private FcpListener createFcpListener() { + return new FcpAdapter() { + @Override + public void receivedSubscribedUSKUpdate( + FcpConnection fcpConnection, SubscribedUSKUpdate subscribedUSKUpdate) { + String identifier = subscribedUSKUpdate.getIdentifier(); + RemoteUskSubscription uskSubscription = subscriptions.get(identifier); + if (uskSubscription == null) { + /* TODO - log warning? */ + return; + } + uskSubscription.foundUpdate(subscribedUSKUpdate.getEdition()); + } + }; + } + + public UskSubscription createUskSubscription(SubscribeUSK subscribeUSK) { + RemoteUskSubscription remoteUskSubscription = + new RemoteUskSubscription(subscribeUSK.getIdentifier(), subscribeUSK.getUri(), subscribeUSK.isActive(), + subscribeUSK.isSparse(), subscribeUSK.getPriority(), subscribeUSK.getActivePriority(), + subscribeUSK.isRealTime(), subscribeUSK.isIgnoreDateHints()); + subscriptions.put(subscribeUSK.getIdentifier(), remoteUskSubscription); + return remoteUskSubscription; + } + + private static class RemoteUskSubscription implements UskSubscription { + + private final String identifier; + private final String uri; + private final boolean active; + private final boolean sparse; + private final Priority priority; + private final Priority activePriority; + private final boolean realTime; + private final boolean ignoreDateHints; + private final List uskUpdaters = Collections.synchronizedList(new ArrayList<>()); + + private RemoteUskSubscription( + String identifier, String uri, boolean active, boolean sparse, Priority priority, Priority activePriority, + boolean realTime, boolean ignoreDateHints) { + this.identifier = identifier; + this.uri = uri; + this.active = active; + this.sparse = sparse; + this.priority = priority; + this.activePriority = activePriority; + this.realTime = realTime; + this.ignoreDateHints = ignoreDateHints; + } + + @Override + public String getUri() { + return uri; + } + + @Override + public void onUpdate(UskUpdater uskUpdater) { + uskUpdaters.add(uskUpdater); + } + + private void foundUpdate(int edition) { + for (UskUpdater uskUpdater : uskUpdaters) { + uskUpdater.uskUpdated(edition); + } + } + + } + +}