Skip to content

Commit d5fa656

Browse files
author
JureZe
committed
immutable API classes - as suggested by kullfar
1 parent bd527f6 commit d5fa656

2 files changed

Lines changed: 24 additions & 18 deletions

File tree

scribejava-apis/src/main/java/com/github/scribejava/apis/KeycloakApi.java

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,38 +5,47 @@
55
import com.github.scribejava.core.extractors.TokenExtractor;
66
import com.github.scribejava.core.model.OAuth2AccessToken;
77

8+
import java.util.concurrent.ConcurrentHashMap;
9+
import java.util.concurrent.ConcurrentMap;
10+
811
public class KeycloakApi extends DefaultApi20 {
912

10-
private String baseUrl = "http://localhost:8080";
11-
private String realm = "master";
13+
private final String baseUrlWithRealm;
1214

13-
public void setBaseUrl(String baseUrl) {
14-
this.baseUrl = baseUrl + (baseUrl.endsWith("/")? "" : "/");
15-
}
15+
private static final ConcurrentMap<String, KeycloakApi> INSTANCES = new ConcurrentHashMap<>();
1616

17-
public void setRealm(String realm) {
18-
this.realm = realm;
17+
protected KeycloakApi(String baseUrlWithRealm) {
18+
this.baseUrlWithRealm = baseUrlWithRealm;
1919
}
2020

21-
protected KeycloakApi() {
21+
public static KeycloakApi instance() {
22+
return instance("http://localhost:8080/", "master");
2223
}
2324

24-
private static class InstanceHolder {
25-
private static final KeycloakApi INSTANCE = new KeycloakApi();
25+
public static KeycloakApi instance(String baseUrl, String realm) {
26+
final String defaultBaseUrlWithRealm = composeBaseUrlWithRealm(baseUrl, realm);
27+
28+
//java8: switch to ConcurrentMap::computeIfAbsent
29+
KeycloakApi api = INSTANCES.get(defaultBaseUrlWithRealm);
30+
if (api == null) {
31+
api = new KeycloakApi(defaultBaseUrlWithRealm);
32+
INSTANCES.putIfAbsent(defaultBaseUrlWithRealm, api);
33+
}
34+
return api;
2635
}
2736

28-
public static KeycloakApi instance() {
29-
return KeycloakApi.InstanceHolder.INSTANCE;
37+
protected static String composeBaseUrlWithRealm(String baseUrl, String realm) {
38+
return baseUrl + (baseUrl.endsWith("/") ? "" : "/") + "auth/realms/" + realm;
3039
}
3140

3241
@Override
3342
public String getAccessTokenEndpoint() {
34-
return baseUrl + "auth/realms/" + realm + "/protocol/openid-connect/token";
43+
return baseUrlWithRealm + "/protocol/openid-connect/token";
3544
}
3645

3746
@Override
3847
protected String getAuthorizationBaseUrl() {
39-
return baseUrl + "auth/realms/" + realm + "/protocol/openid-connect/auth";
48+
return baseUrlWithRealm + "/protocol/openid-connect/auth";
4049
}
4150

4251
@Override

scribejava-apis/src/test/java/com/github/scribejava/apis/examples/KeycloakExample.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,11 @@ public static void main(String... args) throws IOException, InterruptedException
2727
// Replace these with your own api key and secret
2828
final String apiKey = "TEST_SP";
2929
final String apiSecret = "a8fe62c9-c3a1-4545-81ca-fda5df1c032b";
30-
final KeycloakApi keyloackApi = KeycloakApi.instance();
31-
keyloackApi.setBaseUrl(BASE_URL);
32-
keyloackApi.setRealm(REALM);
3330
final OAuth20Service service = new ServiceBuilder(apiKey)
3431
.apiSecret(apiSecret)
3532
.scope("openid")
3633
.callback("http://najdi.si")
37-
.build(keyloackApi);
34+
.build(KeycloakApi.instance(BASE_URL, REALM));
3835
final Scanner in = new Scanner(System.in);
3936

4037
System.out.println("=== Keyloack's OAuth Workflow ===");

0 commit comments

Comments
 (0)