You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ji...@apache.org on 2026/07/13 12:28:23 UTC

(camel-upgrade-recipes) branch main updated (46f0e63 -> 12920d2)

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

JiriOndrusek pushed a change to branch main
in repository https://gitbox.apache.org/repos/asf/camel-upgrade-recipes.git


    from 46f0e63  Document Camel 4.18.3 LTS recipes in README and release notes
     new 62004c3  Fix suite test failures by dynamically expecting POM version upgrades
     new 12920d2  Move shared recipe implementations to patch packages and fix YAML references

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 RECIPE-CONVENTIONS.md                              |  85 +++++++++++++
 .../main/resources/META-INF/rewrite/examples.yml   |  28 +++++
 .../XmlDsl418_1SagaRecipe.java}                    |   4 +-
 .../YamlDsl418_1SagaRecipe.java}                   |   4 +-
 .../RenameHeaderInJavaMethod.java                  |   2 +-
 .../RenameHeaderInSimpleExpression.java            |   2 +-
 .../RenameHeaderInXmlDsl.java                      |   2 +-
 .../RenameHeaderInYamlDsl.java                     |   2 +-
 .../RenameHeaderPrefixInJavaMethod.java            |   2 +-
 .../RenameHeaderPrefixInSimpleExpression.java      |   2 +-
 .../RenameHeaderPrefixInXmlDsl.java                |   2 +-
 .../RenameHeaderPrefixInYamlDsl.java               |   2 +-
 .../RenameHeaderPrefixes.java                      |   4 +-
 .../{camel421 => camel418_3}/RenameHeaders.java    |   6 +-
 .../camel421/RemoveReifierStrategyImport.java      |  79 ------------
 .../RemoveZooWordEmbeddingPredictorImport.java     |  80 ------------
 .../main/resources/META-INF/rewrite/4.18.1.yaml    |   4 +-
 .../main/resources/META-INF/rewrite/4.18.3.yaml    |  24 ++--
 .../src/main/resources/META-INF/rewrite/4.18.yaml  |   8 +-
 .../src/main/resources/META-INF/rewrite/4.21.yaml  |  32 +++--
 .../main/resources/META-INF/rewrite/examples.yml   |  18 +--
 .../org/apache/camel/upgrade/CamelTestUtil.java    |  53 ++++++++
 .../apache/camel/upgrade/CamelUpdate418Test.java   |  17 ++-
 .../apache/camel/upgrade/CamelUpdate418_1Test.java |   8 +-
 .../apache/camel/upgrade/CamelUpdate418_3Test.java |  52 ++++----
 .../apache/camel/upgrade/CamelUpdate419Test.java   |   6 +-
 .../apache/camel/upgrade/CamelUpdate421Test.java   | 140 +++++++--------------
 .../RenameHeaderInJavaMethodTest.java              |   2 +-
 .../RenameHeaderInSimpleExpressionTest.java        |   2 +-
 .../RenameHeaderInXmlDslTest.java                  |   2 +-
 .../RenameHeaderInYamlDslTest.java                 |   2 +-
 .../RenameHeaderPrefixInJavaMethodTest.java        |   2 +-
 .../RenameHeaderPrefixInSimpleExpressionTest.java  |   2 +-
 .../RenameHeaderPrefixInXmlDslTest.java            |   2 +-
 .../RenameHeaderPrefixInYamlDslTest.java           |   2 +-
 .../RenameHeadersTest.java                         |   2 +-
 .../versions/CamelUpdate418LtsVersionTest.java     |   2 -
 .../versions/CamelUpdateLatestVersionTest.java     |   2 -
 pom.xml                                            |   2 +-
 release_notes.adoc                                 |   4 +-
 40 files changed, 319 insertions(+), 377 deletions(-)
 create mode 100644 RECIPE-CONVENTIONS.md
 rename camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/{camel419/XmlDsl419SagaRecipe.java => camel418_1/XmlDsl418_1SagaRecipe.java} (97%)
 rename camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/{camel419/YamlDsl419SagaRecipe.java => camel418_1/YamlDsl418_1SagaRecipe.java} (97%)
 rename camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/{camel421 => camel418_3}/RenameHeaderInJavaMethod.java (99%)
 rename camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/{camel421 => camel418_3}/RenameHeaderInSimpleExpression.java (99%)
 rename camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/{camel421 => camel418_3}/RenameHeaderInXmlDsl.java (98%)
 rename camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/{camel421 => camel418_3}/RenameHeaderInYamlDsl.java (99%)
 rename camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/{camel421 => camel418_3}/RenameHeaderPrefixInJavaMethod.java (99%)
 rename camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/{camel421 => camel418_3}/RenameHeaderPrefixInSimpleExpression.java (99%)
 rename camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/{camel421 => camel418_3}/RenameHeaderPrefixInXmlDsl.java (98%)
 rename camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/{camel421 => camel418_3}/RenameHeaderPrefixInYamlDsl.java (99%)
 rename camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/{camel421 => camel418_3}/RenameHeaderPrefixes.java (97%)
 rename camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/{camel421 => camel418_3}/RenameHeaders.java (96%)
 delete mode 100644 camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel421/RemoveReifierStrategyImport.java
 delete mode 100644 camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel421/RemoveZooWordEmbeddingPredictorImport.java
 rename camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/{camel421 => camel418_3}/RenameHeaderInJavaMethodTest.java (99%)
 rename camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/{camel421 => camel418_3}/RenameHeaderInSimpleExpressionTest.java (99%)
 rename camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/{camel421 => camel418_3}/RenameHeaderInXmlDslTest.java (99%)
 rename camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/{camel421 => camel418_3}/RenameHeaderInYamlDslTest.java (99%)
 rename camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/{camel421 => camel418_3}/RenameHeaderPrefixInJavaMethodTest.java (99%)
 rename camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/{camel421 => camel418_3}/RenameHeaderPrefixInSimpleExpressionTest.java (99%)
 rename camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/{camel421 => camel418_3}/RenameHeaderPrefixInXmlDslTest.java (99%)
 rename camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/{camel421 => camel418_3}/RenameHeaderPrefixInYamlDslTest.java (99%)
 rename camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/{camel421 => camel418_3}/RenameHeadersTest.java (98%)


(camel-upgrade-recipes) 01/02: Fix suite test failures by dynamically expecting POM version upgrades

Posted by ji...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

JiriOndrusek pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-upgrade-recipes.git

commit 62004c3e796cd43f9919206c1237adcb039747aa
Author: Jiri Ondrusek <on...@gmail.com>
AuthorDate: Wed Jul 8 10:33:51 2026 +0200

    Fix suite test failures by dynamically expecting POM version upgrades
    
    Tests running under CamelUpdateLatestTestSuite or CamelUpdate418LtsTestSuite
    failed because the suite recipe includes UpgradeDependencyVersion, which
    changes POM versions. Added pomXmlSpec() helpers to CamelTestUtil that
    detect the active suite recipe and adjust expected POM output accordingly.
    Also bumped rewrite-recipe-bom to 3.31.0 and re-enabled the version tests.
    
    Co-Authored-By: Claude Opus 4.6 <no...@anthropic.com>
---
 .../main/resources/META-INF/rewrite/examples.yml   |  28 ++++
 .../org/apache/camel/upgrade/CamelTestUtil.java    |  53 ++++++++
 .../apache/camel/upgrade/CamelUpdate418Test.java   |  17 ++-
 .../apache/camel/upgrade/CamelUpdate418_1Test.java |   8 +-
 .../apache/camel/upgrade/CamelUpdate418_3Test.java |  52 ++++----
 .../apache/camel/upgrade/CamelUpdate419Test.java   |   6 +-
 .../apache/camel/upgrade/CamelUpdate421Test.java   | 144 +++++++++++----------
 .../versions/CamelUpdate418LtsVersionTest.java     |   2 -
 .../versions/CamelUpdateLatestVersionTest.java     |   2 -
 pom.xml                                            |   2 +-
 10 files changed, 195 insertions(+), 119 deletions(-)

diff --git a/camel-spring-boot-upgrade-recipes/src/main/resources/META-INF/rewrite/examples.yml b/camel-spring-boot-upgrade-recipes/src/main/resources/META-INF/rewrite/examples.yml
index a68bad7..6698207 100644
--- a/camel-spring-boot-upgrade-recipes/src/main/resources/META-INF/rewrite/examples.yml
+++ b/camel-spring-boot-upgrade-recipes/src/main/resources/META-INF/rewrite/examples.yml
@@ -38,3 +38,31 @@ examples:
       camel.main.include-non-singletons=something
       camel.main.warn-on-early-shutdown=something
     language: properties
+---
+type: specs.openrewrite.org/v1beta/example
+recipeName: org.apache.camel.upgrade.spring.UpgradeSpringBoot3To4
+examples:
+- description: ''
+  sources:
+  - before: |
+      <project>
+          <modelVersion>4.0.0</modelVersion>
+          <groupId>com.example</groupId>
+          <artifactId>test</artifactId>
+          <version>1.0.0</version>
+          <properties>
+              <java.version>11</java.version>
+          </properties>
+      </project>
+    after: |
+      <project>
+          <modelVersion>4.0.0</modelVersion>
+          <groupId>com.example</groupId>
+          <artifactId>test</artifactId>
+          <version>1.0.0</version>
+          <properties>
+              <java.version>17</java.version>
+          </properties>
+      </project>
+    path: pom.xml
+    language: xml
diff --git a/camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/CamelTestUtil.java b/camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/CamelTestUtil.java
index ba77142..56fb836 100644
--- a/camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/CamelTestUtil.java
+++ b/camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/CamelTestUtil.java
@@ -20,6 +20,7 @@ import org.openrewrite.InMemoryExecutionContext;
 import org.openrewrite.Parser;
 import org.openrewrite.java.JavaParser;
 import org.openrewrite.test.RecipeSpec;
+import org.openrewrite.test.SourceSpecs;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -28,6 +29,8 @@ import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.*;
 
+import static org.openrewrite.maven.Assertions.pomXml;
+
 public class CamelTestUtil {
     public static final String PROPERTY_USE_RECIPE = "camelUpgradeRecipes-useRecipe";
 
@@ -219,4 +222,54 @@ public class CamelTestUtil {
                 """.formatted(artifactId, version.getVersion());
     }
 
+    /**
+     * Returns the target Camel version when running under a suite recipe that includes
+     * UpgradeDependencyVersion, or null when no version upgrade is expected.
+     */
+    private static String getTargetVersionFromRecipe() {
+        String useRecipe = System.getProperty(PROPERTY_USE_RECIPE);
+        if (useRecipe == null || useRecipe.isEmpty()) {
+            return null;
+        }
+        switch (useRecipe) {
+            case "org.apache.camel.upgrade.CamelMigrationRecipe":
+                return getCamelLatestVersion();
+            case "org.apache.camel.upgrade.Camel418LTSMigrationRecipe":
+                return getCamel418LtsVersion();
+            case "org.apache.camel.upgrade.Camel410LTSMigrationRecipe":
+                return getCamel410LtsVersion();
+            default:
+                return null;
+        }
+    }
+
+    public static boolean isRecipeOverridden() {
+        return getTargetVersionFromRecipe() != null;
+    }
+
+    /**
+     * Creates a pomXml SourceSpecs that expects the camel dependency version to be upgraded
+     * when running under a suite recipe (UpgradeDependencyVersion), or no POM change when
+     * running standalone.
+     */
+    public static SourceSpecs pomXmlSpec(String artifactId, CamelVersion sourceVersion) {
+        return pomXmlSpec(pomXmlWithDependency(artifactId, sourceVersion), sourceVersion.getVersion());
+    }
+
+    /**
+     * Creates a pomXml SourceSpecs from a raw POM string, expecting the camel dependency version
+     * to be upgraded when running under a suite recipe.
+     */
+    public static SourceSpecs pomXmlSpec(String pomBefore, String sourceVersion) {
+        String targetVersion = getTargetVersionFromRecipe();
+        if (targetVersion != null && !targetVersion.equals(sourceVersion)) {
+            String pomAfter = pomBefore.replace(
+                    "<version>" + sourceVersion + "</version>",
+                    "<version>" + targetVersion + "</version>"
+            );
+            return pomXml(pomBefore, pomAfter);
+        }
+        return pomXml(pomBefore);
+    }
+
 }
diff --git a/camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/CamelUpdate418Test.java b/camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/CamelUpdate418Test.java
index 48fd646..c259e25 100644
--- a/camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/CamelUpdate418Test.java
+++ b/camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/CamelUpdate418Test.java
@@ -24,7 +24,6 @@ import org.openrewrite.test.TypeValidation;
 
 import static org.openrewrite.java.Assertions.java;
 import static org.openrewrite.java.Assertions.mavenProject;
-import static org.openrewrite.maven.Assertions.pomXml;
 
 //class has to stay public, because test is extended in project quarkus-updates
 public class CamelUpdate418Test implements RewriteTest {
@@ -42,7 +41,7 @@ public class CamelUpdate418Test implements RewriteTest {
      */
     @DocumentExample
     @Test
-    void testQdrantHeadersChange() {
+    void qdrantHeadersChange() {
         //language=java
         rewriteRun(java(
                 """
@@ -71,7 +70,7 @@ public class CamelUpdate418Test implements RewriteTest {
      * <a href="https://camel.apache.org/manual/camel-4x-upgrade-guide-4_18.html#_camel_tahu">camel-tahu changes</a>
      */
     @Test
-    void testTahuChange() {
+    void tahuChange() {
         //language=java
         rewriteRun(java(
                 """
@@ -101,11 +100,11 @@ public class CamelUpdate418Test implements RewriteTest {
     }
 
     @Test
-    void testKafkaHeadersMigration() {
+    void kafkaHeadersMigration() {
         //language=java
         rewriteRun(
                 mavenProject("test-kafka",
-                        pomXml(CamelTestUtil.pomXmlWithDependency("camel-kafka", CamelTestUtil.CamelVersion.v4_17)),
+                        CamelTestUtil.pomXmlSpec("camel-kafka", CamelTestUtil.CamelVersion.v4_17),
                         java(
                                 """
                                 import org.apache.camel.Exchange;
@@ -141,11 +140,11 @@ public class CamelUpdate418Test implements RewriteTest {
     }
 
     @Test
-    void testDnsHeadersMigrationJava() {
+    void dnsHeadersMigrationJava() {
         //language=java
         rewriteRun(
                 mavenProject("test-dns",
-                        pomXml(CamelTestUtil.pomXmlWithDependency("camel-dns", CamelTestUtil.CamelVersion.v4_17)),
+                        CamelTestUtil.pomXmlSpec("camel-dns", CamelTestUtil.CamelVersion.v4_17),
                         java(
                                 """
                                 import org.apache.camel.Exchange;
@@ -187,11 +186,11 @@ public class CamelUpdate418Test implements RewriteTest {
     }
 
     @Test
-    void testSalesforceHeadersMigrationJava() {
+    void salesforceHeadersMigrationJava() {
         //language=java
         rewriteRun(
                 mavenProject("test-salesforce",
-                        pomXml(CamelTestUtil.pomXmlWithDependency("camel-salesforce", CamelTestUtil.CamelVersion.v4_17)),
+                        CamelTestUtil.pomXmlSpec("camel-salesforce", CamelTestUtil.CamelVersion.v4_17),
                         java(
                                 """
                                 import org.apache.camel.Exchange;
diff --git a/camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/CamelUpdate418_1Test.java b/camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/CamelUpdate418_1Test.java
index 55387a4..56f0dac 100644
--- a/camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/CamelUpdate418_1Test.java
+++ b/camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/CamelUpdate418_1Test.java
@@ -17,6 +17,7 @@
 package org.apache.camel.upgrade;
 
 import org.junit.jupiter.api.Test;
+import org.openrewrite.DocumentExample;
 import org.openrewrite.test.RecipeSpec;
 import org.openrewrite.test.RewriteTest;
 import org.openrewrite.test.TypeValidation;
@@ -39,8 +40,9 @@ public class CamelUpdate418_1Test implements RewriteTest {
     /**
      * <a href="https://camel.apache.org/manual/camel-4x-upgrade-guide-4_19.html#_saga_eip">Saga EIP</a>
      */
+    @DocumentExample
     @Test
-    void testSagaEipXml() {
+    void sagaEipXml() {
         //language=xml
         rewriteRun(xml(
           """
@@ -91,7 +93,7 @@ public class CamelUpdate418_1Test implements RewriteTest {
      * <a href="https://camel.apache.org/manual/camel-4x-upgrade-guide-4_19.html#_saga_eip">Saga EIP</a>
      */
     @Test
-    void testSagaEipYaml() {
+    void sagaEipYaml() {
         //language=yaml
         rewriteRun(yaml(
           """
@@ -126,7 +128,7 @@ public class CamelUpdate418_1Test implements RewriteTest {
      * <a href="https://camel.apache.org/manual/camel-4x-upgrade-guide-4_19.html#_camel_yaml_io_camel_xml_io">YAML DSL</a>
      */
     @Test
-    void testYamlDslRoutePolicyRename() {
+    void yamlDslRoutePolicyRename() {
         //language=yaml
         rewriteRun(yaml(
                 """
diff --git a/camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/CamelUpdate418_3Test.java b/camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/CamelUpdate418_3Test.java
index fbb776f..a6f4743 100644
--- a/camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/CamelUpdate418_3Test.java
+++ b/camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/CamelUpdate418_3Test.java
@@ -17,16 +17,12 @@
 package org.apache.camel.upgrade;
 
 import org.junit.jupiter.api.Test;
-import org.openrewrite.DocumentExample;
 import org.openrewrite.test.RecipeSpec;
 import org.openrewrite.test.RewriteTest;
 import org.openrewrite.test.TypeValidation;
 
 import static org.openrewrite.java.Assertions.java;
 import static org.openrewrite.java.Assertions.mavenProject;
-import static org.openrewrite.maven.Assertions.pomXml;
-import static org.openrewrite.xml.Assertions.xml;
-import static org.openrewrite.yaml.Assertions.yaml;
 
 /**
  * Tests for migrating from Camel 4.18.1 to 4.18.3.
@@ -43,11 +39,11 @@ public class CamelUpdate418_3Test implements RewriteTest {
     }
 
     @Test
-    void testLuceneHeadersMigrationJava() {
+    void luceneHeadersMigrationJava() {
         //language=java
         rewriteRun(
                 mavenProject("test-lucene",
-                        pomXml(CamelTestUtil.pomXmlWithDependency("camel-lucene", CamelTestUtil.CamelVersion.v4_18)),
+                        CamelTestUtil.pomXmlSpec("camel-lucene", CamelTestUtil.CamelVersion.v4_18),
                         java(
                         """
                         import org.apache.camel.Exchange;
@@ -89,11 +85,11 @@ public class CamelUpdate418_3Test implements RewriteTest {
     }
 
     @Test
-    void testJGroupsHeadersMigration() {
+    void jGroupsHeadersMigration() {
         //language=java
         rewriteRun(
                 mavenProject("test-jgroups",
-                        pomXml(CamelTestUtil.pomXmlWithDependency("camel-jgroups", CamelTestUtil.CamelVersion.v4_18)),
+                        CamelTestUtil.pomXmlSpec("camel-jgroups", CamelTestUtil.CamelVersion.v4_18),
                         java(
                         """
                         import org.apache.camel.Exchange;
@@ -131,11 +127,11 @@ public class CamelUpdate418_3Test implements RewriteTest {
     }
 
     @Test
-    void testJiraHeadersMigrationJava() {
+    void jiraHeadersMigrationJava() {
         //language=java
         rewriteRun(
                 mavenProject("test-jira",
-                        pomXml(
+                        CamelTestUtil.pomXmlSpec(
                         """
                         <project>
                             <groupId>com.example</groupId>
@@ -165,7 +161,7 @@ public class CamelUpdate418_3Test implements RewriteTest {
                                 </dependency>
                             </dependencies>
                         </project>
-                        """
+                        """, CamelTestUtil.CamelVersion.v4_18.getVersion()
                         ),
                         java(
                         """
@@ -210,11 +206,11 @@ public class CamelUpdate418_3Test implements RewriteTest {
     }
 
     @Test
-    void testJGroupsRaftHeadersMigration() {
+    void jGroupsRaftHeadersMigration() {
         //language=java
         rewriteRun(
                 mavenProject("test-jgroups-raft",
-                        pomXml(CamelTestUtil.pomXmlWithDependency("camel-jgroups-raft", CamelTestUtil.CamelVersion.v4_18)),
+                        CamelTestUtil.pomXmlSpec("camel-jgroups-raft", CamelTestUtil.CamelVersion.v4_18),
                         java(
                         """
                         import org.apache.camel.Exchange;
@@ -252,11 +248,11 @@ public class CamelUpdate418_3Test implements RewriteTest {
     }
 
     @Test
-    void testShiroHeadersMigration() {
+    void shiroHeadersMigration() {
         //language=java
         rewriteRun(
                 mavenProject("test-shiro",
-                        pomXml(CamelTestUtil.pomXmlWithDependency("camel-shiro", CamelTestUtil.CamelVersion.v4_18)),
+                        CamelTestUtil.pomXmlSpec("camel-shiro", CamelTestUtil.CamelVersion.v4_18),
                         java(
                         """
                         import org.apache.camel.Exchange;
@@ -294,11 +290,11 @@ public class CamelUpdate418_3Test implements RewriteTest {
     }
 
     @Test
-    void testSolrHeadersMigration() {
+    void solrHeadersMigration() {
         //language=java
         rewriteRun(
                 mavenProject("test-solr",
-                        pomXml(CamelTestUtil.pomXmlWithDependency("camel-solr", CamelTestUtil.CamelVersion.v4_18)),
+                        CamelTestUtil.pomXmlSpec("camel-solr", CamelTestUtil.CamelVersion.v4_18),
                         java(
                         """
                         import org.apache.camel.Exchange;
@@ -340,11 +336,11 @@ public class CamelUpdate418_3Test implements RewriteTest {
     }
 
     @Test
-    void testGitHub2HeadersMigrationJava() {
+    void gitHub2HeadersMigrationJava() {
         //language=java
         rewriteRun(
                 mavenProject("test-github",
-                        pomXml(
+                        CamelTestUtil.pomXmlSpec(
                         """
                         <project>
                             <groupId>com.example</groupId>
@@ -361,7 +357,7 @@ public class CamelUpdate418_3Test implements RewriteTest {
                                 </dependency>
                             </dependencies>
                         </project>
-                        """
+                        """, CamelTestUtil.CamelVersion.v4_18.getVersion()
                         ),
                         java(
                         """
@@ -398,11 +394,11 @@ public class CamelUpdate418_3Test implements RewriteTest {
     }
 
     @Test
-    void testGoogleCloudHeadersMigrationJava() {
+    void googleCloudHeadersMigrationJava() {
         //language=java
         rewriteRun(
                 mavenProject("test-google-cloud",
-                        pomXml(CamelTestUtil.pomXmlWithDependency("camel-google-functions", CamelTestUtil.CamelVersion.v4_18)),
+                        CamelTestUtil.pomXmlSpec("camel-google-functions", CamelTestUtil.CamelVersion.v4_18),
                         java(
                         """
                         import org.apache.camel.Exchange;
@@ -438,11 +434,11 @@ public class CamelUpdate418_3Test implements RewriteTest {
     }
 
     @Test
-    void testMongoDbGridFsHeadersMigrationJava() {
+    void mongoDbGridFsHeadersMigrationJava() {
         //language=java
         rewriteRun(
                 mavenProject("test-mongodb",
-                        pomXml(CamelTestUtil.pomXmlWithDependency("camel-mongodb-gridfs", CamelTestUtil.CamelVersion.v4_18)),
+                        CamelTestUtil.pomXmlSpec("camel-mongodb-gridfs", CamelTestUtil.CamelVersion.v4_18),
                         java(
                         """
                         import org.apache.camel.Exchange;
@@ -478,11 +474,11 @@ public class CamelUpdate418_3Test implements RewriteTest {
     }
 
     @Test
-    void testOpenstackHeadersMigrationJava() {
+    void openstackHeadersMigrationJava() {
         //language=java
         rewriteRun(
                 mavenProject("test-openstack",
-                        pomXml(CamelTestUtil.pomXmlWithDependency("camel-openstack", CamelTestUtil.CamelVersion.v4_18)),
+                        CamelTestUtil.pomXmlSpec("camel-openstack", CamelTestUtil.CamelVersion.v4_18),
                         java(
                                 """
                                 import org.apache.camel.Exchange;
@@ -530,11 +526,11 @@ public class CamelUpdate418_3Test implements RewriteTest {
     }
 
     @Test
-    void testWeb3jHeadersMigrationJava() {
+    void web3jHeadersMigrationJava() {
         //language=java
         rewriteRun(
                 mavenProject("test-web3j",
-                        pomXml(CamelTestUtil.pomXmlWithDependency("camel-web3j", CamelTestUtil.CamelVersion.v4_18)),
+                        CamelTestUtil.pomXmlSpec("camel-web3j", CamelTestUtil.CamelVersion.v4_18),
                         java(
                                 """
                                 import org.apache.camel.Exchange;
diff --git a/camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/CamelUpdate419Test.java b/camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/CamelUpdate419Test.java
index a0014ae..01f43ad 100644
--- a/camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/CamelUpdate419Test.java
+++ b/camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/CamelUpdate419Test.java
@@ -108,7 +108,7 @@ public class CamelUpdate419Test implements RewriteTest {
      */
     @Test
     void sagaEipXml() {
-        new CamelUpdate418_1Test().testSagaEipXml();
+        new CamelUpdate418_1Test().sagaEipXml();
     }
 
     /**
@@ -116,7 +116,7 @@ public class CamelUpdate419Test implements RewriteTest {
      */
     @Test
     void sagaEipYaml() {
-        new CamelUpdate418_1Test().testSagaEipYaml();
+        new CamelUpdate418_1Test().sagaEipYaml();
     }
 
 
@@ -191,7 +191,7 @@ public class CamelUpdate419Test implements RewriteTest {
      */
     @Test
     void yamlDslRoutePolicyRename() {
-        new CamelUpdate418_1Test().testYamlDslRoutePolicyRename();
+        new CamelUpdate418_1Test().yamlDslRoutePolicyRename();
     }
     /**
      * <a href="https://camel.apache.org/manual/camel-4x-upgrade-guide-4_18.html#_camel_bom">camel-bom</a>
diff --git a/camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/CamelUpdate421Test.java b/camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/CamelUpdate421Test.java
index df5bdf0..34a9ae1 100644
--- a/camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/CamelUpdate421Test.java
+++ b/camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/CamelUpdate421Test.java
@@ -17,6 +17,7 @@
 package org.apache.camel.upgrade;
 
 import org.junit.jupiter.api.Test;
+import org.openrewrite.DocumentExample;
 import org.openrewrite.test.RecipeSpec;
 import org.openrewrite.test.RewriteTest;
 import org.openrewrite.test.TypeValidation;
@@ -42,37 +43,66 @@ public class CamelUpdate421Test implements RewriteTest {
                 .expectedCyclesThatMakeChanges(1);
     }
 
+    @DocumentExample
     @Test
-    void testJGroupsHeadersMigration() {
-        new CamelUpdate418_3Test().testJGroupsHeadersMigration();
+    void removeReifierStrategyImport() {
+        //language=java
+        rewriteRun(
+                java(
+                """
+                import org.apache.camel.builder.RouteBuilder;
+                import org.apache.camel.spi.ReifierStrategy;
+
+                class Test extends RouteBuilder {
+                    public void configure() {
+                        from("direct:start").to("log:test");
+                    }
+                }
+                """,
+                """
+                import org.apache.camel.builder.RouteBuilder;
+
+                class Test extends RouteBuilder {
+                    public void configure() {
+                        from("direct:start").to("log:test");
+                    }
+                }
+                """
+                )
+        );
+    }
+
+    @Test
+    void jGroupsHeadersMigration() {
+        new CamelUpdate418_3Test().jGroupsHeadersMigration();
     }
 
     @Test
-    void testDnsHeadersMigrationJava() {
-        new CamelUpdate418Test().testDnsHeadersMigrationJava();
+    void dnsHeadersMigrationJava() {
+        new CamelUpdate418Test().dnsHeadersMigrationJava();
     }
 
     @Test
-    void testJiraHeadersMigrationJava() {
-        new CamelUpdate418_3Test().testJiraHeadersMigrationJava();
+    void jiraHeadersMigrationJava() {
+        new CamelUpdate418_3Test().jiraHeadersMigrationJava();
     }
 
     @Test
-    void testOpenstackHeadersMigrationJava() {
-        new CamelUpdate418_3Test().testOpenstackHeadersMigrationJava();
+    void openstackHeadersMigrationJava() {
+        new CamelUpdate418_3Test().openstackHeadersMigrationJava();
     }
 
     @Test
-    void testWeb3jHeadersMigrationJava() {
-        new CamelUpdate418_3Test().testWeb3jHeadersMigrationJava();
+    void web3jHeadersMigrationJava() {
+        new CamelUpdate418_3Test().web3jHeadersMigrationJava();
     }
 
     @Test
-    void testCouchdbHeadersMigration() {
+    void couchdbHeadersMigration() {
         //language=java
         rewriteRun(
                 mavenProject("test-couchdb",
-                        pomXml(CamelTestUtil.pomXmlWithDependency("camel-couchdb", CamelTestUtil.CamelVersion.v4_20)),
+                        CamelTestUtil.pomXmlSpec("camel-couchdb", CamelTestUtil.CamelVersion.v4_20),
                         java(
                         """
                         import org.apache.camel.Exchange;
@@ -110,11 +140,11 @@ public class CamelUpdate421Test implements RewriteTest {
     }
 
     @Test
-    void testCouchbaseHeadersMigration() {
+    void couchbaseHeadersMigration() {
         //language=java
         rewriteRun(
                 mavenProject("test-couchbase",
-                        pomXml(CamelTestUtil.pomXmlWithDependency("camel-couchbase", CamelTestUtil.CamelVersion.v4_20)),
+                        CamelTestUtil.pomXmlSpec("camel-couchbase", CamelTestUtil.CamelVersion.v4_20),
                         java(
                         """
                         import org.apache.camel.Exchange;
@@ -152,43 +182,43 @@ public class CamelUpdate421Test implements RewriteTest {
     }
 
     @Test
-    void testJGroupsRaftHeadersMigration() {
-        new CamelUpdate418_3Test().testJGroupsRaftHeadersMigration();
+    void jGroupsRaftHeadersMigration() {
+        new CamelUpdate418_3Test().jGroupsRaftHeadersMigration();
     }
 
     @Test
-    void testShiroHeadersMigration() {
-        new CamelUpdate418_3Test().testShiroHeadersMigration();
+    void shiroHeadersMigration() {
+        new CamelUpdate418_3Test().shiroHeadersMigration();
     }
 
     @Test
-    void testSolrHeadersMigration() {
-        new CamelUpdate418_3Test().testSolrHeadersMigration();
+    void solrHeadersMigration() {
+        new CamelUpdate418_3Test().solrHeadersMigration();
     }
 
     @Test
-    void testGitHub2HeadersMigrationJava() {
-        new CamelUpdate418_3Test().testGitHub2HeadersMigrationJava();
+    void gitHub2HeadersMigrationJava() {
+        new CamelUpdate418_3Test().gitHub2HeadersMigrationJava();
     }
 
     @Test
-    void testGoogleCloudHeadersMigrationJava() {
-        new CamelUpdate418_3Test().testGoogleCloudHeadersMigrationJava();
+    void googleCloudHeadersMigrationJava() {
+        new CamelUpdate418_3Test().googleCloudHeadersMigrationJava();
     }
 
     //todo more google - vision, text-to=speech, speech-to-text
 
     @Test
-    void testMongoDbGridFsHeadersMigrationJava() {
-        new CamelUpdate418_3Test().testMongoDbGridFsHeadersMigrationJava();
+    void mongoDbGridFsHeadersMigrationJava() {
+        new CamelUpdate418_3Test().mongoDbGridFsHeadersMigrationJava();
     }
 
     @Test
-    void testIrcHeadersMigrationJava() {
+    void ircHeadersMigrationJava() {
         //language=java
         rewriteRun(
                 mavenProject("test-irc",
-                        pomXml(CamelTestUtil.pomXmlWithDependency("camel-irc", CamelTestUtil.CamelVersion.v4_20)),
+                        CamelTestUtil.pomXmlSpec("camel-irc", CamelTestUtil.CamelVersion.v4_20),
                         java(
                         """
                         import org.apache.camel.Exchange;
@@ -224,15 +254,15 @@ public class CamelUpdate421Test implements RewriteTest {
     }
 
     @Test
-    void testPreconditionBlocksWithoutDependency() {
+    void preconditionBlocksWithoutDependency() {
         // Test that the Kafka recipe does NOT run when camel-kafka dependency is absent
         // This verifies the ModuleHasDependency precondition works correctly
         // Using camel-core instead of camel-kafka means the precondition will block the recipe
         //language=java
         rewriteRun(
-                spec -> spec.expectedCyclesThatMakeChanges(0),
+                spec -> spec.expectedCyclesThatMakeChanges(CamelTestUtil.isRecipeOverridden() ? 1 : 0),
                 mavenProject("test-negative",
-                        pomXml(CamelTestUtil.pomXmlWithDependency("camel-core", CamelTestUtil.CamelVersion.v4_20)),
+                        CamelTestUtil.pomXmlSpec("camel-core", CamelTestUtil.CamelVersion.v4_20),
                         java(
                         """
                         import org.apache.camel.Exchange;
@@ -252,35 +282,7 @@ public class CamelUpdate421Test implements RewriteTest {
     }
 
     @Test
-    void testRemoveReifierStrategyImport() {
-        //language=java
-        rewriteRun(
-                java(
-                """
-                import org.apache.camel.builder.RouteBuilder;
-                import org.apache.camel.spi.ReifierStrategy;
-
-                class Test extends RouteBuilder {
-                    public void configure() {
-                        from("direct:start").to("log:test");
-                    }
-                }
-                """,
-                """
-                import org.apache.camel.builder.RouteBuilder;
-
-                class Test extends RouteBuilder {
-                    public void configure() {
-                        from("direct:start").to("log:test");
-                    }
-                }
-                """
-                )
-        );
-    }
-
-    @Test
-    void testRemoveZooWordEmbeddingPredictorImport() {
+    void removeZooWordEmbeddingPredictorImport() {
         //language=java
         rewriteRun(
                 java(
@@ -308,12 +310,12 @@ public class CamelUpdate421Test implements RewriteTest {
     }
 
     @Test
-    void testLuceneHeadersMigrationJava() {
-        new CamelUpdate418_3Test().testLuceneHeadersMigrationJava();
+    void luceneHeadersMigrationJava() {
+        new CamelUpdate418_3Test().luceneHeadersMigrationJava();
     }
 
     @Test
-    void testRemoveCamelStompDependency() {
+    void removeCamelStompDependency() {
         //language=xml
         rewriteRun(
                 pomXml(
@@ -349,7 +351,7 @@ public class CamelUpdate421Test implements RewriteTest {
     }
 
     @Test
-    void testRemoveCamelAwsXrayDependency() {
+    void removeCamelAwsXrayDependency() {
         //language=xml
         rewriteRun(
                 pomXml(
@@ -385,7 +387,7 @@ public class CamelUpdate421Test implements RewriteTest {
     }
 
     @Test
-    void testRemoveCamelGuavaEventbusDependency() {
+    void removeCamelGuavaEventbusDependency() {
         //language=xml
         rewriteRun(
                 pomXml(
@@ -421,7 +423,7 @@ public class CamelUpdate421Test implements RewriteTest {
     }
 
     @Test
-    void testRemoveCamelGrapeDependency() {
+    void removeCamelGrapeDependency() {
         //language=xml
         rewriteRun(
                 pomXml(
@@ -457,7 +459,7 @@ public class CamelUpdate421Test implements RewriteTest {
     }
 
     @Test
-    void testRemoveCamelElytronDependency() {
+    void removeCamelElytronDependency() {
         //language=xml
         rewriteRun(
                 pomXml(
@@ -493,11 +495,11 @@ public class CamelUpdate421Test implements RewriteTest {
     }
 
     @Test
-    void testMigrateAws2S3ListObjectsApi() {
+    void migrateAws2S3ListObjectsApi() {
         //language=java
         rewriteRun(
                 mavenProject("test-aws2-s3",
-                        pomXml(CamelTestUtil.pomXmlWithDependency("camel-aws2-s3", CamelTestUtil.CamelVersion.v4_20)),
+                        CamelTestUtil.pomXmlSpec("camel-aws2-s3", CamelTestUtil.CamelVersion.v4_20),
                         java(
                         """
                         import software.amazon.awssdk.services.s3.model.ListObjectsRequest;
@@ -527,7 +529,7 @@ public class CamelUpdate421Test implements RewriteTest {
     }
 
     @Test
-    void testRemoveCamelGithubDependency() {
+    void removeCamelGithubDependency() {
         //language=xml
         rewriteRun(
                 pomXml(
@@ -563,7 +565,7 @@ public class CamelUpdate421Test implements RewriteTest {
     }
 
     @Test
-    void testErrorRegistryPropertiesFile() {
+    void errorRegistryPropertiesFile() {
         //language=properties
         rewriteRun(
                 properties(
diff --git a/camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/versions/CamelUpdate418LtsVersionTest.java b/camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/versions/CamelUpdate418LtsVersionTest.java
index 0e06c3c..b6f37df 100644
--- a/camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/versions/CamelUpdate418LtsVersionTest.java
+++ b/camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/versions/CamelUpdate418LtsVersionTest.java
@@ -18,11 +18,9 @@ package org.apache.camel.upgrade.versions;
 
 import org.apache.camel.upgrade.AbstractCamelUpdateVersionTest;
 import org.apache.camel.upgrade.CamelTestUtil;
-import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.condition.EnabledIfSystemProperty;
 
 //class has to stay public, because test is extended in project quarkus-updates
-@Disabled //until 4.18.3 is released
 @EnabledIfSystemProperty(named = CamelTestUtil.PROPERTY_USE_RECIPE, matches = "org.apache.camel.upgrade.Camel418LTSMigrationRecipe")
 public class CamelUpdate418LtsVersionTest extends AbstractCamelUpdateVersionTest {
 
diff --git a/camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/versions/CamelUpdateLatestVersionTest.java b/camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/versions/CamelUpdateLatestVersionTest.java
index 2009a2b..fc53dfb 100644
--- a/camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/versions/CamelUpdateLatestVersionTest.java
+++ b/camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/versions/CamelUpdateLatestVersionTest.java
@@ -18,10 +18,8 @@ package org.apache.camel.upgrade.versions;
 
 import org.apache.camel.upgrade.AbstractCamelUpdateVersionTest;
 import org.apache.camel.upgrade.CamelTestUtil;
-import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.condition.EnabledIfSystemProperty;
 
-@Disabled //todo investigate properly why is failing on CI
 @EnabledIfSystemProperty(named = CamelTestUtil.PROPERTY_USE_RECIPE, matches = "org.apache.camel.upgrade.CamelMigrationRecipe")
 //class has to stay public, because test is extended in project quarkus-updates
 public class CamelUpdateLatestVersionTest extends AbstractCamelUpdateVersionTest {
diff --git a/pom.xml b/pom.xml
index 53a4699..27cab7d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -125,7 +125,7 @@
         <spring-batch-version>6.0.3</spring-batch-version>
 
         <!-- Should be aligned to quarkus-updates - https://github.com/quarkusio/quarkus-updates/blob/main/pom.xml#L64 -->
-        <rewrite-recipe-bom.version>3.24.0</rewrite-recipe-bom.version>
+        <rewrite-recipe-bom.version>3.31.0</rewrite-recipe-bom.version>
 
         <slf4j.version>1.7.36</slf4j.version>
 


(camel-upgrade-recipes) 02/02: Move shared recipe implementations to patch packages and fix YAML references

Posted by ji...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

JiriOndrusek pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-upgrade-recipes.git

commit 12920d22d8b3ade0947d8d803383e7cd8c59389d
Author: Jiri Ondrusek <on...@gmail.com>
AuthorDate: Wed Jun 24 11:38:31 2026 +0200

    Move shared recipe implementations to patch packages and fix YAML references
---
 RECIPE-CONVENTIONS.md                              | 85 ++++++++++++++++++++++
 .../XmlDsl418_1SagaRecipe.java}                    |  4 +-
 .../YamlDsl418_1SagaRecipe.java}                   |  4 +-
 .../RenameHeaderInJavaMethod.java                  |  2 +-
 .../RenameHeaderInSimpleExpression.java            |  2 +-
 .../RenameHeaderInXmlDsl.java                      |  2 +-
 .../RenameHeaderInYamlDsl.java                     |  2 +-
 .../RenameHeaderPrefixInJavaMethod.java            |  2 +-
 .../RenameHeaderPrefixInSimpleExpression.java      |  2 +-
 .../RenameHeaderPrefixInXmlDsl.java                |  2 +-
 .../RenameHeaderPrefixInYamlDsl.java               |  2 +-
 .../RenameHeaderPrefixes.java                      |  4 +-
 .../{camel421 => camel418_3}/RenameHeaders.java    |  6 +-
 .../camel421/RemoveReifierStrategyImport.java      | 79 --------------------
 .../RemoveZooWordEmbeddingPredictorImport.java     | 80 --------------------
 .../main/resources/META-INF/rewrite/4.18.1.yaml    |  4 +-
 .../main/resources/META-INF/rewrite/4.18.3.yaml    | 24 +++---
 .../src/main/resources/META-INF/rewrite/4.18.yaml  |  8 +-
 .../src/main/resources/META-INF/rewrite/4.21.yaml  | 32 ++++----
 .../main/resources/META-INF/rewrite/examples.yml   | 18 ++---
 .../apache/camel/upgrade/CamelUpdate421Test.java   | 58 ---------------
 .../RenameHeaderInJavaMethodTest.java              |  2 +-
 .../RenameHeaderInSimpleExpressionTest.java        |  2 +-
 .../RenameHeaderInXmlDslTest.java                  |  2 +-
 .../RenameHeaderInYamlDslTest.java                 |  2 +-
 .../RenameHeaderPrefixInJavaMethodTest.java        |  2 +-
 .../RenameHeaderPrefixInSimpleExpressionTest.java  |  2 +-
 .../RenameHeaderPrefixInXmlDslTest.java            |  2 +-
 .../RenameHeaderPrefixInYamlDslTest.java           |  2 +-
 .../RenameHeadersTest.java                         |  2 +-
 release_notes.adoc                                 |  4 +-
 31 files changed, 155 insertions(+), 289 deletions(-)

diff --git a/RECIPE-CONVENTIONS.md b/RECIPE-CONVENTIONS.md
new file mode 100644
index 0000000..6ece041
--- /dev/null
+++ b/RECIPE-CONVENTIONS.md
@@ -0,0 +1,85 @@
+# Recipe Organization Convention: Patch vs. Main Migration Recipes
+
+When a breaking change is backported to an LTS patch release (e.g., 4.18.3) and also ships in the next main version (e.g., 4.21), the same migration recipe is needed in both upgrade paths. This document describes the convention the project follows to avoid duplicating Java code and YAML definitions.
+
+## The Convention
+
+**Rule: Implementation lives in the patch package; newer versions reference it.**
+
+When a patch release (e.g., 4.18.3) and a main release (e.g., 4.21) both require the same migration:
+
+1. **Java implementation** goes into the patch-version package (e.g., `org.apache.camel.upgrade.camel418_3`)
+2. **YAML recipe definitions** using those Java classes are defined in the patch YAML file (e.g., `4.18.3.yaml`) with recipe names in the patch namespace (e.g., `camel418_3.upgradeJGroupsHeaders`)
+3. **Newer main-version YAMLs** (e.g., `4.21.yaml`) reference the patch recipes -- they do NOT duplicate the Java classes or redefine the YAML recipes under their own namespace
+
+### Example: Header Renames (4.18.3 / 4.21)
+
+**Java classes** -- all in `src/main/java/org/apache/camel/upgrade/camel418_3/`:
+- `RenameHeaders.java`, `RenameHeaderPrefixes.java`, and their visitor classes
+
+**No `camel421/` Java package exists** -- 4.21 has no header rename Java code of its own.
+
+**4.18.3.yaml** defines the recipes with their implementations:
+```yaml
+name: org.apache.camel.upgrade.camel418_3.upgradeJGroupsHeaders
+recipeList:
+  - org.apache.camel.upgrade.camel418_3.RenameHeaders:   # points to patch Java class
+      headerMappings:
+        JGROUPS_CHANNEL_ADDRESS: CamelJGroupsChannelAddress
+```
+
+**4.21.yaml** reuses those patch recipes in two ways:
+
+1. Referencing whole patch-defined recipes directly:
+```yaml
+name: org.apache.camel.upgrade.camel421.CamelMigrationRecipe
+recipeList:
+  ## inherited from patch recipe
+  - org.apache.camel.upgrade.camel418_3.upgradeJGroupsHeaders    # reuses 4.18.3 recipe
+  - org.apache.camel.upgrade.camel418_3.upgradeJiraHeaders
+  - org.apache.camel.upgrade.camel418_3.upgradeShiroHeaders
+  ...
+```
+
+2. Defining new 4.21-specific YAML recipes that reuse the patch Java class:
+```yaml
+name: org.apache.camel.upgrade.camel421.upgradeKafkaRecipes
+recipeList:
+  - org.apache.camel.upgrade.camel418_3.RenameHeaders:   # reuses patch Java class
+      headerMappings:
+        kafka.PARTITION_KEY: CamelKafkaPartitionKey
+```
+
+### Example: Saga EIP (4.18.1 / 4.19)
+
+**Java classes** in `camel418_1/`: `XmlDsl419SagaRecipe.java`, `YamlDsl419SagaRecipe.java`
+
+**4.18.1.yaml** defines the saga recipe:
+```yaml
+name: org.apache.camel.upgrade.camel418_1.saga
+recipeList:
+  - org.apache.camel.upgrade.camel418_1.XmlDsl419SagaRecipe
+  - org.apache.camel.upgrade.camel418_1.YamlDsl419SagaRecipe
+```
+
+**4.19.yaml** references it:
+```yaml
+name: org.apache.camel.upgrade.camel419.CamelMigrationRecipe
+recipeList:
+  - org.apache.camel.upgrade.camel418_1.saga        # reuses 4.18.1 recipe
+  - org.apache.camel.upgrade.camel419.removedComponents
+```
+
+## LTS Aggregation
+
+LTS recipes (e.g., `4.18LTS.yaml`) chain patch recipes in reverse chronological order:
+```
+camel418_3.CamelMigrationRecipe  (4.18.1 -> 4.18.3)
+camel418_1.CamelMigrationRecipe  (4.18.0 -> 4.18.1)
+camel418.CamelMigrationRecipe    (4.17   -> 4.18)
+... older versions
+```
+
+## Exception: 4.10.x
+
+The 4.10.4 patch predates this convention and does not follow it -- its implementation lives in the main-version package (`camel412`) rather than in a dedicated patch package.
diff --git a/camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel419/XmlDsl419SagaRecipe.java b/camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel418_1/XmlDsl418_1SagaRecipe.java
similarity index 97%
rename from camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel419/XmlDsl419SagaRecipe.java
rename to camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel418_1/XmlDsl418_1SagaRecipe.java
index a37bb74..34ed9d8 100644
--- a/camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel419/XmlDsl419SagaRecipe.java
+++ b/camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel418_1/XmlDsl418_1SagaRecipe.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.upgrade.camel419;
+package org.apache.camel.upgrade.camel418_1;
 
 import org.apache.camel.upgrade.AbstractCamelXmlVisitor;
 import org.openrewrite.ExecutionContext;
@@ -33,7 +33,7 @@ import java.util.Optional;
  * Changed model for configuring completion and compensation URIs in XML DSL.
  * Converts child elements to attributes.
  */
-public class XmlDsl419SagaRecipe extends Recipe {
+public class XmlDsl418_1SagaRecipe extends Recipe {
 
     private static final XPathMatcher SAGA_MATCHER = new XPathMatcher("//saga");
 
diff --git a/camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel419/YamlDsl419SagaRecipe.java b/camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel418_1/YamlDsl418_1SagaRecipe.java
similarity index 97%
rename from camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel419/YamlDsl419SagaRecipe.java
rename to camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel418_1/YamlDsl418_1SagaRecipe.java
index 64c8ef7..026fbfd 100644
--- a/camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel419/YamlDsl419SagaRecipe.java
+++ b/camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel418_1/YamlDsl418_1SagaRecipe.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.upgrade.camel419;
+package org.apache.camel.upgrade.camel418_1;
 
 import org.apache.camel.upgrade.AbstractCamelYamlVisitor;
 import org.apache.camel.upgrade.RecipesUtil;
@@ -32,7 +32,7 @@ import org.openrewrite.yaml.tree.Yaml;
  * Changed model for configuring completion and compensation URIs in YAML DSL.
  * Flattens nested uri fields to direct attribute values.
  */
-public class YamlDsl419SagaRecipe extends Recipe {
+public class YamlDsl418_1SagaRecipe extends Recipe {
 
     private static final JsonPathMatcher COMPENSATION_MATCHER = new JsonPathMatcher("$..saga.compensation");
     private static final JsonPathMatcher COMPLETION_MATCHER = new JsonPathMatcher("$..saga.completion");
diff --git a/camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel421/RenameHeaderInJavaMethod.java b/camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel418_3/RenameHeaderInJavaMethod.java
similarity index 99%
rename from camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel421/RenameHeaderInJavaMethod.java
rename to camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel418_3/RenameHeaderInJavaMethod.java
index 0a847a5..2dbddf1 100644
--- a/camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel421/RenameHeaderInJavaMethod.java
+++ b/camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel418_3/RenameHeaderInJavaMethod.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.upgrade.camel421;
+package org.apache.camel.upgrade.camel418_3;
 
 import org.apache.camel.upgrade.AbstractCamelJavaVisitor;
 import org.apache.camel.upgrade.RecipesUtil;
diff --git a/camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel421/RenameHeaderInSimpleExpression.java b/camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel418_3/RenameHeaderInSimpleExpression.java
similarity index 99%
rename from camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel421/RenameHeaderInSimpleExpression.java
rename to camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel418_3/RenameHeaderInSimpleExpression.java
index 1089d4e..f62c3e4 100644
--- a/camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel421/RenameHeaderInSimpleExpression.java
+++ b/camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel418_3/RenameHeaderInSimpleExpression.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.upgrade.camel421;
+package org.apache.camel.upgrade.camel418_3;
 
 import org.apache.camel.upgrade.AbstractCamelJavaVisitor;
 import org.apache.camel.upgrade.RecipesUtil;
diff --git a/camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel421/RenameHeaderInXmlDsl.java b/camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel418_3/RenameHeaderInXmlDsl.java
similarity index 98%
rename from camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel421/RenameHeaderInXmlDsl.java
rename to camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel418_3/RenameHeaderInXmlDsl.java
index 9ca4d6f..0f889cd 100644
--- a/camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel421/RenameHeaderInXmlDsl.java
+++ b/camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel418_3/RenameHeaderInXmlDsl.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.upgrade.camel421;
+package org.apache.camel.upgrade.camel418_3;
 
 import org.apache.camel.upgrade.AbstractCamelXmlVisitor;
 import org.openrewrite.ExecutionContext;
diff --git a/camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel421/RenameHeaderInYamlDsl.java b/camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel418_3/RenameHeaderInYamlDsl.java
similarity index 99%
rename from camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel421/RenameHeaderInYamlDsl.java
rename to camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel418_3/RenameHeaderInYamlDsl.java
index ea9dbe3..ff6ea84 100644
--- a/camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel421/RenameHeaderInYamlDsl.java
+++ b/camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel418_3/RenameHeaderInYamlDsl.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.upgrade.camel421;
+package org.apache.camel.upgrade.camel418_3;
 
 import org.apache.camel.upgrade.AbstractCamelYamlVisitor;
 import org.apache.camel.upgrade.RecipesUtil;
diff --git a/camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel421/RenameHeaderPrefixInJavaMethod.java b/camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel418_3/RenameHeaderPrefixInJavaMethod.java
similarity index 99%
rename from camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel421/RenameHeaderPrefixInJavaMethod.java
rename to camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel418_3/RenameHeaderPrefixInJavaMethod.java
index 04b87de..ad9d876 100644
--- a/camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel421/RenameHeaderPrefixInJavaMethod.java
+++ b/camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel418_3/RenameHeaderPrefixInJavaMethod.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.upgrade.camel421;
+package org.apache.camel.upgrade.camel418_3;
 
 import org.apache.camel.upgrade.AbstractCamelJavaVisitor;
 import org.apache.camel.upgrade.RecipesUtil;
diff --git a/camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel421/RenameHeaderPrefixInSimpleExpression.java b/camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel418_3/RenameHeaderPrefixInSimpleExpression.java
similarity index 99%
rename from camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel421/RenameHeaderPrefixInSimpleExpression.java
rename to camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel418_3/RenameHeaderPrefixInSimpleExpression.java
index b201597..298910a 100644
--- a/camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel421/RenameHeaderPrefixInSimpleExpression.java
+++ b/camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel418_3/RenameHeaderPrefixInSimpleExpression.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.upgrade.camel421;
+package org.apache.camel.upgrade.camel418_3;
 
 import org.apache.camel.upgrade.AbstractCamelJavaVisitor;
 import org.apache.camel.upgrade.RecipesUtil;
diff --git a/camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel421/RenameHeaderPrefixInXmlDsl.java b/camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel418_3/RenameHeaderPrefixInXmlDsl.java
similarity index 98%
rename from camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel421/RenameHeaderPrefixInXmlDsl.java
rename to camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel418_3/RenameHeaderPrefixInXmlDsl.java
index 29d0a6b..ee54903 100644
--- a/camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel421/RenameHeaderPrefixInXmlDsl.java
+++ b/camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel418_3/RenameHeaderPrefixInXmlDsl.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.upgrade.camel421;
+package org.apache.camel.upgrade.camel418_3;
 
 import org.apache.camel.upgrade.AbstractCamelXmlVisitor;
 import org.openrewrite.ExecutionContext;
diff --git a/camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel421/RenameHeaderPrefixInYamlDsl.java b/camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel418_3/RenameHeaderPrefixInYamlDsl.java
similarity index 99%
rename from camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel421/RenameHeaderPrefixInYamlDsl.java
rename to camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel418_3/RenameHeaderPrefixInYamlDsl.java
index 77be3cd..9d944ff 100644
--- a/camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel421/RenameHeaderPrefixInYamlDsl.java
+++ b/camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel418_3/RenameHeaderPrefixInYamlDsl.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.upgrade.camel421;
+package org.apache.camel.upgrade.camel418_3;
 
 import org.apache.camel.upgrade.AbstractCamelYamlVisitor;
 import org.apache.camel.upgrade.RecipesUtil;
diff --git a/camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel421/RenameHeaderPrefixes.java b/camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel418_3/RenameHeaderPrefixes.java
similarity index 97%
rename from camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel421/RenameHeaderPrefixes.java
rename to camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel418_3/RenameHeaderPrefixes.java
index 8d344e8..7e0b9bf 100644
--- a/camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel421/RenameHeaderPrefixes.java
+++ b/camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel418_3/RenameHeaderPrefixes.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.upgrade.camel421;
+package org.apache.camel.upgrade.camel418_3;
 
 import org.openrewrite.Option;
 import org.openrewrite.Recipe;
@@ -35,7 +35,7 @@ import java.util.Map;
  *
  * Example YAML configuration:
  * <pre>
- * - org.apache.camel.upgrade.camel421.RenameHeaderPrefixes:
+ * - org.apache.camel.upgrade.camel418_3.RenameHeaderPrefixes:
  *     prefixMappings:
  *       SolrField.: CamelSolrField.
  *       SolrParam.: CamelSolrParam.
diff --git a/camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel421/RenameHeaders.java b/camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel418_3/RenameHeaders.java
similarity index 96%
rename from camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel421/RenameHeaders.java
rename to camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel418_3/RenameHeaders.java
index 51cbcef..2dcd08f 100644
--- a/camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel421/RenameHeaders.java
+++ b/camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel418_3/RenameHeaders.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.upgrade.camel421;
+package org.apache.camel.upgrade.camel418_3;
 
 import org.openrewrite.Option;
 import org.openrewrite.Recipe;
@@ -30,7 +30,7 @@ import java.util.Map;
  *
  * Example YAML configuration (bulk rename):
  * <pre>
- * - org.apache.camel.upgrade.camel421.RenameHeaders:
+ * - org.apache.camel.upgrade.camel418_3.RenameHeaders:
  *     headerMappings:
  *       kafka.TOPIC: CamelKafkaTopic
  *       kafka.PARTITION: CamelKafkaPartition
@@ -39,7 +39,7 @@ import java.util.Map;
  *
  * Example YAML configuration (single rename):
  * <pre>
- * - org.apache.camel.upgrade.camel421.RenameHeaders:
+ * - org.apache.camel.upgrade.camel418_3.RenameHeaders:
  *     oldHeaderName: kafka.TOPIC
  *     newHeaderName: CamelKafkaTopic
  * </pre>
diff --git a/camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel421/RemoveReifierStrategyImport.java b/camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel421/RemoveReifierStrategyImport.java
deleted file mode 100644
index 01bfe60..0000000
--- a/camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel421/RemoveReifierStrategyImport.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.upgrade.camel421;
-
-import org.openrewrite.ExecutionContext;
-import org.openrewrite.Recipe;
-import org.openrewrite.TreeVisitor;
-import org.openrewrite.java.JavaIsoVisitor;
-import org.openrewrite.java.tree.J;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class RemoveReifierStrategyImport extends Recipe {
-
-    @Override
-    public String getDisplayName() {
-        return "Remove ReifierStrategy import";
-    }
-
-    @Override
-    public String getDescription() {
-        return "Removes import for org.apache.camel.spi.ReifierStrategy which is no longer in use.";
-    }
-
-    @Override
-    public TreeVisitor<?, ExecutionContext> getVisitor() {
-        return new JavaIsoVisitor<ExecutionContext>() {
-            @Override
-            public J.CompilationUnit visitCompilationUnit(J.CompilationUnit cu, ExecutionContext ctx) {
-                J.CompilationUnit c = super.visitCompilationUnit(cu, ctx);
-
-                // Find and remove the ReifierStrategy import
-                List<J.Import> imports = new ArrayList<>(c.getImports());
-                int removedIndex = -1;
-                for (int i = 0; i < imports.size(); i++) {
-                    String importType = imports.get(i).getQualid().printTrimmed(getCursor());
-                    if ("org.apache.camel.spi.ReifierStrategy".equals(importType)) {
-                        removedIndex = i;
-                        imports.remove(i);
-                        break;
-                    }
-                }
-
-                if (removedIndex >= 0 && !imports.isEmpty()) {
-                    // If we removed the first import and there are more imports,
-                    // clean up the prefix of the new first import
-                    if (removedIndex == 0) {
-                        J.Import firstImport = imports.get(0);
-                        String prefix = firstImport.getPrefix().getWhitespace();
-                        // Remove leading newlines
-                        String cleanedPrefix = prefix.replaceFirst("^\\n+", "");
-                        imports.set(0, firstImport.withPrefix(firstImport.getPrefix().withWhitespace(cleanedPrefix)));
-                    }
-                    c = c.withImports(imports);
-                } else if (removedIndex >= 0) {
-                    // All imports removed
-                    c = c.withImports(imports);
-                }
-
-                return c;
-            }
-        };
-    }
-}
diff --git a/camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel421/RemoveZooWordEmbeddingPredictorImport.java b/camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel421/RemoveZooWordEmbeddingPredictorImport.java
deleted file mode 100644
index 3f23c54..0000000
--- a/camel-upgrade-recipes/src/main/java/org/apache/camel/upgrade/camel421/RemoveZooWordEmbeddingPredictorImport.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.upgrade.camel421;
-
-import org.openrewrite.ExecutionContext;
-import org.openrewrite.Recipe;
-import org.openrewrite.TreeVisitor;
-import org.openrewrite.java.JavaIsoVisitor;
-import org.openrewrite.java.tree.J;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class RemoveZooWordEmbeddingPredictorImport extends Recipe {
-
-    @Override
-    public String getDisplayName() {
-        return "Remove ZooWordEmbeddingPredictor import";
-    }
-
-    @Override
-    public String getDescription() {
-        return "Removes import for ZooWordEmbeddingPredictor which has been removed from camel-djl. The underlying MXNet engine is discontinued and the zoo model never loaded successfully.";
-    }
-
-    @Override
-    public TreeVisitor<?, ExecutionContext> getVisitor() {
-        return new JavaIsoVisitor<ExecutionContext>() {
-            @Override
-            public J.CompilationUnit visitCompilationUnit(J.CompilationUnit cu, ExecutionContext ctx) {
-                J.CompilationUnit c = super.visitCompilationUnit(cu, ctx);
-
-                // Find and remove the ZooWordEmbeddingPredictor import
-                List<J.Import> imports = new ArrayList<>(c.getImports());
-                int removedIndex = -1;
-                for (int i = 0; i < imports.size(); i++) {
-                    String importType = imports.get(i).getQualid().printTrimmed(getCursor());
-                    // The class could be in different packages, so we check the simple name
-                    if (importType.endsWith(".ZooWordEmbeddingPredictor")) {
-                        removedIndex = i;
-                        imports.remove(i);
-                        break;
-                    }
-                }
-
-                if (removedIndex >= 0 && !imports.isEmpty()) {
-                    // If we removed the first import and there are more imports,
-                    // clean up the prefix of the new first import
-                    if (removedIndex == 0) {
-                        J.Import firstImport = imports.get(0);
-                        String prefix = firstImport.getPrefix().getWhitespace();
-                        // Remove leading newlines
-                        String cleanedPrefix = prefix.replaceFirst("^\\n+", "");
-                        imports.set(0, firstImport.withPrefix(firstImport.getPrefix().withWhitespace(cleanedPrefix)));
-                    }
-                    c = c.withImports(imports);
-                } else if (removedIndex >= 0) {
-                    // All imports removed
-                    c = c.withImports(imports);
-                }
-
-                return c;
-            }
-        };
-    }
-}
diff --git a/camel-upgrade-recipes/src/main/resources/META-INF/rewrite/4.18.1.yaml b/camel-upgrade-recipes/src/main/resources/META-INF/rewrite/4.18.1.yaml
index 7f93e59..287dde4 100644
--- a/camel-upgrade-recipes/src/main/resources/META-INF/rewrite/4.18.1.yaml
+++ b/camel-upgrade-recipes/src/main/resources/META-INF/rewrite/4.18.1.yaml
@@ -37,8 +37,8 @@ name: org.apache.camel.upgrade.camel418_1.saga
 displayName: Migrate camel-sage model configuration
 description: The Saga EIP has fixed the model for how to configure completion and compensation URIs.
 recipeList:
-  - org.apache.camel.upgrade.camel419.XmlDsl419SagaRecipe
-  - org.apache.camel.upgrade.camel419.YamlDsl419SagaRecipe
+  - org.apache.camel.upgrade.camel418_1.XmlDsl418_1SagaRecipe
+  - org.apache.camel.upgrade.camel418_1.YamlDsl418_1SagaRecipe
   - org.apache.camel.upgrade.camel418_1.routePolicy
 ---
 ### https://camel.apache.org/manual/camel-4x-upgrade-guide-4_19.html#_camel_yaml_io_camel_xml_io
diff --git a/camel-upgrade-recipes/src/main/resources/META-INF/rewrite/4.18.3.yaml b/camel-upgrade-recipes/src/main/resources/META-INF/rewrite/4.18.3.yaml
index c06218d..ec74778 100644
--- a/camel-upgrade-recipes/src/main/resources/META-INF/rewrite/4.18.3.yaml
+++ b/camel-upgrade-recipes/src/main/resources/META-INF/rewrite/4.18.3.yaml
@@ -54,7 +54,7 @@ preconditions:
       groupIdPattern: org.apache.camel
       artifactIdPattern: camel-jgroups
 recipeList:
-  - org.apache.camel.upgrade.camel421.RenameHeaders:
+  - org.apache.camel.upgrade.camel418_3.RenameHeaders:
       headerMappings:
         JGROUPS_CHANNEL_ADDRESS: CamelJGroupsChannelAddress
         JGROUPS_DEST: CamelJGroupsDest
@@ -71,7 +71,7 @@ preconditions:
       groupIdPattern: org.apache.camel
       artifactIdPattern: camel-jira
 recipeList:
-  - org.apache.camel.upgrade.camel421.RenameHeaders:
+  - org.apache.camel.upgrade.camel418_3.RenameHeaders:
       headerMappings:
         IssueAssigneeId: CamelJiraIssueAssigneeId
         IssueAssignee: CamelJiraIssueAssignee
@@ -104,7 +104,7 @@ preconditions:
       groupIdPattern: org.apache.camel
       artifactIdPattern: camel-jgroups-raft
 recipeList:
-  - org.apache.camel.upgrade.camel421.RenameHeaders:
+  - org.apache.camel.upgrade.camel418_3.RenameHeaders:
       headerMappings:
         JGROUPSRAFT_LOG_SIZE: CamelJGroupsRaftLogSize
         JGROUPSRAFT_COMMIT_INDEX: CamelJGroupsRaftCommitIndex
@@ -129,7 +129,7 @@ preconditions:
       groupIdPattern: org.apache.camel
       artifactIdPattern: camel-shiro
 recipeList:
-  - org.apache.camel.upgrade.camel421.RenameHeaders:
+  - org.apache.camel.upgrade.camel418_3.RenameHeaders:
       headerMappings:
         SHIRO_SECURITY_TOKEN: CamelShiroSecurityToken
         SHIRO_SECURITY_USERNAME: CamelShiroSecurityUsername
@@ -145,7 +145,7 @@ preconditions:
       groupIdPattern: org.apache.camel
       artifactIdPattern: camel-solr
 recipeList:
-  - org.apache.camel.upgrade.camel421.RenameHeaderPrefixes:
+  - org.apache.camel.upgrade.camel418_3.RenameHeaderPrefixes:
       prefixMappings:
         SolrField.: CamelSolrField.
         SolrParam.: CamelSolrParam.
@@ -160,7 +160,7 @@ preconditions:
       groupIdPattern: org.apache.camel
       artifactIdPattern: camel-github2
 recipeList:
-  - org.apache.camel.upgrade.camel421.RenameHeaders:
+  - org.apache.camel.upgrade.camel418_3.RenameHeaders:
       headerMappings:
         GitHubPullRequest: CamelGitHubPullRequest
         GitHubInResponseTo: CamelGitHubInResponseTo
@@ -177,7 +177,7 @@ preconditions:
       groupIdPattern: org.apache.camel
       artifactIdPattern: camel-google-functions
 recipeList:
-  - org.apache.camel.upgrade.camel421.RenameHeaders:
+  - org.apache.camel.upgrade.camel418_3.RenameHeaders:
       headerMappings:
         GoogleCloudFunctionsOperation: CamelGoogleCloudFunctionsOperation
         GoogleCloudFunctionsEntryPoint: CamelGoogleCloudFunctionsEntryPoint
@@ -195,7 +195,7 @@ preconditions:
       groupIdPattern: org.apache.camel
       artifactIdPattern: camel-google-secret-manager
 recipeList:
-  - org.apache.camel.upgrade.camel421.RenameHeaders:
+  - org.apache.camel.upgrade.camel418_3.RenameHeaders:
       headerMappings:
         GoogleSecretManagerOperation: CamelGoogleSecretManagerOperation
 ---
@@ -209,7 +209,7 @@ preconditions:
       groupIdPattern: org.apache.camel
       artifactIdPattern: camel-mongodb-gridfs
 recipeList:
-  - org.apache.camel.upgrade.camel421.RenameHeaders:
+  - org.apache.camel.upgrade.camel418_3.RenameHeaders:
       headerMappings:
         gridfs.operation: CamelGridFsOperation
         gridfs.metadata: CamelGridFsMetadata
@@ -227,7 +227,7 @@ preconditions:
       groupIdPattern: org.apache.camel
       artifactIdPattern: camel-lucene
 recipeList:
-  - org.apache.camel.upgrade.camel421.RenameHeaders:
+  - org.apache.camel.upgrade.camel418_3.RenameHeaders:
       headerMappings:
         RETURN_LUCENE_DOCS: CamelLuceneReturnLuceneDocs
 ---
@@ -241,7 +241,7 @@ preconditions:
       groupIdPattern: org.apache.camel
       artifactIdPattern: camel-openstack
 recipeList:
-  - org.apache.camel.upgrade.camel421.RenameHeaders:
+  - org.apache.camel.upgrade.camel418_3.RenameHeaders:
       headerMappings:
         FlavorId: CamelOpenstackNovaFlavorId
         RAM: CamelOpenstackNovaRam
@@ -278,7 +278,7 @@ preconditions:
       groupIdPattern: org.apache.camel
       artifactIdPattern: camel-web3j
 recipeList:
-  - org.apache.camel.upgrade.camel421.RenameHeaders:
+  - org.apache.camel.upgrade.camel418_3.RenameHeaders:
       headerMappings:
         AT_BLOCK: CamelWeb3jAtBlock
         FROM_ADDRESS: CamelWeb3jFromAddress
diff --git a/camel-upgrade-recipes/src/main/resources/META-INF/rewrite/4.18.yaml b/camel-upgrade-recipes/src/main/resources/META-INF/rewrite/4.18.yaml
index 2020733..45b88dd 100644
--- a/camel-upgrade-recipes/src/main/resources/META-INF/rewrite/4.18.yaml
+++ b/camel-upgrade-recipes/src/main/resources/META-INF/rewrite/4.18.yaml
@@ -52,7 +52,7 @@ preconditions:
       groupIdPattern: org.apache.camel
       artifactIdPattern: camel-kafka
 recipeList:
-  - org.apache.camel.upgrade.camel421.RenameHeaders:
+  - org.apache.camel.upgrade.camel418_3.RenameHeaders:
       headerMappings:
         kafka.PARTITION_KEY: CamelKafkaPartitionKey
         kafka.PARTITION: CamelKafkaPartition
@@ -77,7 +77,7 @@ preconditions:
       groupIdPattern: org.apache.camel
       artifactIdPattern: camel-dns
 recipeList:
-  - org.apache.camel.upgrade.camel421.RenameHeaders:
+  - org.apache.camel.upgrade.camel418_3.RenameHeaders:
       headerMappings:
         dns.class: CamelDnsClass
         dns.name: CamelDnsName
@@ -96,7 +96,7 @@ preconditions:
       groupIdPattern: org.apache.camel
       artifactIdPattern: camel-salesforce
 recipeList:
-  - org.apache.camel.upgrade.camel421.RenameHeaders:
+  - org.apache.camel.upgrade.camel418_3.RenameHeaders:
       headerMappings:
         sObjectName: CamelSalesforceSObjectName
         sObjectId: CamelSalesforceSObjectId
@@ -114,6 +114,6 @@ recipeList:
         pkChunkingChunkSize: CamelSalesforcePkChunkingChunkSize
         pkChunkingParent: CamelSalesforcePkChunkingParent
         pkChunkingStartRow: CamelSalesforcePkChunkingStartRow
-  - org.apache.camel.upgrade.camel421.RenameHeaderPrefixes:
+  - org.apache.camel.upgrade.camel418_3.RenameHeaderPrefixes:
       prefixMappings:
         apexQueryParam.: CamelSalesforceApexQueryParam.
diff --git a/camel-upgrade-recipes/src/main/resources/META-INF/rewrite/4.21.yaml b/camel-upgrade-recipes/src/main/resources/META-INF/rewrite/4.21.yaml
index 2606659..959421f 100644
--- a/camel-upgrade-recipes/src/main/resources/META-INF/rewrite/4.21.yaml
+++ b/camel-upgrade-recipes/src/main/resources/META-INF/rewrite/4.21.yaml
@@ -57,8 +57,6 @@ recipeList:
   - org.apache.camel.upgrade.camel421.upgradeMiloHeaders
   - org.apache.camel.upgrade.camel421.upgradeOpensearchHeaders
   - org.apache.camel.upgrade.camel421.upgradeIrcHeaders
-  - org.apache.camel.upgrade.camel421.RemoveReifierStrategyImport
-  - org.apache.camel.upgrade.camel421.RemoveZooWordEmbeddingPredictorImport
   - org.apache.camel.upgrade.camel421.removeCamelStompDependency
   - org.apache.camel.upgrade.camel421.removeCamelAwsXrayDependency
   - org.apache.camel.upgrade.camel421.removeCamelGuavaEventbusDependency
@@ -78,7 +76,7 @@ preconditions:
       groupIdPattern: org.apache.camel
       artifactIdPattern: camel-kafka
 recipeList:
-  - org.apache.camel.upgrade.camel421.RenameHeaders:
+  - org.apache.camel.upgrade.camel418_3.RenameHeaders:
       headerMappings:
         kafka.PARTITION_KEY: CamelKafkaPartitionKey
         kafka.PARTITION: CamelKafkaPartition
@@ -103,7 +101,7 @@ preconditions:
       groupIdPattern: org.apache.camel
       artifactIdPattern: camel-dns
 recipeList:
-  - org.apache.camel.upgrade.camel421.RenameHeaders:
+  - org.apache.camel.upgrade.camel418_3.RenameHeaders:
       headerMappings:
         dns.class: CamelDnsClass
         dns.name: CamelDnsName
@@ -122,7 +120,7 @@ preconditions:
       groupIdPattern: org.apache.camel
       artifactIdPattern: camel-couchdb
 recipeList:
-  - org.apache.camel.upgrade.camel421.RenameHeaders:
+  - org.apache.camel.upgrade.camel418_3.RenameHeaders:
       headerMappings:
         CouchDbDatabase: CamelCouchDbDatabase
         CouchDbSeq: CamelCouchDbSeq
@@ -140,7 +138,7 @@ preconditions:
       groupIdPattern: org.apache.camel
       artifactIdPattern: camel-couchbase
 recipeList:
-  - org.apache.camel.upgrade.camel421.RenameHeaders:
+  - org.apache.camel.upgrade.camel418_3.RenameHeaders:
       headerMappings:
         CCB_KEY: CamelCouchbaseKey
         CCB_ID: CamelCouchbaseId
@@ -158,7 +156,7 @@ preconditions:
       groupIdPattern: org.apache.camel
       artifactIdPattern: camel-github
 recipeList:
-  - org.apache.camel.upgrade.camel421.RenameHeaders:
+  - org.apache.camel.upgrade.camel418_3.RenameHeaders:
       headerMappings:
         GitHubPullRequest: CamelGitHubPullRequest
         GitHubInResponseTo: CamelGitHubInResponseTo
@@ -175,7 +173,7 @@ preconditions:
       groupIdPattern: org.apache.camel
       artifactIdPattern: camel-google-vision
 recipeList:
-  - org.apache.camel.upgrade.camel421.RenameHeaders:
+  - org.apache.camel.upgrade.camel418_3.RenameHeaders:
       headerMappings:
         GoogleCloudVisionOperation: CamelGoogleCloudVisionOperation
         GoogleCloudVisionResponseObject: CamelGoogleCloudVisionResponseObject
@@ -190,7 +188,7 @@ preconditions:
       groupIdPattern: org.apache.camel
       artifactIdPattern: camel-google-text-to-speech
 recipeList:
-  - org.apache.camel.upgrade.camel421.RenameHeaders:
+  - org.apache.camel.upgrade.camel418_3.RenameHeaders:
       headerMappings:
         GoogleCloudTextToSpeechOperation: CamelGoogleCloudTextToSpeechOperation
         GoogleCloudTextToSpeechResponseObject: CamelGoogleCloudTextToSpeechResponseObject
@@ -205,7 +203,7 @@ preconditions:
       groupIdPattern: org.apache.camel
       artifactIdPattern: camel-google-speech-to-text
 recipeList:
-  - org.apache.camel.upgrade.camel421.RenameHeaders:
+  - org.apache.camel.upgrade.camel418_3.RenameHeaders:
       headerMappings:
         GoogleCloudSpeechToTextOperation: CamelGoogleCloudSpeechToTextOperation
         GoogleCloudSpeechToTextResponseObject: CamelGoogleCloudSpeechToTextResponseObject
@@ -220,7 +218,7 @@ preconditions:
       groupIdPattern: org.apache.camel
       artifactIdPattern: camel-irc
 recipeList:
-  - org.apache.camel.upgrade.camel421.RenameHeaders:
+  - org.apache.camel.upgrade.camel418_3.RenameHeaders:
       headerMappings:
         irc.messageType: CamelIrcMessageType
         irc.target: CamelIrcTarget
@@ -243,7 +241,7 @@ preconditions:
       groupIdPattern: org.apache.camel
       artifactIdPattern: camel-pdf
 recipeList:
-  - org.apache.camel.upgrade.camel421.RenameHeaders:
+  - org.apache.camel.upgrade.camel418_3.RenameHeaders:
       headerMappings:
         protection-policy: CamelPdfProtectionPolicy
         pdf-document: CamelPdfDocument
@@ -260,7 +258,7 @@ preconditions:
       groupIdPattern: org.apache.camel
       artifactIdPattern: camel-arangodb
 recipeList:
-  - org.apache.camel.upgrade.camel421.RenameHeaders:
+  - org.apache.camel.upgrade.camel418_3.RenameHeaders:
       headerMappings:
         key: CamelArangoDbKey
         ResultClassType: CamelArangoDbResultClassType
@@ -275,7 +273,7 @@ preconditions:
       groupIdPattern: org.apache.camel
       artifactIdPattern: camel-jt400
 recipeList:
-  - org.apache.camel.upgrade.camel421.RenameHeaders:
+  - org.apache.camel.upgrade.camel418_3.RenameHeaders:
       headerMappings:
         KEY: CamelJt400Key
         SENDER_INFORMATION: CamelJt400SenderInformation
@@ -290,7 +288,7 @@ preconditions:
       groupIdPattern: org.apache.camel
       artifactIdPattern: camel-mail
 recipeList:
-  - org.apache.camel.upgrade.camel421.RenameHeaders:
+  - org.apache.camel.upgrade.camel418_3.RenameHeaders:
       headerMappings:
         copyTo: CamelMailCopyTo
         moveTo: CamelMailMoveTo
@@ -306,7 +304,7 @@ preconditions:
       groupIdPattern: org.apache.camel
       artifactIdPattern: camel-milo
 recipeList:
-  - org.apache.camel.upgrade.camel421.RenameHeaders:
+  - org.apache.camel.upgrade.camel418_3.RenameHeaders:
       headerMappings:
         await: CamelMiloAwait
 ---
@@ -320,7 +318,7 @@ preconditions:
       groupIdPattern: org.apache.camel
       artifactIdPattern: camel-opensearch
 recipeList:
-  - org.apache.camel.upgrade.camel421.RenameHeaders:
+  - org.apache.camel.upgrade.camel418_3.RenameHeaders:
       headerMappings:
         operation: CamelOpensearchOperation
         indexId: CamelOpensearchIndexId
diff --git a/camel-upgrade-recipes/src/main/resources/META-INF/rewrite/examples.yml b/camel-upgrade-recipes/src/main/resources/META-INF/rewrite/examples.yml
index d2aeab9..9d27753 100644
--- a/camel-upgrade-recipes/src/main/resources/META-INF/rewrite/examples.yml
+++ b/camel-upgrade-recipes/src/main/resources/META-INF/rewrite/examples.yml
@@ -1,6 +1,6 @@
 ---
 type: specs.openrewrite.org/v1beta/example
-recipeName: org.apache.camel.upgrade.camel421.RenameHeaderInJavaMethod
+recipeName: org.apache.camel.upgrade.camel418_3.RenameHeaderInJavaMethod
 examples:
 - description: ''
   parameters:
@@ -26,7 +26,7 @@ examples:
     language: java
 ---
 type: specs.openrewrite.org/v1beta/example
-recipeName: org.apache.camel.upgrade.camel421.RenameHeaderInSimpleExpression
+recipeName: org.apache.camel.upgrade.camel418_3.RenameHeaderInSimpleExpression
 examples:
 - description: ''
   parameters:
@@ -54,7 +54,7 @@ examples:
     language: java
 ---
 type: specs.openrewrite.org/v1beta/example
-recipeName: org.apache.camel.upgrade.camel421.RenameHeaderInXmlDsl
+recipeName: org.apache.camel.upgrade.camel418_3.RenameHeaderInXmlDsl
 examples:
 - description: ''
   parameters:
@@ -78,7 +78,7 @@ examples:
     language: xml
 ---
 type: specs.openrewrite.org/v1beta/example
-recipeName: org.apache.camel.upgrade.camel421.RenameHeaderInYamlDsl
+recipeName: org.apache.camel.upgrade.camel418_3.RenameHeaderInYamlDsl
 examples:
 - description: ''
   parameters:
@@ -104,7 +104,7 @@ examples:
     language: yaml
 ---
 type: specs.openrewrite.org/v1beta/example
-recipeName: org.apache.camel.upgrade.camel421.RenameHeaderPrefixInJavaMethod
+recipeName: org.apache.camel.upgrade.camel418_3.RenameHeaderPrefixInJavaMethod
 examples:
 - description: ''
   parameters:
@@ -132,7 +132,7 @@ examples:
     language: java
 ---
 type: specs.openrewrite.org/v1beta/example
-recipeName: org.apache.camel.upgrade.camel421.RenameHeaderPrefixInSimpleExpression
+recipeName: org.apache.camel.upgrade.camel418_3.RenameHeaderPrefixInSimpleExpression
 examples:
 - description: ''
   parameters:
@@ -160,7 +160,7 @@ examples:
     language: java
 ---
 type: specs.openrewrite.org/v1beta/example
-recipeName: org.apache.camel.upgrade.camel421.RenameHeaderPrefixInXmlDsl
+recipeName: org.apache.camel.upgrade.camel418_3.RenameHeaderPrefixInXmlDsl
 examples:
 - description: ''
   parameters:
@@ -184,7 +184,7 @@ examples:
     language: xml
 ---
 type: specs.openrewrite.org/v1beta/example
-recipeName: org.apache.camel.upgrade.camel421.RenameHeaderPrefixInYamlDsl
+recipeName: org.apache.camel.upgrade.camel418_3.RenameHeaderPrefixInYamlDsl
 examples:
 - description: ''
   parameters:
@@ -210,7 +210,7 @@ examples:
     language: yaml
 ---
 type: specs.openrewrite.org/v1beta/example
-recipeName: org.apache.camel.upgrade.camel421.RenameHeaders
+recipeName: org.apache.camel.upgrade.camel418_3.RenameHeaders
 examples:
 - description: ''
   parameters:
diff --git a/camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/CamelUpdate421Test.java b/camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/CamelUpdate421Test.java
index 34a9ae1..ccaa588 100644
--- a/camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/CamelUpdate421Test.java
+++ b/camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/CamelUpdate421Test.java
@@ -17,7 +17,6 @@
 package org.apache.camel.upgrade;
 
 import org.junit.jupiter.api.Test;
-import org.openrewrite.DocumentExample;
 import org.openrewrite.test.RecipeSpec;
 import org.openrewrite.test.RewriteTest;
 import org.openrewrite.test.TypeValidation;
@@ -43,35 +42,6 @@ public class CamelUpdate421Test implements RewriteTest {
                 .expectedCyclesThatMakeChanges(1);
     }
 
-    @DocumentExample
-    @Test
-    void removeReifierStrategyImport() {
-        //language=java
-        rewriteRun(
-                java(
-                """
-                import org.apache.camel.builder.RouteBuilder;
-                import org.apache.camel.spi.ReifierStrategy;
-
-                class Test extends RouteBuilder {
-                    public void configure() {
-                        from("direct:start").to("log:test");
-                    }
-                }
-                """,
-                """
-                import org.apache.camel.builder.RouteBuilder;
-
-                class Test extends RouteBuilder {
-                    public void configure() {
-                        from("direct:start").to("log:test");
-                    }
-                }
-                """
-                )
-        );
-    }
-
     @Test
     void jGroupsHeadersMigration() {
         new CamelUpdate418_3Test().jGroupsHeadersMigration();
@@ -281,34 +251,6 @@ public class CamelUpdate421Test implements RewriteTest {
         ));
     }
 
-    @Test
-    void removeZooWordEmbeddingPredictorImport() {
-        //language=java
-        rewriteRun(
-                java(
-                """
-                import org.apache.camel.builder.RouteBuilder;
-                import org.apache.camel.component.djl.model.nlp.ZooWordEmbeddingPredictor;
-
-                class Test extends RouteBuilder {
-                    public void configure() {
-                        from("direct:start").to("log:test");
-                    }
-                }
-                """,
-                """
-                import org.apache.camel.builder.RouteBuilder;
-
-                class Test extends RouteBuilder {
-                    public void configure() {
-                        from("direct:start").to("log:test");
-                    }
-                }
-                """
-                )
-        );
-    }
-
     @Test
     void luceneHeadersMigrationJava() {
         new CamelUpdate418_3Test().luceneHeadersMigrationJava();
diff --git a/camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/camel421/RenameHeaderInJavaMethodTest.java b/camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/camel418_3/RenameHeaderInJavaMethodTest.java
similarity index 99%
rename from camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/camel421/RenameHeaderInJavaMethodTest.java
rename to camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/camel418_3/RenameHeaderInJavaMethodTest.java
index b92a04c..ea0e286 100644
--- a/camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/camel421/RenameHeaderInJavaMethodTest.java
+++ b/camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/camel418_3/RenameHeaderInJavaMethodTest.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.upgrade.camel421;
+package org.apache.camel.upgrade.camel418_3;
 
 import org.apache.camel.upgrade.CamelTestUtil;
 import org.junit.jupiter.api.Test;
diff --git a/camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/camel421/RenameHeaderInSimpleExpressionTest.java b/camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/camel418_3/RenameHeaderInSimpleExpressionTest.java
similarity index 99%
rename from camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/camel421/RenameHeaderInSimpleExpressionTest.java
rename to camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/camel418_3/RenameHeaderInSimpleExpressionTest.java
index 4635472..b41ecdf 100644
--- a/camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/camel421/RenameHeaderInSimpleExpressionTest.java
+++ b/camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/camel418_3/RenameHeaderInSimpleExpressionTest.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.upgrade.camel421;
+package org.apache.camel.upgrade.camel418_3;
 
 import org.apache.camel.upgrade.CamelTestUtil;
 import org.junit.jupiter.api.Test;
diff --git a/camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/camel421/RenameHeaderInXmlDslTest.java b/camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/camel418_3/RenameHeaderInXmlDslTest.java
similarity index 99%
rename from camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/camel421/RenameHeaderInXmlDslTest.java
rename to camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/camel418_3/RenameHeaderInXmlDslTest.java
index 322592e..a57d7fd 100644
--- a/camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/camel421/RenameHeaderInXmlDslTest.java
+++ b/camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/camel418_3/RenameHeaderInXmlDslTest.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.upgrade.camel421;
+package org.apache.camel.upgrade.camel418_3;
 
 import org.junit.jupiter.api.Test;
 import org.openrewrite.DocumentExample;
diff --git a/camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/camel421/RenameHeaderInYamlDslTest.java b/camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/camel418_3/RenameHeaderInYamlDslTest.java
similarity index 99%
rename from camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/camel421/RenameHeaderInYamlDslTest.java
rename to camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/camel418_3/RenameHeaderInYamlDslTest.java
index a9fd6db..242daa9 100644
--- a/camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/camel421/RenameHeaderInYamlDslTest.java
+++ b/camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/camel418_3/RenameHeaderInYamlDslTest.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.upgrade.camel421;
+package org.apache.camel.upgrade.camel418_3;
 
 import org.junit.jupiter.api.Test;
 import org.openrewrite.DocumentExample;
diff --git a/camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/camel421/RenameHeaderPrefixInJavaMethodTest.java b/camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/camel418_3/RenameHeaderPrefixInJavaMethodTest.java
similarity index 99%
rename from camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/camel421/RenameHeaderPrefixInJavaMethodTest.java
rename to camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/camel418_3/RenameHeaderPrefixInJavaMethodTest.java
index 14befa2..5d7ceed 100644
--- a/camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/camel421/RenameHeaderPrefixInJavaMethodTest.java
+++ b/camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/camel418_3/RenameHeaderPrefixInJavaMethodTest.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.upgrade.camel421;
+package org.apache.camel.upgrade.camel418_3;
 
 import org.apache.camel.upgrade.CamelTestUtil;
 import org.junit.jupiter.api.Test;
diff --git a/camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/camel421/RenameHeaderPrefixInSimpleExpressionTest.java b/camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/camel418_3/RenameHeaderPrefixInSimpleExpressionTest.java
similarity index 99%
rename from camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/camel421/RenameHeaderPrefixInSimpleExpressionTest.java
rename to camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/camel418_3/RenameHeaderPrefixInSimpleExpressionTest.java
index a4cb3f6..4c240dc 100644
--- a/camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/camel421/RenameHeaderPrefixInSimpleExpressionTest.java
+++ b/camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/camel418_3/RenameHeaderPrefixInSimpleExpressionTest.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.upgrade.camel421;
+package org.apache.camel.upgrade.camel418_3;
 
 import org.apache.camel.upgrade.CamelTestUtil;
 import org.junit.jupiter.api.Test;
diff --git a/camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/camel421/RenameHeaderPrefixInXmlDslTest.java b/camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/camel418_3/RenameHeaderPrefixInXmlDslTest.java
similarity index 99%
rename from camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/camel421/RenameHeaderPrefixInXmlDslTest.java
rename to camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/camel418_3/RenameHeaderPrefixInXmlDslTest.java
index 95910e7..d2c1310 100644
--- a/camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/camel421/RenameHeaderPrefixInXmlDslTest.java
+++ b/camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/camel418_3/RenameHeaderPrefixInXmlDslTest.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.upgrade.camel421;
+package org.apache.camel.upgrade.camel418_3;
 
 import org.junit.jupiter.api.Test;
 import org.openrewrite.DocumentExample;
diff --git a/camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/camel421/RenameHeaderPrefixInYamlDslTest.java b/camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/camel418_3/RenameHeaderPrefixInYamlDslTest.java
similarity index 99%
rename from camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/camel421/RenameHeaderPrefixInYamlDslTest.java
rename to camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/camel418_3/RenameHeaderPrefixInYamlDslTest.java
index 454ef01..77b64d1 100644
--- a/camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/camel421/RenameHeaderPrefixInYamlDslTest.java
+++ b/camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/camel418_3/RenameHeaderPrefixInYamlDslTest.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.upgrade.camel421;
+package org.apache.camel.upgrade.camel418_3;
 
 import org.junit.jupiter.api.Test;
 import org.openrewrite.DocumentExample;
diff --git a/camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/camel421/RenameHeadersTest.java b/camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/camel418_3/RenameHeadersTest.java
similarity index 98%
rename from camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/camel421/RenameHeadersTest.java
rename to camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/camel418_3/RenameHeadersTest.java
index 65e7851..b530588 100644
--- a/camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/camel421/RenameHeadersTest.java
+++ b/camel-upgrade-recipes/src/test/java/org/apache/camel/upgrade/camel418_3/RenameHeadersTest.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.upgrade.camel421;
+package org.apache.camel.upgrade.camel418_3;
 
 import org.apache.camel.upgrade.CamelTestUtil;
 import org.junit.jupiter.api.Test;
diff --git a/release_notes.adoc b/release_notes.adoc
index c76dcaa..00a3363 100644
--- a/release_notes.adoc
+++ b/release_notes.adoc
@@ -34,7 +34,7 @@ The following table lists migration topics and indicates the level of coverage (
 | https://camel.apache.org/manual/camel-4x-upgrade-guide-4_21.html#virtual-threads[Virtual Threads maxQueueSize Honored] | ❌ None | Runtime behavior change
 | https://camel.apache.org/manual/camel-4x-upgrade-guide-4_21.html#new-block-rejected-policy[New Block Rejected Policy] | ❌ None | New feature
 | https://camel.apache.org/manual/camel-4x-upgrade-guide-4_21.html#java-serialization[Java Serialization Type Converters Removed] | ❌ None | Removal without replacement
-| https://camel.apache.org/manual/camel-4x-upgrade-guide-4_21.html#reifierstrategy[ReifierStrategy SPI Removed] | ✅ Full | Import removal automated for `org.apache.camel.spi.ReifierStrategy`
+| https://camel.apache.org/manual/camel-4x-upgrade-guide-4_21.html#reifierstrategy[ReifierStrategy SPI Removed] | ❌ None | Class `org.apache.camel.spi.ReifierStrategy` was removed with no replacement
 | https://camel.apache.org/manual/camel-4x-upgrade-guide-4_21.html#namednode-getchildren-method[NamedNode.getChildren() Method] | ❌ None | New method (additive)
 | https://camel.apache.org/manual/camel-4x-upgrade-guide-4_21.html#namednode-level[NamedNode Level Calculation Changed] | ❌ None | Runtime behavior change
 | https://camel.apache.org/manual/camel-4x-upgrade-guide-4_21.html#camel-jbang[camel-jbang] | ❌ None | CLI runtime behavior
@@ -52,7 +52,7 @@ The following table lists migration topics and indicates the level of coverage (
 | https://camel.apache.org/manual/camel-4x-upgrade-guide-4_21.html#camel-github-removal[camel-github Removed] | ✅ Full | Automated removal of `org.apache.camel:camel-github` dependency. Migration to `camel-github2` was automated in 4.18.3 (see 4.18.3 section below).
 | https://camel.apache.org/manual/camel-4x-upgrade-guide-4_21.html#camel-telemetry[camel-telemetry Processor Span Changes] | ❌ None | Interface signature changed
 | https://camel.apache.org/manual/camel-4x-upgrade-guide-4_21.html#camel-opentelemetry2[camel-opentelemetry2 Scope Management] | ❌ None | Internal implementation change
-| https://camel.apache.org/manual/camel-4x-upgrade-guide-4_21.html#camel-djl[camel-djl Word Embedding Removed] | ✅ Full | Import removal automated for `ZooWordEmbeddingPredictor`
+| https://camel.apache.org/manual/camel-4x-upgrade-guide-4_21.html#camel-djl[camel-djl Word Embedding Removed] | ❌ None | Class `ZooWordEmbeddingPredictor` was removed with no replacement
 | https://camel.apache.org/manual/camel-4x-upgrade-guide-4_21.html#camel-aws-bedrock[camel-aws-bedrock Guardrail Header] | ❌ None | New optional feature
 | https://camel.apache.org/manual/camel-4x-upgrade-guide-4_21.html#camel-jgroups-potential-breaking-change[camel-jgroups Headers] | ⚠️ Partial | Only basic header usage is migrated. Automated for `.setHeader()` and Simple expressions. Dynamic headers and Map operations require manual review.
 | https://camel.apache.org/manual/camel-4x-upgrade-guide-4_21.html#camel-elasticsearch-rest-client[camel-elasticsearch-rest-client Headers] | ❌ None | Header values are too common, automatic upgrade is complicated.