From 7bd1cbfe2f33687190b865c316750483e259da70 Mon Sep 17 00:00:00 2001 From: Marc Becker Date: Fri, 22 Mar 2024 13:32:36 +0000 Subject: [PATCH] More examples --- pom.xml | 3 +- .../recipe/CdsElementEqualsRules.java | 27 ++++++++++ .../recipe/FindCdsModelEquals.java | 51 +++++++++++++++++++ .../sap/openrewrite/recipe/FindSetTenant.java | 26 +++++++--- .../recipe/RequestContexRunnerRules.java | 28 ++++++++++ .../recipe/CdsElementEqualsRulesTest.java | 51 +++++++++++++++++++ .../recipe/FindCdsModelEqualsTest.java | 49 ++++++++++++++++++ .../openrewrite/recipe/FindSetTenantTest.java | 28 ++++++++-- .../recipe/RequestContextRunnerRulesTest.java | 51 +++++++++++++++++++ 9 files changed, 302 insertions(+), 12 deletions(-) create mode 100644 src/main/java/com/sap/openrewrite/recipe/CdsElementEqualsRules.java create mode 100644 src/main/java/com/sap/openrewrite/recipe/FindCdsModelEquals.java create mode 100644 src/main/java/com/sap/openrewrite/recipe/RequestContexRunnerRules.java create mode 100644 src/test/java/com/sap/openrewrite/recipe/CdsElementEqualsRulesTest.java create mode 100644 src/test/java/com/sap/openrewrite/recipe/FindCdsModelEqualsTest.java create mode 100644 src/test/java/com/sap/openrewrite/recipe/RequestContextRunnerRulesTest.java diff --git a/pom.xml b/pom.xml index 9b18ebf..00f3de7 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ 4.0.0 com.sap.openrewrite.recipe cap-java-recipes - 1.0 + 1.0.0-SNAPSHOT @@ -93,7 +93,6 @@ com.sap.cds cds-services-api 2.7.1 - test diff --git a/src/main/java/com/sap/openrewrite/recipe/CdsElementEqualsRules.java b/src/main/java/com/sap/openrewrite/recipe/CdsElementEqualsRules.java new file mode 100644 index 0000000..b4ebe6e --- /dev/null +++ b/src/main/java/com/sap/openrewrite/recipe/CdsElementEqualsRules.java @@ -0,0 +1,27 @@ +package com.sap.openrewrite.recipe; + +import org.openrewrite.java.template.RecipeDescriptor; + +import com.google.errorprone.refaster.annotation.AfterTemplate; +import com.google.errorprone.refaster.annotation.BeforeTemplate; +import com.sap.cds.reflect.CdsElement; + +public class CdsElementEqualsRules { + + @RecipeDescriptor( + name = "Replace CdsElement == comparisons", + description = "Replaces CdsElement == comparions with equals") + public static class SetTenantToSystemUser { + + @BeforeTemplate + public boolean useObjectIdentity(CdsElement e1, CdsElement e2) { + return e1 == e2; + } + + @AfterTemplate + public boolean useEquals(CdsElement e1, CdsElement e2) { + return e1.equals(e2); + } + } + +} diff --git a/src/main/java/com/sap/openrewrite/recipe/FindCdsModelEquals.java b/src/main/java/com/sap/openrewrite/recipe/FindCdsModelEquals.java new file mode 100644 index 0000000..7268065 --- /dev/null +++ b/src/main/java/com/sap/openrewrite/recipe/FindCdsModelEquals.java @@ -0,0 +1,51 @@ +package com.sap.openrewrite.recipe; + +import org.openrewrite.ExecutionContext; +import org.openrewrite.Preconditions; +import org.openrewrite.Recipe; +import org.openrewrite.TreeVisitor; +import org.openrewrite.java.JavaIsoVisitor; +import org.openrewrite.java.JavaTemplate; +import org.openrewrite.java.JavaVisitor; +import org.openrewrite.java.search.UsesType; +import org.openrewrite.java.template.Semantics; +import org.openrewrite.java.tree.J; +import org.openrewrite.marker.SearchResult; + +import com.sap.cds.reflect.CdsModel; + +public class FindCdsModelEquals extends Recipe { + + @Override + public String getDisplayName() { + return "Finds CdsModel == comparisons"; + } + + @Override + public String getDescription() { + return "Finds usages of CdsModel ==."; + } + + @Override + public TreeVisitor getVisitor() { + JavaVisitor javaVisitor = new JavaIsoVisitor<>() { + final JavaTemplate useObjectIdentity = Semantics.expression(this, "useObjectIdentity", + (CdsModel m1, CdsModel m2) -> m1 == m2).build(); + + @Override + public J.Binary visitBinary(J.Binary elem, ExecutionContext ctx) { + J.Binary b = super.visitBinary(elem, ctx); + if (useObjectIdentity.matches(getCursor())) { + return SearchResult.found(elem); + } + return b; + } + + }; + return Preconditions.check( + new UsesType<>("com.sap.cds.reflect.CdsModel", true), + javaVisitor + ); + } + +} diff --git a/src/main/java/com/sap/openrewrite/recipe/FindSetTenant.java b/src/main/java/com/sap/openrewrite/recipe/FindSetTenant.java index 134bb0c..d82729c 100644 --- a/src/main/java/com/sap/openrewrite/recipe/FindSetTenant.java +++ b/src/main/java/com/sap/openrewrite/recipe/FindSetTenant.java @@ -5,12 +5,15 @@ import org.openrewrite.TreeVisitor; import org.openrewrite.java.JavaIsoVisitor; import org.openrewrite.java.MethodMatcher; +import org.openrewrite.java.tree.J; import org.openrewrite.java.tree.J.MethodInvocation; import org.openrewrite.marker.SearchResult; +import com.sap.openrewrite.recipe.table.SetTenant; + public class FindSetTenant extends Recipe { - // private final transient SetTenant table = new SetTenant(this); + private final transient SetTenant table = new SetTenant(this); @Override public String getDisplayName() { @@ -24,18 +27,27 @@ public String getDescription() { @Override public TreeVisitor getVisitor() { - MethodMatcher setTenantMatcher = new MethodMatcher("com.sap.cds.services.request.ModifiableUserInfo#setTenant(..)"); - MethodMatcher modifyUserMatcher = new MethodMatcher("com.sap.cds.services.request.RequestContext#modifyUser(..)"); + MethodMatcher setTenantMatcher = new MethodMatcher("com.sap.cds.services.request.ModifiableUserInfo setTenant(..)"); + MethodMatcher modifyUserMatcher = new MethodMatcher("com.sap.cds.services.runtime.RequestContextRunner modifyUser(..)"); return new JavaIsoVisitor() { @Override public MethodInvocation visitMethodInvocation(MethodInvocation method, ExecutionContext p) { MethodInvocation m = super.visitMethodInvocation(method, p); + + // JavaTemplate matcher = Semantics.expression(this, "setTenantMatcher", + // (RequestContextRunner r, String s) -> r.modifyUser(u -> u.setTenant(s))) + // .build(); + // if (matcher.matches(getCursor())) { + // return SearchResult.found(m); + // } + if (setTenantMatcher.matches(m)) { - //MethodInvocation enclosing = getCursor().firstEnclosing(J.MethodInvocation.class); - //if (modifyUserMatcher.matches(enclosing)) { - return SearchResult.found(method); - //} + MethodInvocation parent = getCursor().getParent().firstEnclosing(J.MethodInvocation.class); + if (modifyUserMatcher.matches(parent)) { + table.insertRow(p, new SetTenant.Row(m.printTrimmed(getCursor()))); + return SearchResult.found(m); + } } return m; } diff --git a/src/main/java/com/sap/openrewrite/recipe/RequestContexRunnerRules.java b/src/main/java/com/sap/openrewrite/recipe/RequestContexRunnerRules.java new file mode 100644 index 0000000..c54f9ef --- /dev/null +++ b/src/main/java/com/sap/openrewrite/recipe/RequestContexRunnerRules.java @@ -0,0 +1,28 @@ +package com.sap.openrewrite.recipe; + +import org.openrewrite.java.template.RecipeDescriptor; + +import com.google.errorprone.refaster.annotation.AfterTemplate; +import com.google.errorprone.refaster.annotation.BeforeTemplate; +import com.sap.cds.services.runtime.RequestContextRunner; + +public class RequestContexRunnerRules { + + @RecipeDescriptor( + name = "Replaces setTenant() with systemUser()", + description = "Descriptions") + public static class SetTenantToSystemUser { + + @BeforeTemplate + public RequestContextRunner modifyUserBefore(RequestContextRunner runner, String tenant) { + return runner.modifyUser(u -> u.setTenant(tenant)); + } + + @AfterTemplate + public RequestContextRunner systemUserAfter(RequestContextRunner runner, String tenant) { + return runner.systemUser(tenant); + } + + } + +} diff --git a/src/test/java/com/sap/openrewrite/recipe/CdsElementEqualsRulesTest.java b/src/test/java/com/sap/openrewrite/recipe/CdsElementEqualsRulesTest.java new file mode 100644 index 0000000..43df830 --- /dev/null +++ b/src/test/java/com/sap/openrewrite/recipe/CdsElementEqualsRulesTest.java @@ -0,0 +1,51 @@ +package com.sap.openrewrite.recipe; + +import static org.openrewrite.java.Assertions.java; + +import org.junit.jupiter.api.Test; +import org.openrewrite.java.JavaParser; +import org.openrewrite.test.RecipeSpec; +import org.openrewrite.test.RewriteTest; + +public class CdsElementEqualsRulesTest implements RewriteTest { + + @Override + public void defaults(RecipeSpec spec) { + spec.recipe(new CdsElementEqualsRulesRecipes()).parser(JavaParser.fromJavaVersion().classpath("cds4j-api")); + } + + @Test + void testReplaceModifyUser() { + rewriteRun( + java( + + """ + import com.sap.cds.reflect.CdsEntity; + import com.sap.cds.reflect.CdsElement; + + class Test { + + boolean test(CdsEntity entity, CdsElement elem) { + return entity.getElement("test") == elem; + } + + } + """, + """ + import com.sap.cds.reflect.CdsEntity; + import com.sap.cds.reflect.CdsElement; + + class Test { + + boolean test(CdsEntity entity, CdsElement elem) { + return entity.getElement("test").equals(elem); + } + + } + """ + ) + ); + + } + +} diff --git a/src/test/java/com/sap/openrewrite/recipe/FindCdsModelEqualsTest.java b/src/test/java/com/sap/openrewrite/recipe/FindCdsModelEqualsTest.java new file mode 100644 index 0000000..93c6044 --- /dev/null +++ b/src/test/java/com/sap/openrewrite/recipe/FindCdsModelEqualsTest.java @@ -0,0 +1,49 @@ +package com.sap.openrewrite.recipe; + +import static org.openrewrite.java.Assertions.java; + +import org.junit.jupiter.api.Test; +import org.openrewrite.java.JavaParser; +import org.openrewrite.test.RecipeSpec; +import org.openrewrite.test.RewriteTest; + +public class FindCdsModelEqualsTest implements RewriteTest { + + @Override + public void defaults(RecipeSpec spec) { + spec.recipe(new FindCdsModelEquals()).parser(JavaParser.fromJavaVersion().classpath("cds4j-api")); + } + + @Test + void testReplaceModifyUser() { + rewriteRun( + java( + + """ + import com.sap.cds.reflect.CdsModel; + + class Test { + + boolean test(CdsModel m1, CdsModel m2) { + return m1 == m2; + } + + } + """, + """ + import com.sap.cds.reflect.CdsModel; + + class Test { + + boolean test(CdsModel m1, CdsModel m2) { + return /*~~>*/m1 == m2; + } + + } + """ + ) + ); + + } + +} diff --git a/src/test/java/com/sap/openrewrite/recipe/FindSetTenantTest.java b/src/test/java/com/sap/openrewrite/recipe/FindSetTenantTest.java index de0361e..f253bc4 100644 --- a/src/test/java/com/sap/openrewrite/recipe/FindSetTenantTest.java +++ b/src/test/java/com/sap/openrewrite/recipe/FindSetTenantTest.java @@ -15,7 +15,7 @@ public void defaults(RecipeSpec spec) { } @Test - void testSelect() { + void testSetTenantInModifyUser() { rewriteRun( java( @@ -25,7 +25,9 @@ void testSelect() { class Test { void test(CdsRuntime runtime) { - runtime.requestContext().modifyUser(u -> u.setTenant(null)); + runtime.requestContext().modifyUser(u -> + u.setTenant(null) + ); } } @@ -36,7 +38,9 @@ void test(CdsRuntime runtime) { class Test { void test(CdsRuntime runtime) { - runtime.requestContext().modifyUser(u -> /*~~>*/u.setTenant(null)); + runtime.requestContext().modifyUser(u -> + /*~~>*/u.setTenant(null) + ); } } @@ -46,4 +50,22 @@ void test(CdsRuntime runtime) { } + @Test + void testSetTenant() { + rewriteRun( + java( + """ + import com.sap.cds.services.request.UserInfo; + + class Test { + + void test() { + UserInfo.create().setTenant(null); + } + + } + """ + ) + ); + } } diff --git a/src/test/java/com/sap/openrewrite/recipe/RequestContextRunnerRulesTest.java b/src/test/java/com/sap/openrewrite/recipe/RequestContextRunnerRulesTest.java new file mode 100644 index 0000000..b8695b1 --- /dev/null +++ b/src/test/java/com/sap/openrewrite/recipe/RequestContextRunnerRulesTest.java @@ -0,0 +1,51 @@ +package com.sap.openrewrite.recipe; + +import static org.openrewrite.java.Assertions.java; + +import org.junit.jupiter.api.Test; +import org.openrewrite.java.JavaParser; +import org.openrewrite.test.RecipeSpec; +import org.openrewrite.test.RewriteTest; + +public class RequestContextRunnerRulesTest implements RewriteTest { + + @Override + public void defaults(RecipeSpec spec) { + spec.recipe(new RequestContexRunnerRulesRecipes()).parser(JavaParser.fromJavaVersion().classpath("cds-services-api")); + } + + @Test + void testReplaceModifyUser() { + rewriteRun( + java( + + """ + import com.sap.cds.services.runtime.CdsRuntime; + + class Test { + + void test(CdsRuntime runtime) { + String test = "test"; + runtime.requestContext().modifyUser(u -> u.setTenant(test)); + } + + } + """, + """ + import com.sap.cds.services.runtime.CdsRuntime; + + class Test { + + void test(CdsRuntime runtime) { + String test = "test"; + runtime.requestContext().systemUser(test); + } + + } + """ + ) + ); + + } + +}