From 7d1c485723119b7c0e2eb4c886dd30e17c977828 Mon Sep 17 00:00:00 2001 From: anuram Date: Fri, 31 Jan 2025 14:39:18 -0500 Subject: [PATCH 1/6] Java21 recipe deprecatedSecurityManager --- .../migrate/DeprecatedSecurityManager.java | 83 +++++++++++++++++++ .../META-INF/rewrite/java-version-21.yml | 2 +- .../DeprecatedSecurityManagerTest.java | 73 ++++++++++++++++ 3 files changed, 157 insertions(+), 1 deletion(-) create mode 100644 src/main/java/org/openrewrite/java/migrate/DeprecatedSecurityManager.java create mode 100644 src/test/java/org/openrewrite/java/migrate/DeprecatedSecurityManagerTest.java diff --git a/src/main/java/org/openrewrite/java/migrate/DeprecatedSecurityManager.java b/src/main/java/org/openrewrite/java/migrate/DeprecatedSecurityManager.java new file mode 100644 index 0000000000..26289eaa98 --- /dev/null +++ b/src/main/java/org/openrewrite/java/migrate/DeprecatedSecurityManager.java @@ -0,0 +1,83 @@ +/* + * Copyright 2025 the original author or authors. + *

+ * Licensed under the Moderne Source Available License (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * https://docs.moderne.io/licensing/moderne-source-available-license + *

+ * 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.openrewrite.java.migrate; + +import org.openrewrite.Cursor; +import org.openrewrite.ExecutionContext; +import org.openrewrite.Recipe; +import org.openrewrite.TreeVisitor; +import org.openrewrite.internal.ListUtils; +import org.openrewrite.java.JavaIsoVisitor; +import org.openrewrite.java.JavaTemplate; +import org.openrewrite.java.MethodMatcher; +import org.openrewrite.java.tree.J; +import org.openrewrite.java.tree.Statement; + +import java.util.List; + +public class DeprecatedSecurityManager extends Recipe { + + @Override + public String getDisplayName() { + return "Call `System.setProperty(\"java.security.manager\")` before calling `java.lang.System setSecurityManager(java.lang.SecurityManager)`"; + } + + @Override + public String getDescription() { + return "The default value of the `java.security.manager` system property has been changed to disallow since Java 18." + + " Unless the system property is set to allow on the command line, any invocation of System.setSecurityManager(SecurityManager) " + + " with a non-null argument will throw an `UnsupportedOperationException`. " + + " You can set system property as `Djava.security.manager=allow.` to prevent the exception" + + "The recipe calls `System.setProperty(\"java.security.manager\")` before calling `java.lang.System setSecurityManager(SecurityManager)`."; + } + + @Override + public TreeVisitor getVisitor() { + return new JavaIsoVisitor() { + public J.Block visitBlock(J.Block block, ExecutionContext ctx) { + MethodMatcher SETSECURITY_REF = new MethodMatcher("java.lang.System setSecurityManager(java.lang.SecurityManager) ", true); + List statements = block.getStatements(); + boolean propertySet = false; + for (int i = 0; i < statements.size() ; i++) { + Statement stmt = statements.get(i); + if (stmt instanceof J.MethodInvocation) { + if (SETSECURITY_REF.matches((J.MethodInvocation) stmt)) { + for (Statement statement : statements) { + if (statement instanceof J.MethodInvocation && + ((J.MethodInvocation) statement).getSimpleName().equals("setProperty") && + ((J.MethodInvocation) statement).getArguments().get(0) instanceof J.Literal && + ((J.Literal) ((J.MethodInvocation) statement).getArguments().get(0)).getValue().equals("java.security.manager")) { + propertySet = true; + break; + } + } + String templateString = "System.setProperty(\"java.security.manager\", \"allow\");"; + if (!propertySet) { + stmt = JavaTemplate.builder(templateString) + .contextSensitive() + .build().apply(new Cursor(getCursor(), stmt), + stmt.getCoordinates().replace()); + statements = ListUtils.insert(statements, stmt, i); + return block.withStatements(statements); + } + } + } + } + return super.visitBlock(block, ctx); + } + }; + } +} diff --git a/src/main/resources/META-INF/rewrite/java-version-21.yml b/src/main/resources/META-INF/rewrite/java-version-21.yml index f8907448c4..4d082d1cc9 100644 --- a/src/main/resources/META-INF/rewrite/java-version-21.yml +++ b/src/main/resources/META-INF/rewrite/java-version-21.yml @@ -37,7 +37,7 @@ recipeList: - org.openrewrite.java.migrate.UpgradePluginsForJava21 - org.openrewrite.java.migrate.DeleteDeprecatedFinalize - org.openrewrite.java.migrate.RemovedSubjectMethods - + - org.openrewrite.java.migrate.DeprecatedSecurityManager --- type: specs.openrewrite.org/v1beta/recipe name: org.openrewrite.java.migrate.UpgradeBuildToJava21 diff --git a/src/test/java/org/openrewrite/java/migrate/DeprecatedSecurityManagerTest.java b/src/test/java/org/openrewrite/java/migrate/DeprecatedSecurityManagerTest.java new file mode 100644 index 0000000000..d233e271c6 --- /dev/null +++ b/src/test/java/org/openrewrite/java/migrate/DeprecatedSecurityManagerTest.java @@ -0,0 +1,73 @@ +/* + * Copyright 2025 the original author or authors. + *

+ * Licensed under the Moderne Source Available License (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * https://docs.moderne.io/licensing/moderne-source-available-license + *

+ * 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.openrewrite.java.migrate; + +import org.junit.jupiter.api.Test; +import org.openrewrite.DocumentExample; +import org.openrewrite.test.RecipeSpec; +import org.openrewrite.test.RewriteTest; + +import static org.openrewrite.java.Assertions.java; +import static org.openrewrite.java.Assertions.javaVersion; + +class DeprecatedSecurityManagerTest implements RewriteTest { + @Override + public void defaults(RecipeSpec spec) { + spec.recipe(new DeprecatedSecurityManager()) + .allSources(src -> src.markers(javaVersion(11))); + } + @Test + @DocumentExample + void deprecatedSecurityManager() { + rewriteRun( + //language=java + java( + """ + import java.lang.Thread; + import java.lang.*; + + public class Test { + + public void foo(){ + String x = "dlaj"; + } + public static void main(String[] args) { + System.setSecurityManager(new SecurityManager()); + int i = 5; + } + } + """, + """ + import java.lang.Thread; + import java.lang.*; + + public class Test { + + public void foo(){ + String x = "dlaj"; + } + public static void main(String[] args) { + System.setProperty("java.security.manager", "allow"); + System.setSecurityManager(new SecurityManager()); + int i = 5; + } + } + """ + ) + ); + } + +} From adb9a149ff9960b29fd5d8c8f0abf178ae44fd1c Mon Sep 17 00:00:00 2001 From: anuram Date: Fri, 31 Jan 2025 14:52:27 -0500 Subject: [PATCH 2/6] added precondtions --- .../migrate/DeprecatedSecurityManager.java | 65 +++++++++---------- .../DeprecatedSecurityManagerTest.java | 2 +- 2 files changed, 33 insertions(+), 34 deletions(-) diff --git a/src/main/java/org/openrewrite/java/migrate/DeprecatedSecurityManager.java b/src/main/java/org/openrewrite/java/migrate/DeprecatedSecurityManager.java index 26289eaa98..2504bacd71 100644 --- a/src/main/java/org/openrewrite/java/migrate/DeprecatedSecurityManager.java +++ b/src/main/java/org/openrewrite/java/migrate/DeprecatedSecurityManager.java @@ -15,14 +15,12 @@ */ package org.openrewrite.java.migrate; -import org.openrewrite.Cursor; -import org.openrewrite.ExecutionContext; -import org.openrewrite.Recipe; -import org.openrewrite.TreeVisitor; +import org.openrewrite.*; import org.openrewrite.internal.ListUtils; import org.openrewrite.java.JavaIsoVisitor; import org.openrewrite.java.JavaTemplate; import org.openrewrite.java.MethodMatcher; +import org.openrewrite.java.search.UsesJavaVersion; import org.openrewrite.java.tree.J; import org.openrewrite.java.tree.Statement; @@ -46,38 +44,39 @@ public String getDescription() { @Override public TreeVisitor getVisitor() { - return new JavaIsoVisitor() { - public J.Block visitBlock(J.Block block, ExecutionContext ctx) { - MethodMatcher SETSECURITY_REF = new MethodMatcher("java.lang.System setSecurityManager(java.lang.SecurityManager) ", true); - List statements = block.getStatements(); - boolean propertySet = false; - for (int i = 0; i < statements.size() ; i++) { - Statement stmt = statements.get(i); - if (stmt instanceof J.MethodInvocation) { - if (SETSECURITY_REF.matches((J.MethodInvocation) stmt)) { - for (Statement statement : statements) { - if (statement instanceof J.MethodInvocation && - ((J.MethodInvocation) statement).getSimpleName().equals("setProperty") && - ((J.MethodInvocation) statement).getArguments().get(0) instanceof J.Literal && - ((J.Literal) ((J.MethodInvocation) statement).getArguments().get(0)).getValue().equals("java.security.manager")) { - propertySet = true; - break; + return Preconditions.check(new UsesJavaVersion<>(18), + new JavaIsoVisitor() { + public J.Block visitBlock(J.Block block, ExecutionContext ctx) { + MethodMatcher SETSECURITY_REF = new MethodMatcher("java.lang.System setSecurityManager(java.lang.SecurityManager) ", true); + List statements = block.getStatements(); + boolean propertySet = false; + for (int i = 0; i < statements.size(); i++) { + Statement stmt = statements.get(i); + if (stmt instanceof J.MethodInvocation) { + if (SETSECURITY_REF.matches((J.MethodInvocation) stmt)) { + for (Statement statement : statements) { + if (statement instanceof J.MethodInvocation && + ((J.MethodInvocation) statement).getSimpleName().equals("setProperty") && + ((J.MethodInvocation) statement).getArguments().get(0) instanceof J.Literal && + ((J.Literal) ((J.MethodInvocation) statement).getArguments().get(0)).getValue().equals("java.security.manager")) { + propertySet = true; + break; + } + } + String templateString = "System.setProperty(\"java.security.manager\", \"allow\");"; + if (!propertySet) { + stmt = JavaTemplate.builder(templateString) + .contextSensitive() + .build().apply(new Cursor(getCursor(), stmt), + stmt.getCoordinates().replace()); + statements = ListUtils.insert(statements, stmt, i); + return block.withStatements(statements); + } } } - String templateString = "System.setProperty(\"java.security.manager\", \"allow\");"; - if (!propertySet) { - stmt = JavaTemplate.builder(templateString) - .contextSensitive() - .build().apply(new Cursor(getCursor(), stmt), - stmt.getCoordinates().replace()); - statements = ListUtils.insert(statements, stmt, i); - return block.withStatements(statements); - } } + return super.visitBlock(block, ctx); } - } - return super.visitBlock(block, ctx); - } - }; + }); } } diff --git a/src/test/java/org/openrewrite/java/migrate/DeprecatedSecurityManagerTest.java b/src/test/java/org/openrewrite/java/migrate/DeprecatedSecurityManagerTest.java index d233e271c6..64086e9927 100644 --- a/src/test/java/org/openrewrite/java/migrate/DeprecatedSecurityManagerTest.java +++ b/src/test/java/org/openrewrite/java/migrate/DeprecatedSecurityManagerTest.java @@ -27,7 +27,7 @@ class DeprecatedSecurityManagerTest implements RewriteTest { @Override public void defaults(RecipeSpec spec) { spec.recipe(new DeprecatedSecurityManager()) - .allSources(src -> src.markers(javaVersion(11))); + .allSources(src -> src.markers(javaVersion(21))); } @Test @DocumentExample From 1ee3c5324110c5f958bb0ac61863f36809435c42 Mon Sep 17 00:00:00 2001 From: anuram Date: Fri, 31 Jan 2025 14:55:00 -0500 Subject: [PATCH 3/6] small change --- .../openrewrite/java/migrate/DeprecatedSecurityManager.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/openrewrite/java/migrate/DeprecatedSecurityManager.java b/src/main/java/org/openrewrite/java/migrate/DeprecatedSecurityManager.java index 2504bacd71..e827d0f3b1 100644 --- a/src/main/java/org/openrewrite/java/migrate/DeprecatedSecurityManager.java +++ b/src/main/java/org/openrewrite/java/migrate/DeprecatedSecurityManager.java @@ -38,8 +38,8 @@ public String getDescription() { return "The default value of the `java.security.manager` system property has been changed to disallow since Java 18." + " Unless the system property is set to allow on the command line, any invocation of System.setSecurityManager(SecurityManager) " + " with a non-null argument will throw an `UnsupportedOperationException`. " + - " You can set system property as `Djava.security.manager=allow.` to prevent the exception" - + "The recipe calls `System.setProperty(\"java.security.manager\")` before calling `java.lang.System setSecurityManager(SecurityManager)`."; + " You can set system property as `Djava.security.manager=allow.` to prevent the exception" + + "The recipe calls `System.setProperty(\"java.security.manager\")` before calling `java.lang.System setSecurityManager(SecurityManager)`."; } @Override From 47f14511f49af0451bb6e8fa993849a977614160 Mon Sep 17 00:00:00 2001 From: anuram Date: Fri, 31 Jan 2025 15:03:47 -0500 Subject: [PATCH 4/6] description update --- .../org/openrewrite/java/migrate/DeprecatedSecurityManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/openrewrite/java/migrate/DeprecatedSecurityManager.java b/src/main/java/org/openrewrite/java/migrate/DeprecatedSecurityManager.java index e827d0f3b1..1317be578b 100644 --- a/src/main/java/org/openrewrite/java/migrate/DeprecatedSecurityManager.java +++ b/src/main/java/org/openrewrite/java/migrate/DeprecatedSecurityManager.java @@ -39,7 +39,7 @@ public String getDescription() { " Unless the system property is set to allow on the command line, any invocation of System.setSecurityManager(SecurityManager) " + " with a non-null argument will throw an `UnsupportedOperationException`. " + " You can set system property as `Djava.security.manager=allow.` to prevent the exception" + - "The recipe calls `System.setProperty(\"java.security.manager\")` before calling `java.lang.System setSecurityManager(SecurityManager)`."; + "The recipe calls `System.setProperty(\"java.security.manager\",\"allow\")` before calling `java.lang.System setSecurityManager(SecurityManager)`."; } @Override From 1ebafda3de06c3fc838512d3685632322390d370 Mon Sep 17 00:00:00 2001 From: Anu Ramamoorthy <93149514+ranuradh@users.noreply.github.com> Date: Fri, 31 Jan 2025 15:06:01 -0500 Subject: [PATCH 5/6] Update src/main/java/org/openrewrite/java/migrate/DeprecatedSecurityManager.java Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .../org/openrewrite/java/migrate/DeprecatedSecurityManager.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/org/openrewrite/java/migrate/DeprecatedSecurityManager.java b/src/main/java/org/openrewrite/java/migrate/DeprecatedSecurityManager.java index 1317be578b..51d91f9e52 100644 --- a/src/main/java/org/openrewrite/java/migrate/DeprecatedSecurityManager.java +++ b/src/main/java/org/openrewrite/java/migrate/DeprecatedSecurityManager.java @@ -46,6 +46,7 @@ public String getDescription() { public TreeVisitor getVisitor() { return Preconditions.check(new UsesJavaVersion<>(18), new JavaIsoVisitor() { + @Override public J.Block visitBlock(J.Block block, ExecutionContext ctx) { MethodMatcher SETSECURITY_REF = new MethodMatcher("java.lang.System setSecurityManager(java.lang.SecurityManager) ", true); List statements = block.getStatements(); From e58d3b7d6a99acfbbaacbde77dcadad484ff4a53 Mon Sep 17 00:00:00 2001 From: anuram Date: Fri, 31 Jan 2025 15:11:19 -0500 Subject: [PATCH 6/6] updates to description --- .../openrewrite/java/migrate/DeprecatedSecurityManager.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/openrewrite/java/migrate/DeprecatedSecurityManager.java b/src/main/java/org/openrewrite/java/migrate/DeprecatedSecurityManager.java index 1317be578b..42b26136ee 100644 --- a/src/main/java/org/openrewrite/java/migrate/DeprecatedSecurityManager.java +++ b/src/main/java/org/openrewrite/java/migrate/DeprecatedSecurityManager.java @@ -30,7 +30,7 @@ public class DeprecatedSecurityManager extends Recipe { @Override public String getDisplayName() { - return "Call `System.setProperty(\"java.security.manager\")` before calling `java.lang.System setSecurityManager(java.lang.SecurityManager)`"; + return "Call `System.setProperty(\"java.security.manager\",\"allow\")` before calling `System.setSecurityManager(java.lang.SecurityManager)`"; } @Override @@ -38,8 +38,8 @@ public String getDescription() { return "The default value of the `java.security.manager` system property has been changed to disallow since Java 18." + " Unless the system property is set to allow on the command line, any invocation of System.setSecurityManager(SecurityManager) " + " with a non-null argument will throw an `UnsupportedOperationException`. " + - " You can set system property as `Djava.security.manager=allow.` to prevent the exception" + - "The recipe calls `System.setProperty(\"java.security.manager\",\"allow\")` before calling `java.lang.System setSecurityManager(SecurityManager)`."; + " You can set system property as `Djava.security.manager=allow.` to prevent the exception." + + "The recipe calls `System.setProperty(\"java.security.manager\",\"allow\")` before calling `System.setSecurityManager(SecurityManager)`."; } @Override