11package io .tiledb .cloud ;
22
3- import io .tiledb .cloud .rest_api .ApiClient ;
43import okhttp3 .OkHttpClient ;
54import org .json .JSONObject ;
65import 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