Skip to content

Commit a17fd14

Browse files
authored
feat: refactor TileDBClient to support versioned API clients (#45)
* refactor TileDBClient to support versioned API clients * mark getApiClient() as deprecated
1 parent be39ea3 commit a17fd14

File tree

1 file changed

+97
-15
lines changed

1 file changed

+97
-15
lines changed

src/main/java/io/tiledb/cloud/TileDBClient.java

Lines changed: 97 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package io.tiledb.cloud;
22

3-
import io.tiledb.cloud.rest_api.ApiClient;
43
import okhttp3.OkHttpClient;
54
import org.json.JSONObject;
65
import org.json.JSONTokener;
@@ -32,7 +31,14 @@ public class TileDBClient{
3231

3332
static Logger logger = Logger.getLogger(TileDBClient.class.getName());
3433

35-
private ApiClient apiClient;
34+
private io.tiledb.cloud.rest_api.ApiClient apiClient;
35+
36+
// Lazy-initialized versioned clients (v4 is optional and created via reflection)
37+
private io.tiledb.cloud.rest_api.ApiClient v1Client;
38+
private io.tiledb.cloud.rest_api.v2.ApiClient v2Client;
39+
private io.tiledb.cloud.rest_api.v4.ApiClient v4Client;
40+
41+
public enum ApiVersion { V1, V2, V4 }
3642

3743
/**
3844
* Static initialization.
@@ -42,7 +48,7 @@ public class TileDBClient{
4248
apiKey = "";
4349
username = "";
4450
password = "";
45-
basePath = "https://api.tiledb.com/v1"; //default is TileDB
51+
basePath = "https://api.tiledb.com/v1"; //default is TileDB (v1 for backward compatibility)
4652
loginInfoIsInJSONFile = true;
4753
verifyingSsl = true;
4854

@@ -102,11 +108,7 @@ private static boolean loadCloudJSONFileFromHome() throws IOException {
102108

103109
if (object.has("host")){
104110
String host = object.getString("host");
105-
if (host.equals("https://api.tiledb.com")){
106-
basePath = host + "/v1";
107-
} else {
108-
basePath = host;
109-
}
111+
basePath = host;
110112
logger.log(Level.INFO, "Found host from disk");
111113
}
112114

@@ -203,7 +205,7 @@ private void writeAuthJSONFileToHome() {
203205
* @param tileDBLogin Login object with credentials
204206
*/
205207
public TileDBClient(OkHttpClient client, TileDBLogin tileDBLogin){
206-
apiClient = new ApiClient(client);
208+
apiClient = new io.tiledb.cloud.rest_api.ApiClient(client);
207209
setClientCredentials(tileDBLogin);
208210
setReadTimeout(0);
209211
}
@@ -214,7 +216,7 @@ public TileDBClient(OkHttpClient client, TileDBLogin tileDBLogin){
214216
* @param client an okhttp3.OkHttpClient object
215217
*/
216218
public TileDBClient(OkHttpClient client){
217-
apiClient = new ApiClient(client);
219+
apiClient = new io.tiledb.cloud.rest_api.ApiClient(client);
218220
setClientCredentials(new TileDBLogin());
219221
setReadTimeout(0);
220222
}
@@ -225,7 +227,7 @@ public TileDBClient(OkHttpClient client){
225227
* @param tileDBLogin Login object with credentials
226228
*/
227229
public TileDBClient(TileDBLogin tileDBLogin){
228-
apiClient = new ApiClient();
230+
apiClient = new io.tiledb.cloud.rest_api.ApiClient();
229231
setClientCredentials(tileDBLogin);
230232
setReadTimeout(0);
231233
}
@@ -235,7 +237,7 @@ public TileDBClient(TileDBLogin tileDBLogin){
235237
*
236238
*/
237239
public TileDBClient(){
238-
apiClient = new ApiClient();
240+
apiClient = new io.tiledb.cloud.rest_api.ApiClient();
239241
setClientCredentials(new TileDBLogin());
240242
setReadTimeout(0);
241243
}
@@ -249,7 +251,7 @@ public TileDBClient(){
249251
* @param parameters a java.util.Map of parameters
250252
*/
251253
public TileDBClient(String basePath, String clientId, String clientSecret, Map<String, String> parameters){
252-
apiClient = new ApiClient(basePath, clientId, clientSecret, parameters);
254+
apiClient = new io.tiledb.cloud.rest_api.ApiClient(basePath, clientId, clientSecret, parameters);
253255
setClientCredentials(new TileDBLogin());
254256
setReadTimeout(0);
255257
}
@@ -264,7 +266,7 @@ public TileDBClient(String basePath, String clientId, String clientSecret, Map<S
264266
* @param tileDBLogin Login object with credentials
265267
*/
266268
public TileDBClient(String basePath, String clientId, String clientSecret, Map<String, String> parameters, TileDBLogin tileDBLogin){
267-
apiClient = new ApiClient(basePath, clientId, clientSecret, parameters);
269+
apiClient = new io.tiledb.cloud.rest_api.ApiClient(basePath, clientId, clientSecret, parameters);
268270
setClientCredentials(tileDBLogin);
269271
setReadTimeout(0);
270272
}
@@ -289,7 +291,87 @@ public void setClientCredentials(TileDBLogin tileDBLogin) {
289291
apiClient.setBasePath(basePath);
290292
}
291293

292-
public ApiClient getApiClient() {
294+
@Deprecated
295+
// Replaced by: getV1Client()
296+
public io.tiledb.cloud.rest_api.ApiClient getApiClient() {
293297
return apiClient;
294298
}
299+
300+
private String normalizeBaseHost(String inputBase) {
301+
if (inputBase == null || inputBase.isEmpty()) {
302+
return "https://api.tiledb.com";
303+
}
304+
// strip trailing /v{digits}
305+
String trimmed = inputBase.trim();
306+
return trimmed.replaceFirst("/v\\d+$", "");
307+
}
308+
309+
private String versionedBasePath(ApiVersion version) {
310+
String hostOnly = normalizeBaseHost(basePath);
311+
String suffix;
312+
switch (version) {
313+
case V2:
314+
suffix = "/v2";
315+
break;
316+
case V4:
317+
suffix = "/v4";
318+
break;
319+
case V1:
320+
default:
321+
suffix = "/v1";
322+
break;
323+
}
324+
return hostOnly + suffix;
325+
}
326+
327+
public io.tiledb.cloud.rest_api.ApiClient getV1Client() {
328+
if (v1Client == null) {
329+
v1Client = new io.tiledb.cloud.rest_api.ApiClient();
330+
v1Client.setApiKey(apiKey);
331+
v1Client.setUsername(username);
332+
v1Client.setPassword(password);
333+
v1Client.setVerifyingSsl(verifyingSsl);
334+
v1Client.setBasePath(versionedBasePath(ApiVersion.V1));
335+
v1Client = v1Client.setReadTimeout(this.apiClient.getReadTimeout());
336+
}
337+
return v1Client;
338+
}
339+
340+
public io.tiledb.cloud.rest_api.v2.ApiClient getV2Client() {
341+
if (v2Client == null) {
342+
v2Client = new io.tiledb.cloud.rest_api.v2.ApiClient();
343+
v2Client.setApiKey(apiKey);
344+
v2Client.setUsername(username);
345+
v2Client.setPassword(password);
346+
v2Client.setVerifyingSsl(verifyingSsl);
347+
v2Client.setBasePath(versionedBasePath(ApiVersion.V2));
348+
v2Client = v2Client.setReadTimeout(this.apiClient.getReadTimeout());
349+
}
350+
return v2Client;
351+
}
352+
353+
public io.tiledb.cloud.rest_api.v4.ApiClient getV4Client() {
354+
if (v4Client == null) {
355+
v4Client = new io.tiledb.cloud.rest_api.v4.ApiClient();
356+
v4Client.setApiKey(apiKey);
357+
v4Client.setUsername(username);
358+
v4Client.setPassword(password);
359+
v4Client.setVerifyingSsl(verifyingSsl);
360+
v4Client.setBasePath(versionedBasePath(ApiVersion.V4));
361+
v4Client = v4Client.setReadTimeout(this.apiClient.getReadTimeout());
362+
}
363+
return v4Client;
364+
}
365+
366+
public Object getApiClient(ApiVersion version) {
367+
switch (version) {
368+
case V1:
369+
return getV1Client();
370+
case V2:
371+
return getV2Client();
372+
case V4:
373+
default:
374+
return getV4Client();
375+
}
376+
}
295377
}

0 commit comments

Comments
 (0)