Skip to content

Commit 5d5177b

Browse files
authored
Refactor to use a new class CompletingFutureContribution (#484)
- Reduces boilerplate when the same pattern is used
1 parent 0673585 commit 5d5177b

File tree

14 files changed

+103
-93
lines changed

14 files changed

+103
-93
lines changed

httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/bootstrap/H2MultiplexingRequester.java

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,9 @@
3737
import org.apache.hc.core5.annotation.Internal;
3838
import org.apache.hc.core5.concurrent.Cancellable;
3939
import org.apache.hc.core5.concurrent.CancellableDependency;
40+
import org.apache.hc.core5.concurrent.CompletingFutureContribution;
4041
import org.apache.hc.core5.concurrent.ComplexFuture;
4142
import org.apache.hc.core5.concurrent.FutureCallback;
42-
import org.apache.hc.core5.concurrent.FutureContribution;
4343
import org.apache.hc.core5.function.Callback;
4444
import org.apache.hc.core5.function.Decorator;
4545
import org.apache.hc.core5.function.Resolver;
@@ -282,14 +282,7 @@ public final <T> Future<T> execute(
282282
final AsyncClientExchangeHandler exchangeHandler = new BasicClientExchangeHandler<>(
283283
requestProducer,
284284
responseConsumer,
285-
new FutureContribution<T>(future) {
286-
287-
@Override
288-
public void completed(final T result) {
289-
future.completed(result);
290-
}
291-
292-
});
285+
new CompletingFutureContribution<T, T>(future));
293286
execute(target, exchangeHandler, pushHandlerFactory, future, timeout, context != null ? context : HttpCoreContext.create());
294287
return future;
295288
}

httpcore5-h2/src/test/java/org/apache/hc/core5/http2/examples/H2ViaHttp1ProxyExecutionExample.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ public void onOutputFlowControl(final HttpConnection connection, final int strea
148148
proxy,
149149
Timeout.ofSeconds(30),
150150
null,
151-
new FutureContribution<AsyncClientEndpoint>(tunnelFuture) {
151+
new FutureContribution<AsyncClientEndpoint, AsyncClientEndpoint>(tunnelFuture) {
152152

153153
@Override
154154
public void completed(final AsyncClientEndpoint endpoint) {
@@ -157,15 +157,15 @@ public void completed(final AsyncClientEndpoint endpoint) {
157157
endpoint.execute(
158158
new BasicRequestProducer(connect, null),
159159
new BasicResponseConsumer<>(new DiscardingEntityConsumer<>()),
160-
new FutureContribution<Message<HttpResponse, Void>>(tunnelFuture) {
160+
new FutureContribution<Message<HttpResponse, Void>, AsyncClientEndpoint>(tunnelFuture) {
161161

162162
@Override
163163
public void completed(final Message<HttpResponse, Void> message) {
164164
final HttpResponse response = message.getHead();
165165
if (response.getCode() == HttpStatus.SC_OK) {
166166
((TlsUpgradeCapable) endpoint).tlsUpgrade(
167167
target,
168-
new FutureContribution<ProtocolIOSession>(tunnelFuture) {
168+
new FutureContribution<ProtocolIOSession, AsyncClientEndpoint>(tunnelFuture) {
169169

170170
@Override
171171
public void completed(final ProtocolIOSession protocolSession) {

httpcore5-testing/src/main/java/org/apache/hc/core5/testing/nio/ClientSessionEndpoint.java

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@
3434
import org.apache.hc.core5.annotation.Contract;
3535
import org.apache.hc.core5.annotation.ThreadingBehavior;
3636
import org.apache.hc.core5.concurrent.BasicFuture;
37+
import org.apache.hc.core5.concurrent.CompletingFutureContribution;
3738
import org.apache.hc.core5.concurrent.FutureCallback;
38-
import org.apache.hc.core5.concurrent.FutureContribution;
3939
import org.apache.hc.core5.http.ConnectionClosedException;
4040
import org.apache.hc.core5.http.nio.AsyncClientExchangeHandler;
4141
import org.apache.hc.core5.http.nio.AsyncPushConsumer;
@@ -103,14 +103,7 @@ public <T> Future<T> execute(
103103
Asserts.check(!closed.get(), "Connection is already closed");
104104
final BasicFuture<T> future = new BasicFuture<>(callback);
105105
execute(new BasicClientExchangeHandler<>(requestProducer, responseConsumer,
106-
new FutureContribution<T>(future) {
107-
108-
@Override
109-
public void completed(final T result) {
110-
future.completed(result);
111-
}
112-
113-
}),
106+
new CompletingFutureContribution<T, T>(future)),
114107
pushHandlerFactory, context);
115108
return future;
116109
}

httpcore5-testing/src/main/java/org/apache/hc/core5/testing/nio/H2TestClient.java

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@
3535
import javax.net.ssl.SSLContext;
3636

3737
import org.apache.hc.core5.concurrent.BasicFuture;
38+
import org.apache.hc.core5.concurrent.CompletingFutureContribution;
3839
import org.apache.hc.core5.concurrent.FutureCallback;
39-
import org.apache.hc.core5.concurrent.FutureContribution;
4040
import org.apache.hc.core5.function.Supplier;
4141
import org.apache.hc.core5.http.HttpHost;
4242
import org.apache.hc.core5.http.config.CharCodingConfig;
@@ -53,7 +53,6 @@
5353
import org.apache.hc.core5.reactor.IOEventHandlerFactory;
5454
import org.apache.hc.core5.reactor.IOReactorConfig;
5555
import org.apache.hc.core5.reactor.IOReactorStatus;
56-
import org.apache.hc.core5.reactor.IOSession;
5756
import org.apache.hc.core5.reactor.ssl.SSLSessionInitializer;
5857
import org.apache.hc.core5.reactor.ssl.SSLSessionVerifier;
5958
import org.apache.hc.core5.util.Args;
@@ -209,14 +208,7 @@ public Future<ClientSessionEndpoint> connect(
209208
final Timeout timeout,
210209
final FutureCallback<ClientSessionEndpoint> callback) {
211210
final BasicFuture<ClientSessionEndpoint> future = new BasicFuture<>(callback);
212-
requestSession(host, timeout, new FutureContribution<IOSession>(future) {
213-
214-
@Override
215-
public void completed(final IOSession session) {
216-
future.completed(new ClientSessionEndpoint(session));
217-
}
218-
219-
});
211+
requestSession(host, timeout, new CompletingFutureContribution<>(future, ClientSessionEndpoint::new));
220212
return future;
221213
}
222214

httpcore5-testing/src/main/java/org/apache/hc/core5/testing/nio/Http1TestClient.java

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@
3333
import javax.net.ssl.SSLContext;
3434

3535
import org.apache.hc.core5.concurrent.BasicFuture;
36+
import org.apache.hc.core5.concurrent.CompletingFutureContribution;
3637
import org.apache.hc.core5.concurrent.FutureCallback;
37-
import org.apache.hc.core5.concurrent.FutureContribution;
3838
import org.apache.hc.core5.http.HttpHost;
3939
import org.apache.hc.core5.http.config.CharCodingConfig;
4040
import org.apache.hc.core5.http.config.Http1Config;
@@ -43,7 +43,6 @@
4343
import org.apache.hc.core5.http.protocol.HttpProcessor;
4444
import org.apache.hc.core5.reactor.IOReactorConfig;
4545
import org.apache.hc.core5.reactor.IOReactorStatus;
46-
import org.apache.hc.core5.reactor.IOSession;
4746
import org.apache.hc.core5.reactor.ssl.SSLSessionInitializer;
4847
import org.apache.hc.core5.reactor.ssl.SSLSessionVerifier;
4948
import org.apache.hc.core5.util.Asserts;
@@ -129,14 +128,7 @@ public Future<ClientSessionEndpoint> connect(
129128
final Timeout timeout,
130129
final FutureCallback<ClientSessionEndpoint> callback) {
131130
final BasicFuture<ClientSessionEndpoint> future = new BasicFuture<>(callback);
132-
requestSession(host, timeout, new FutureContribution<IOSession>(future) {
133-
134-
@Override
135-
public void completed(final IOSession session) {
136-
future.completed(new ClientSessionEndpoint(session));
137-
}
138-
139-
});
131+
requestSession(host, timeout, new CompletingFutureContribution<>(future, ClientSessionEndpoint::new));
140132
return future;
141133
}
142134

httpcore5-testing/src/test/java/org/apache/hc/core5/testing/nio/TLSIntegrationTest.java

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import javax.net.ssl.SSLSession;
4141

4242
import org.apache.hc.core5.concurrent.BasicFuture;
43+
import org.apache.hc.core5.concurrent.CompletingFutureContribution;
4344
import org.apache.hc.core5.concurrent.FutureCallback;
4445
import org.apache.hc.core5.concurrent.FutureContribution;
4546
import org.apache.hc.core5.function.Supplier;
@@ -178,21 +179,14 @@ Future<TlsDetails> executeTlsHandshake() throws Exception {
178179
client.connect(
179180
new HttpHost(URIScheme.HTTP.id, "localhost", address.getPort()),
180181
TIMEOUT, null,
181-
new FutureContribution<AsyncClientEndpoint>(tlsFuture) {
182+
new FutureContribution<AsyncClientEndpoint, TlsDetails>(tlsFuture) {
182183

183184
@Override
184185
public void completed(final AsyncClientEndpoint clientEndpoint) {
185186
try {
186187
((TlsUpgradeCapable) clientEndpoint).tlsUpgrade(
187188
target,
188-
new FutureContribution<ProtocolIOSession>(tlsFuture) {
189-
190-
@Override
191-
public void completed(final ProtocolIOSession protocolIOSession) {
192-
tlsFuture.completed(protocolIOSession.getTlsDetails());
193-
}
194-
195-
});
189+
new CompletingFutureContribution<>(tlsFuture, ProtocolIOSession::getTlsDetails));
196190
} catch (final Exception ex) {
197191
tlsFuture.failed(ex);
198192
}

httpcore5-testing/src/test/java/org/apache/hc/core5/testing/nio/TLSUpgradeTest.java

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
import java.util.concurrent.Future;
3434

3535
import org.apache.hc.core5.concurrent.BasicFuture;
36-
import org.apache.hc.core5.concurrent.FutureContribution;
36+
import org.apache.hc.core5.concurrent.CompletingFutureContribution;
3737
import org.apache.hc.core5.function.Supplier;
3838
import org.apache.hc.core5.http.ContentType;
3939
import org.apache.hc.core5.http.HttpHost;
@@ -120,14 +120,7 @@ void testTLSUpgrade() throws Exception {
120120

121121
// Upgrade to TLS
122122
final BasicFuture<TlsDetails> tlsFuture = new BasicFuture<>(null);
123-
((TlsUpgradeCapable) clientEndpoint).tlsUpgrade(target, new FutureContribution<ProtocolIOSession>(tlsFuture) {
124-
125-
@Override
126-
public void completed(final ProtocolIOSession protocolIOSession) {
127-
tlsFuture.completed(protocolIOSession.getTlsDetails());
128-
}
129-
130-
});
123+
((TlsUpgradeCapable) clientEndpoint).tlsUpgrade(target, new CompletingFutureContribution<>(tlsFuture, ProtocolIOSession::getTlsDetails));
131124

132125
final TlsDetails tlsDetails = tlsFuture.get(TIMEOUT.getDuration(), TIMEOUT.getTimeUnit());
133126
Assertions.assertNotNull(tlsDetails);
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
/*
2+
* ====================================================================
3+
* Licensed to the Apache Software Foundation (ASF) under one
4+
* or more contributor license agreements. See the NOTICE file
5+
* distributed with this work for additional information
6+
* regarding copyright ownership. The ASF licenses this file
7+
* to you under the Apache License, Version 2.0 (the
8+
* "License"); you may not use this file except in compliance
9+
* with the License. You may obtain a copy of the License at
10+
*
11+
* http://www.apache.org/licenses/LICENSE-2.0
12+
*
13+
* Unless required by applicable law or agreed to in writing,
14+
* software distributed under the License is distributed on an
15+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16+
* KIND, either express or implied. See the License for the
17+
* specific language governing permissions and limitations
18+
* under the License.
19+
* ====================================================================
20+
*
21+
* This software consists of voluntary contributions made by many
22+
* individuals on behalf of the Apache Software Foundation. For more
23+
* information on the Apache Software Foundation, please see
24+
* <http://www.apache.org/>.
25+
*
26+
*/
27+
28+
package org.apache.hc.core5.concurrent;
29+
30+
import java.util.Objects;
31+
import java.util.function.Function;
32+
33+
/**
34+
* Completes a result on a {@link BasicFuture}.
35+
*
36+
* @param <T> the future result type of an asynchronous operation for this type.
37+
* @param <U> the future result type of an asynchronous operation for the {@link FutureCallback}.
38+
* @since 5.5
39+
*/
40+
public class CompletingFutureContribution<T, U> extends FutureContribution<T, U> {
41+
42+
private final Function<T, U> resultProvider;
43+
44+
/**
45+
* Constructs a new instance to callback the given {@link BasicFuture}.
46+
*
47+
* @param future The callback.
48+
*/
49+
@SuppressWarnings("unchecked")
50+
public CompletingFutureContribution(final BasicFuture<U> future) {
51+
this(future, (Function<T, U>) Function.identity());
52+
}
53+
54+
/**
55+
* Constructs a new instance to callback the given {@link BasicFuture}.
56+
*
57+
* @param future The callback.
58+
* @param resultProvider Provides the result to complete the future.
59+
*/
60+
public CompletingFutureContribution(final BasicFuture<U> future, final Function<T, U> resultProvider) {
61+
super(future);
62+
this.resultProvider = Objects.requireNonNull(resultProvider, "resultProvider");
63+
}
64+
65+
@Override
66+
public void completed(final T result) {
67+
getFuture().completed(resultProvider.apply(result));
68+
}
69+
70+
}

httpcore5/src/main/java/org/apache/hc/core5/concurrent/FutureContribution.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,19 +30,20 @@
3030
* Convenience base class for {@link FutureCallback}s that contribute a result
3131
* of the operation to another {@link BasicFuture}.
3232
*
33-
* @param <T> the future result type of an asynchronous operation.
33+
* @param <T> the future result type of an asynchronous operation for this type.
34+
* @param <U> the future result type of an asynchronous operation for the {@link FutureCallback}.
3435
* @since 5.1
3536
*/
36-
public abstract class FutureContribution<T> implements FutureCallback<T> {
37+
public abstract class FutureContribution<T, U> implements FutureCallback<T> {
3738

38-
private final BasicFuture<?> future;
39+
private final BasicFuture<U> future;
3940

4041
/**
4142
* Constructs a new instance to callback the given {@link BasicFuture}.
4243
*
4344
* @param future The callback.
4445
*/
45-
public FutureContribution(final BasicFuture<?> future) {
46+
public FutureContribution(final BasicFuture<U> future) {
4647
this.future = future;
4748
}
4849

@@ -60,4 +61,8 @@ public final void cancelled() {
6061
}
6162
}
6263

64+
BasicFuture<U> getFuture() {
65+
return future;
66+
}
67+
6368
}

httpcore5/src/main/java/org/apache/hc/core5/http/impl/bootstrap/HttpAsyncRequester.java

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,9 @@
3737
import org.apache.hc.core5.annotation.Internal;
3838
import org.apache.hc.core5.concurrent.BasicFuture;
3939
import org.apache.hc.core5.concurrent.CallbackContribution;
40+
import org.apache.hc.core5.concurrent.CompletingFutureContribution;
4041
import org.apache.hc.core5.concurrent.ComplexFuture;
4142
import org.apache.hc.core5.concurrent.FutureCallback;
42-
import org.apache.hc.core5.concurrent.FutureContribution;
4343
import org.apache.hc.core5.function.Callback;
4444
import org.apache.hc.core5.function.Decorator;
4545
import org.apache.hc.core5.http.ConnectionClosedException;
@@ -417,14 +417,7 @@ public final <T> Future<T> execute(
417417
final AsyncClientExchangeHandler exchangeHandler = new BasicClientExchangeHandler<>(
418418
requestProducer,
419419
responseConsumer,
420-
new FutureContribution<T>(future) {
421-
422-
@Override
423-
public void completed(final T result) {
424-
future.completed(result);
425-
}
426-
427-
});
420+
new CompletingFutureContribution<T, T>(future));
428421
execute(target, exchangeHandler, pushHandlerFactory, timeout, context != null ? context : HttpCoreContext.create());
429422
return future;
430423
}

0 commit comments

Comments
 (0)