Remove debug code
[jFCPlib.git] / src / main / java / net / pterodactylus / fcp / quelaton / FcpReplySequence.java
1 package net.pterodactylus.fcp.quelaton;
2
3 import java.io.IOException;
4 import java.util.concurrent.ExecutorService;
5 import java.util.function.Consumer;
6
7 import net.pterodactylus.fcp.AllData;
8 import net.pterodactylus.fcp.CloseConnectionDuplicateClientName;
9 import net.pterodactylus.fcp.ConfigData;
10 import net.pterodactylus.fcp.DataFound;
11 import net.pterodactylus.fcp.EndListPeerNotes;
12 import net.pterodactylus.fcp.EndListPeers;
13 import net.pterodactylus.fcp.EndListPersistentRequests;
14 import net.pterodactylus.fcp.FCPPluginReply;
15 import net.pterodactylus.fcp.FcpConnection;
16 import net.pterodactylus.fcp.FcpListener;
17 import net.pterodactylus.fcp.FcpMessage;
18 import net.pterodactylus.fcp.FinishedCompression;
19 import net.pterodactylus.fcp.GetFailed;
20 import net.pterodactylus.fcp.IdentifierCollision;
21 import net.pterodactylus.fcp.NodeData;
22 import net.pterodactylus.fcp.NodeHello;
23 import net.pterodactylus.fcp.Peer;
24 import net.pterodactylus.fcp.PeerNote;
25 import net.pterodactylus.fcp.PeerRemoved;
26 import net.pterodactylus.fcp.PersistentGet;
27 import net.pterodactylus.fcp.PersistentPut;
28 import net.pterodactylus.fcp.PersistentPutDir;
29 import net.pterodactylus.fcp.PersistentRequestModified;
30 import net.pterodactylus.fcp.PersistentRequestRemoved;
31 import net.pterodactylus.fcp.PluginInfo;
32 import net.pterodactylus.fcp.ProtocolError;
33 import net.pterodactylus.fcp.PutFailed;
34 import net.pterodactylus.fcp.PutFetchable;
35 import net.pterodactylus.fcp.PutSuccessful;
36 import net.pterodactylus.fcp.ReceivedBookmarkFeed;
37 import net.pterodactylus.fcp.SSKKeypair;
38 import net.pterodactylus.fcp.SentFeed;
39 import net.pterodactylus.fcp.SimpleProgress;
40 import net.pterodactylus.fcp.StartedCompression;
41 import net.pterodactylus.fcp.SubscribedUSKUpdate;
42 import net.pterodactylus.fcp.TestDDAComplete;
43 import net.pterodactylus.fcp.TestDDAReply;
44 import net.pterodactylus.fcp.URIGenerated;
45 import net.pterodactylus.fcp.UnknownNodeIdentifier;
46 import net.pterodactylus.fcp.UnknownPeerNoteType;
47
48 import com.google.common.util.concurrent.ListenableFuture;
49 import com.google.common.util.concurrent.ListeningExecutorService;
50 import com.google.common.util.concurrent.MoreExecutors;
51
52 /**
53  * An FCP reply sequence enables you to conveniently wait for a specific set of FCP replies.
54  *
55  * @author <a href="bombe@freenetproject.org">David ‘Bombe’ Roden</a>
56  */
57 public abstract class FcpReplySequence<R> implements AutoCloseable, FcpListener {
58
59         private final Object syncObject = new Object();
60         private final ListeningExecutorService executorService;
61         private final FcpConnection fcpConnection;
62
63         public FcpReplySequence(ExecutorService executorService, FcpConnection fcpConnection) {
64                 this.executorService = MoreExecutors.listeningDecorator(executorService);
65                 this.fcpConnection = fcpConnection;
66         }
67
68         protected abstract boolean isFinished();
69
70         public ListenableFuture<R> send(FcpMessage fcpMessage) throws IOException {
71                 fcpConnection.addFcpListener(this);
72                 fcpConnection.sendMessage(fcpMessage);
73                 return executorService.submit(() -> {
74                         synchronized (syncObject) {
75                                 while (!isFinished()) {
76                                         syncObject.wait();
77                                 }
78                         }
79                         return getResult();
80                 });
81         }
82
83         protected R getResult() {
84                 return null;
85         }
86
87         @Override
88         public void close() {
89                 fcpConnection.removeFcpListener(this);
90         }
91
92         private <M> void consume(Consumer<M> consumer,  M message) {
93                 consumer.accept(message);
94                 synchronized (syncObject) {
95                         syncObject.notifyAll();
96                 }
97         }
98
99         private void consumeUnknown(FcpMessage fcpMessage) {
100                 consumeUnknownMessage(fcpMessage);
101                 synchronized (syncObject) {
102                         syncObject.notifyAll();
103                 }
104         }
105
106         private void consumeClose(Throwable throwable) {
107                 consumeConnectionClosed(throwable);
108                 synchronized (syncObject) {
109                         syncObject.notifyAll();
110                 }
111         }
112
113         @Override
114         public final void receivedNodeHello(FcpConnection fcpConnection, NodeHello nodeHello) {
115                 consume(this::consumeNodeHello, nodeHello);
116         }
117
118         protected void consumeNodeHello(NodeHello nodeHello) { }
119
120         @Override
121         public final void receivedCloseConnectionDuplicateClientName(FcpConnection fcpConnection,
122                         CloseConnectionDuplicateClientName closeConnectionDuplicateClientName) {
123                 consume(this::consumeCloseConnectionDuplicateClientName, closeConnectionDuplicateClientName);
124         }
125
126         protected void consumeCloseConnectionDuplicateClientName(CloseConnectionDuplicateClientName closeConnectionDuplicateClientName) { }
127
128         @Override
129         public final void receivedSSKKeypair(FcpConnection fcpConnection, SSKKeypair sskKeypair) {
130                 consume(this::consumeSSKKeypair, sskKeypair);
131         }
132
133         protected void consumeSSKKeypair(SSKKeypair sskKeypair) { }
134
135         @Override
136         public final void receivedPeer(FcpConnection fcpConnection, Peer peer) {
137                 consume(this::consumePeer, peer);
138         }
139
140         protected void consumePeer(Peer peer) { }
141
142         @Override
143         public final void receivedEndListPeers(FcpConnection fcpConnection, EndListPeers endListPeers) {
144                 consume(this::consumeEndListPeers, endListPeers);
145         }
146
147         protected void consumeEndListPeers(EndListPeers endListPeers) { }
148
149         @Override
150         public final void receivedPeerNote(FcpConnection fcpConnection, PeerNote peerNote) {
151                 consume(this::consumePeerNote, peerNote);
152         }
153
154         protected void consumePeerNote(PeerNote peerNote) { }
155
156         @Override
157         public final void receivedEndListPeerNotes(FcpConnection fcpConnection, EndListPeerNotes endListPeerNotes) {
158                 consume(this::consumeEndListPeerNotes, endListPeerNotes);
159         }
160
161         protected void consumeEndListPeerNotes(EndListPeerNotes endListPeerNotes) { }
162
163         @Override
164         public final void receivedPeerRemoved(FcpConnection fcpConnection, PeerRemoved peerRemoved) {
165                 consume(this::consumePeerRemoved, peerRemoved);
166         }
167
168         protected void consumePeerRemoved(PeerRemoved peerRemoved) { }
169
170         @Override
171         public final void receivedNodeData(FcpConnection fcpConnection, NodeData nodeData) {
172                 consume(this::consumeNodeData, nodeData);
173         }
174
175         protected void consumeNodeData(NodeData nodeData) { }
176
177         @Override
178         public final void receivedTestDDAReply(FcpConnection fcpConnection, TestDDAReply testDDAReply) {
179                 consume(this::consumeTestDDAReply, testDDAReply);
180         }
181
182         protected void consumeTestDDAReply(TestDDAReply testDDAReply) { }
183
184         @Override
185         public final void receivedTestDDAComplete(FcpConnection fcpConnection, TestDDAComplete testDDAComplete) {
186                 consume(this::consumeTestDDAComplete, testDDAComplete);
187         }
188
189         protected void consumeTestDDAComplete(TestDDAComplete testDDAComplete) { }
190
191         @Override
192         public final void receivedPersistentGet(FcpConnection fcpConnection, PersistentGet persistentGet) {
193                 consume(this::consumePersistentGet, persistentGet);
194         }
195
196         protected void consumePersistentGet(PersistentGet persistentGet) { }
197
198         @Override
199         public final void receivedPersistentPut(FcpConnection fcpConnection, PersistentPut persistentPut) {
200                 consume(this::consumePersistentPut, persistentPut);
201         }
202
203         protected void consumePersistentPut(PersistentPut persistentPut) { }
204
205         @Override
206         public final void receivedEndListPersistentRequests(FcpConnection fcpConnection,
207                         EndListPersistentRequests endListPersistentRequests) {
208                 consume(this::consumeEndListPersistentRequests, endListPersistentRequests);
209         }
210
211         protected void consumeEndListPersistentRequests(EndListPersistentRequests endListPersistentRequests) { }
212
213         @Override
214         public final void receivedURIGenerated(FcpConnection fcpConnection, URIGenerated uriGenerated) {
215                 consume(this::consumeURIGenerated, uriGenerated);
216         }
217
218         protected void consumeURIGenerated(URIGenerated uriGenerated) { }
219
220         @Override
221         public final void receivedDataFound(FcpConnection fcpConnection, DataFound dataFound) {
222                 consume(this::consumeDataFound, dataFound);
223         }
224
225         protected void consumeDataFound(DataFound dataFound) { }
226
227         @Override
228         public final void receivedAllData(FcpConnection fcpConnection, AllData allData) {
229                 consume(this::consumeAllData, allData);
230         }
231
232         protected void consumeAllData(AllData allData) { }
233
234         @Override
235         public final void receivedSimpleProgress(FcpConnection fcpConnection, SimpleProgress simpleProgress) {
236                 consume(this::consumeSimpleProgress, simpleProgress);
237         }
238
239         protected void consumeSimpleProgress(SimpleProgress simpleProgress) { }
240
241         @Override
242         public final void receivedStartedCompression(FcpConnection fcpConnection, StartedCompression startedCompression) {
243                 consume(this::consumeStartedCompression, startedCompression);
244         }
245
246         protected void consumeStartedCompression(StartedCompression startedCompression) { }
247
248         @Override
249         public final void receivedFinishedCompression(FcpConnection fcpConnection, FinishedCompression finishedCompression) {
250                 consume(this::consumeFinishedCompression, finishedCompression);
251         }
252
253         protected void consumeFinishedCompression(FinishedCompression finishedCompression) { }
254
255         @Override
256         public final void receivedUnknownPeerNoteType(FcpConnection fcpConnection, UnknownPeerNoteType unknownPeerNoteType) {
257                 consume(this::consumeUnknownPeerNoteType, unknownPeerNoteType);
258         }
259
260         protected void consumeUnknownPeerNoteType(UnknownPeerNoteType unknownPeerNoteType) { }
261
262         @Override
263         public final void receivedUnknownNodeIdentifier(FcpConnection fcpConnection,
264                         UnknownNodeIdentifier unknownNodeIdentifier) {
265                 consume(this::consumeUnknownNodeIdentifier, unknownNodeIdentifier);
266         }
267
268         protected void consumeUnknownNodeIdentifier(UnknownNodeIdentifier unknownNodeIdentifier) { }
269
270         @Override
271         public final void receivedConfigData(FcpConnection fcpConnection, ConfigData configData) {
272                 consume(this::consumeConfigData, configData);
273         }
274
275         protected void consumeConfigData(ConfigData configData) { }
276
277         @Override
278         public final void receivedGetFailed(FcpConnection fcpConnection, GetFailed getFailed) {
279                 consume(this::consumeGetFailed, getFailed);
280         }
281
282         protected void consumeGetFailed(GetFailed getFailed) { }
283
284         @Override
285         public final void receivedPutFailed(FcpConnection fcpConnection, PutFailed putFailed) {
286                 consume(this::consumePutFailed, putFailed);
287         }
288
289         protected void consumePutFailed(PutFailed putFailed) { }
290
291         @Override
292         public final void receivedIdentifierCollision(FcpConnection fcpConnection, IdentifierCollision identifierCollision) {
293                 consume(this::consumeIdentifierCollision, identifierCollision);
294         }
295
296         protected void consumeIdentifierCollision(IdentifierCollision identifierCollision) { }
297
298         @Override
299         public final void receivedPersistentPutDir(FcpConnection fcpConnection, PersistentPutDir persistentPutDir) {
300                 consume(this::consumePersistentPutDir, persistentPutDir);
301         }
302
303         protected void consumePersistentPutDir(PersistentPutDir persistentPutDir) { }
304
305         @Override
306         public final void receivedPersistentRequestRemoved(FcpConnection fcpConnection,
307                         PersistentRequestRemoved persistentRequestRemoved) {
308                 consume(this::consumePersistentRequestRemoved, persistentRequestRemoved);
309         }
310
311         protected void consumePersistentRequestRemoved(PersistentRequestRemoved persistentRequestRemoved) { }
312
313         @Override
314         public final void receivedSubscribedUSKUpdate(FcpConnection fcpConnection, SubscribedUSKUpdate subscribedUSKUpdate) {
315                 consume(this::consumeSubscribedUSKUpdate, subscribedUSKUpdate);
316         }
317
318         protected void consumeSubscribedUSKUpdate(SubscribedUSKUpdate subscribedUSKUpdate) { }
319
320         @Override
321         public final void receivedPluginInfo(FcpConnection fcpConnection, PluginInfo pluginInfo) {
322                 consume(this::consumePluginInfo, pluginInfo);
323         }
324
325         protected void consumePluginInfo(PluginInfo pluginInfo) { }
326
327         @Override
328         public final void receivedFCPPluginReply(FcpConnection fcpConnection, FCPPluginReply fcpPluginReply) {
329                 consume(this::consumeFCPPluginReply, fcpPluginReply);
330         }
331
332         protected void consumeFCPPluginReply(FCPPluginReply fcpPluginReply) { }
333
334         @Override
335         public final void receivedPersistentRequestModified(FcpConnection fcpConnection,
336                         PersistentRequestModified persistentRequestModified) {
337                 consume(this::consumePersistentRequestModified, persistentRequestModified);
338         }
339
340         protected void consumePersistentRequestModified(PersistentRequestModified persistentRequestModified) { }
341
342         @Override
343         public final void receivedPutSuccessful(FcpConnection fcpConnection, PutSuccessful putSuccessful) {
344                 consume(this::consumePutSuccessful, putSuccessful);
345         }
346
347         protected void consumePutSuccessful(PutSuccessful putSuccessful) { }
348
349         @Override
350         public final void receivedPutFetchable(FcpConnection fcpConnection, PutFetchable putFetchable) {
351                 consume(this::consumePutFetchable, putFetchable);
352         }
353
354         protected void consumePutFetchable(PutFetchable putFetchable) { }
355
356         @Override
357         public final void receivedSentFeed(FcpConnection source, SentFeed sentFeed) {
358                 consume(this::consumeSentFeed, sentFeed);
359         }
360
361         protected void consumeSentFeed(SentFeed sentFeed) { }
362
363         @Override
364         public final void receivedBookmarkFeed(FcpConnection fcpConnection, ReceivedBookmarkFeed receivedBookmarkFeed) {
365                 consume(this::consumeReceivedBookmarkFeed, receivedBookmarkFeed);
366         }
367
368         protected void consumeReceivedBookmarkFeed(ReceivedBookmarkFeed receivedBookmarkFeed) { }
369
370         @Override
371         public final void receivedProtocolError(FcpConnection fcpConnection, ProtocolError protocolError) {
372                 consume(this::consumeProtocolError, protocolError);
373         }
374
375         protected void consumeProtocolError(ProtocolError protocolError) { }
376
377         @Override
378         public final void receivedMessage(FcpConnection fcpConnection, FcpMessage fcpMessage) {
379                 consumeUnknown(fcpMessage);
380         }
381
382         protected void consumeUnknownMessage(FcpMessage fcpMessage) { }
383
384         @Override
385         public final void connectionClosed(FcpConnection fcpConnection, Throwable throwable) {
386                 consumeClose(throwable);
387         }
388
389         protected void consumeConnectionClosed(Throwable throwable) { }
390
391 }