This is an automated email from the ASF dual-hosted git repository.

orpiske pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 3ddc73a8b49baf3e0fd8cd0274e0aa307c10b481
Author: Otavio Rodolfo Piske <[email protected]>
AuthorDate: Fri Aug 8 14:26:14 2025 +0200

    CAMEL-22326: Configuration API cleanup
---
 .../langchain4j/agent/api/AgentConfiguration.java  |  53 +++++++++-
 .../agent/api/AgentConfigurationTest.java          | 112 ++++++++++++++++++++-
 2 files changed, 163 insertions(+), 2 deletions(-)

diff --git 
a/components/camel-ai/camel-langchain4j-agent-api/src/main/java/org/apache/camel/component/langchain4j/agent/api/AgentConfiguration.java
 
b/components/camel-ai/camel-langchain4j-agent-api/src/main/java/org/apache/camel/component/langchain4j/agent/api/AgentConfiguration.java
index 83dcc70c384..fcdeaf0f8f8 100644
--- 
a/components/camel-ai/camel-langchain4j-agent-api/src/main/java/org/apache/camel/component/langchain4j/agent/api/AgentConfiguration.java
+++ 
b/components/camel-ai/camel-langchain4j-agent-api/src/main/java/org/apache/camel/component/langchain4j/agent/api/AgentConfiguration.java
@@ -138,6 +138,17 @@ public class AgentConfiguration {
         return 
withInputGuardrailClasses(parseGuardrailClasses(inputGuardrailClasses));
     }
 
+    /**
+     * Sets input guardrail classes from an array of class names.
+     *
+     * @param  inputGuardrailClasses array of fully qualified class names
+     * @return                       this configuration instance for method 
chaining
+     * @see                          #parseGuardrailClasses(String[])
+     */
+    public AgentConfiguration withInputGuardrailClassesArray(String[] 
inputGuardrailClasses) {
+        return 
withInputGuardrailClasses(parseGuardrailClasses(inputGuardrailClasses));
+    }
+
     /**
      * Sets input guardrail classes for security filtering of incoming 
messages.
      *
@@ -169,6 +180,17 @@ public class AgentConfiguration {
         return 
withOutputGuardrailClasses(parseGuardrailClasses(outputGuardrailClasses));
     }
 
+    /**
+     * Sets output guardrail classes from an array of class names.
+     *
+     * @param  outputGuardrailClasses array of fully qualified class names
+     * @return                        this configuration instance for method 
chaining
+     * @see                           #parseGuardrailClasses(String[])
+     */
+    public AgentConfiguration withOutputGuardrailClassesArray(String[] 
outputGuardrailClasses) {
+        return 
withOutputGuardrailClasses(parseGuardrailClasses(outputGuardrailClasses));
+    }
+
     /**
      * Sets output guardrail classes for security filtering of agent responses.
      *
@@ -206,7 +228,36 @@ public class AgentConfiguration {
             return Collections.emptyList();
         }
 
-        return Arrays.stream(guardrailClassNames.split(","))
+        return parseGuardrailClasses(guardrailClassNames.split(","));
+    }
+
+    /**
+     * Parses an array of guardrail class names into a list of loaded classes.
+     *
+     * <p>
+     * This utility method takes an array of fully qualified class names and 
attempts to load each class using
+     * reflection. Classes that cannot be loaded are logged as warnings and 
excluded from the result.
+     * </p>
+     *
+     * <p>
+     * Example usage:
+     * </p>
+     *
+     * <pre>{@code
+     * String[] classNames = { "java.lang.String", "java.util.List" };
+     * List<Class<?>> classes = 
AgentConfiguration.parseGuardrailClasses(classNames);
+     * }</pre>
+     *
+     * @param  guardrailClassNames array of fully qualified class names, may 
be {@code null}
+     * @return                     a list of successfully loaded classes; 
empty list if input is {@code null} or if no
+     *                             classes could be loaded
+     */
+    public static List<Class<?>> parseGuardrailClasses(String[] 
guardrailClassNames) {
+        if (guardrailClassNames == null) {
+            return Collections.emptyList();
+        }
+
+        return Arrays.stream(guardrailClassNames)
                 .map(String::trim)
                 .filter(name -> !name.isEmpty())
                 .map(AgentConfiguration::loadGuardrailClass)
diff --git 
a/components/camel-ai/camel-langchain4j-agent-api/src/test/java/org/apache/camel/component/langchain4j/agent/api/AgentConfigurationTest.java
 
b/components/camel-ai/camel-langchain4j-agent-api/src/test/java/org/apache/camel/component/langchain4j/agent/api/AgentConfigurationTest.java
index 86264dae307..f1eec10a3be 100644
--- 
a/components/camel-ai/camel-langchain4j-agent-api/src/test/java/org/apache/camel/component/langchain4j/agent/api/AgentConfigurationTest.java
+++ 
b/components/camel-ai/camel-langchain4j-agent-api/src/test/java/org/apache/camel/component/langchain4j/agent/api/AgentConfigurationTest.java
@@ -66,7 +66,7 @@ public class AgentConfigurationTest {
 
     @Test
     public void testParseGuardrailClasses_WithNullInput() {
-        List<Class<?>> result = AgentConfiguration.parseGuardrailClasses(null);
+        List<Class<?>> result = 
AgentConfiguration.parseGuardrailClasses((String) null);
 
         assertNotNull(result);
         assertTrue(result.isEmpty());
@@ -138,4 +138,114 @@ public class AgentConfigurationTest {
         assertTrue(result.contains(String.class));
         assertTrue(result.contains(List.class));
     }
+
+    // Tests for array-based parseGuardrailClasses method
+
+    @Test
+    public void testParseGuardrailClasses_WithValidClassesArray() {
+        String[] classNames = { "java.lang.String", "java.util.List", 
"java.io.Serializable" };
+
+        List<Class<?>> result = 
AgentConfiguration.parseGuardrailClasses(classNames);
+
+        assertNotNull(result);
+        assertEquals(3, result.size());
+        assertTrue(result.contains(String.class));
+        assertTrue(result.contains(List.class));
+        assertTrue(result.contains(java.io.Serializable.class));
+    }
+
+    @Test
+    public void 
testParseGuardrailClasses_WithMixedValidAndInvalidClassesArray() {
+        String[] classNames = { "java.lang.String", 
"com.nonexistent.InvalidClass", "java.util.List" };
+
+        List<Class<?>> result = 
AgentConfiguration.parseGuardrailClasses(classNames);
+
+        assertNotNull(result);
+        assertEquals(2, result.size());
+        assertTrue(result.contains(String.class));
+        assertTrue(result.contains(List.class));
+    }
+
+    @Test
+    public void testParseGuardrailClasses_WithNullArray() {
+        String[] classNames = null;
+
+        List<Class<?>> result = 
AgentConfiguration.parseGuardrailClasses(classNames);
+
+        assertNotNull(result);
+        assertTrue(result.isEmpty());
+    }
+
+    @Test
+    public void testParseGuardrailClasses_WithEmptyArray() {
+        String[] classNames = {};
+
+        List<Class<?>> result = 
AgentConfiguration.parseGuardrailClasses(classNames);
+
+        assertNotNull(result);
+        assertTrue(result.isEmpty());
+    }
+
+    @Test
+    public void testParseGuardrailClasses_WithArrayContainingEmptyStrings() {
+        String[] classNames = { "java.lang.String", "", "java.util.List", "   
", "java.io.Serializable" };
+
+        List<Class<?>> result = 
AgentConfiguration.parseGuardrailClasses(classNames);
+
+        assertNotNull(result);
+        assertEquals(3, result.size());
+        assertTrue(result.contains(String.class));
+        assertTrue(result.contains(List.class));
+        assertTrue(result.contains(java.io.Serializable.class));
+    }
+
+    // Tests for fluent methods with arrays
+
+    @Test
+    public void testWithInputGuardrailClassesArray() {
+        String[] classNames = { "java.lang.String", "java.util.List" };
+
+        AgentConfiguration config = new AgentConfiguration()
+                .withInputGuardrailClassesArray(classNames);
+
+        assertNotNull(config.getInputGuardrailClasses());
+        assertEquals(2, config.getInputGuardrailClasses().size());
+        assertTrue(config.getInputGuardrailClasses().contains(String.class));
+        assertTrue(config.getInputGuardrailClasses().contains(List.class));
+    }
+
+    @Test
+    public void testWithOutputGuardrailClassesArray() {
+        String[] classNames = { "java.lang.String", "java.util.List" };
+
+        AgentConfiguration config = new AgentConfiguration()
+                .withOutputGuardrailClassesArray(classNames);
+
+        assertNotNull(config.getOutputGuardrailClasses());
+        assertEquals(2, config.getOutputGuardrailClasses().size());
+        assertTrue(config.getOutputGuardrailClasses().contains(String.class));
+        assertTrue(config.getOutputGuardrailClasses().contains(List.class));
+    }
+
+    @Test
+    public void testWithInputGuardrailClassesArray_WithNullArray() {
+        String[] classNames = null;
+
+        AgentConfiguration config = new AgentConfiguration()
+                .withInputGuardrailClassesArray(classNames);
+
+        assertNotNull(config.getInputGuardrailClasses());
+        assertTrue(config.getInputGuardrailClasses().isEmpty());
+    }
+
+    @Test
+    public void testWithOutputGuardrailClassesArray_WithInvalidClasses() {
+        String[] classNames = { "com.nonexistent.InvalidClass1", 
"com.nonexistent.InvalidClass2" };
+
+        AgentConfiguration config = new AgentConfiguration()
+                .withOutputGuardrailClassesArray(classNames);
+
+        assertNotNull(config.getOutputGuardrailClasses());
+        assertTrue(config.getOutputGuardrailClasses().isEmpty());
+    }
 }

Reply via email to