Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Migration module with OpenRewrite recipes for AxonFramework 4.7 #2597

Merged
merged 11 commits into from
Feb 14, 2023
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