Skip to content

Commit c27bb64

Browse files
committed
BingAds#203: separate implementations for Jersey and Cxf HttpClientProviders
1 parent cb09496 commit c27bb64

File tree

5 files changed

+89
-65
lines changed

5 files changed

+89
-65
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package com.microsoft.bingads;
2+
3+
import java.util.HashSet;
4+
import java.util.Map;
5+
import java.util.Set;
6+
7+
import org.apache.cxf.transport.common.gzip.GZIPFeature;
8+
9+
import com.microsoft.bingads.internal.CxfUtils;
10+
11+
import jakarta.ws.rs.client.Client;
12+
import jakarta.ws.rs.client.ClientBuilder;
13+
import jakarta.ws.rs.client.WebTarget;
14+
15+
public class CxfHttpClientProvider extends HttpClientProvider {
16+
17+
protected CxfHttpClientProvider(ClientBuilder clientBuilder) {
18+
super(configureClientBuilder(clientBuilder), CxfHttpClientProvider::createWebTargets);
19+
}
20+
21+
private static ClientBuilder configureClientBuilder(ClientBuilder clientBuilder) {
22+
return clientBuilder.register(new GZIPFeature());
23+
}
24+
25+
private static Map<String, WebTarget> createWebTargets(Client client) {
26+
return CxfUtils.runOnNewBus(
27+
() -> initializeWebTargets(client),
28+
logging -> {
29+
Set<String> headerNames = new HashSet<>();
30+
31+
headerNames.add("Authorization");
32+
headerNames.add("Password");
33+
34+
logging.setSensitiveProtocolHeaderNames(headerNames);
35+
});
36+
}
37+
}

Diff for: src/main/java/com/microsoft/bingads/GlobalSettings.java

+2-12
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,13 @@
33
import com.microsoft.bingads.internal.utilities.Lazy;
44

55
public class GlobalSettings {
6-
private static Lazy<HttpClientProvider> lazyHttpClientProvider = new Lazy<>(() -> {
7-
HttpClientProvider provider = new HttpClientProvider();
8-
9-
provider.initialize();
10-
11-
return provider;
12-
});
6+
private static Lazy<HttpClientProvider> lazyHttpClientProvider = new Lazy<>(HttpClientProviderFactory::getHttpClientProvider);
137

148
public static HttpClientProvider getHttpClientProvider() {
159
return lazyHttpClientProvider.getValue();
1610
}
1711

1812
public static void setHttpClientProvider(HttpClientProvider httpClientProvider) {
19-
lazyHttpClientProvider = new Lazy<>(() -> {
20-
httpClientProvider.initialize();
21-
22-
return httpClientProvider;
23-
});
13+
lazyHttpClientProvider = new Lazy<>(() -> httpClientProvider);
2414
}
2515
}

Diff for: src/main/java/com/microsoft/bingads/HttpClientProvider.java

+15-53
Original file line numberDiff line numberDiff line change
@@ -4,82 +4,44 @@
44
import java.net.URL;
55
import java.util.Arrays;
66
import java.util.HashMap;
7-
import java.util.HashSet;
87
import java.util.Map;
9-
import java.util.Set;
10-
import java.util.concurrent.Executors;
118
import java.util.concurrent.TimeUnit;
129

13-
import org.apache.cxf.transport.common.gzip.GZIPFeature;
14-
15-
import com.microsoft.bingads.internal.CxfUtils;
1610
import com.microsoft.bingads.internal.ServiceFactoryImpl;
1711
import com.microsoft.bingads.internal.ServiceInfo;
1812
import com.microsoft.bingads.internal.ServiceUtils;
13+
import com.microsoft.bingads.internal.functionalinterfaces.Function;
1914

2015
import jakarta.ws.rs.client.Client;
2116
import jakarta.ws.rs.client.ClientBuilder;
2217
import jakarta.ws.rs.client.WebTarget;
2318

2419
public class HttpClientProvider {
25-
private Map<String, WebTarget> webTargetByService;
26-
27-
public void initialize() {
28-
if (webTargetByService != null) {
29-
return;
30-
}
20+
private final Client client;
21+
private final Map<String, WebTarget> webTargetByService;
3122

32-
ClientBuilder clientBuilder = configureClientBuilder(ClientBuilder.newBuilder());
33-
34-
Client client = clientBuilder.build();
23+
HttpClientProvider(ClientBuilder clientBuilder) {
24+
this(clientBuilder, HttpClientProvider::initializeWebTargets);
25+
}
3526

36-
webTargetByService = createWebTargets(client);
27+
HttpClientProvider(ClientBuilder clientBuilder, Function<Client, Map<String, WebTarget>> webTargetByServiceFunction) {
28+
client = clientBuilder.connectTimeout(1, TimeUnit.MINUTES)
29+
.readTimeout(10, TimeUnit.MINUTES)
30+
.build();
31+
webTargetByService = webTargetByServiceFunction.apply(client);
3732
}
3833

3934
public WebTarget get(Class<?> serviceInterface, ApiEnvironment environment) {
4035
String key = getKey(serviceInterface, environment);
41-
4236
return webTargetByService.get(key);
4337
}
4438

45-
private static String getKey(Class<?> serviceInterface, ApiEnvironment environment) {
46-
return serviceInterface.getName() + "_" + environment.toString();
39+
protected void close() {
40+
client.close();
4741
}
4842

49-
protected ClientBuilder configureClientBuilder(ClientBuilder clientBuilder) {
50-
String clientClassName = clientBuilder.getClass().getName();
51-
52-
if (clientClassName.contains("org.apache.cxf")) {
53-
clientBuilder = clientBuilder.register(new GZIPFeature());
54-
}
55-
56-
if (clientClassName.contains("org.glassfish.jersey")) {
57-
clientBuilder = clientBuilder.property("jersey.config.client.suppressHttpComplianceValidation", true); // allow DELETE requests with body
58-
}
59-
60-
return clientBuilder
61-
.connectTimeout(1, TimeUnit.MINUTES)
62-
.readTimeout(10, TimeUnit.MINUTES);
63-
}
64-
65-
protected Map<String, WebTarget> createWebTargets(Client client) {
66-
boolean isCxf = client.getClass().getName().contains("org.apache.cxf");
67-
68-
if (isCxf) {
69-
return CxfUtils.runOnNewBus(
70-
() -> initializeWebTargets(client),
71-
(logging) -> {
72-
Set<String> headerNames = new HashSet<>();
73-
74-
headerNames.add("Authorization");
75-
headerNames.add("Password");
76-
77-
logging.setSensitiveProtocolHeaderNames(headerNames);
78-
}
79-
);
80-
}
81-
82-
return initializeWebTargets(client);
43+
private static String getKey(Class<?> serviceInterface, ApiEnvironment environment) {
44+
return serviceInterface.getName() + "_" + environment.toString();
8345
}
8446

8547
protected static Map<String, WebTarget> initializeWebTargets(Client client) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.microsoft.bingads;
2+
3+
import jakarta.ws.rs.client.ClientBuilder;
4+
5+
public class HttpClientProviderFactory {
6+
7+
private HttpClientProviderFactory() {
8+
// no instantiation necessary
9+
}
10+
11+
public static HttpClientProvider getHttpClientProvider() {
12+
ClientBuilder clientBuilder = ClientBuilder.newBuilder();
13+
if (clientBuilder.getClass().getName().contains("org.apache.cxf")) {
14+
return new CxfHttpClientProvider(clientBuilder);
15+
} else if (clientBuilder.getClass().getName().contains("org.glassfish.jersey")) {
16+
return new JerseyHttpClientProvider(clientBuilder);
17+
}
18+
return new HttpClientProvider(clientBuilder);
19+
}
20+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.microsoft.bingads;
2+
3+
import jakarta.ws.rs.client.ClientBuilder;
4+
5+
public class JerseyHttpClientProvider extends HttpClientProvider {
6+
7+
protected JerseyHttpClientProvider(ClientBuilder clientBuilder) {
8+
super(configureClientBuilder(clientBuilder));
9+
}
10+
11+
private static ClientBuilder configureClientBuilder(ClientBuilder clientBuilder) {
12+
// allow DELETE requests with body
13+
return clientBuilder.property("jersey.config.client.suppressHttpComplianceValidation", true);
14+
}
15+
}

0 commit comments

Comments
 (0)