Skip to content

Commit 4b4c2aa

Browse files
authored
Add recipe to change SDK generated types. (#5053)
* Add recipe to change SDK generated types. * Address feedback
1 parent 8924bfc commit 4b4c2aa

File tree

12 files changed

+883
-40
lines changed

12 files changed

+883
-40
lines changed

migration-tool/pom.xml

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -35,14 +35,7 @@
3535
<dependency>
3636
<groupId>org.openrewrite.recipe</groupId>
3737
<artifactId>rewrite-recipe-bom</artifactId>
38-
<version>2.5.4</version>
39-
<type>pom</type>
40-
<scope>import</scope>
41-
</dependency>
42-
<dependency>
43-
<groupId>software.amazon.awssdk</groupId>
44-
<artifactId>bom-internal</artifactId>
45-
<version>${awsjavasdk.version}</version>
38+
<version>2.8.1</version>
4639
<type>pom</type>
4740
<scope>import</scope>
4841
</dependency>
@@ -60,6 +53,19 @@
6053
<artifactId>rewrite-java-8</artifactId>
6154
<scope>runtime</scope>
6255
</dependency>
56+
57+
<dependency>
58+
<groupId>com.amazonaws</groupId>
59+
<artifactId>aws-java-sdk-sqs</artifactId>
60+
<scope>test</scope>
61+
<version>1.12.472</version>
62+
<exclusions>
63+
<exclusion>
64+
<groupId>com.fasterxml.jackson</groupId>
65+
<artifactId>jackson-core</artifactId>
66+
</exclusion>
67+
</exclusions>
68+
</dependency>
6369
<dependency>
6470
<groupId>org.openrewrite</groupId>
6571
<artifactId>rewrite-maven</artifactId>
@@ -75,6 +81,7 @@
7581
<groupId>org.junit.jupiter</groupId>
7682
<artifactId>junit-jupiter</artifactId>
7783
<scope>test</scope>
84+
<version>${junit5.version}</version>
7885
</dependency>
7986
<dependency>
8087
<groupId>org.junit.jupiter</groupId>
@@ -88,6 +95,17 @@
8895
<artifactId>sqs</artifactId>
8996
<scope>test</scope>
9097
<version>${awsjavasdk.version}</version>
98+
<exclusions>
99+
<exclusion>
100+
<groupId>com.fasterxml.jackson</groupId>
101+
<artifactId>jackson-core</artifactId>
102+
</exclusion>
103+
</exclusions>
104+
</dependency>
105+
<dependency>
106+
<groupId>software.amazon.awssdk</groupId>
107+
<artifactId>utils</artifactId>
108+
<version>${awsjavasdk.version}</version>
91109
</dependency>
92110
</dependencies>
93111

migration-tool/src/main/java/software/amazon/awssdk/migration/recipe/ChangeSdkType.java

Lines changed: 474 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
/*
2+
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License").
5+
* You may not use this file except in compliance with the License.
6+
* A copy of the License is located at
7+
*
8+
* http://aws.amazon.com/apache2.0
9+
*
10+
* or in the "license" file accompanying this file. This file is distributed
11+
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
12+
* express or implied. See the License for the specific language governing
13+
* permissions and limitations under the License.
14+
*/
15+
16+
package software.amazon.awssdk.migration.recipe.utils;
17+
18+
import java.util.stream.Stream;
19+
import software.amazon.awssdk.annotations.SdkInternalApi;
20+
import software.amazon.awssdk.utils.internal.CodegenNamingUtils;
21+
22+
@SdkInternalApi
23+
public final class NamingConversionUtils {
24+
25+
private static final String V1_PACKAGE_PREFIX = "com.amazonaws.services";
26+
private static final String V2_PACKAGE_PREFIX = "software.amazon.awssdk.services";
27+
28+
private NamingConversionUtils() {
29+
}
30+
31+
public static String getV2Equivalent(String currentFqcn) {
32+
int lastIndexOfDot = currentFqcn.lastIndexOf(".");
33+
String v1ClassName = currentFqcn.substring(lastIndexOfDot + 1, currentFqcn.length());
34+
String packagePrefix = currentFqcn.substring(0, lastIndexOfDot);
35+
36+
String v2ClassName;
37+
String v2PackagePrefix = packagePrefix.replace(V1_PACKAGE_PREFIX, V2_PACKAGE_PREFIX);
38+
39+
if (Stream.of("Abstract", "Amazon", "AWS").anyMatch(v1ClassName::startsWith)) {
40+
v2ClassName = getV2ClientEquivalent(v1ClassName);
41+
} else {
42+
v2ClassName = v1ClassName.replace("Result", "Response");
43+
}
44+
45+
return v2PackagePrefix + "." + v2ClassName;
46+
}
47+
48+
private static String getV2ClientEquivalent(String className) {
49+
if (className.startsWith("Abstract") ) {
50+
className = className.substring(8);
51+
}
52+
if (className.startsWith("Amazon") ) {
53+
className = className.substring(6);
54+
} else if (className.startsWith("AWS")) {
55+
className = className.substring(3);
56+
}
57+
58+
String v2Style = CodegenNamingUtils.pascalCase(className);
59+
60+
if (!className.endsWith("Client") && !className.endsWith("Builder")) {
61+
v2Style = v2Style + "Client";
62+
}
63+
64+
return v2Style;
65+
}
66+
}

migration-tool/src/main/resources/META-INF/rewrite/java-sdk-v1-to-v2.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,4 @@ tags:
2222
- sdk
2323
recipeList:
2424
- software.amazon.awssdk.UpgradeSdkDependencies
25-
- software.amazon.awssdk.UpdateSdkTypes
25+
- software.amazon.awssdk.migration.recipe.ChangeSdkType

migration-tool/src/main/resources/META-INF/rewrite/update-sdk-type.yml

Lines changed: 0 additions & 26 deletions
This file was deleted.

migration-tool/src/main/resources/META-INF/rewrite/upgrade-sdk-dependencies.yml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,12 @@ recipeList:
185185
newGroupId: software.amazon.awssdk
186186
newArtifactId: servicecatalog
187187
newVersion: 2.23.16-SNAPSHOT
188+
- org.openrewrite.maven.ChangeDependencyGroupIdAndArtifactId:
189+
oldGroupId: com.amazonaws
190+
oldArtifactId: aws-java-sdk-timestreaminfluxdb
191+
newGroupId: software.amazon.awssdk
192+
newArtifactId: timestreaminfluxdb
193+
newVersion: 2.23.16-SNAPSHOT
188194
- org.openrewrite.maven.ChangeDependencyGroupIdAndArtifactId:
189195
oldGroupId: com.amazonaws
190196
oldArtifactId: aws-java-sdk-lakeformation
@@ -587,6 +593,12 @@ recipeList:
587593
newGroupId: software.amazon.awssdk
588594
newArtifactId: paymentcryptography
589595
newVersion: 2.23.16-SNAPSHOT
596+
- org.openrewrite.maven.ChangeDependencyGroupIdAndArtifactId:
597+
oldGroupId: com.amazonaws
598+
oldArtifactId: aws-java-sdk-chatbot
599+
newGroupId: software.amazon.awssdk
600+
newArtifactId: chatbot
601+
newVersion: 2.23.16-SNAPSHOT
590602
- org.openrewrite.maven.ChangeDependencyGroupIdAndArtifactId:
591603
oldGroupId: com.amazonaws
592604
oldArtifactId: aws-java-sdk-fms
@@ -1709,6 +1721,12 @@ recipeList:
17091721
newGroupId: software.amazon.awssdk
17101722
newArtifactId: internetmonitor
17111723
newVersion: 2.23.16-SNAPSHOT
1724+
- org.openrewrite.maven.ChangeDependencyGroupIdAndArtifactId:
1725+
oldGroupId: com.amazonaws
1726+
oldArtifactId: aws-java-sdk-artifact
1727+
newGroupId: software.amazon.awssdk
1728+
newArtifactId: artifact
1729+
newVersion: 2.23.16-SNAPSHOT
17121730
- org.openrewrite.maven.ChangeDependencyGroupIdAndArtifactId:
17131731
oldGroupId: com.amazonaws
17141732
oldArtifactId: aws-java-sdk-iotsitewise
Lines changed: 182 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,182 @@
1+
/*
2+
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License").
5+
* You may not use this file except in compliance with the License.
6+
* A copy of the License is located at
7+
*
8+
* http://aws.amazon.com/apache2.0
9+
*
10+
* or in the "license" file accompanying this file. This file is distributed
11+
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
12+
* express or implied. See the License for the specific language governing
13+
* permissions and limitations under the License.
14+
*/
15+
16+
package software.amazon.awssdk.migration.recipe;
17+
18+
import static org.openrewrite.java.Assertions.java;
19+
20+
import org.junit.jupiter.api.Test;
21+
import org.junit.jupiter.api.condition.EnabledOnJre;
22+
import org.junit.jupiter.api.condition.JRE;
23+
import org.openrewrite.java.Java8Parser;
24+
import org.openrewrite.test.RecipeSpec;
25+
import org.openrewrite.test.RewriteTest;
26+
27+
public class ChangeSdkTypeTest implements RewriteTest {
28+
29+
@Override
30+
public void defaults(RecipeSpec spec) {
31+
spec.recipe(new ChangeSdkType());
32+
}
33+
34+
@Test
35+
@EnabledOnJre({JRE.JAVA_8})
36+
void shouldChangeVariables() {
37+
rewriteRun(
38+
spec -> spec.parser(Java8Parser.builder().classpath("aws-java-sdk-sqs")),
39+
java(
40+
"import com.amazonaws.services.sqs.AmazonSQS;\n" +
41+
"import com.amazonaws.services.sqs.AmazonSQSClient;\n" +
42+
"import com.amazonaws.services.sqs.model.ListQueuesResult;\n" +
43+
"import com.amazonaws.services.sqs.model.ListQueuesRequest;\n" +
44+
"class Test {\n" +
45+
" static void method() {\n" +
46+
" AmazonSQS sqs = null;\n" +
47+
" ListQueuesRequest request = null;\n" +
48+
" ListQueuesResult result = null;\n" +
49+
" }\n" +
50+
"}\n",
51+
"import software.amazon.awssdk.services.sqs.SqsClient;\n" +
52+
"import software.amazon.awssdk.services.sqs.model.ListQueuesRequest;\n" +
53+
// TODO: duplicate import for some reason, fix this
54+
"import software.amazon.awssdk.services.sqs.SqsClient;\n" +
55+
"import software.amazon.awssdk.services.sqs.model.ListQueuesResponse;\n" +
56+
"\n" +
57+
"class Test {\n" +
58+
" static void method() {\n" +
59+
" SqsClient sqs = null;\n" +
60+
" ListQueuesRequest request = null;\n" +
61+
" ListQueuesResponse result = null;\n" +
62+
" }\n" +
63+
"}\n"
64+
)
65+
);
66+
}
67+
68+
@Test
69+
@EnabledOnJre({JRE.JAVA_8})
70+
void shouldChangeFields() {
71+
rewriteRun(
72+
spec -> spec.parser(Java8Parser.builder().classpath("aws-java-sdk-sqs")),
73+
java(
74+
"import com.amazonaws.services.sqs.model.DeleteQueueRequest;\n" +
75+
"import com.amazonaws.services.sqs.model.DeleteQueueResult;\n" +
76+
"class Test {\n" +
77+
" private DeleteQueueRequest deleteQueueRequest;\n" +
78+
" private static DeleteQueueResult resultField;\n" +
79+
"}\n",
80+
"import software.amazon.awssdk.services.sqs.model.DeleteQueueRequest;\n" +
81+
"import software.amazon.awssdk.services.sqs.model.DeleteQueueResponse;\n" +
82+
"\n" +
83+
"class Test {\n" +
84+
" private DeleteQueueRequest deleteQueueRequest;\n" +
85+
" private static DeleteQueueResponse resultField;\n" +
86+
"}\n"
87+
)
88+
);
89+
}
90+
91+
@Test
92+
@EnabledOnJre({JRE.JAVA_8})
93+
void shouldChangeFieldsInAList() {
94+
rewriteRun(
95+
spec -> spec.parser(Java8Parser.builder().classpath("aws-java-sdk-sqs")),
96+
java(
97+
"import com.amazonaws.services.sqs.model.DeleteQueueResult;\n" +
98+
"import java.util.List;\n" +
99+
"class Test {\n" +
100+
" private List<DeleteQueueResult> results;\n" +
101+
"}\n",
102+
"import software.amazon.awssdk.services.sqs.model.DeleteQueueResponse;\n\n" +
103+
"import java.util.List;\n" +
104+
"\n" +
105+
"class Test {\n" +
106+
" private List<DeleteQueueResponse> results;\n" +
107+
"}\n"
108+
)
109+
);
110+
}
111+
112+
@Test
113+
@EnabledOnJre({JRE.JAVA_8})
114+
void shouldChangeMethodParameters() {
115+
rewriteRun(
116+
spec -> spec.parser(Java8Parser.builder().classpath("aws-java-sdk-sqs")),
117+
java(
118+
"import com.amazonaws.services.sqs.model.CreateQueueRequest;\n" +
119+
"class Test {\n" +
120+
" static void method(CreateQueueRequest request) {\n" +
121+
" }\n" +
122+
"}\n",
123+
"import software.amazon.awssdk.services.sqs.model.CreateQueueRequest;\n" +
124+
"\n" +
125+
"class Test {\n" +
126+
" static void method(CreateQueueRequest request) {\n" +
127+
" }\n" +
128+
"}\n"
129+
)
130+
);
131+
}
132+
133+
@Test
134+
@EnabledOnJre({JRE.JAVA_8})
135+
void shouldNotChangeExistingV2Types() {
136+
rewriteRun(
137+
spec -> spec.parser(Java8Parser.builder().classpath("aws-java-sdk-sqs", "sqs")),
138+
java(
139+
"import com.amazonaws.services.sqs.model.CreateQueueRequest;\n" +
140+
"import software.amazon.awssdk.services.sqs.model.DeleteQueueRequest;\n" +
141+
"class Test {\n" +
142+
" private CreateQueueRequest createQueue;\n" +
143+
" private DeleteQueueRequest deleteQueue;\n" +
144+
" static void method() {\n" +
145+
" }\n" +
146+
"}\n",
147+
"import software.amazon.awssdk.services.sqs.model.CreateQueueRequest;\n" +
148+
"import software.amazon.awssdk.services.sqs.model.DeleteQueueRequest;\n" +
149+
"\n" +
150+
"class Test {\n" +
151+
" private CreateQueueRequest createQueue;\n" +
152+
" private DeleteQueueRequest deleteQueue;\n" +
153+
" static void method() {\n" +
154+
" }\n" +
155+
"}\n"
156+
)
157+
);
158+
}
159+
160+
@Test
161+
@EnabledOnJre({JRE.JAVA_8})
162+
void shouldChangeFieldsInInnerClass() {
163+
rewriteRun(
164+
spec -> spec.parser(Java8Parser.builder().classpath("aws-java-sdk-sqs")),
165+
java(
166+
"import com.amazonaws.services.sqs.model.CreateQueueResult;\n" +
167+
"class Test {\n" +
168+
" public class Inner{\n" +
169+
" private CreateQueueResult createQueue;\n" +
170+
" }\n" +
171+
"}\n",
172+
"import software.amazon.awssdk.services.sqs.model.CreateQueueResponse;\n" +
173+
"\n" +
174+
"class Test {\n" +
175+
" public class Inner{\n" +
176+
" private CreateQueueResponse createQueue;\n" +
177+
" }\n" +
178+
"}\n"
179+
)
180+
);
181+
}
182+
}

migration-tool/src/test/java/software/amazon/awssdk/recipe/UpgradeSdkDependenciesTest.java renamed to migration-tool/src/test/java/software/amazon/awssdk/migration/recipe/UpgradeSdkDependenciesTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
* permissions and limitations under the License.
1414
*/
1515

16-
package software.amazon.awssdk.recipe;
16+
package software.amazon.awssdk.migration.recipe;
1717

1818
import static org.openrewrite.maven.Assertions.pomXml;
1919

0 commit comments

Comments
 (0)