This is an automated email from the ASF dual-hosted git repository. luigidemasi pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/camel.git
commit 1ea100c9dc7aa4564f359ddd9d4fd23019aa3433 Author: Luigi De Masi <[email protected]> AuthorDate: Wed Sep 30 19:42:45 2026 +0200 CAMEL-25178: Preserve case lookup and guard diagnostic labels Remove the redundant case alias from Switch while retaining the catalog part mapping that supplies the complete Switch sample for a case. Keep case labels available when an endpoint builder fails to produce its URI, without caching values that can become stale after builder mutation. Cover exact catalog lookup, diagnostic failure and recovery, and masking. Co-authored-by: Codex <[email protected]> Signed-off-by: Luigi De Masi <[email protected]> --- .../org/apache/camel/catalog/models/switch.json | 2 +- .../camel/catalog/schemas/camelYamlDsl-model.json | 2 +- .../META-INF/org/apache/camel/model/switch.json | 2 +- .../apache/camel/model/SwitchCaseDefinition.java | 8 ++++- .../org/apache/camel/model/SwitchDefinition.java | 2 +- .../builder/endpoint/SwitchEndpointDslTest.java | 40 ++++++++++++++++++++++ .../jbang/core/commands/ai/CatalogSamplesTest.java | 2 ++ .../resources/schema/camelYamlDsl-model.json | 2 +- 8 files changed, 54 insertions(+), 6 deletions(-) diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/switch.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/switch.json index 4befb27147a7..b0a91281d33d 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/switch.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/switch.json @@ -8,7 +8,7 @@ "firstVersion": "4.23.0", "label": "eip,routing", "javaType": "org.apache.camel.model.SwitchDefinition", - "aliases": [ "decision-table", "dispatch-table", "lookup-table", "case" ], + "aliases": [ "decision-table", "dispatch-table", "lookup-table" ], "abstract": false, "input": true, "output": false diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/schemas/camelYamlDsl-model.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/schemas/camelYamlDsl-model.json index eacf7a4d52cd..5962bfc01ece 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/schemas/camelYamlDsl-model.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/schemas/camelYamlDsl-model.json @@ -8369,7 +8369,7 @@ "title" : "Switch", "description" : "Evaluates a selector once and dispatches to a fixed endpoint by literal scalar values", "label" : "eip,routing", - "aliases" : [ "decision-table", "dispatch-table", "lookup-table", "case" ], + "aliases" : [ "decision-table", "dispatch-table", "lookup-table" ], "input" : true, "isListItem" : true, "children" : [ { diff --git a/core/camel-core-model/src/generated/resources/META-INF/org/apache/camel/model/switch.json b/core/camel-core-model/src/generated/resources/META-INF/org/apache/camel/model/switch.json index 4befb27147a7..b0a91281d33d 100644 --- a/core/camel-core-model/src/generated/resources/META-INF/org/apache/camel/model/switch.json +++ b/core/camel-core-model/src/generated/resources/META-INF/org/apache/camel/model/switch.json @@ -8,7 +8,7 @@ "firstVersion": "4.23.0", "label": "eip,routing", "javaType": "org.apache.camel.model.SwitchDefinition", - "aliases": [ "decision-table", "dispatch-table", "lookup-table", "case" ], + "aliases": [ "decision-table", "dispatch-table", "lookup-table" ], "abstract": false, "input": true, "output": false diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/SwitchCaseDefinition.java b/core/camel-core-model/src/main/java/org/apache/camel/model/SwitchCaseDefinition.java index 99de82bbc378..46786eae7989 100644 --- a/core/camel-core-model/src/main/java/org/apache/camel/model/SwitchCaseDefinition.java +++ b/core/camel-core-model/src/main/java/org/apache/camel/model/SwitchCaseDefinition.java @@ -141,7 +141,13 @@ public class SwitchCaseDefinition extends OptionalIdentifiedDefinition<SwitchCas @Override public String getLabel() { - return "case[" + value + " -> " + URISupport.sanitizeUri(getEndpointUri()) + "]"; + String endpointUri = null; + try { + endpointUri = getEndpointUri(); + } catch (RuntimeException e) { + // Keep diagnostic output available when the endpoint URI cannot be built. + } + return "case[" + value + " -> " + URISupport.sanitizeUri(endpointUri) + "]"; } @Override diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/SwitchDefinition.java b/core/camel-core-model/src/main/java/org/apache/camel/model/SwitchDefinition.java index 65eff9dd77d5..0e79be39ae5c 100644 --- a/core/camel-core-model/src/main/java/org/apache/camel/model/SwitchDefinition.java +++ b/core/camel-core-model/src/main/java/org/apache/camel/model/SwitchDefinition.java @@ -36,7 +36,7 @@ import org.apache.camel.spi.Metadata; /** Routes a message to one fixed endpoint using a literal lookup table. */ @Metadata(firstVersion = "4.23.0", label = "eip,routing", - aliases = { "decision-table", "dispatch-table", "lookup-table", "case" }, + aliases = { "decision-table", "dispatch-table", "lookup-table" }, description = "Evaluates a selector once and dispatches to a fixed endpoint by literal scalar values") @XmlRootElement(name = "switch") @XmlAccessorType(XmlAccessType.FIELD) diff --git a/dsl/camel-endpointdsl/src/test/java/org/apache/camel/builder/endpoint/SwitchEndpointDslTest.java b/dsl/camel-endpointdsl/src/test/java/org/apache/camel/builder/endpoint/SwitchEndpointDslTest.java index 057ec3e308cd..c030df31ebb5 100644 --- a/dsl/camel-endpointdsl/src/test/java/org/apache/camel/builder/endpoint/SwitchEndpointDslTest.java +++ b/dsl/camel-endpointdsl/src/test/java/org/apache/camel/builder/endpoint/SwitchEndpointDslTest.java @@ -22,18 +22,22 @@ import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; import org.apache.camel.Exchange; +import org.apache.camel.builder.EndpointProducerBuilder; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.component.mock.MockEndpoint; import org.apache.camel.model.RouteDefinition; +import org.apache.camel.model.SwitchCaseDefinition; import org.apache.camel.model.SwitchDefinition; import org.apache.camel.xml.jaxb.JaxbHelper; import org.apache.camel.xml.jaxb.JaxbModelToXMLDumper; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotSame; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertSame; +import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; public class SwitchEndpointDslTest extends BaseEndpointDslTest { @@ -86,6 +90,42 @@ public class SwitchEndpointDslTest extends BaseEndpointDslTest { MockEndpoint.assertIsSatisfied(context); } + @Test + public void caseLabelToleratesBuilderFailureAndReflectsLaterChanges() { + class FailingEndpointBuilder extends AbstractEndpointBuilder implements EndpointProducerBuilder { + private boolean failing; + + FailingEndpointBuilder() { + super("direct", "billing"); + } + + @Override + public String getRawUri() { + if (failing) { + throw new IllegalStateException("Cannot build endpoint URI"); + } + return super.getRawUri(); + } + } + + FailingEndpointBuilder builder = new FailingEndpointBuilder(); + SwitchCaseDefinition c = new SwitchCaseDefinition(); + c.setValue("billing"); + c.setEndpointProducerBuilder(builder); + assertEquals("case[billing -> direct://billing]", c.getLabel()); + + builder.failing = true; + assertEquals("case[billing -> null]", c.getLabel()); + assertEquals(c.getLabel(), c.toString()); + assertThrows(IllegalStateException.class, c::getEndpointUri); + + builder.failing = false; + builder.doSetProperty("password", "secret"); + assertTrue(c.getLabel().startsWith("case[billing -> direct://billing?password=")); + assertFalse(c.getLabel().contains("secret")); + assertEquals(c.getLabel(), c.toString()); + } + @Override protected RouteBuilder createRouteBuilder() { return new EndpointRouteBuilder() { diff --git a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/ai/CatalogSamplesTest.java b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/ai/CatalogSamplesTest.java index 091b463f93d8..716eda767050 100644 --- a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/ai/CatalogSamplesTest.java +++ b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/ai/CatalogSamplesTest.java @@ -99,6 +99,8 @@ public class CatalogSamplesTest { assertThat(yaml(sample, 0)).contains("switch:", "uri: direct:billing", "uri: direct:technical", "uri: direct:review"); } + assertThat(catalog.eipModel("case").getName()).isEqualTo("case"); + assertThat(catalog.suggestEipNames("case", 0)).containsExactly("case"); for (String term : List.of("case", "switchOtherwise")) { assertThat(CatalogSamples.sample(catalog, term, 1).getString("partOf")).isEqualTo("switch"); } diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camelYamlDsl-model.json b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camelYamlDsl-model.json index eacf7a4d52cd..5962bfc01ece 100644 --- a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camelYamlDsl-model.json +++ b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camelYamlDsl-model.json @@ -8369,7 +8369,7 @@ "title" : "Switch", "description" : "Evaluates a selector once and dispatches to a fixed endpoint by literal scalar values", "label" : "eip,routing", - "aliases" : [ "decision-table", "dispatch-table", "lookup-table", "case" ], + "aliases" : [ "decision-table", "dispatch-table", "lookup-table" ], "input" : true, "isListItem" : true, "children" : [ {
