Skip to content
Merged
30 changes: 30 additions & 0 deletions migration/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# Migration

Module containing [OpenRewrite](https://docs.openrewrite.org/) recipes for migrating Axon Framework applications.

## Migrate to Axon Framework 4.7 Javax

### Maven

```bash
mvn -U org.openrewrite.maven:rewrite-maven-plugin:run \
-Drewrite.recipeArtifactCoordinates=org.axonframework:axon-migration:LATEST \
-DactiveRecipes=org.axonframework.axon.UpgradeAxonFramework_4_7_Javax
```

#### Gradle

Requires a custom [Gradle init script](https://docs.openrewrite.org/running-recipes/running-rewrite-on-a-gradle-project-without-modifying-the-build).

## Migrate to Axon Framework 4.7 Jakarta

### Maven
```bash
mvn -U org.openrewrite.maven:rewrite-maven-plugin:run \
-Drewrite.recipeArtifactCoordinates=org.axonframework:axon-migration:4.7.2-SNAPSHOT \
-DactiveRecipes=org.axonframework.axon.UpgradeAxonFramework_4_7_Jakarta
```

#### Gradle

Requires a custom [Gradle init script](https://docs.openrewrite.org/running-recipes/running-rewrite-on-a-gradle-project-without-modifying-the-build).
54 changes: 54 additions & 0 deletions migration/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
~ Copyright (c) 2010-2023. Axon Framework
~
~ Licensed 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.
-->

<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.axonframework</groupId>
<artifactId>axon</artifactId>
<version>4.7.2-SNAPSHOT</version>
</parent>

<artifactId>axon-migration</artifactId>

<name>Axon Framework - Migration</name>
<description>
Module containing OpenRewrite migration recipes.
</description>

<dependencies>
<dependency>
<groupId>org.axonframework</groupId>
<artifactId>axon-messaging</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.openrewrite.recipe</groupId>
<artifactId>rewrite-migrate-java</artifactId>
<version>1.16.0</version>
</dependency>
<dependency>
<groupId>org.openrewrite</groupId>
<artifactId>rewrite-test</artifactId>
<version>7.35.0</version>
<scope>test</scope>
</dependency>
</dependencies>

</project>
74 changes: 74 additions & 0 deletions migration/src/main/resources/META-INF/rewrite/axon-jakarta-47.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
type: specs.openrewrite.org/v1beta/recipe
name: org.axonframework.migration.UpgradeAxonFramework_4_7_Jakarta
displayName: Upgrade to Axonframework 4.7 Jakarta
description: Migration file to upgrade from an Axon Framework Javax-specific project to Jakarta.
recipeList:
# Include the Jakarta migration recipe
- org.openrewrite.java.migrate.jakarta.JavaxMigrationToJakarta
# Swap 4.6 dependencies for 4.7 dependencies
- org.openrewrite.maven.ChangeDependencyGroupIdAndArtifactId:
oldGroupId: org.axonframework
oldArtifactId: axon-configuration-jakarta
newArtifactId: axon-configuration
newVersion: 4.7.x
- org.openrewrite.maven.ChangeDependencyGroupIdAndArtifactId:
oldGroupId: org.axonframework
oldArtifactId: axon-eventsourcing-jakarta
newArtifactId: axon-eventsourcing
newVersion: 4.7.x
- org.openrewrite.maven.ChangeDependencyGroupIdAndArtifactId:
oldGroupId: org.axonframework
oldArtifactId: axon-messaging-jakarta
newArtifactId: axon-messaging
newVersion: 4.7.x
- org.openrewrite.maven.ChangeDependencyGroupIdAndArtifactId:
oldGroupId: org.axonframework
oldArtifactId: axon-modelling-jakarta
newArtifactId: axon-modelling
newVersion: 4.7.x
# Convert legacy JPA packages to Jakarta JPA packages
- org.openrewrite.java.ChangePackage:
oldPackageName: org.axonframework.common.legacyjpa
newPackageName: org.axonframework.common.jpa
- org.openrewrite.java.ChangeType:
oldFullyQualifiedTypeName: org.axonframework.eventhandling.deadletter.legacyjpa.DeadLetterJpaConverter
newFullyQualifiedTypeName: org.axonframework.eventhandling.deadletter.jpa.DeadLetterJpaConverter
- org.openrewrite.java.ChangeType:
oldFullyQualifiedTypeName: org.axonframework.eventhandling.deadletter.legacyjpa.EventMessageDeadLetterJpaConverter
newFullyQualifiedTypeName: org.axonframework.eventhandling.deadletter.jpa.EventMessageDeadLetterJpaConverter
- org.openrewrite.java.ChangeType:
oldFullyQualifiedTypeName: org.axonframework.eventhandling.deadletter.legacyjpa.JpaDeadLetter
newFullyQualifiedTypeName: org.axonframework.eventhandling.deadletter.jpa.JpaDeadLetter
- org.openrewrite.java.ChangeType:
oldFullyQualifiedTypeName: org.axonframework.eventhandling.deadletter.legacyjpa.JpaSequencedDeadLetterQueue
newFullyQualifiedTypeName: org.axonframework.eventhandling.deadletter.jpa.JpaSequencedDeadLetterQueue
- org.openrewrite.java.ChangeType:
oldFullyQualifiedTypeName: org.axonframework.eventhandling.tokenstore.legacyjpa.JpaTokenStore
newFullyQualifiedTypeName: org.axonframework.eventhandling.tokenstore.jpa.JpaTokenStore
- org.openrewrite.java.ChangeType:
oldFullyQualifiedTypeName: org.axonframework.eventsourcing.eventstore.legacyjpa.JpaEventStorageEngine
newFullyQualifiedTypeName: org.axonframework.eventsourcing.eventstore.jpa.JpaEventStorageEngine
- org.openrewrite.java.ChangeType:
oldFullyQualifiedTypeName: org.axonframework.eventsourcing.eventstore.legacyjpa.SQLErrorCodesResolver
newFullyQualifiedTypeName: org.axonframework.eventsourcing.eventstore.jpa.SQLErrorCodesResolver
- org.openrewrite.java.ChangeType:
oldFullyQualifiedTypeName: org.axonframework.messaging.interceptors.legacyvalidation.BeanValidationInterceptor
newFullyQualifiedTypeName: org.axonframework.messaging.interceptors.BeanValidationInterceptor
- org.openrewrite.java.ChangeType:
oldFullyQualifiedTypeName: org.axonframework.messaging.interceptors.legacyvalidation.JSR303ViolationException
newFullyQualifiedTypeName: org.axonframework.messaging.interceptors.JSR303ViolationException
- org.openrewrite.java.ChangeType:
oldFullyQualifiedTypeName: org.axonframework.modelling.command.legacyjpa.GenericJpaRepository
newFullyQualifiedTypeName: org.axonframework.modelling.command.GenericJpaRepository
- org.openrewrite.java.ChangeType:
oldFullyQualifiedTypeName: org.axonframework.modelling.saga.repository.legacyjpa.JpaSagaStore
newFullyQualifiedTypeName: org.axonframework.modelling.saga.repository.jpa.JpaSagaStore
- org.openrewrite.java.ChangeType:
oldFullyQualifiedTypeName: org.axonframework.springboot.autoconfig.legacyjpa.JpaJavaxAutoConfiguration
newFullyQualifiedTypeName: org.axonframework.springboot.autoconfig.JpaAutoConfiguration
- org.openrewrite.java.ChangeType:
oldFullyQualifiedTypeName: org.axonframework.springboot.autoconfig.legacyjpa.JpaJavaxEventStoreAutoConfiguration
newFullyQualifiedTypeName: org.axonframework.springboot.autoconfig.JpaEventStoreAutoConfiguration
- org.openrewrite.java.ChangeType:
oldFullyQualifiedTypeName: org.axonframework.springboot.util.legacyjpa.ContainerManagedEntityManagerProvider
newFullyQualifiedTypeName: org.axonframework.springboot.util.jpa.ContainerManagedEntityManagerProvider
52 changes: 52 additions & 0 deletions migration/src/main/resources/META-INF/rewrite/axon-javax-47.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
type: specs.openrewrite.org/v1beta/recipe
name: org.axonframework.migration.UpgradeAxonFramework_4_7_Javax
displayName: Upgrade to Axonframework 4.7 Javax
description: Migration file to upgrade an Axon Framework Javax-specific project and remain on Javax.
recipeList:
# Move all classes from org.axonframework.common.jpa to org.axonframework.common.legacyjpa
- org.openrewrite.java.ChangePackage:
oldPackageName: org.axonframework.common.jpa
newPackageName: org.axonframework.common.legacyjpa
# Move selected classes
- org.openrewrite.java.ChangeType:
oldFullyQualifiedTypeName: org.axonframework.eventhandling.deadletter.jpa.DeadLetterJpaConverter
newFullyQualifiedTypeName: org.axonframework.eventhandling.deadletter.legacyjpa.DeadLetterJpaConverter
- org.openrewrite.java.ChangeType:
oldFullyQualifiedTypeName: org.axonframework.eventhandling.deadletter.jpa.EventMessageDeadLetterJpaConverter
newFullyQualifiedTypeName: org.axonframework.eventhandling.deadletter.legacyjpa.EventMessageDeadLetterJpaConverter
- org.openrewrite.java.ChangeType:
oldFullyQualifiedTypeName: org.axonframework.eventhandling.deadletter.jpa.JpaDeadLetter
newFullyQualifiedTypeName: org.axonframework.eventhandling.deadletter.legacyjpa.JpaDeadLetter
- org.openrewrite.java.ChangeType:
oldFullyQualifiedTypeName: org.axonframework.eventhandling.deadletter.jpa.JpaSequencedDeadLetterQueue
newFullyQualifiedTypeName: org.axonframework.eventhandling.deadletter.legacyjpa.JpaSequencedDeadLetterQueue
- org.openrewrite.java.ChangeType:
oldFullyQualifiedTypeName: org.axonframework.eventhandling.tokenstore.jpa.JpaTokenStore
newFullyQualifiedTypeName: org.axonframework.eventhandling.tokenstore.legacyjpa.JpaTokenStore
- org.openrewrite.java.ChangeType:
oldFullyQualifiedTypeName: org.axonframework.eventsourcing.eventstore.jpa.JpaEventStorageEngine
newFullyQualifiedTypeName: org.axonframework.eventsourcing.eventstore.legacyjpa.JpaEventStorageEngine
- org.openrewrite.java.ChangeType:
oldFullyQualifiedTypeName: org.axonframework.eventsourcing.eventstore.jpa.SQLErrorCodesResolver
newFullyQualifiedTypeName: org.axonframework.eventsourcing.eventstore.legacyjpa.SQLErrorCodesResolver
- org.openrewrite.java.ChangeType:
oldFullyQualifiedTypeName: org.axonframework.messaging.interceptors.BeanValidationInterceptor
newFullyQualifiedTypeName: org.axonframework.messaging.interceptors.legacyvalidation.BeanValidationInterceptor
- org.openrewrite.java.ChangeType:
oldFullyQualifiedTypeName: org.axonframework.messaging.interceptors.JSR303ViolationException
newFullyQualifiedTypeName: org.axonframework.messaging.interceptors.legacyvalidation.JSR303ViolationException
- org.openrewrite.java.ChangeType:
oldFullyQualifiedTypeName: org.axonframework.modelling.command.GenericJpaRepository
newFullyQualifiedTypeName: org.axonframework.modelling.command.legacyjpa.GenericJpaRepository
- org.openrewrite.java.ChangeType:
oldFullyQualifiedTypeName: org.axonframework.modelling.saga.repository.jpa.JpaSagaStore
newFullyQualifiedTypeName: org.axonframework.modelling.saga.repository.legacyjpa.JpaSagaStore
- org.openrewrite.java.ChangeType:
oldFullyQualifiedTypeName: org.axonframework.springboot.autoconfig.JpaAutoConfiguration
newFullyQualifiedTypeName: org.axonframework.springboot.autoconfig.legacyjpa.JpaJavaxAutoConfiguration
- org.openrewrite.java.ChangeType:
oldFullyQualifiedTypeName: org.axonframework.springboot.autoconfig.JpaEventStoreAutoConfiguration
newFullyQualifiedTypeName: org.axonframework.springboot.autoconfig.legacyjpa.JpaJavaxEventStoreAutoConfiguration
- org.openrewrite.java.ChangeType:
oldFullyQualifiedTypeName: org.axonframework.springboot.util.jpa.ContainerManagedEntityManagerProvider
newFullyQualifiedTypeName: org.axonframework.springboot.util.legacyjpa.ContainerManagedEntityManagerProvider
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
/*
* Copyright (c) 2010-2023. Axon Framework
*
* Licensed 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.axonframework.migration;

import org.junit.jupiter.api.Test;
import org.openrewrite.config.Environment;
import org.openrewrite.java.JavaParser;
import org.openrewrite.test.RecipeSpec;
import org.openrewrite.test.RewriteTest;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import static org.assertj.core.api.Assertions.assertThat;
import static org.openrewrite.java.Assertions.java;
import static org.openrewrite.java.Assertions.mavenProject;
import static org.openrewrite.maven.Assertions.pomXml;

class AxonJakartaTest implements RewriteTest {

@Override
public void defaults(RecipeSpec spec) {
spec
.parser(JavaParser.fromJavaVersion()
.logCompilationWarningsAndErrors(true)
.classpath("axon-messaging", "rewrite-migrate-java"))
.recipe(Environment.builder()
.scanRuntimeClasspath()
.build()
.activateRecipes("org.axonframework.migration.UpgradeAxonFramework_4_7_Jakarta"));
}

@Test
void migrateImports() {
//language=java
rewriteRun(
java(
"package sample.axon;\n" +
"import org.axonframework.eventhandling.deadletter.legacyjpa.DeadLetterJpaConverter;\n" +
"class ATest {\n" +
" DeadLetterJpaConverter converter;\n" +
"}",

"package sample.axon;\n\n" +
"import org.axonframework.eventhandling.deadletter.jpa.DeadLetterJpaConverter;\n\n" +
"class ATest {\n" +
" DeadLetterJpaConverter converter;\n" +
"}"
));
}

@Test
void migrateDependencies() {
//language=xml
rewriteRun(
mavenProject("any-project",
pomXml(

" <project>\n" +
" <modelVersion>4.0.0</modelVersion>\n" +
" <groupId>com.example</groupId>\n" +
" <artifactId>axon</artifactId>\n" +
" <version>1.0.0</version>\n" +
" <dependencies>\n" +
" <dependency>\n" +
" <groupId>org.axonframework</groupId>\n" +
" <artifactId>axon-configuration-jakarta</artifactId>\n" +
" <version>4.6.3</version>\n" +
" </dependency>\n" +
" </dependencies>\n" +
" </project>\n",
spec -> spec.after(pom -> {
Matcher version = Pattern.compile("4.[7-9].\\d+").matcher(pom);
assertThat(version.find()).describedAs("Expected 4.7.x in %s", pom).isTrue();
return String.format(
" <project>\n" +
" <modelVersion>4.0.0</modelVersion>\n" +
" <groupId>com.example</groupId>\n" +
" <artifactId>axon</artifactId>\n" +
" <version>1.0.0</version>\n" +
" <dependencies>\n" +
" <dependency>\n" +
" <groupId>org.axonframework</groupId>\n" +
" <artifactId>axon-configuration</artifactId>\n" +
" <version>%s</version>\n" +
" </dependency>\n" +
" </dependencies>\n" +
" </project>\n", version.group(0));
}))));
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
/*
* Copyright (c) 2010-2023. Axon Framework
*
* Licensed 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.axonframework.migration;

import org.junit.jupiter.api.Test;
import org.openrewrite.java.JavaParser;
import org.openrewrite.test.RecipeSpec;
import org.openrewrite.test.RewriteTest;

import static org.openrewrite.java.Assertions.java;

class AxonJavaxTest implements RewriteTest {

@Override
public void defaults(RecipeSpec spec) {
spec
.parser(JavaParser.fromJavaVersion()
.logCompilationWarningsAndErrors(true)
.classpath("axon-messaging"))
.recipe("/META-INF/rewrite/axon-javax-47.yml", "org.axonframework.migration.UpgradeAxonFramework_4_7_Javax");
}

@Test
void migrateImports() {
//language=java
rewriteRun(
java(
"package sample.axon;\n" +
"import org.axonframework.eventhandling.deadletter.jpa.DeadLetterJpaConverter;\n" +
"class ATest {\n" +
" DeadLetterJpaConverter converter;\n" +
"}",

"package sample.axon;\n\n" +
"import org.axonframework.eventhandling.deadletter.legacyjpa.DeadLetterJpaConverter;\n\n" +
"class ATest {\n" +
" DeadLetterJpaConverter converter;\n" +
"}"
));
}

}
1 change: 1 addition & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
<module>integrationtests</module>
<module>legacy</module>
<module>reactorless-test</module>
<module>migration</module>
</modules>
<packaging>pom</packaging>

Expand Down