Skip to content

Commit 34ca1a7

Browse files
committed
[2.0.0-SNAPSHOT]
EthHttpClient contract and package refactoring
1 parent 0cafb6d commit 34ca1a7

21 files changed

+223
-84
lines changed

src/main/java/io/goodforgod/api/etherscan/AccountAPIProvider.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import io.goodforgod.api.etherscan.error.EtherScanException;
44
import io.goodforgod.api.etherscan.error.EtherScanResponseException;
5-
import io.goodforgod.api.etherscan.executor.EthHttpClient;
5+
import io.goodforgod.api.etherscan.http.EthHttpClient;
66
import io.goodforgod.api.etherscan.manager.RequestQueueManager;
77
import io.goodforgod.api.etherscan.model.*;
88
import io.goodforgod.api.etherscan.model.response.*;
@@ -49,8 +49,9 @@ final class AccountAPIProvider extends BasicProvider implements AccountAPI {
4949

5050
AccountAPIProvider(RequestQueueManager requestQueueManager,
5151
String baseUrl,
52-
EthHttpClient executor) {
53-
super(requestQueueManager, "account", baseUrl, executor);
52+
EthHttpClient executor,
53+
Converter converter) {
54+
super(requestQueueManager, "account", baseUrl, executor, converter);
5455
}
5556

5657
@NotNull

src/main/java/io/goodforgod/api/etherscan/BasicProvider.java

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
package io.goodforgod.api.etherscan;
22

3-
import com.google.gson.Gson;
43
import io.goodforgod.api.etherscan.error.EtherScanException;
54
import io.goodforgod.api.etherscan.error.EtherScanParseException;
65
import io.goodforgod.api.etherscan.error.EtherScanRateLimitException;
76
import io.goodforgod.api.etherscan.error.EtherScanResponseException;
8-
import io.goodforgod.api.etherscan.executor.EthHttpClient;
7+
import io.goodforgod.api.etherscan.http.EthHttpClient;
98
import io.goodforgod.api.etherscan.manager.RequestQueueManager;
109
import io.goodforgod.api.etherscan.model.response.StringResponseTO;
1110
import io.goodforgod.api.etherscan.util.BasicUtils;
12-
import io.goodforgod.gson.configuration.GsonConfiguration;
11+
import java.net.URI;
12+
import java.nio.charset.StandardCharsets;
1313
import java.util.Map;
1414

1515
/**
@@ -30,30 +30,31 @@ abstract class BasicProvider {
3030
private final String baseUrl;
3131
private final EthHttpClient executor;
3232
private final RequestQueueManager queue;
33-
private final Gson gson;
33+
private final Converter converter;
3434

3535
BasicProvider(RequestQueueManager requestQueueManager,
3636
String module,
3737
String baseUrl,
38-
EthHttpClient ethHttpClient) {
38+
EthHttpClient ethHttpClient,
39+
Converter converter) {
3940
this.queue = requestQueueManager;
4041
this.module = "&module=" + module;
4142
this.baseUrl = baseUrl;
4243
this.executor = ethHttpClient;
43-
this.gson = new GsonConfiguration().builder().create();
44+
this.converter = converter;
4445
}
4546

4647
<T> T convert(String json, Class<T> tClass) {
4748
try {
48-
final T t = gson.fromJson(json, tClass);
49+
final T t = converter.fromJson(json, tClass);
4950
if (t instanceof StringResponseTO && ((StringResponseTO) t).getResult().startsWith("Max rate limit reached")) {
5051
throw new EtherScanRateLimitException(((StringResponseTO) t).getResult());
5152
}
5253

5354
return t;
5455
} catch (Exception e) {
5556
try {
56-
final Map<String, Object> map = gson.fromJson(json, Map.class);
57+
final Map<String, Object> map = converter.fromJson(json, Map.class);
5758
final Object result = map.get("result");
5859
if (result instanceof String && ((String) result).startsWith("Max rate limit reached"))
5960
throw new EtherScanRateLimitException(((String) result));
@@ -69,18 +70,18 @@ <T> T convert(String json, Class<T> tClass) {
6970

7071
String getRequest(String urlParameters) {
7172
queue.takeTurn();
72-
final String url = baseUrl + module + urlParameters;
73-
final String result = executor.get(url);
73+
final URI uri = URI.create(baseUrl + module + urlParameters);
74+
final String result = executor.get(uri);
7475
if (BasicUtils.isEmpty(result))
75-
throw new EtherScanResponseException("Server returned null value for GET request at URL - " + url);
76+
throw new EtherScanResponseException("Server returned null value for GET request at URL - " + uri);
7677

7778
return result;
7879
}
7980

8081
String postRequest(String urlParameters, String dataToPost) {
8182
queue.takeTurn();
82-
final String url = baseUrl + module + urlParameters;
83-
return executor.post(url, dataToPost);
83+
final URI uri = URI.create(baseUrl + module + urlParameters);
84+
return executor.post(uri, dataToPost.getBytes(StandardCharsets.UTF_8));
8485
}
8586

8687
<T> T getRequest(String urlParameters, Class<T> tClass) {

src/main/java/io/goodforgod/api/etherscan/BlockAPIProvider.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package io.goodforgod.api.etherscan;
22

33
import io.goodforgod.api.etherscan.error.EtherScanException;
4-
import io.goodforgod.api.etherscan.executor.EthHttpClient;
4+
import io.goodforgod.api.etherscan.http.EthHttpClient;
55
import io.goodforgod.api.etherscan.manager.RequestQueueManager;
66
import io.goodforgod.api.etherscan.model.BlockUncle;
77
import io.goodforgod.api.etherscan.model.response.UncleBlockResponseTO;
@@ -24,8 +24,9 @@ final class BlockAPIProvider extends BasicProvider implements BlockAPI {
2424

2525
BlockAPIProvider(RequestQueueManager requestQueueManager,
2626
String baseUrl,
27-
EthHttpClient executor) {
28-
super(requestQueueManager, "block", baseUrl, executor);
27+
EthHttpClient executor,
28+
Converter converter) {
29+
super(requestQueueManager, "block", baseUrl, executor, converter);
2930
}
3031

3132
@NotNull

src/main/java/io/goodforgod/api/etherscan/ContractAPIProvider.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import io.goodforgod.api.etherscan.error.EtherScanException;
44
import io.goodforgod.api.etherscan.error.EtherScanResponseException;
5-
import io.goodforgod.api.etherscan.executor.EthHttpClient;
5+
import io.goodforgod.api.etherscan.http.EthHttpClient;
66
import io.goodforgod.api.etherscan.manager.RequestQueueManager;
77
import io.goodforgod.api.etherscan.model.Abi;
88
import io.goodforgod.api.etherscan.model.response.StringResponseTO;
@@ -24,8 +24,9 @@ final class ContractAPIProvider extends BasicProvider implements ContractAPI {
2424

2525
ContractAPIProvider(RequestQueueManager requestQueueManager,
2626
String baseUrl,
27-
EthHttpClient executor) {
28-
super(requestQueueManager, "contract", baseUrl, executor);
27+
EthHttpClient executor,
28+
Converter converter) {
29+
super(requestQueueManager, "contract", baseUrl, executor, converter);
2930
}
3031

3132
@NotNull
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package io.goodforgod.api.etherscan;
2+
3+
import org.jetbrains.annotations.NotNull;
4+
5+
/**
6+
* @author Anton Kurako (GoodforGod)
7+
* @since 14.05.2023
8+
*/
9+
public interface Converter {
10+
11+
@NotNull
12+
<T> T fromJson(@NotNull String json, @NotNull Class<T> type);
13+
}

src/main/java/io/goodforgod/api/etherscan/EthScanAPIBuilder.java

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
package io.goodforgod.api.etherscan;
22

3+
import com.google.gson.Gson;
34
import io.goodforgod.api.etherscan.error.EtherScanKeyException;
4-
import io.goodforgod.api.etherscan.executor.EthHttpClient;
5-
import io.goodforgod.api.etherscan.executor.impl.UrlEthHttpClient;
5+
import io.goodforgod.api.etherscan.http.EthHttpClient;
6+
import io.goodforgod.api.etherscan.http.impl.UrlEthHttpClient;
67
import io.goodforgod.api.etherscan.manager.RequestQueueManager;
78
import io.goodforgod.api.etherscan.manager.impl.FakeRequestQueueManager;
89
import io.goodforgod.api.etherscan.util.BasicUtils;
10+
import io.goodforgod.gson.configuration.GsonConfiguration;
911
import java.util.function.Supplier;
1012
import org.jetbrains.annotations.NotNull;
1113

@@ -18,10 +20,19 @@ final class EthScanAPIBuilder implements EtherScanAPI.Builder {
1820
private static final Supplier<EthHttpClient> DEFAULT_SUPPLIER = UrlEthHttpClient::new;
1921
private static final String DEFAULT_KEY = "YourApiKeyToken";
2022

23+
private final Gson gson = new GsonConfiguration().builder().create();
24+
2125
private String apiKey = DEFAULT_KEY;
2226
private EthNetwork ethNetwork = EthNetworks.MAINNET;
2327
private RequestQueueManager queueManager = RequestQueueManager.DEFAULT;
2428
private Supplier<EthHttpClient> ethHttpClientSupplier = DEFAULT_SUPPLIER;
29+
private Supplier<Converter> converterSupplier = () -> new Converter() {
30+
31+
@Override
32+
public <T> @NotNull T fromJson(@NotNull String json, @NotNull Class<T> type) {
33+
return gson.fromJson(json, type);
34+
}
35+
};
2536

2637
@NotNull
2738
@Override
@@ -64,8 +75,15 @@ public EtherScanAPI.Builder withHttpClient(@NotNull Supplier<EthHttpClient> http
6475
return this;
6576
}
6677

78+
@NotNull
79+
@Override
80+
public EtherScanAPI.Builder withConverter(@NotNull Supplier<Converter> converterSupplier) {
81+
this.converterSupplier = converterSupplier;
82+
return this;
83+
}
84+
6785
@Override
6886
public @NotNull EtherScanAPI build() {
69-
return new EtherScanAPIProvider(apiKey, ethNetwork, ethHttpClientSupplier, queueManager);
87+
return new EtherScanAPIProvider(apiKey, ethNetwork, queueManager, ethHttpClientSupplier.get(), converterSupplier.get());
7088
}
7189
}

src/main/java/io/goodforgod/api/etherscan/EtherScanAPI.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package io.goodforgod.api.etherscan;
22

3-
import io.goodforgod.api.etherscan.executor.EthHttpClient;
3+
import io.goodforgod.api.etherscan.http.EthHttpClient;
44
import io.goodforgod.api.etherscan.manager.RequestQueueManager;
55
import java.util.function.Supplier;
66
import org.jetbrains.annotations.NotNull;
@@ -59,6 +59,9 @@ interface Builder {
5959
@NotNull
6060
Builder withHttpClient(@NotNull Supplier<EthHttpClient> httpClientSupplier);
6161

62+
@NotNull
63+
Builder withConverter(@NotNull Supplier<Converter> converterSupplier);
64+
6265
@NotNull
6366
EtherScanAPI build();
6467
}

src/main/java/io/goodforgod/api/etherscan/EtherScanAPIProvider.java

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
package io.goodforgod.api.etherscan;
22

3-
import io.goodforgod.api.etherscan.executor.EthHttpClient;
3+
import io.goodforgod.api.etherscan.http.EthHttpClient;
44
import io.goodforgod.api.etherscan.manager.RequestQueueManager;
5-
import java.util.function.Supplier;
65
import org.jetbrains.annotations.NotNull;
76

87
/**
@@ -25,21 +24,21 @@ final class EtherScanAPIProvider implements EtherScanAPI {
2524

2625
EtherScanAPIProvider(String apiKey,
2726
EthNetwork network,
28-
Supplier<EthHttpClient> executorSupplier,
29-
RequestQueueManager queue) {
27+
RequestQueueManager queue,
28+
EthHttpClient ethHttpClient,
29+
Converter converter) {
3030
// EtherScan 1request\5sec limit support by queue manager
31-
final EthHttpClient ethHttpClient = executorSupplier.get();
3231
final String baseUrl = network.domain() + "?apikey=" + apiKey;
3332

3433
this.requestQueueManager = queue;
35-
this.account = new AccountAPIProvider(queue, baseUrl, ethHttpClient);
36-
this.block = new BlockAPIProvider(queue, baseUrl, ethHttpClient);
37-
this.contract = new ContractAPIProvider(queue, baseUrl, ethHttpClient);
38-
this.logs = new LogsAPIProvider(queue, baseUrl, ethHttpClient);
39-
this.proxy = new ProxyAPIProvider(queue, baseUrl, ethHttpClient);
40-
this.stats = new StatisticAPIProvider(queue, baseUrl, ethHttpClient);
41-
this.txs = new TransactionAPIProvider(queue, baseUrl, ethHttpClient);
42-
this.gasTracker = new GasTrackerAPIProvider(queue, baseUrl, ethHttpClient);
34+
this.account = new AccountAPIProvider(queue, baseUrl, ethHttpClient, converter);
35+
this.block = new BlockAPIProvider(queue, baseUrl, ethHttpClient, converter);
36+
this.contract = new ContractAPIProvider(queue, baseUrl, ethHttpClient, converter);
37+
this.logs = new LogsAPIProvider(queue, baseUrl, ethHttpClient, converter);
38+
this.proxy = new ProxyAPIProvider(queue, baseUrl, ethHttpClient, converter);
39+
this.stats = new StatisticAPIProvider(queue, baseUrl, ethHttpClient, converter);
40+
this.txs = new TransactionAPIProvider(queue, baseUrl, ethHttpClient, converter);
41+
this.gasTracker = new GasTrackerAPIProvider(queue, baseUrl, ethHttpClient, converter);
4342
}
4443

4544
@NotNull

src/main/java/io/goodforgod/api/etherscan/GasTrackerAPIProvider.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import io.goodforgod.api.etherscan.error.EtherScanException;
44
import io.goodforgod.api.etherscan.error.EtherScanResponseException;
5-
import io.goodforgod.api.etherscan.executor.EthHttpClient;
5+
import io.goodforgod.api.etherscan.http.EthHttpClient;
66
import io.goodforgod.api.etherscan.manager.RequestQueueManager;
77
import io.goodforgod.api.etherscan.model.GasEstimate;
88
import io.goodforgod.api.etherscan.model.GasOracle;
@@ -27,8 +27,9 @@ final class GasTrackerAPIProvider extends BasicProvider implements GasTrackerAPI
2727

2828
GasTrackerAPIProvider(RequestQueueManager queue,
2929
String baseUrl,
30-
EthHttpClient ethHttpClient) {
31-
super(queue, "gastracker", baseUrl, ethHttpClient);
30+
EthHttpClient ethHttpClient,
31+
Converter converter) {
32+
super(queue, "gastracker", baseUrl, ethHttpClient, converter);
3233
}
3334

3435
@Override

src/main/java/io/goodforgod/api/etherscan/LogsAPIProvider.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package io.goodforgod.api.etherscan;
22

33
import io.goodforgod.api.etherscan.error.EtherScanException;
4-
import io.goodforgod.api.etherscan.executor.EthHttpClient;
4+
import io.goodforgod.api.etherscan.http.EthHttpClient;
55
import io.goodforgod.api.etherscan.manager.RequestQueueManager;
66
import io.goodforgod.api.etherscan.model.Log;
77
import io.goodforgod.api.etherscan.model.query.LogQuery;
@@ -24,8 +24,9 @@ final class LogsAPIProvider extends BasicProvider implements LogsAPI {
2424

2525
LogsAPIProvider(RequestQueueManager queue,
2626
String baseUrl,
27-
EthHttpClient executor) {
28-
super(queue, "logs", baseUrl, executor);
27+
EthHttpClient executor,
28+
Converter converter) {
29+
super(queue, "logs", baseUrl, executor, converter);
2930
}
3031

3132
@NotNull

0 commit comments

Comments
 (0)