From c5032b26810d17410d3ebe9365562027f2a48be3 Mon Sep 17 00:00:00 2001 From: petruki <31597636+petruki@users.noreply.github.com> Date: Sat, 9 Aug 2025 14:03:19 -0700 Subject: [PATCH] fix: exclude API to handle primitive collection or arrays --- .../io/github/trackerforce/PathExclude.java | 15 +++++- .../trackerforce/fixture/clazz/Address.java | 32 +++++++++++++ .../fixture/clazz/Occupation.java | 22 +++++++++ .../trackerforce/fixture/clazz/Order.java | 16 +++++++ .../trackerforce/fixture/clazz/Product.java | 30 ++++++++++++ .../fixture/clazz/UserDetail.java | 47 +++++-------------- .../trackerforce/fixture/record/Address.java | 33 ++++++++++++- .../fixture/record/Occupation.java | 21 +++++++++ .../trackerforce/fixture/record/Order.java | 15 ++++++ .../trackerforce/fixture/record/Product.java | 29 ++++++++++++ .../fixture/record/UserDetail.java | 44 +++++------------ 11 files changed, 235 insertions(+), 69 deletions(-) diff --git a/src/main/java/io/github/trackerforce/PathExclude.java b/src/main/java/io/github/trackerforce/PathExclude.java index acdfe5c..f8c3c01 100644 --- a/src/main/java/io/github/trackerforce/PathExclude.java +++ b/src/main/java/io/github/trackerforce/PathExclude.java @@ -109,6 +109,10 @@ private Object handleCollectionOrArray(Object value, String path, ExclusionNode boolean isArray = value.getClass().isArray(); if (isArray) { + if (isPrimitiveArray(value)) { + return value; + } + array = (Object[]) value; list = Arrays.asList((Object[]) value); } else { @@ -120,6 +124,10 @@ private Object handleCollectionOrArray(Object value, String path, ExclusionNode return isArray ? array : list; } + return addElementsToList(path, node, list); + } + + private List addElementsToList(String path, ExclusionNode node, List list) { List items = new ArrayList<>(); for (Object element : list) { if (isSimpleValue(element)) { @@ -130,7 +138,6 @@ private Object handleCollectionOrArray(Object value, String path, ExclusionNode items.add(elementMap); } } - return items; } @@ -140,6 +147,12 @@ private boolean isSimpleValue(Object value) { value.getClass().isPrimitive(); } + private boolean isPrimitiveArray(Object value) { + return value instanceof boolean[] || value instanceof byte[] || value instanceof char[] || + value instanceof short[] || value instanceof int[] || value instanceof long[] || + value instanceof float[] || value instanceof double[]; + } + private List getPropertyNames(Class clazz) { List names = new ArrayList<>(); if (clazz.isRecord()) { diff --git a/src/test/java/io/github/trackerforce/fixture/clazz/Address.java b/src/test/java/io/github/trackerforce/fixture/clazz/Address.java index 71763e1..94ab60d 100644 --- a/src/test/java/io/github/trackerforce/fixture/clazz/Address.java +++ b/src/test/java/io/github/trackerforce/fixture/clazz/Address.java @@ -14,4 +14,36 @@ public class Address { String state; String zipCode; String country; + int[] coordinates; + + public static Address of123() { + return new Address( + "123 Main St", + "Springfield", + "IL", + "62701", + "USA", + new int[]{40, 90} + ); + } + + public static Address of456() { + return new Address( + "456 Elm St", + "Springfield", + "IL", + "62701", + "USA", + new int[]{39, 89}); + } + + public static Address of789() { + return new Address( + "789 Oak St", + "Springfield", + "IL", + "62701", + "USA", + new int[]{39, 89}); + } } diff --git a/src/test/java/io/github/trackerforce/fixture/clazz/Occupation.java b/src/test/java/io/github/trackerforce/fixture/clazz/Occupation.java index f8f6e8f..46e9052 100644 --- a/src/test/java/io/github/trackerforce/fixture/clazz/Occupation.java +++ b/src/test/java/io/github/trackerforce/fixture/clazz/Occupation.java @@ -15,4 +15,26 @@ public class Occupation { String department; int yearsOfExperience; Address address; + + public static Occupation ofSoftwareEngineer() { + return new Occupation( + "Software Engineer", + "Develops software applications", + 90000.00, + "Engineering", + 5, + new Address("123 Tech St", "Tech City", "CA", "90001", "USA", new int[]{37, 122}) + ); + } + + public static Occupation ofProjectManager() { + return new Occupation( + "Project Manager", + "Manages software projects", + 95000.00, + "Management", + 7, + new Address("456 Project Ave", "Project City", "CA", "90002", "USA", new int[]{34, 118}) + ); + } } diff --git a/src/test/java/io/github/trackerforce/fixture/clazz/Order.java b/src/test/java/io/github/trackerforce/fixture/clazz/Order.java index 76b40d6..7e2d17c 100644 --- a/src/test/java/io/github/trackerforce/fixture/clazz/Order.java +++ b/src/test/java/io/github/trackerforce/fixture/clazz/Order.java @@ -14,4 +14,20 @@ public class Order { List products; Date orderDate; String orderId; + + public static Order ofOrder123() { + return new Order( + List.of(Product.ofLaptop(), Product.ofSmartphone()), + new Date(), + "order123" + ); + } + + public static Order ofOrder456() { + return new Order( + List.of(Product.ofHeadphones()), + new Date(), + "order456" + ); + } } diff --git a/src/test/java/io/github/trackerforce/fixture/clazz/Product.java b/src/test/java/io/github/trackerforce/fixture/clazz/Product.java index baa6040..169cb81 100644 --- a/src/test/java/io/github/trackerforce/fixture/clazz/Product.java +++ b/src/test/java/io/github/trackerforce/fixture/clazz/Product.java @@ -15,4 +15,34 @@ public class Product { double price; String category; int stockQuantity; + + public static Product ofLaptop() { + return new Product( + "1", + "Laptop", + "High-end gaming laptop", + 1500.00, + "Electronics", + 5); + } + + public static Product ofSmartphone() { + return new Product( + "2", + "Smartphone", + "Latest model smartphone", + 800.00, + "Electronics", + 10); + } + + public static Product ofHeadphones() { + return new Product( + "3", + "Headphones", + "Noise-cancelling headphones", + 200.00, + "Accessories", + 15); + } } diff --git a/src/test/java/io/github/trackerforce/fixture/clazz/UserDetail.java b/src/test/java/io/github/trackerforce/fixture/clazz/UserDetail.java index 2b46270..f8e7bb6 100644 --- a/src/test/java/io/github/trackerforce/fixture/clazz/UserDetail.java +++ b/src/test/java/io/github/trackerforce/fixture/clazz/UserDetail.java @@ -1,13 +1,13 @@ package io.github.trackerforce.fixture.clazz; -import java.util.Date; -import java.util.List; -import java.util.Map; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Data; import lombok.experimental.FieldDefaults; +import java.util.List; +import java.util.Map; + @Data @AllArgsConstructor @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) @@ -22,6 +22,7 @@ public class UserDetail { Occupation[] occupations; Map additionalInfo; Map locations; + int[] scoresArray; public static UserDetail of() { return new UserDetail( @@ -29,38 +30,15 @@ public static UserDetail of() { "jown@email.com", "John Doe", "+1234567890", - new Address( - "123 Main St", - "Springfield", - "IL", - "62701", - "USA" - ), + Address.of123(), List.of( - new Order( - List.of( - new Product("1", "Laptop", "High-end gaming laptop", 1500.00, "Electronics", 5), - new Product("2", "Smartphone", "Latest model smartphone", 800.00, "Electronics", 10) - ), - new Date(), - "order123" - ), - new Order( - List.of( - new Product("3", "Headphones", "Noise-cancelling headphones", 200.00, "Accessories", 15) - ), - new Date(), - "order456" - ) + Order.ofOrder123(), + Order.ofOrder456() ), new String[] {"USER", "ADMIN"}, new Occupation[] { - new Occupation("Software Engineer", "Develops software applications", 90000.00, "Engineering", 5, - new Address("123 Tech St", "Tech City", "CA", "90001", "USA") - ), - new Occupation("Project Manager", "Manages software projects", 95000.00, "Management", 7, - new Address("456 Project Ave", "Project City", "CA", "90002", "USA") - ) + Occupation.ofSoftwareEngineer(), + Occupation.ofProjectManager() }, Map.of( "preferredLanguage", "English", @@ -68,9 +46,10 @@ public static UserDetail of() { "lastLogin", "2023-10-01T12:00:00Z" ), Map.of( - "home", new Address("456 Elm St", "Springfield", "IL", "62701", "USA"), - "work", new Address("789 Oak St", "Springfield", "IL", "62701", "USA") - ) + "home", Address.of456(), + "work", Address.of789() + ), + new int[] {85, 90, 95} ); } } diff --git a/src/test/java/io/github/trackerforce/fixture/record/Address.java b/src/test/java/io/github/trackerforce/fixture/record/Address.java index 272d80a..ae46b23 100644 --- a/src/test/java/io/github/trackerforce/fixture/record/Address.java +++ b/src/test/java/io/github/trackerforce/fixture/record/Address.java @@ -5,6 +5,37 @@ public record Address( String city, String state, String zipCode, - String country + String country, + int[] coordinates ) { + public static Address of123() { + return new Address( + "123 Main St", + "Springfield", + "IL", + "62701", + "USA", + new int[]{40, 90} + ); + } + + public static Address of456() { + return new Address( + "456 Elm St", + "Springfield", + "IL", + "62701", + "USA", + new int[]{39, 89}); + } + + public static Address of789() { + return new Address( + "789 Oak St", + "Springfield", + "IL", + "62701", + "USA", + new int[]{39, 89}); + } } diff --git a/src/test/java/io/github/trackerforce/fixture/record/Occupation.java b/src/test/java/io/github/trackerforce/fixture/record/Occupation.java index 9e94b8d..b10673f 100644 --- a/src/test/java/io/github/trackerforce/fixture/record/Occupation.java +++ b/src/test/java/io/github/trackerforce/fixture/record/Occupation.java @@ -8,4 +8,25 @@ public record Occupation( int yearsOfExperience, Address address ) { + public static Occupation ofSoftwareEngineer() { + return new Occupation( + "Software Engineer", + "Develops software applications", + 90000.00, + "Engineering", + 5, + new Address("123 Tech St", "Tech City", "CA", "90001", "USA", new int[]{37, 122}) + ); + } + + public static Occupation ofProjectManager() { + return new Occupation( + "Project Manager", + "Manages software projects", + 95000.00, + "Management", + 7, + new Address("456 Project Ave", "Project City", "CA", "90002", "USA", new int[]{34, 118}) + ); + } } diff --git a/src/test/java/io/github/trackerforce/fixture/record/Order.java b/src/test/java/io/github/trackerforce/fixture/record/Order.java index 72bcfa5..55dc523 100644 --- a/src/test/java/io/github/trackerforce/fixture/record/Order.java +++ b/src/test/java/io/github/trackerforce/fixture/record/Order.java @@ -8,4 +8,19 @@ public record Order( Date orderDate, String orderId ) { + public static Order ofOrder123() { + return new Order( + List.of(Product.ofLaptop(), Product.ofSmartphone()), + new Date(), + "order123" + ); + } + + public static Order ofOrder456() { + return new Order( + List.of(Product.ofHeadphones()), + new Date(), + "order456" + ); + } } diff --git a/src/test/java/io/github/trackerforce/fixture/record/Product.java b/src/test/java/io/github/trackerforce/fixture/record/Product.java index 1eaddcc..62c0559 100644 --- a/src/test/java/io/github/trackerforce/fixture/record/Product.java +++ b/src/test/java/io/github/trackerforce/fixture/record/Product.java @@ -8,4 +8,33 @@ public record Product( String category, int stockQuantity ) { + public static Product ofLaptop() { + return new Product( + "1", + "Laptop", + "High-end gaming laptop", + 1500.00, + "Electronics", + 5); + } + + public static Product ofSmartphone() { + return new Product( + "2", + "Smartphone", + "Latest model smartphone", + 800.00, + "Electronics", + 10); + } + + public static Product ofHeadphones() { + return new Product( + "3", + "Headphones", + "Noise-cancelling headphones", + 200.00, + "Accessories", + 15); + } } diff --git a/src/test/java/io/github/trackerforce/fixture/record/UserDetail.java b/src/test/java/io/github/trackerforce/fixture/record/UserDetail.java index a2a7f8b..f5ec9be 100644 --- a/src/test/java/io/github/trackerforce/fixture/record/UserDetail.java +++ b/src/test/java/io/github/trackerforce/fixture/record/UserDetail.java @@ -1,6 +1,5 @@ package io.github.trackerforce.fixture.record; -import java.util.Date; import java.util.List; import java.util.Map; @@ -14,7 +13,8 @@ public record UserDetail( String[] roles, Occupation[] occupations, Map additionalInfo, - Map locations + Map locations, + int[] scoresArray ) { public static UserDetail of() { return new UserDetail( @@ -22,38 +22,15 @@ public static UserDetail of() { "jown@email.com", "John Doe", "+1234567890", - new Address( - "123 Main St", - "Springfield", - "IL", - "62701", - "USA" - ), + Address.of123(), List.of( - new Order( - List.of( - new Product("1", "Laptop", "High-end gaming laptop", 1500.00, "Electronics", 5), - new Product("2", "Smartphone", "Latest model smartphone", 800.00, "Electronics", 10) - ), - new Date(), - "order123" - ), - new Order( - List.of( - new Product("3", "Headphones", "Noise-cancelling headphones", 200.00, "Accessories", 15) - ), - new Date(), - "order456" - ) + Order.ofOrder123(), + Order.ofOrder456() ), new String[] {"USER", "ADMIN"}, new Occupation[] { - new Occupation("Software Engineer", "Develops software applications", 90000.00, "Engineering", 5, - new Address("123 Tech St", "Tech City", "CA", "90001", "USA") - ), - new Occupation("Project Manager", "Manages software projects", 95000.00, "Management", 7, - new Address("456 Project Ave", "Project City", "CA", "90002", "USA") - ) + Occupation.ofSoftwareEngineer(), + Occupation.ofProjectManager() }, Map.of( "preferredLanguage", "English", @@ -61,9 +38,10 @@ public static UserDetail of() { "lastLogin", "2023-10-01T12:00:00Z" ), Map.of( - "home", new Address("456 Elm St", "Springfield", "IL", "62701", "USA"), - "work", new Address("789 Oak St", "Springfield", "IL", "62701", "USA") - ) + "home", Address.of456(), + "work", Address.of789() + ), + new int[] {85, 90, 95} ); } }