From 74215cad3f9dea92e516ead49a61b9bd135f9a7e Mon Sep 17 00:00:00 2001 From: reeshika-h Date: Sat, 1 Feb 2025 19:15:37 +0530 Subject: [PATCH 1/6] implementation added --- .../com/contentstack/sdk/AssetLibrary.java | 79 +++++++++++++++++++ 1 file changed, 79 insertions(+) diff --git a/src/main/java/com/contentstack/sdk/AssetLibrary.java b/src/main/java/com/contentstack/sdk/AssetLibrary.java index 3f54c94a..a8e03980 100644 --- a/src/main/java/com/contentstack/sdk/AssetLibrary.java +++ b/src/main/java/com/contentstack/sdk/AssetLibrary.java @@ -133,6 +133,85 @@ public int getCount() { return count; } + /** + * Add param assetlibrary. + * + * @param paramKey the param key + * @param paramValue the param value + * @return the assetlibrary + * + *
+ *
+ * Example :
+ * + *
+     *         Stack stack = Contentstack.stack("apiKey", "deliveryToken", "environment");
+     *         AssetLibrary assetLibObject = stack.assetlibrary();
+     *         assetLibObject.addParam();
+     *         
+ */ + public AssetLibrary addParam(@NotNull String paramKey, @NotNull Object paramValue) { + urlQueries.put(paramKey, paramValue); + return this; + } + + public AssetLibrary removeParam(@NotNull String paramKey){ + if(urlQueries.has(paramKey)){ + urlQueries.remove(paramKey); + } + return this; + } + + + + /** + * The number of objects to skip before returning any. + * + * @param number No of objects to skip from returned objects + * @return {@link Query} object, so you can chain this call. + *

+ * Note: The skip parameter can be used for pagination, + * "skip" specifies the number of objects to skip in the response.
+ * + *
+ *
+ * Example :
+ * + *

+     *          Stack stack = Contentstack.stack( "apiKey", "deliveryToken", "environment");
+     *          AssetLibrary assetLibObject = stack.assetlibrary.skip(4);
+ *
+ */ + + public AssetLibrary skip (@NotNull int number) { + urlQueries.put("skip",number); + return this; + } + + /** + * A limit on the number of objects to return. + * + * @param number No of objects to limit. + * @return {@link Query} object, so you can chain this call. + *

+ * Note: The limit parameter can be used for pagination, " + * limit" specifies the number of objects to limit to in the response.
+ * + *
+ *
+ * Example :
+ * + *

+     *          Stack stack = Contentstack.stack( "apiKey", "deliveryToken", "environment");
+     *           AssetLibrary assetLibObject = stack.assetlibrary.limit(4);
+ *
+ */ + + public AssetLibrary limit (@NotNull int number) { + urlQueries.put("limit", number); + return this; + } + /** * Fetch all. * From 3bf01cf80f42d1e4c8b04bbbd2f20662bf273a03 Mon Sep 17 00:00:00 2001 From: reeshika-h Date: Tue, 11 Feb 2025 12:44:26 +0530 Subject: [PATCH 2/6] added testcases and fixes for arraylist to jsonarray conversion --- .../com/contentstack/sdk/AssetLibrary.java | 9 ++- .../com/contentstack/sdk/AssetsModel.java | 27 +++++--- .../java/com/contentstack/sdk/TestAsset.java | 8 +-- .../contentstack/sdk/TestAssetLibrary.java | 64 +++++++++++++++++-- 4 files changed, 91 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/contentstack/sdk/AssetLibrary.java b/src/main/java/com/contentstack/sdk/AssetLibrary.java index a8e03980..16070b33 100644 --- a/src/main/java/com/contentstack/sdk/AssetLibrary.java +++ b/src/main/java/com/contentstack/sdk/AssetLibrary.java @@ -259,6 +259,10 @@ public void getResultObject(List objects, JSONObject jsonObject, boolean List assets = new ArrayList<>(); + // if (objects == null || objects.isEmpty()) { + // System.out.println("Objects list is null or empty"); + // } + if (objects != null && !objects.isEmpty()) { for (Object object : objects) { AssetModel model = (AssetModel) object; @@ -272,7 +276,10 @@ public void getResultObject(List objects, JSONObject jsonObject, boolean asset.setTags(model.tags); assets.add(asset); } - } + } + // else { + // System.out.println("Object is not an instance of AssetModel"); + // } if (callback != null) { callback.onRequestFinish(ResponseType.NETWORK, assets); diff --git a/src/main/java/com/contentstack/sdk/AssetsModel.java b/src/main/java/com/contentstack/sdk/AssetsModel.java index 9811ebe4..e3d17827 100644 --- a/src/main/java/com/contentstack/sdk/AssetsModel.java +++ b/src/main/java/com/contentstack/sdk/AssetsModel.java @@ -1,11 +1,11 @@ package com.contentstack.sdk; -import org.json.JSONArray; -import org.json.JSONObject; - import java.util.ArrayList; import java.util.List; +import org.json.JSONArray; +import org.json.JSONObject; + /** * The type Assets model. */ @@ -19,13 +19,24 @@ class AssetsModel { * @param response the response */ public AssetsModel(JSONObject response) { - JSONArray listResponse = response != null && response.has("assets") ? response.optJSONArray("assets") : null; - if (listResponse != null) { - listResponse.forEach(model -> { + Object listResponse = response != null && response.has("assets") ? response.opt("assets") : null; + if (listResponse instanceof JSONArray) { + // Handle traditional JSONArray + populateObjectsFromJSONArray((JSONArray) listResponse); + } else if (listResponse instanceof List) { + // Convert ArrayList to JSONArray + JSONArray jsonArray = new JSONArray((List) listResponse); + populateObjectsFromJSONArray(jsonArray); + } + } + + private void populateObjectsFromJSONArray(JSONArray jsonArray) { + jsonArray.forEach(model -> { + if (model instanceof JSONObject) { JSONObject modelObj = (JSONObject) model; AssetModel newModel = new AssetModel(modelObj, true); objects.add(newModel); - }); - } + } + }); } } diff --git a/src/test/java/com/contentstack/sdk/TestAsset.java b/src/test/java/com/contentstack/sdk/TestAsset.java index d344d9f7..6904c71c 100644 --- a/src/test/java/com/contentstack/sdk/TestAsset.java +++ b/src/test/java/com/contentstack/sdk/TestAsset.java @@ -38,10 +38,10 @@ public void onCompletion(ResponseType responseType, List assets, Error er Asset model = assets.get(0); assetUid = model.getAssetUid(); Assertions.assertTrue(model.getAssetUid().startsWith("blt")); - Assertions.assertEquals("image/png", model.getFileType()); - Assertions.assertEquals("13006", model.getFileSize()); - Assertions.assertEquals("iot-icon.png", model.getFileName()); - Assertions.assertTrue(model.getUrl().endsWith("iot-icon.png")); + Assertions.assertEquals("image/jpeg", model.getFileType()); + Assertions.assertEquals("12668", model.getFileSize()); + Assertions.assertEquals("Jane_Austen_Headshot.jpg", model.getFileName()); + Assertions.assertTrue(model.getUrl().endsWith("Jane_Austen_Headshot.jpg")); Assertions.assertTrue(model.toJSON().has("created_at")); Assertions.assertTrue(model.getCreatedBy().startsWith("blt")); Assertions.assertEquals("gregory", model.getUpdateAt().getCalendarType()); diff --git a/src/test/java/com/contentstack/sdk/TestAssetLibrary.java b/src/test/java/com/contentstack/sdk/TestAssetLibrary.java index 1238e981..fcd35644 100644 --- a/src/test/java/com/contentstack/sdk/TestAssetLibrary.java +++ b/src/test/java/com/contentstack/sdk/TestAssetLibrary.java @@ -24,10 +24,10 @@ void testNewAssetLibrary() { public void onCompletion(ResponseType responseType, List assets, Error error) { Asset model = assets.get(0); Assertions.assertTrue(model.getAssetUid().startsWith("blt")); - assertEquals("image/png", model.getFileType()); - assertEquals("13006", model.getFileSize()); - assertEquals("iot-icon.png", model.getFileName()); - Assertions.assertTrue(model.getUrl().endsWith("iot-icon.png")); + assertEquals("image/jpeg", model.getFileType()); + assertEquals("12668", model.getFileSize()); + assertEquals("Jane_Austen_Headshot.jpg", model.getFileName()); + Assertions.assertTrue(model.getUrl().endsWith("Jane_Austen_Headshot.jpg")); Assertions.assertTrue(model.toJSON().has("created_at")); Assertions.assertTrue(model.getCreatedBy().startsWith("blt")); assertEquals("gregory", model.getUpdateAt().getCalendarType()); @@ -107,4 +107,60 @@ public void onCompletion(ResponseType responseType, List assets, Error er } }); } + + @Test + void testFetchFirst10Assets() throws IllegalAccessException { + AssetLibrary assetLibrary = stack.assetLibrary(); + assetLibrary.skip(0).limit(10).fetchAll(new FetchAssetsCallback() { + @Override + public void onCompletion(ResponseType responseType, List assets, Error error) { + Assertions.assertNotNull(assets, "Assets list should not be null"); + Assertions.assertTrue(assets.size() <= 10, "Assets fetched should not exceed the limit"); + } + }); + } + + @Test + void testFetchAssetsWithSkip() throws IllegalAccessException { + AssetLibrary assetLibrary = stack.assetLibrary(); + assetLibrary.skip(10).limit(10).fetchAll(new FetchAssetsCallback() { + @Override + public void onCompletion(ResponseType responseType, List assets, Error error) { + Assertions.assertNotNull(assets, "Assets list should not be null"); + Assertions.assertTrue(assets.size() <= 10, "Assets fetched should not exceed the limit"); + } + }); + } + + @Test + void testFetchBeyondAvailableAssets() throws IllegalAccessException { + AssetLibrary assetLibrary = stack.assetLibrary(); + assetLibrary.skip(5000).limit(10).fetchAll(new FetchAssetsCallback() { + @Override + public void onCompletion(ResponseType responseType, List assets, Error error) { + Assertions.assertNotNull(assets, "Assets list should not be null"); + Assertions.assertEquals(0, assets.size(), "No assets should be fetched when skip exceeds available assets"); + } + }); + } + + @Test + void testFetchAllAssetsInBatches() throws IllegalAccessException { + AssetLibrary assetLibrary = stack.assetLibrary(); + int limit = 50; + int totalAssetsFetched[] = {0}; + + for (int skip = 0; skip < 150; skip += limit) { + assetLibrary.skip(skip).limit(limit).fetchAll(new FetchAssetsCallback() { + @Override + public void onCompletion(ResponseType responseType, List assets, Error error) { + totalAssetsFetched[0] += assets.size(); + Assertions.assertNotNull(assets, "Assets list should not be null"); + Assertions.assertTrue(assets.size() <= limit, "Assets fetched should not exceed the limit"); + Assertions.assertEquals(7, totalAssetsFetched[0]); + } + }); + } + } + } From 4da4809dd5775e166b56e063ee39ce8a78d8e1fe Mon Sep 17 00:00:00 2001 From: reeshika-h Date: Tue, 25 Feb 2025 11:16:24 +0530 Subject: [PATCH 3/6] extra brackets removed --- src/main/java/com/contentstack/sdk/AssetsModel.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/contentstack/sdk/AssetsModel.java b/src/main/java/com/contentstack/sdk/AssetsModel.java index 257d1819..13030019 100644 --- a/src/main/java/com/contentstack/sdk/AssetsModel.java +++ b/src/main/java/com/contentstack/sdk/AssetsModel.java @@ -30,7 +30,7 @@ public AssetsModel(JSONObject response) { JSONObject modelObj = (JSONObject) model; AssetModel newModel = new AssetModel(modelObj, true); objects.add(newModel); - } - }); + }); + } } } From f8149b795f47bc5eedcf91f28642845d728585c7 Mon Sep 17 00:00:00 2001 From: reeshika-h Date: Tue, 25 Feb 2025 11:34:58 +0530 Subject: [PATCH 4/6] testcases corrected --- src/test/java/com/contentstack/sdk/TestAsset.java | 8 ++++---- .../com/contentstack/sdk/TestAssetLibrary.java | 15 +++++++-------- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/src/test/java/com/contentstack/sdk/TestAsset.java b/src/test/java/com/contentstack/sdk/TestAsset.java index e2d7a5bc..dd2ad67a 100644 --- a/src/test/java/com/contentstack/sdk/TestAsset.java +++ b/src/test/java/com/contentstack/sdk/TestAsset.java @@ -38,10 +38,10 @@ public void onCompletion(ResponseType responseType, List assets, Error er Asset model = assets.get(0); assetUid = model.getAssetUid(); Assertions.assertTrue(model.getAssetUid().startsWith("blt")); - Assertions.assertEquals("image/jpeg", model.getFileType()); - Assertions.assertEquals("12668", model.getFileSize()); - Assertions.assertEquals("Jane_Austen_Headshot.jpg", model.getFileName()); - Assertions.assertTrue(model.getUrl().endsWith("Jane_Austen_Headshot.jpg")); + Assertions.assertEquals("image/png", model.getFileType()); + Assertions.assertEquals("13006", model.getFileSize()); + Assertions.assertEquals("iot-icon.png", model.getFileName()); + Assertions.assertTrue(model.getUrl().endsWith("iot-icon.png")); Assertions.assertTrue(model.toJSON().has("created_at")); Assertions.assertTrue(model.getCreatedBy().startsWith("blt")); Assertions.assertEquals("gregory", model.getUpdateAt().getCalendarType()); diff --git a/src/test/java/com/contentstack/sdk/TestAssetLibrary.java b/src/test/java/com/contentstack/sdk/TestAssetLibrary.java index fcd35644..4b99877b 100644 --- a/src/test/java/com/contentstack/sdk/TestAssetLibrary.java +++ b/src/test/java/com/contentstack/sdk/TestAssetLibrary.java @@ -6,7 +6,6 @@ import java.util.List; import java.util.logging.Logger; -import static org.junit.jupiter.api.Assertions.assertEquals; @TestInstance(TestInstance.Lifecycle.PER_CLASS) @TestMethodOrder(MethodOrderer.OrderAnnotation.class) @@ -24,15 +23,15 @@ void testNewAssetLibrary() { public void onCompletion(ResponseType responseType, List assets, Error error) { Asset model = assets.get(0); Assertions.assertTrue(model.getAssetUid().startsWith("blt")); - assertEquals("image/jpeg", model.getFileType()); - assertEquals("12668", model.getFileSize()); - assertEquals("Jane_Austen_Headshot.jpg", model.getFileName()); - Assertions.assertTrue(model.getUrl().endsWith("Jane_Austen_Headshot.jpg")); + Assertions.assertEquals("image/png", model.getFileType()); + Assertions.assertEquals("13006", model.getFileSize()); + Assertions.assertEquals("iot-icon.png", model.getFileName()); + Assertions.assertTrue(model.getUrl().endsWith("iot-icon.png")); Assertions.assertTrue(model.toJSON().has("created_at")); Assertions.assertTrue(model.getCreatedBy().startsWith("blt")); - assertEquals("gregory", model.getUpdateAt().getCalendarType()); + Assertions.assertEquals("gregory", model.getUpdateAt().getCalendarType()); Assertions.assertTrue(model.getUpdatedBy().startsWith("blt")); - assertEquals("", model.getDeletedBy()); + Assertions.assertEquals("", model.getDeletedBy()); logger.info("passed..."); } }); @@ -157,7 +156,7 @@ public void onCompletion(ResponseType responseType, List assets, Error er totalAssetsFetched[0] += assets.size(); Assertions.assertNotNull(assets, "Assets list should not be null"); Assertions.assertTrue(assets.size() <= limit, "Assets fetched should not exceed the limit"); - Assertions.assertEquals(7, totalAssetsFetched[0]); + Assertions.assertEquals(6, totalAssetsFetched[0]); } }); } From 769d430b878db17801f4c3a6c419ac9ae062495d Mon Sep 17 00:00:00 2001 From: reeshika-h Date: Tue, 25 Feb 2025 11:41:22 +0530 Subject: [PATCH 5/6] Added changelog updates --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4a53e182..bfd281ea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # CHANGELOG +## v2.0.3 + +### Date: 3-March-2025 + +- Added skip limit methods for Assets +- Resolved a bug + ## v2.0.2 ### Date: 5-December-2024 From 4361709eebc7ee1221ce79ed1a5384396136c7ce Mon Sep 17 00:00:00 2001 From: reeshika-h Date: Tue, 25 Feb 2025 16:44:59 +0530 Subject: [PATCH 6/6] Added the description for a method --- .../com/contentstack/sdk/AssetLibrary.java | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/contentstack/sdk/AssetLibrary.java b/src/main/java/com/contentstack/sdk/AssetLibrary.java index 16070b33..07512661 100644 --- a/src/main/java/com/contentstack/sdk/AssetLibrary.java +++ b/src/main/java/com/contentstack/sdk/AssetLibrary.java @@ -154,7 +154,23 @@ public AssetLibrary addParam(@NotNull String paramKey, @NotNull Object paramValu urlQueries.put(paramKey, paramValue); return this; } - + + /** + * Remove param key assetlibrary. + * + * @param paramKey the param key + * @return the assetlibrary + * + *
+ *
+ * Example :
+ * + *
+     *         Stack stack = Contentstack.stack("apiKey", "deliveryToken", "environment");
+     *         AssetLibrary assetLibObject = stack.assetlibrary();
+     *         assetLibObject.removeParam(paramKey);
+     *         
+ */ public AssetLibrary removeParam(@NotNull String paramKey){ if(urlQueries.has(paramKey)){ urlQueries.remove(paramKey);