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()); + } }
