-
Notifications
You must be signed in to change notification settings - Fork 0
/
RandomOrgClient.java
108 lines (96 loc) · 4.03 KB
/
RandomOrgClient.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
package com.manoelcampos.randomorg;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import io.github.cdimascio.dotenv.Dotenv;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
/**
* Client to <a href="https://random.org">https://random.org</a> service.
* You need to create an account at the website and then an API key.
* Create a .env file inside your project root directory
* and insert the line below:
*
* <p>
* RANDOM_ORG_API_KEY=you-api-key
* </p>
*
* or create an environment variable with the name shown above.
*
* @author Manoel Campos da Silva Filho
* @see <a href="https://api.random.org/json-rpc/4/basic">API Docs</a>
*/
public class RandomOrgClient implements RandomNumberGenerator {
public static final String APIKEY_ENV_VAR_NAME = "RANDOM_ORG_API_KEY";
static final String JSONRPC_VERSION = "2.0";
private final String API_KEY;
private final HttpClient client;
private final ObjectMapper objectMapper;
/**
* Instantiates an object for sending requests to the random.org service
* to generate real random values.
* Reads the API Key from an environment variable with the name
* as indicated by {@link #APIKEY_ENV_VAR_NAME}.
*/
public RandomOrgClient() {
this(Dotenv.load().get(APIKEY_ENV_VAR_NAME));
}
/**
* Instantiates an object for sending requests to the random.org service
* to generate real random values.
*/
public RandomOrgClient(final String apiKey) {
objectMapper = new ObjectMapper();
objectMapper.registerModule(new JavaTimeModule());
API_KEY = apiKey;
client = HttpClient.newBuilder().build();
}
@Override
public int[] generateIntegers(final int n) {
return generateIntegers(new GenerateIntegersRequestParams(n));
}
@Override
public int[] generateNonDuplicatedIntegers(final int n) {
return generateIntegers(new GenerateIntegersRequestParams(n, false));
}
@Override
public int[] generateIntegers(final int n, final int minValue, final int maxValue) {
return generateIntegers(new GenerateIntegersRequestParams(n, minValue, maxValue));
}
@Override
public int[] generateNonDuplicatedIntegers(final int n, final int minValue, final int maxValue) {
return generateIntegers(new GenerateIntegersRequestParams(n, minValue, maxValue, false));
}
private int[] generateIntegers(final GenerateIntegersRequestParams params) {
final var data = new GenerateIntegersRequestData(params.setApiKey(API_KEY));
try {
final var json = objectMapper.writeValueAsString(data);
final var req =
HttpRequest
.newBuilder(new URI(GenerateIntegersRequestData.API_PATH))
.header("content-type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(json))
.build();
final String res = client.send(req, HttpResponse.BodyHandlers.ofString()).body();
final var generateIntegersResponse = objectMapper.readValue(res, GenerateIntegersResponse.class);
return generateIntegersResponse.getResult().getRandom().getData();
} catch (URISyntaxException | InterruptedException | IOException e) {
throw new RuntimeException(e);
}
}
public static void main(String[] args) {
final var randomService = new RandomOrgClient();
final int n = 4;
final int minValue = 1;
final int maxValue = 10;
System.out.printf(
"Generating %d real random integers from [%d ..%d] using %s%n",
n, minValue, maxValue, randomService.getClass().getSimpleName());
for (final int number : randomService.generateIntegers(n, minValue, maxValue)) {
System.out.println(number);
}
}
}