From dcefdbece9a560b05d80b6a1466175ebd5e3f5f3 Mon Sep 17 00:00:00 2001 From: timo <1398557+timo-a@users.noreply.github.com> Date: Sun, 22 Dec 2024 01:14:37 +0100 Subject: [PATCH 01/15] migrate recipe as-is --- .../migrate/lombok/log/ConvertCommons.java | 81 ++++++++++++ .../java/migrate/lombok/log/ConvertJBoss.java | 80 ++++++++++++ .../migrate/lombok/log/ConvertLog4j2.java | 81 ++++++++++++ .../migrate/lombok/log/ConvertLogRecipe.java | 20 +++ .../java/migrate/lombok/log/ConvertSlf4j.java | 81 ++++++++++++ .../migrate/lombok/log/ConvertUtilLog.java | 85 +++++++++++++ .../java/migrate/lombok/log/LogVisitor.java | 118 ++++++++++++++++++ 7 files changed, 546 insertions(+) create mode 100644 src/main/java/org/openrewrite/java/migrate/lombok/log/ConvertCommons.java create mode 100644 src/main/java/org/openrewrite/java/migrate/lombok/log/ConvertJBoss.java create mode 100644 src/main/java/org/openrewrite/java/migrate/lombok/log/ConvertLog4j2.java create mode 100644 src/main/java/org/openrewrite/java/migrate/lombok/log/ConvertLogRecipe.java create mode 100644 src/main/java/org/openrewrite/java/migrate/lombok/log/ConvertSlf4j.java create mode 100644 src/main/java/org/openrewrite/java/migrate/lombok/log/ConvertUtilLog.java create mode 100644 src/main/java/org/openrewrite/java/migrate/lombok/log/LogVisitor.java diff --git a/src/main/java/org/openrewrite/java/migrate/lombok/log/ConvertCommons.java b/src/main/java/org/openrewrite/java/migrate/lombok/log/ConvertCommons.java new file mode 100644 index 000000000..014600be0 --- /dev/null +++ b/src/main/java/org/openrewrite/java/migrate/lombok/log/ConvertCommons.java @@ -0,0 +1,81 @@ +/* + * Copyright 2021 the original author or authors. + *

+ * 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 + *

+ * https://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.openrewrite.java.migrate.lombok.log; + +import lombok.EqualsAndHashCode; +import lombok.Value; +import org.jspecify.annotations.Nullable; +import org.openrewrite.ExecutionContext; +import org.openrewrite.Option; +import org.openrewrite.TreeVisitor; +import org.openrewrite.java.JavaTemplate; + +@Value +@EqualsAndHashCode(callSuper = false) +public class ConvertCommons extends ConvertLogRecipe { + + @Override + public String getDisplayName() { + return getDisplayName("@CommonsLog"); + } + + @Override + public String getDescription() { + //language=markdown + return getDescription("@CommonsLog", "org.apache.commons.logging.Log"); + } + + @Option(displayName = "Name of the log field", + description = FIELD_NAME_DESCRIPTION, + example = "LOGGER", + required = false) + @Nullable + String fieldName; + + @Override + public TreeVisitor getVisitor() { + return new CommonsLogVisitor(fieldName); + } + + public static class CommonsLogVisitor extends LogVisitor { + + CommonsLogVisitor(String fieldName_) { + super(fieldName_); + } + + @Override + protected void switchImports() { + maybeAddImport("lombok.extern.apachecommons.CommonsLog"); + maybeRemoveImport("org.apache.commons.logging.Log"); + maybeRemoveImport("org.apache.commons.logging.LogFactory"); + } + + @Override + protected JavaTemplate getLombokTemplate() { + return getLombokTemplate("CommonsLog", "lombok.extern.apachecommons.CommonsLog"); + } + + @Override + protected String expectedLoggerPath() { + return "org.apache.commons.logging.Log"; + } + + @Override + protected boolean methodPath(String path) { + return "org.apache.commons.logging.LogFactory.getLog".equals(path); + } + } +} diff --git a/src/main/java/org/openrewrite/java/migrate/lombok/log/ConvertJBoss.java b/src/main/java/org/openrewrite/java/migrate/lombok/log/ConvertJBoss.java new file mode 100644 index 000000000..8a8317118 --- /dev/null +++ b/src/main/java/org/openrewrite/java/migrate/lombok/log/ConvertJBoss.java @@ -0,0 +1,80 @@ +/* + * Copyright 2021 the original author or authors. + *

+ * 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 + *

+ * https://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.openrewrite.java.migrate.lombok.log; + +import lombok.EqualsAndHashCode; +import lombok.Value; +import org.jspecify.annotations.Nullable; +import org.openrewrite.ExecutionContext; +import org.openrewrite.Option; +import org.openrewrite.TreeVisitor; +import org.openrewrite.java.JavaTemplate; + +@Value +@EqualsAndHashCode(callSuper = false) +public class ConvertJBoss extends ConvertLogRecipe { + + @Override + public String getDisplayName() { + return getDisplayName("@JBossLog"); + } + + @Override + public String getDescription() { + //language=markdown + return getDescription("@JBossLog", "org.jboss.logging.Logger"); + } + + @Option(displayName = "Name of the log field", + description = FIELD_NAME_DESCRIPTION, + example = "LOGGER", + required = false) + @Nullable + String fieldName; + + @Override + public TreeVisitor getVisitor() { + return new JbosslogVisitor(fieldName); + } + + public static class JbosslogVisitor extends LogVisitor { + + JbosslogVisitor(String fieldName_) { + super(fieldName_); + } + + @Override + protected void switchImports() { + maybeAddImport("lombok.extern.jbosslog.JBossLog"); + maybeRemoveImport("org.jboss.logging.Logger"); + } + + @Override + protected JavaTemplate getLombokTemplate() { + return getLombokTemplate("JBossLog", "lombok.extern.jbosslog.JBossLog"); + } + + @Override + protected String expectedLoggerPath() { + return "org.jboss.logging.Logger"; + } + + @Override + protected boolean methodPath(String path) { + return "org.jboss.logging.Logger.getLogger".equals(path); + } + } +} diff --git a/src/main/java/org/openrewrite/java/migrate/lombok/log/ConvertLog4j2.java b/src/main/java/org/openrewrite/java/migrate/lombok/log/ConvertLog4j2.java new file mode 100644 index 000000000..60f7c028b --- /dev/null +++ b/src/main/java/org/openrewrite/java/migrate/lombok/log/ConvertLog4j2.java @@ -0,0 +1,81 @@ +/* + * Copyright 2021 the original author or authors. + *

+ * 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 + *

+ * https://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.openrewrite.java.migrate.lombok.log; + +import lombok.EqualsAndHashCode; +import lombok.Value; +import org.jspecify.annotations.Nullable; +import org.openrewrite.ExecutionContext; +import org.openrewrite.Option; +import org.openrewrite.TreeVisitor; +import org.openrewrite.java.JavaTemplate; + +@Value +@EqualsAndHashCode(callSuper = false) +public class ConvertLog4j2 extends ConvertLogRecipe { + + @Override + public String getDisplayName() { + return getDisplayName("@Log4j2"); + } + + @Override + public String getDescription() { + //language=markdown + return getDescription("@Log4j2", "org.apache.logging.log4j.Logger"); + } + + @Option(displayName = "Name of the log field", + description = FIELD_NAME_DESCRIPTION, + example = "LOGGER", + required = false) + @Nullable + String fieldName; + + @Override + public TreeVisitor getVisitor() { + return new Log4j2Visitor(fieldName); + } + + public static class Log4j2Visitor extends LogVisitor { + + Log4j2Visitor(String fieldName_) { + super(fieldName_); + } + + @Override + protected void switchImports() { + maybeAddImport("lombok.extern.log4j.Log4j2"); + maybeRemoveImport("org.apache.logging.log4j.Logger"); + maybeRemoveImport("org.apache.logging.log4j.LogManager"); + } + + @Override + protected JavaTemplate getLombokTemplate() { + return getLombokTemplate("Log4j2", "lombok.extern.log4j.Log4j2"); + } + + @Override + protected String expectedLoggerPath() { + return "org.apache.logging.log4j.Logger"; + } + + @Override + protected boolean methodPath(String path) { + return "org.apache.logging.log4j.LogManager.getLogger".equals(path); + } + } +} diff --git a/src/main/java/org/openrewrite/java/migrate/lombok/log/ConvertLogRecipe.java b/src/main/java/org/openrewrite/java/migrate/lombok/log/ConvertLogRecipe.java new file mode 100644 index 000000000..c759fae7f --- /dev/null +++ b/src/main/java/org/openrewrite/java/migrate/lombok/log/ConvertLogRecipe.java @@ -0,0 +1,20 @@ +package org.openrewrite.java.migrate.lombok.log; + +import org.openrewrite.Recipe; + +public abstract class ConvertLogRecipe extends Recipe { + + protected static final String FIELD_NAME_DESCRIPTION = "Name of the log field to replace. " + + "If not specified, the field name is not checked and any field that satisfies the other checks is converted."; + + protected String getDisplayName(String annotation) { + //language=markdown + return String.format("Use `%s` instead of defining the field yourself", annotation); + } + + protected String getDescription(String annotation, String pathToLogger) { + //language=markdown + return String.format("Prefer the lombok annotation `%s` over explicitly written out `%s` fields.", annotation, pathToLogger); + } + +} diff --git a/src/main/java/org/openrewrite/java/migrate/lombok/log/ConvertSlf4j.java b/src/main/java/org/openrewrite/java/migrate/lombok/log/ConvertSlf4j.java new file mode 100644 index 000000000..a4cda6349 --- /dev/null +++ b/src/main/java/org/openrewrite/java/migrate/lombok/log/ConvertSlf4j.java @@ -0,0 +1,81 @@ +/* + * Copyright 2021 the original author or authors. + *

+ * 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 + *

+ * https://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.openrewrite.java.migrate.lombok.log; + +import lombok.EqualsAndHashCode; +import lombok.Value; +import org.jspecify.annotations.Nullable; +import org.openrewrite.ExecutionContext; +import org.openrewrite.Option; +import org.openrewrite.TreeVisitor; +import org.openrewrite.java.JavaTemplate; + +@Value +@EqualsAndHashCode(callSuper = false) +public class ConvertSlf4j extends ConvertLogRecipe { + + @Override + public String getDisplayName() { + return getDisplayName("@Slf4"); + } + + @Override + public String getDescription() { + //language=markdown + return getDescription("@Slf4", "org.slf4j.Logger"); + } + + @Option(displayName = "Name of the log field", + description = FIELD_NAME_DESCRIPTION, + example = "LOGGER", + required = false) + @Nullable + String fieldName; + + @Override + public TreeVisitor getVisitor() { + return new Slf4jVisitor(fieldName); + } + + public static class Slf4jVisitor extends LogVisitor { + + Slf4jVisitor(String fieldName_) { + super(fieldName_); + } + + @Override + protected void switchImports() { + maybeAddImport("lombok.extern.slf4j.Slf4j"); + maybeRemoveImport("org.slf4j.Logger"); + maybeRemoveImport("org.slf4j.LoggerFactory"); + } + + @Override + protected JavaTemplate getLombokTemplate() { + return getLombokTemplate("Slf4j", "lombok.extern.slf4j.Slf4j"); + } + + @Override + protected String expectedLoggerPath() { + return "org.slf4j.Logger"; + } + + @Override + protected boolean methodPath(String path) { + return "org.slf4j.LoggerFactory.getLogger".equals(path); + } + } +} diff --git a/src/main/java/org/openrewrite/java/migrate/lombok/log/ConvertUtilLog.java b/src/main/java/org/openrewrite/java/migrate/lombok/log/ConvertUtilLog.java new file mode 100644 index 000000000..aa4c78368 --- /dev/null +++ b/src/main/java/org/openrewrite/java/migrate/lombok/log/ConvertUtilLog.java @@ -0,0 +1,85 @@ +/* + * Copyright 2021 the original author or authors. + *

+ * 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 + *

+ * https://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.openrewrite.java.migrate.lombok.log; + +import lombok.EqualsAndHashCode; +import lombok.Value; +import org.jspecify.annotations.Nullable; +import org.openrewrite.ExecutionContext; +import org.openrewrite.Option; +import org.openrewrite.TreeVisitor; +import org.openrewrite.java.JavaTemplate; + +@Value +@EqualsAndHashCode(callSuper = false) +public class ConvertUtilLog extends ConvertLogRecipe { + + @Override + public String getDisplayName() { + return getDisplayName("@Log"); + } + + @Override + public String getDescription() { + //language=markdown + return getDescription("@Log", "java.util.logging.Logger"); + } + + @Option(displayName = "Name of the log field", + description = FIELD_NAME_DESCRIPTION, + example = "LOGGER", + required = false) + @Nullable + String fieldName; + + @Override + public TreeVisitor getVisitor() { + return new LogVanillaVisitor(fieldName); + } + + public static class LogVanillaVisitor extends LogVisitor { + + LogVanillaVisitor(String fieldName_) { + super(fieldName_); + } + + @Override + protected void switchImports() { + maybeAddImport("lombok.extern.java.Log"); + maybeRemoveImport("java.util.logging.Logger"); + } + + @Override + protected JavaTemplate getLombokTemplate() { + return getLombokTemplate("Log", "lombok.extern.java.Log"); + } + + @Override + protected String expectedLoggerPath() { + return "java.util.logging.Logger"; + } + + @Override + protected boolean methodPath(String path) { + return "java.util.logging.Logger.getLogger".equals(path); + } + + @Override + protected String getFactoryParameter(String className) { + return className + ".class.getName()"; + } + } +} diff --git a/src/main/java/org/openrewrite/java/migrate/lombok/log/LogVisitor.java b/src/main/java/org/openrewrite/java/migrate/lombok/log/LogVisitor.java new file mode 100644 index 000000000..1eb2836e3 --- /dev/null +++ b/src/main/java/org/openrewrite/java/migrate/lombok/log/LogVisitor.java @@ -0,0 +1,118 @@ +/* + * Copyright 2021 the original author or authors. + *

+ * 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 + *

+ * https://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.openrewrite.java.migrate.lombok.log; + +import lombok.EqualsAndHashCode; +import lombok.RequiredArgsConstructor; +import org.openrewrite.ExecutionContext; +import org.openrewrite.java.JavaIsoVisitor; +import org.openrewrite.java.JavaParser; +import org.openrewrite.java.JavaTemplate; +import org.openrewrite.java.tree.Flag; +import org.openrewrite.java.tree.J; +import org.openrewrite.java.tree.JavaType; + +import static java.util.Comparator.comparing; + +@RequiredArgsConstructor +@EqualsAndHashCode(callSuper = false) +abstract class LogVisitor extends JavaIsoVisitor { + public static final String CLASS_NAME = "CLASS_NAME"; + + final String fieldName; + + @Override + public J.ClassDeclaration visitClassDeclaration(J.ClassDeclaration classDecl, ExecutionContext ctx) { + + getCursor().putMessage(CLASS_NAME, classDecl.getSimpleName()); + + J.ClassDeclaration visitClassDeclaration = super.visitClassDeclaration(classDecl, ctx); + + //if nothing changed -> return + if (visitClassDeclaration == classDecl) { + return classDecl; + } + + switchImports(); + return getLombokTemplate().apply( + updateCursor(visitClassDeclaration), + visitClassDeclaration.getCoordinates().addAnnotation(comparing(J.Annotation::getSimpleName))); + } + + protected abstract JavaTemplate getLombokTemplate(); + + protected JavaTemplate getLombokTemplate(String name, String import_) { + return JavaTemplate + .builder("@"+name+"\n") + .javaParser(JavaParser.fromJavaVersion() + .classpath("lombok")) + .imports(import_) + .build(); + } + + protected abstract void switchImports(); + + protected abstract boolean methodPath(String path); + protected abstract String expectedLoggerPath(); + + @Override + public J.VariableDeclarations visitVariableDeclarations(J.VariableDeclarations multiVariable, ExecutionContext ctx) { + + //there must be exactly one Logger per line + //declaring two or more in one line is possible, but I don't care to support that + if (multiVariable.getVariables().size() != 1) + return multiVariable; + + J.VariableDeclarations.NamedVariable var = multiVariable.getVariables().get(0); + + JavaType.Variable type = var.getVariableType(); + if (!type.hasFlags(Flag.Private, Flag.Static, Flag.Final)) { + return multiVariable; + } + + JavaType.FullyQualified type0 = multiVariable.getTypeAsFullyQualified(); + String path = type0.getFullyQualifiedName(); + if (!expectedLoggerPath().equals(path)) + return multiVariable; + + //name needs to match the name of the field that lombok creates todo write name normalization recipe + if (fieldName != null && !fieldName.equals(var.getSimpleName())) + return multiVariable; + + J.MethodInvocation methodCall = (J.MethodInvocation) var.getInitializer(); + + String leftSide = methodCall.getMethodType().getDeclaringType().getFullyQualifiedName() + "." + methodCall.getMethodType().getName(); + + //method call must match + if (!methodPath(leftSide)) { + return multiVariable; + } + + //argument must match + String className = getCursor().pollNearestMessage(CLASS_NAME); + if (methodCall.getArguments().size() != 1 || + !methodCall.getArguments().get(0).toString().equals(getFactoryParameter(className) + )) { + return multiVariable; + } + + return null; + } + + protected String getFactoryParameter(String className) { + return className + ".class"; + } +} From e840b920d991ed5ce1665afde8e3ae7d566b72da Mon Sep 17 00:00:00 2001 From: timo <1398557+timo-a@users.noreply.github.com> Date: Mon, 23 Dec 2024 21:31:31 +0100 Subject: [PATCH 02/15] fix license --- .../java/migrate/lombok/log/ConvertCommons.java | 2 +- .../java/migrate/lombok/log/ConvertJBoss.java | 2 +- .../java/migrate/lombok/log/ConvertLog4j2.java | 2 +- .../java/migrate/lombok/log/ConvertLogRecipe.java | 15 +++++++++++++++ .../java/migrate/lombok/log/ConvertSlf4j.java | 2 +- .../java/migrate/lombok/log/ConvertUtilLog.java | 2 +- 6 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/openrewrite/java/migrate/lombok/log/ConvertCommons.java b/src/main/java/org/openrewrite/java/migrate/lombok/log/ConvertCommons.java index 014600be0..eeaf809dd 100644 --- a/src/main/java/org/openrewrite/java/migrate/lombok/log/ConvertCommons.java +++ b/src/main/java/org/openrewrite/java/migrate/lombok/log/ConvertCommons.java @@ -1,5 +1,5 @@ /* - * Copyright 2021 the original author or authors. + * Copyright 2024 the original author or authors. *

* Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/openrewrite/java/migrate/lombok/log/ConvertJBoss.java b/src/main/java/org/openrewrite/java/migrate/lombok/log/ConvertJBoss.java index 8a8317118..562b6711a 100644 --- a/src/main/java/org/openrewrite/java/migrate/lombok/log/ConvertJBoss.java +++ b/src/main/java/org/openrewrite/java/migrate/lombok/log/ConvertJBoss.java @@ -1,5 +1,5 @@ /* - * Copyright 2021 the original author or authors. + * Copyright 2024 the original author or authors. *

* Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/openrewrite/java/migrate/lombok/log/ConvertLog4j2.java b/src/main/java/org/openrewrite/java/migrate/lombok/log/ConvertLog4j2.java index 60f7c028b..4e40dc03a 100644 --- a/src/main/java/org/openrewrite/java/migrate/lombok/log/ConvertLog4j2.java +++ b/src/main/java/org/openrewrite/java/migrate/lombok/log/ConvertLog4j2.java @@ -1,5 +1,5 @@ /* - * Copyright 2021 the original author or authors. + * Copyright 2024 the original author or authors. *

* Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/openrewrite/java/migrate/lombok/log/ConvertLogRecipe.java b/src/main/java/org/openrewrite/java/migrate/lombok/log/ConvertLogRecipe.java index c759fae7f..88bbfde73 100644 --- a/src/main/java/org/openrewrite/java/migrate/lombok/log/ConvertLogRecipe.java +++ b/src/main/java/org/openrewrite/java/migrate/lombok/log/ConvertLogRecipe.java @@ -1,3 +1,18 @@ +/* + * Copyright 2024 the original author or authors. + *

+ * 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 + *

+ * https://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.openrewrite.java.migrate.lombok.log; import org.openrewrite.Recipe; diff --git a/src/main/java/org/openrewrite/java/migrate/lombok/log/ConvertSlf4j.java b/src/main/java/org/openrewrite/java/migrate/lombok/log/ConvertSlf4j.java index a4cda6349..d29a9abd9 100644 --- a/src/main/java/org/openrewrite/java/migrate/lombok/log/ConvertSlf4j.java +++ b/src/main/java/org/openrewrite/java/migrate/lombok/log/ConvertSlf4j.java @@ -1,5 +1,5 @@ /* - * Copyright 2021 the original author or authors. + * Copyright 2024 the original author or authors. *

* Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/openrewrite/java/migrate/lombok/log/ConvertUtilLog.java b/src/main/java/org/openrewrite/java/migrate/lombok/log/ConvertUtilLog.java index aa4c78368..54237a851 100644 --- a/src/main/java/org/openrewrite/java/migrate/lombok/log/ConvertUtilLog.java +++ b/src/main/java/org/openrewrite/java/migrate/lombok/log/ConvertUtilLog.java @@ -1,5 +1,5 @@ /* - * Copyright 2021 the original author or authors. + * Copyright 2024 the original author or authors. *

* Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. From 6bf288f498cb6d3bc3ba449f54ae08136aa57ad4 Mon Sep 17 00:00:00 2001 From: timo <1398557+timo-a@users.noreply.github.com> Date: Mon, 23 Dec 2024 21:31:58 +0100 Subject: [PATCH 03/15] minor polish --- .../openrewrite/java/migrate/lombok/log/ConvertLogRecipe.java | 1 - .../org/openrewrite/java/migrate/lombok/log/LogVisitor.java | 3 ++- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/openrewrite/java/migrate/lombok/log/ConvertLogRecipe.java b/src/main/java/org/openrewrite/java/migrate/lombok/log/ConvertLogRecipe.java index 88bbfde73..17e1c376b 100644 --- a/src/main/java/org/openrewrite/java/migrate/lombok/log/ConvertLogRecipe.java +++ b/src/main/java/org/openrewrite/java/migrate/lombok/log/ConvertLogRecipe.java @@ -23,7 +23,6 @@ public abstract class ConvertLogRecipe extends Recipe { "If not specified, the field name is not checked and any field that satisfies the other checks is converted."; protected String getDisplayName(String annotation) { - //language=markdown return String.format("Use `%s` instead of defining the field yourself", annotation); } diff --git a/src/main/java/org/openrewrite/java/migrate/lombok/log/LogVisitor.java b/src/main/java/org/openrewrite/java/migrate/lombok/log/LogVisitor.java index 1eb2836e3..be87fbf0b 100644 --- a/src/main/java/org/openrewrite/java/migrate/lombok/log/LogVisitor.java +++ b/src/main/java/org/openrewrite/java/migrate/lombok/log/LogVisitor.java @@ -17,6 +17,7 @@ import lombok.EqualsAndHashCode; import lombok.RequiredArgsConstructor; +import org.jspecify.annotations.Nullable; import org.openrewrite.ExecutionContext; import org.openrewrite.java.JavaIsoVisitor; import org.openrewrite.java.JavaParser; @@ -69,7 +70,7 @@ protected JavaTemplate getLombokTemplate(String name, String import_) { protected abstract String expectedLoggerPath(); @Override - public J.VariableDeclarations visitVariableDeclarations(J.VariableDeclarations multiVariable, ExecutionContext ctx) { + public J.@Nullable VariableDeclarations visitVariableDeclarations(J.VariableDeclarations multiVariable, ExecutionContext ctx) { //there must be exactly one Logger per line //declaring two or more in one line is possible, but I don't care to support that From a420044f3c5171f0f3404e80740e2a4e41bc1e12 Mon Sep 17 00:00:00 2001 From: timo <1398557+timo-a@users.noreply.github.com> Date: Tue, 24 Dec 2024 01:12:51 +0100 Subject: [PATCH 04/15] rename recipes --- ...ConvertCommons.java => UseCommonsLog.java} | 2 +- .../{ConvertJBoss.java => UseJBossLog.java} | 2 +- .../log/{ConvertUtilLog.java => UseLog.java} | 2 +- .../{ConvertLog4j2.java => UseLog4j2.java} | 2 +- ...gRecipe.java => UseLogRecipeTemplate.java} | 2 +- .../log/{ConvertSlf4j.java => UseSlf4j.java} | 2 +- .../rewrite/use-lombok-log-catchall.yml | 30 +++++++++++++++++++ 7 files changed, 36 insertions(+), 6 deletions(-) rename src/main/java/org/openrewrite/java/migrate/lombok/log/{ConvertCommons.java => UseCommonsLog.java} (97%) rename src/main/java/org/openrewrite/java/migrate/lombok/log/{ConvertJBoss.java => UseJBossLog.java} (97%) rename src/main/java/org/openrewrite/java/migrate/lombok/log/{ConvertUtilLog.java => UseLog.java} (97%) rename src/main/java/org/openrewrite/java/migrate/lombok/log/{ConvertLog4j2.java => UseLog4j2.java} (97%) rename src/main/java/org/openrewrite/java/migrate/lombok/log/{ConvertLogRecipe.java => UseLogRecipeTemplate.java} (95%) rename src/main/java/org/openrewrite/java/migrate/lombok/log/{ConvertSlf4j.java => UseSlf4j.java} (97%) create mode 100644 src/main/resources/META-INF/rewrite/use-lombok-log-catchall.yml diff --git a/src/main/java/org/openrewrite/java/migrate/lombok/log/ConvertCommons.java b/src/main/java/org/openrewrite/java/migrate/lombok/log/UseCommonsLog.java similarity index 97% rename from src/main/java/org/openrewrite/java/migrate/lombok/log/ConvertCommons.java rename to src/main/java/org/openrewrite/java/migrate/lombok/log/UseCommonsLog.java index eeaf809dd..c2865d9b6 100644 --- a/src/main/java/org/openrewrite/java/migrate/lombok/log/ConvertCommons.java +++ b/src/main/java/org/openrewrite/java/migrate/lombok/log/UseCommonsLog.java @@ -25,7 +25,7 @@ @Value @EqualsAndHashCode(callSuper = false) -public class ConvertCommons extends ConvertLogRecipe { +public class UseCommonsLog extends UseLogRecipeTemplate { @Override public String getDisplayName() { diff --git a/src/main/java/org/openrewrite/java/migrate/lombok/log/ConvertJBoss.java b/src/main/java/org/openrewrite/java/migrate/lombok/log/UseJBossLog.java similarity index 97% rename from src/main/java/org/openrewrite/java/migrate/lombok/log/ConvertJBoss.java rename to src/main/java/org/openrewrite/java/migrate/lombok/log/UseJBossLog.java index 562b6711a..53e00fd04 100644 --- a/src/main/java/org/openrewrite/java/migrate/lombok/log/ConvertJBoss.java +++ b/src/main/java/org/openrewrite/java/migrate/lombok/log/UseJBossLog.java @@ -25,7 +25,7 @@ @Value @EqualsAndHashCode(callSuper = false) -public class ConvertJBoss extends ConvertLogRecipe { +public class UseJBossLog extends UseLogRecipeTemplate { @Override public String getDisplayName() { diff --git a/src/main/java/org/openrewrite/java/migrate/lombok/log/ConvertUtilLog.java b/src/main/java/org/openrewrite/java/migrate/lombok/log/UseLog.java similarity index 97% rename from src/main/java/org/openrewrite/java/migrate/lombok/log/ConvertUtilLog.java rename to src/main/java/org/openrewrite/java/migrate/lombok/log/UseLog.java index 54237a851..d15b8e2a1 100644 --- a/src/main/java/org/openrewrite/java/migrate/lombok/log/ConvertUtilLog.java +++ b/src/main/java/org/openrewrite/java/migrate/lombok/log/UseLog.java @@ -25,7 +25,7 @@ @Value @EqualsAndHashCode(callSuper = false) -public class ConvertUtilLog extends ConvertLogRecipe { +public class UseLog extends UseLogRecipeTemplate { @Override public String getDisplayName() { diff --git a/src/main/java/org/openrewrite/java/migrate/lombok/log/ConvertLog4j2.java b/src/main/java/org/openrewrite/java/migrate/lombok/log/UseLog4j2.java similarity index 97% rename from src/main/java/org/openrewrite/java/migrate/lombok/log/ConvertLog4j2.java rename to src/main/java/org/openrewrite/java/migrate/lombok/log/UseLog4j2.java index 4e40dc03a..425e639f8 100644 --- a/src/main/java/org/openrewrite/java/migrate/lombok/log/ConvertLog4j2.java +++ b/src/main/java/org/openrewrite/java/migrate/lombok/log/UseLog4j2.java @@ -25,7 +25,7 @@ @Value @EqualsAndHashCode(callSuper = false) -public class ConvertLog4j2 extends ConvertLogRecipe { +public class UseLog4j2 extends UseLogRecipeTemplate { @Override public String getDisplayName() { diff --git a/src/main/java/org/openrewrite/java/migrate/lombok/log/ConvertLogRecipe.java b/src/main/java/org/openrewrite/java/migrate/lombok/log/UseLogRecipeTemplate.java similarity index 95% rename from src/main/java/org/openrewrite/java/migrate/lombok/log/ConvertLogRecipe.java rename to src/main/java/org/openrewrite/java/migrate/lombok/log/UseLogRecipeTemplate.java index 17e1c376b..a70ca191b 100644 --- a/src/main/java/org/openrewrite/java/migrate/lombok/log/ConvertLogRecipe.java +++ b/src/main/java/org/openrewrite/java/migrate/lombok/log/UseLogRecipeTemplate.java @@ -17,7 +17,7 @@ import org.openrewrite.Recipe; -public abstract class ConvertLogRecipe extends Recipe { +public abstract class UseLogRecipeTemplate extends Recipe { protected static final String FIELD_NAME_DESCRIPTION = "Name of the log field to replace. " + "If not specified, the field name is not checked and any field that satisfies the other checks is converted."; diff --git a/src/main/java/org/openrewrite/java/migrate/lombok/log/ConvertSlf4j.java b/src/main/java/org/openrewrite/java/migrate/lombok/log/UseSlf4j.java similarity index 97% rename from src/main/java/org/openrewrite/java/migrate/lombok/log/ConvertSlf4j.java rename to src/main/java/org/openrewrite/java/migrate/lombok/log/UseSlf4j.java index d29a9abd9..394652bc1 100644 --- a/src/main/java/org/openrewrite/java/migrate/lombok/log/ConvertSlf4j.java +++ b/src/main/java/org/openrewrite/java/migrate/lombok/log/UseSlf4j.java @@ -25,7 +25,7 @@ @Value @EqualsAndHashCode(callSuper = false) -public class ConvertSlf4j extends ConvertLogRecipe { +public class UseSlf4j extends UseLogRecipeTemplate { @Override public String getDisplayName() { diff --git a/src/main/resources/META-INF/rewrite/use-lombok-log-catchall.yml b/src/main/resources/META-INF/rewrite/use-lombok-log-catchall.yml new file mode 100644 index 000000000..68b384ebf --- /dev/null +++ b/src/main/resources/META-INF/rewrite/use-lombok-log-catchall.yml @@ -0,0 +1,30 @@ +# +# Copyright 2024 the original author or authors. +#

+# 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 +#

+# https://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. +# + +--- +type: specs.openrewrite.org/v1beta/recipe +name: io.github.timoa.lombok.log.ConvertAnyLog +displayName: Use lomboks log annotation instead of defining the field yourself +description: >- + Applies all recipes that replace logger declarations with class level annotations. + If you know which logger framework is in use you can simply use the specific recipe. + If, for some reason you need to cover all frameworks you can use this recipe. +recipeList: + - org.openrewrite.java.migrate.lombok.log.UseSlf4j + - org.openrewrite.java.migrate.lombok.log.UseCommonsLog + - org.openrewrite.java.migrate.lombok.log.UseLog4j2 + - org.openrewrite.java.migrate.lombok.log.UseJBossLog + - org.openrewrite.java.migrate.lombok.log.UseLog From 7b8fdaf1f23d93d9d90c9255ae72a9ff816e6aa4 Mon Sep 17 00:00:00 2001 From: timo <1398557+timo-a@users.noreply.github.com> Date: Tue, 24 Dec 2024 01:13:06 +0100 Subject: [PATCH 05/15] add tests --- build.gradle.kts | 3 + .../migrate/lombok/log/ConvertAnyLogTest.java | 160 +++++++++++ .../log/ConvertToLogAnnotationTest.java | 266 ++++++++++++++++++ 3 files changed, 429 insertions(+) create mode 100644 src/test/java/org/openrewrite/java/migrate/lombok/log/ConvertAnyLogTest.java create mode 100644 src/test/java/org/openrewrite/java/migrate/lombok/log/ConvertToLogAnnotationTest.java diff --git a/build.gradle.kts b/build.gradle.kts index af572b74a..786afc449 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -50,6 +50,9 @@ dependencies { testImplementation("com.google.guava:guava:33.0.0-jre") testImplementation("joda-time:joda-time:2.12.3") testImplementation("org.threeten:threeten-extra:1.8.0") + testImplementation("org.apache.logging.log4j:log4j-api:2.23.1") + testImplementation("org.jboss.logging:jboss-logging:3.6.0.Final") + testImplementation("commons-logging:commons-logging:1.3.2") testRuntimeOnly("com.fasterxml.jackson.datatype:jackson-datatype-jsr353") testRuntimeOnly("com.fasterxml.jackson.core:jackson-core") diff --git a/src/test/java/org/openrewrite/java/migrate/lombok/log/ConvertAnyLogTest.java b/src/test/java/org/openrewrite/java/migrate/lombok/log/ConvertAnyLogTest.java new file mode 100644 index 000000000..11361a612 --- /dev/null +++ b/src/test/java/org/openrewrite/java/migrate/lombok/log/ConvertAnyLogTest.java @@ -0,0 +1,160 @@ +/* + * Copyright 2024 the original author or authors. + *

+ * 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 + *

+ * https://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.openrewrite.java.migrate.lombok.log; + +import org.junit.jupiter.api.Test; +import org.openrewrite.DocumentExample; +import org.openrewrite.java.JavaParser; +import org.openrewrite.test.RecipeSpec; +import org.openrewrite.test.RewriteTest; + +import static org.openrewrite.java.Assertions.java; + +class ConvertAnyLogTest implements RewriteTest { + + @Override + public void defaults(RecipeSpec spec) { + spec.recipeFromResources("io.github.timoa.lombok.log.ConvertAnyLog") + .parser(JavaParser.fromJavaVersion() + .classpath("slf4j-api", "log4j-api", "jboss-logging", "commons-logging")); + } + + @DocumentExample + @Test + void replaceAllLoggers() { + rewriteRun( + // language=java + java( + """ + class A { + private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(A.class); + } + """, + """ + import lombok.extern.slf4j.Slf4j; + + @Slf4j + class A { + } + """ + ), + // language=java + java( + """ + import org.apache.logging.log4j.Logger; + import org.apache.logging.log4j.LogManager; + class B { + private static final Logger log = LogManager.getLogger(B.class); + } + """, + """ + import lombok.extern.log4j.Log4j2; + + @Log4j2 + class B { + } + """ + ), + // language=java + java( + """ + import java.util.logging.Logger; + class C { + private static final Logger log = Logger.getLogger(C.class.getName()); + } + """, + """ + import lombok.extern.java.Log; + + @Log + class C { + } + """ + ), + // language=java + java( + """ + import org.jboss.logging.Logger; + class D { + private static final Logger log = Logger.getLogger(D.class); + } + """, + """ + import lombok.extern.jbosslog.JBossLog; + + @JBossLog + class D { + } + """ + ), + // language=java + java( + """ + import org.apache.commons.logging.Log; + import org.apache.commons.logging.LogFactory; + class E { + private static final Log log = LogFactory.getLog(E.class); + } + """, + """ + import lombok.extern.apachecommons.CommonsLog; + + @CommonsLog + class E { + } + """ + ) + ); + } + + @Test + void allInOne() { + rewriteRun( + // language=java + java( + """ + import org.apache.logging.log4j.LogManager; + import java.util.logging.Logger; + import org.apache.commons.logging.Log; + import org.apache.commons.logging.LogFactory; + + class A { + private static final org.slf4j.Logger log1 = org.slf4j.LoggerFactory.getLogger(A.class); + private static final org.apache.logging.log4j.Logger log2 = org.apache.logging.log4j.LogManager.getLogger(A.class); + private static final Logger log3 = Logger.getLogger(A.class.getName()); + private static final org.jboss.logging.Logger log4 = org.jboss.logging.Logger.getLogger(A.class); + private static final Log log5 = LogFactory.getLog(A.class); + } + """, + """ + import lombok.extern.apachecommons.CommonsLog; + import lombok.extern.java.Log; + import lombok.extern.jbosslog.JBossLog; + import lombok.extern.log4j.Log4j2; + import lombok.extern.slf4j.Slf4j; + + @CommonsLog + @JBossLog + @Log + @Log4j2 + @Slf4j + class A { + } + """ + ) + ); + } +} diff --git a/src/test/java/org/openrewrite/java/migrate/lombok/log/ConvertToLogAnnotationTest.java b/src/test/java/org/openrewrite/java/migrate/lombok/log/ConvertToLogAnnotationTest.java new file mode 100644 index 000000000..77f74a04e --- /dev/null +++ b/src/test/java/org/openrewrite/java/migrate/lombok/log/ConvertToLogAnnotationTest.java @@ -0,0 +1,266 @@ +/* + * Copyright 2024 the original author or authors. + *

+ * 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 + *

+ * https://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.openrewrite.java.migrate.lombok.log; + +import org.junit.jupiter.api.Test; +import org.openrewrite.DocumentExample; +import org.openrewrite.java.JavaParser; +import org.openrewrite.test.RecipeSpec; +import org.openrewrite.test.RewriteTest; + +import static org.openrewrite.java.Assertions.java; + +class ConvertToLogAnnotationTest implements RewriteTest { + + @Override + public void defaults(RecipeSpec spec) { + spec.recipe(new UseSlf4j(null)) + .parser(JavaParser.fromJavaVersion() + .classpath("slf4j-api")); + } + + @DocumentExample + @Test + void replaceSlf4j() { + rewriteRun(// language=java + java( + """ + class A { + private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(A.class); + } + """, + """ + import lombok.extern.slf4j.Slf4j; + + @Slf4j + class A { + } + """ + ) + ); + } + + @Test + void replaceSlf4jImportedType() { + rewriteRun(// language=java + java( + """ + import org.slf4j.Logger; + class A { + private static final Logger log = org.slf4j.LoggerFactory.getLogger(A.class); + } + """, + """ + import lombok.extern.slf4j.Slf4j; + + @Slf4j + class A { + } + """ + ) + ); + } + + @Test + void replaceSlf4jImportedLogger() { + rewriteRun(// language=java + java( + """ + import org.slf4j.LoggerFactory; + class A { + private static final org.slf4j.Logger log = LoggerFactory.getLogger(A.class); + } + """, + """ + import lombok.extern.slf4j.Slf4j; + + @Slf4j + class A { + } + """ + ) + ); + } + + @Test + void replaceSlf4jStaticallyImportedLogger() { + rewriteRun(// language=java + java( + """ + import static org.slf4j.LoggerFactory.*; + class A { + private static final org.slf4j.Logger log = getLogger(A.class); + } + """, + """ + import lombok.extern.slf4j.Slf4j; + + @Slf4j + class A { + } + """ + ) + ); + } + + @Test + void shouldNotReplaceWhenFieldNameDiffersFromSpecifiedName() { + rewriteRun( + spec -> spec.recipe(new UseSlf4j("log")) + .parser(JavaParser.fromJavaVersion() + .classpath("slf4j-api")), + + // language=java + java( + """ + class A { + private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(A.class); + } + """ + ) + ); + } + + @Test + void replaceSlf4jWithPackage() { + rewriteRun(// language=java + java( + """ + package com.yourorg.yourapp; + class A { + private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(A.class); + } + """, + """ + package com.yourorg.yourapp; + + import lombok.extern.slf4j.Slf4j; + + @Slf4j + class A { + } + """ + ) + ); + } + + @Test + void replaceLog4j() { + rewriteRun( + spec -> spec.recipe(new UseLog4j2(null)) + .parser(JavaParser.fromJavaVersion() + .logCompilationWarningsAndErrors(true) + .classpath("log4j-api")), + // language=java + java( + """ + import org.apache.logging.log4j.Logger; + import org.apache.logging.log4j.LogManager; + class A { + private static final Logger log = LogManager.getLogger(A.class); + } + """, + """ + import lombok.extern.log4j.Log4j2; + + @Log4j2 + class A { + } + """ + ) + ); + } + + @Test + void replaceLog() { + rewriteRun( + spec -> spec.recipe(new UseLog(null)) + .parser(JavaParser.fromJavaVersion() + .logCompilationWarningsAndErrors(true)), + + // language=java + java( + """ + import java.util.logging.Logger; + class A { + private static final Logger log = Logger.getLogger(A.class.getName()); + } + """, + """ + import lombok.extern.java.Log; + + @Log + class A { + } + """ + ) + ); + } + + @Test + void replaceJbossLog() { + rewriteRun( + spec -> spec.recipe(new UseJBossLog(null)) + .parser(JavaParser.fromJavaVersion() + .logCompilationWarningsAndErrors(true) + .classpath("jboss-logging")), + // language=java + java( + """ + import org.jboss.logging.Logger; + class A { + private static final Logger log = Logger.getLogger(A.class); + } + """, + """ + import lombok.extern.jbosslog.JBossLog; + + @JBossLog + class A { + } + """ + ) + ); + } + + @Test + void replaceCommonsLog() { + rewriteRun( + spec -> spec.recipe(new UseCommonsLog(null)) + .parser(JavaParser.fromJavaVersion() + .logCompilationWarningsAndErrors(true) + .classpath("commons-logging")), + // language=java + java( + """ + import org.apache.commons.logging.Log; + import org.apache.commons.logging.LogFactory; + class A { + private static final Log log = LogFactory.getLog(A.class); + } + """, + """ + import lombok.extern.apachecommons.CommonsLog; + + @CommonsLog + class A { + } + """ + ) + ); + } + +} From 9e865e30daba73837a8cd346061190203a766eca Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Sun, 5 Jan 2025 16:08:25 +0100 Subject: [PATCH 06/15] Use `firstEnclosingOrThrow` to find class name, not messaging --- .../java/migrate/lombok/log/LogVisitor.java | 26 ++++++++----------- .../lombok/log/UseLogRecipeTemplate.java | 2 +- .../java/migrate/lombok/log/package-info.java | 21 +++++++++++++++ 3 files changed, 33 insertions(+), 16 deletions(-) create mode 100644 src/main/java/org/openrewrite/java/migrate/lombok/log/package-info.java diff --git a/src/main/java/org/openrewrite/java/migrate/lombok/log/LogVisitor.java b/src/main/java/org/openrewrite/java/migrate/lombok/log/LogVisitor.java index be87fbf0b..47a764c1f 100644 --- a/src/main/java/org/openrewrite/java/migrate/lombok/log/LogVisitor.java +++ b/src/main/java/org/openrewrite/java/migrate/lombok/log/LogVisitor.java @@ -31,26 +31,22 @@ @RequiredArgsConstructor @EqualsAndHashCode(callSuper = false) abstract class LogVisitor extends JavaIsoVisitor { - public static final String CLASS_NAME = "CLASS_NAME"; - final String fieldName; + @Nullable + private final String fieldName; @Override public J.ClassDeclaration visitClassDeclaration(J.ClassDeclaration classDecl, ExecutionContext ctx) { - - getCursor().putMessage(CLASS_NAME, classDecl.getSimpleName()); - J.ClassDeclaration visitClassDeclaration = super.visitClassDeclaration(classDecl, ctx); - - //if nothing changed -> return - if (visitClassDeclaration == classDecl) { - return classDecl; + if (visitClassDeclaration != classDecl) { + switchImports(); + return getLombokTemplate() + .apply( + updateCursor(visitClassDeclaration), + visitClassDeclaration.getCoordinates().addAnnotation(comparing(J.Annotation::getSimpleName))); } - switchImports(); - return getLombokTemplate().apply( - updateCursor(visitClassDeclaration), - visitClassDeclaration.getCoordinates().addAnnotation(comparing(J.Annotation::getSimpleName))); + return classDecl; } protected abstract JavaTemplate getLombokTemplate(); @@ -80,7 +76,7 @@ protected JavaTemplate getLombokTemplate(String name, String import_) { J.VariableDeclarations.NamedVariable var = multiVariable.getVariables().get(0); JavaType.Variable type = var.getVariableType(); - if (!type.hasFlags(Flag.Private, Flag.Static, Flag.Final)) { + if (type == null || !type.hasFlags(Flag.Private, Flag.Static, Flag.Final)) { return multiVariable; } @@ -103,7 +99,7 @@ protected JavaTemplate getLombokTemplate(String name, String import_) { } //argument must match - String className = getCursor().pollNearestMessage(CLASS_NAME); + String className = getCursor().firstEnclosingOrThrow(J.ClassDeclaration.class).getSimpleName(); if (methodCall.getArguments().size() != 1 || !methodCall.getArguments().get(0).toString().equals(getFactoryParameter(className) )) { diff --git a/src/main/java/org/openrewrite/java/migrate/lombok/log/UseLogRecipeTemplate.java b/src/main/java/org/openrewrite/java/migrate/lombok/log/UseLogRecipeTemplate.java index a70ca191b..f4be0df33 100644 --- a/src/main/java/org/openrewrite/java/migrate/lombok/log/UseLogRecipeTemplate.java +++ b/src/main/java/org/openrewrite/java/migrate/lombok/log/UseLogRecipeTemplate.java @@ -17,7 +17,7 @@ import org.openrewrite.Recipe; -public abstract class UseLogRecipeTemplate extends Recipe { +abstract class UseLogRecipeTemplate extends Recipe { protected static final String FIELD_NAME_DESCRIPTION = "Name of the log field to replace. " + "If not specified, the field name is not checked and any field that satisfies the other checks is converted."; diff --git a/src/main/java/org/openrewrite/java/migrate/lombok/log/package-info.java b/src/main/java/org/openrewrite/java/migrate/lombok/log/package-info.java new file mode 100644 index 000000000..7ecaac351 --- /dev/null +++ b/src/main/java/org/openrewrite/java/migrate/lombok/log/package-info.java @@ -0,0 +1,21 @@ +/* + * Copyright 2024 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. + */ +@NullMarked +@NonNullFields +package org.openrewrite.java.migrate.lombok.log; + +import org.jspecify.annotations.NullMarked; +import org.openrewrite.internal.lang.NonNullFields; From 4f69a213799ef8464071eec170db337edbe00107 Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Sun, 5 Jan 2025 16:16:29 +0100 Subject: [PATCH 07/15] Inline getLombokTemplate and visitors --- .../java/migrate/lombok/log/LogVisitor.java | 31 +++++------ .../migrate/lombok/log/UseCommonsLog.java | 46 +++++++---------- .../java/migrate/lombok/log/UseJBossLog.java | 44 ++++++---------- .../java/migrate/lombok/log/UseLog.java | 51 +++++++------------ .../java/migrate/lombok/log/UseLog4j2.java | 46 +++++++---------- .../java/migrate/lombok/log/UseSlf4j.java | 46 +++++++---------- .../log/ConvertToLogAnnotationTest.java | 4 +- 7 files changed, 101 insertions(+), 167 deletions(-) diff --git a/src/main/java/org/openrewrite/java/migrate/lombok/log/LogVisitor.java b/src/main/java/org/openrewrite/java/migrate/lombok/log/LogVisitor.java index 47a764c1f..f291b5bb6 100644 --- a/src/main/java/org/openrewrite/java/migrate/lombok/log/LogVisitor.java +++ b/src/main/java/org/openrewrite/java/migrate/lombok/log/LogVisitor.java @@ -32,6 +32,7 @@ @EqualsAndHashCode(callSuper = false) abstract class LogVisitor extends JavaIsoVisitor { + private final String logAnnotation; @Nullable private final String fieldName; @@ -39,30 +40,24 @@ abstract class LogVisitor extends JavaIsoVisitor { public J.ClassDeclaration visitClassDeclaration(J.ClassDeclaration classDecl, ExecutionContext ctx) { J.ClassDeclaration visitClassDeclaration = super.visitClassDeclaration(classDecl, ctx); if (visitClassDeclaration != classDecl) { - switchImports(); - return getLombokTemplate() + maybeAddImport(logAnnotation); + removeImports(); + return JavaTemplate + .builder("@" + logAnnotation.substring(logAnnotation.lastIndexOf('.') + 1) + "\n") + .javaParser(JavaParser.fromJavaVersion().classpath("lombok")) + .imports(logAnnotation) + .build() .apply( - updateCursor(visitClassDeclaration), - visitClassDeclaration.getCoordinates().addAnnotation(comparing(J.Annotation::getSimpleName))); + updateCursor(visitClassDeclaration), + visitClassDeclaration.getCoordinates().addAnnotation(comparing(J.Annotation::getSimpleName))); } - return classDecl; } - protected abstract JavaTemplate getLombokTemplate(); - - protected JavaTemplate getLombokTemplate(String name, String import_) { - return JavaTemplate - .builder("@"+name+"\n") - .javaParser(JavaParser.fromJavaVersion() - .classpath("lombok")) - .imports(import_) - .build(); - } - - protected abstract void switchImports(); + protected abstract void removeImports(); protected abstract boolean methodPath(String path); + protected abstract String expectedLoggerPath(); @Override @@ -91,7 +86,7 @@ protected JavaTemplate getLombokTemplate(String name, String import_) { J.MethodInvocation methodCall = (J.MethodInvocation) var.getInitializer(); - String leftSide = methodCall.getMethodType().getDeclaringType().getFullyQualifiedName() + "." + methodCall.getMethodType().getName(); + String leftSide = methodCall.getMethodType().getDeclaringType().getFullyQualifiedName() + "." + methodCall.getMethodType().getName(); //method call must match if (!methodPath(leftSide)) { diff --git a/src/main/java/org/openrewrite/java/migrate/lombok/log/UseCommonsLog.java b/src/main/java/org/openrewrite/java/migrate/lombok/log/UseCommonsLog.java index c2865d9b6..885c9c903 100644 --- a/src/main/java/org/openrewrite/java/migrate/lombok/log/UseCommonsLog.java +++ b/src/main/java/org/openrewrite/java/migrate/lombok/log/UseCommonsLog.java @@ -21,7 +21,6 @@ import org.openrewrite.ExecutionContext; import org.openrewrite.Option; import org.openrewrite.TreeVisitor; -import org.openrewrite.java.JavaTemplate; @Value @EqualsAndHashCode(callSuper = false) @@ -47,35 +46,24 @@ public String getDescription() { @Override public TreeVisitor getVisitor() { - return new CommonsLogVisitor(fieldName); - } - - public static class CommonsLogVisitor extends LogVisitor { - - CommonsLogVisitor(String fieldName_) { - super(fieldName_); - } + String fieldName_ = fieldName; + return new LogVisitor("lombok.extern.apachecommons.CommonsLog", fieldName_) { + @Override + protected void removeImports() { + maybeRemoveImport("org.apache.commons.logging.Log"); + maybeRemoveImport("org.apache.commons.logging.LogFactory"); + } - @Override - protected void switchImports() { - maybeAddImport("lombok.extern.apachecommons.CommonsLog"); - maybeRemoveImport("org.apache.commons.logging.Log"); - maybeRemoveImport("org.apache.commons.logging.LogFactory"); - } + @Override + protected String expectedLoggerPath() { + return "org.apache.commons.logging.Log"; + } - @Override - protected JavaTemplate getLombokTemplate() { - return getLombokTemplate("CommonsLog", "lombok.extern.apachecommons.CommonsLog"); - } - - @Override - protected String expectedLoggerPath() { - return "org.apache.commons.logging.Log"; - } - - @Override - protected boolean methodPath(String path) { - return "org.apache.commons.logging.LogFactory.getLog".equals(path); - } + @Override + protected boolean methodPath(String path) { + return "org.apache.commons.logging.LogFactory.getLog".equals(path); + } + }; } + } diff --git a/src/main/java/org/openrewrite/java/migrate/lombok/log/UseJBossLog.java b/src/main/java/org/openrewrite/java/migrate/lombok/log/UseJBossLog.java index 53e00fd04..a35887b3b 100644 --- a/src/main/java/org/openrewrite/java/migrate/lombok/log/UseJBossLog.java +++ b/src/main/java/org/openrewrite/java/migrate/lombok/log/UseJBossLog.java @@ -21,7 +21,6 @@ import org.openrewrite.ExecutionContext; import org.openrewrite.Option; import org.openrewrite.TreeVisitor; -import org.openrewrite.java.JavaTemplate; @Value @EqualsAndHashCode(callSuper = false) @@ -47,34 +46,23 @@ public String getDescription() { @Override public TreeVisitor getVisitor() { - return new JbosslogVisitor(fieldName); - } - - public static class JbosslogVisitor extends LogVisitor { - - JbosslogVisitor(String fieldName_) { - super(fieldName_); - } + String fieldName_ = fieldName; + return new LogVisitor("lombok.extern.jbosslog.JBossLog", fieldName_) { + @Override + protected void removeImports() { + maybeRemoveImport("org.jboss.logging.Logger"); + } - @Override - protected void switchImports() { - maybeAddImport("lombok.extern.jbosslog.JBossLog"); - maybeRemoveImport("org.jboss.logging.Logger"); - } + @Override + protected String expectedLoggerPath() { + return "org.jboss.logging.Logger"; + } - @Override - protected JavaTemplate getLombokTemplate() { - return getLombokTemplate("JBossLog", "lombok.extern.jbosslog.JBossLog"); - } - - @Override - protected String expectedLoggerPath() { - return "org.jboss.logging.Logger"; - } - - @Override - protected boolean methodPath(String path) { - return "org.jboss.logging.Logger.getLogger".equals(path); - } + @Override + protected boolean methodPath(String path) { + return "org.jboss.logging.Logger.getLogger".equals(path); + } + }; } + } diff --git a/src/main/java/org/openrewrite/java/migrate/lombok/log/UseLog.java b/src/main/java/org/openrewrite/java/migrate/lombok/log/UseLog.java index d15b8e2a1..3090d8bcc 100644 --- a/src/main/java/org/openrewrite/java/migrate/lombok/log/UseLog.java +++ b/src/main/java/org/openrewrite/java/migrate/lombok/log/UseLog.java @@ -21,7 +21,6 @@ import org.openrewrite.ExecutionContext; import org.openrewrite.Option; import org.openrewrite.TreeVisitor; -import org.openrewrite.java.JavaTemplate; @Value @EqualsAndHashCode(callSuper = false) @@ -47,39 +46,27 @@ public String getDescription() { @Override public TreeVisitor getVisitor() { - return new LogVanillaVisitor(fieldName); - } - - public static class LogVanillaVisitor extends LogVisitor { - - LogVanillaVisitor(String fieldName_) { - super(fieldName_); - } - - @Override - protected void switchImports() { - maybeAddImport("lombok.extern.java.Log"); - maybeRemoveImport("java.util.logging.Logger"); - } - - @Override - protected JavaTemplate getLombokTemplate() { - return getLombokTemplate("Log", "lombok.extern.java.Log"); - } + String fieldName_ = fieldName; + return new LogVisitor("lombok.extern.java.Log", fieldName_) { + @Override + protected void removeImports() { + maybeRemoveImport("java.util.logging.Logger"); + } - @Override - protected String expectedLoggerPath() { - return "java.util.logging.Logger"; - } + @Override + protected String expectedLoggerPath() { + return "java.util.logging.Logger"; + } - @Override - protected boolean methodPath(String path) { - return "java.util.logging.Logger.getLogger".equals(path); - } + @Override + protected boolean methodPath(String path) { + return "java.util.logging.Logger.getLogger".equals(path); + } - @Override - protected String getFactoryParameter(String className) { - return className + ".class.getName()"; - } + @Override + protected String getFactoryParameter(String className) { + return className + ".class.getName()"; + } + }; } } diff --git a/src/main/java/org/openrewrite/java/migrate/lombok/log/UseLog4j2.java b/src/main/java/org/openrewrite/java/migrate/lombok/log/UseLog4j2.java index 425e639f8..577afcf91 100644 --- a/src/main/java/org/openrewrite/java/migrate/lombok/log/UseLog4j2.java +++ b/src/main/java/org/openrewrite/java/migrate/lombok/log/UseLog4j2.java @@ -21,7 +21,6 @@ import org.openrewrite.ExecutionContext; import org.openrewrite.Option; import org.openrewrite.TreeVisitor; -import org.openrewrite.java.JavaTemplate; @Value @EqualsAndHashCode(callSuper = false) @@ -47,35 +46,24 @@ public String getDescription() { @Override public TreeVisitor getVisitor() { - return new Log4j2Visitor(fieldName); - } - - public static class Log4j2Visitor extends LogVisitor { - - Log4j2Visitor(String fieldName_) { - super(fieldName_); - } + String fieldName_ = fieldName; + return new LogVisitor("lombok.extern.log4j.Log4j2", fieldName_) { + @Override + protected void removeImports() { + maybeRemoveImport("org.apache.logging.log4j.Logger"); + maybeRemoveImport("org.apache.logging.log4j.LogManager"); + } - @Override - protected void switchImports() { - maybeAddImport("lombok.extern.log4j.Log4j2"); - maybeRemoveImport("org.apache.logging.log4j.Logger"); - maybeRemoveImport("org.apache.logging.log4j.LogManager"); - } + @Override + protected String expectedLoggerPath() { + return "org.apache.logging.log4j.Logger"; + } - @Override - protected JavaTemplate getLombokTemplate() { - return getLombokTemplate("Log4j2", "lombok.extern.log4j.Log4j2"); - } - - @Override - protected String expectedLoggerPath() { - return "org.apache.logging.log4j.Logger"; - } - - @Override - protected boolean methodPath(String path) { - return "org.apache.logging.log4j.LogManager.getLogger".equals(path); - } + @Override + protected boolean methodPath(String path) { + return "org.apache.logging.log4j.LogManager.getLogger".equals(path); + } + }; } + } diff --git a/src/main/java/org/openrewrite/java/migrate/lombok/log/UseSlf4j.java b/src/main/java/org/openrewrite/java/migrate/lombok/log/UseSlf4j.java index 394652bc1..4bc8fa809 100644 --- a/src/main/java/org/openrewrite/java/migrate/lombok/log/UseSlf4j.java +++ b/src/main/java/org/openrewrite/java/migrate/lombok/log/UseSlf4j.java @@ -21,7 +21,6 @@ import org.openrewrite.ExecutionContext; import org.openrewrite.Option; import org.openrewrite.TreeVisitor; -import org.openrewrite.java.JavaTemplate; @Value @EqualsAndHashCode(callSuper = false) @@ -47,35 +46,24 @@ public String getDescription() { @Override public TreeVisitor getVisitor() { - return new Slf4jVisitor(fieldName); - } - - public static class Slf4jVisitor extends LogVisitor { - - Slf4jVisitor(String fieldName_) { - super(fieldName_); - } + String fieldName_ = fieldName; + return new LogVisitor("lombok.extern.slf4j.Slf4j", fieldName_) { + @Override + protected void removeImports() { + maybeRemoveImport("org.slf4j.Logger"); + maybeRemoveImport("org.slf4j.LoggerFactory"); + } - @Override - protected void switchImports() { - maybeAddImport("lombok.extern.slf4j.Slf4j"); - maybeRemoveImport("org.slf4j.Logger"); - maybeRemoveImport("org.slf4j.LoggerFactory"); - } + @Override + protected String expectedLoggerPath() { + return "org.slf4j.Logger"; + } - @Override - protected JavaTemplate getLombokTemplate() { - return getLombokTemplate("Slf4j", "lombok.extern.slf4j.Slf4j"); - } - - @Override - protected String expectedLoggerPath() { - return "org.slf4j.Logger"; - } - - @Override - protected boolean methodPath(String path) { - return "org.slf4j.LoggerFactory.getLogger".equals(path); - } + @Override + protected boolean methodPath(String path) { + return "org.slf4j.LoggerFactory.getLogger".equals(path); + } + }; } + } diff --git a/src/test/java/org/openrewrite/java/migrate/lombok/log/ConvertToLogAnnotationTest.java b/src/test/java/org/openrewrite/java/migrate/lombok/log/ConvertToLogAnnotationTest.java index 77f74a04e..eee95661f 100644 --- a/src/test/java/org/openrewrite/java/migrate/lombok/log/ConvertToLogAnnotationTest.java +++ b/src/test/java/org/openrewrite/java/migrate/lombok/log/ConvertToLogAnnotationTest.java @@ -191,7 +191,7 @@ void replaceLog() { .parser(JavaParser.fromJavaVersion() .logCompilationWarningsAndErrors(true)), - // language=java + // language=java java( """ import java.util.logging.Logger; @@ -217,7 +217,7 @@ void replaceJbossLog() { .parser(JavaParser.fromJavaVersion() .logCompilationWarningsAndErrors(true) .classpath("jboss-logging")), - // language=java + // language=java java( """ import org.jboss.logging.Logger; From 920275a4d9a592a42f605a0524c378e5cef03930 Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Sun, 5 Jan 2025 16:41:18 +0100 Subject: [PATCH 08/15] Use TypeUtils and MethodMatcher --- .../java/migrate/lombok/log/LogVisitor.java | 30 +++++++-------- .../migrate/lombok/log/UseCommonsLog.java | 23 +++-------- .../java/migrate/lombok/log/UseJBossLog.java | 22 +++-------- .../java/migrate/lombok/log/UseLog.java | 21 +++------- .../java/migrate/lombok/log/UseLog4j2.java | 23 +++-------- .../java/migrate/lombok/log/UseSlf4j.java | 22 ++--------- .../migrate/lombok/log/ConvertAnyLogTest.java | 38 ------------------- 7 files changed, 37 insertions(+), 142 deletions(-) diff --git a/src/main/java/org/openrewrite/java/migrate/lombok/log/LogVisitor.java b/src/main/java/org/openrewrite/java/migrate/lombok/log/LogVisitor.java index f291b5bb6..4af261db0 100644 --- a/src/main/java/org/openrewrite/java/migrate/lombok/log/LogVisitor.java +++ b/src/main/java/org/openrewrite/java/migrate/lombok/log/LogVisitor.java @@ -22,16 +22,20 @@ import org.openrewrite.java.JavaIsoVisitor; import org.openrewrite.java.JavaParser; import org.openrewrite.java.JavaTemplate; +import org.openrewrite.java.MethodMatcher; import org.openrewrite.java.tree.Flag; import org.openrewrite.java.tree.J; import org.openrewrite.java.tree.JavaType; +import org.openrewrite.java.tree.TypeUtils; import static java.util.Comparator.comparing; @RequiredArgsConstructor @EqualsAndHashCode(callSuper = false) -abstract class LogVisitor extends JavaIsoVisitor { +class LogVisitor extends JavaIsoVisitor { + private final String logType; + private final String factoryMethodPattern; private final String logAnnotation; @Nullable private final String fieldName; @@ -40,8 +44,9 @@ abstract class LogVisitor extends JavaIsoVisitor { public J.ClassDeclaration visitClassDeclaration(J.ClassDeclaration classDecl, ExecutionContext ctx) { J.ClassDeclaration visitClassDeclaration = super.visitClassDeclaration(classDecl, ctx); if (visitClassDeclaration != classDecl) { + maybeRemoveImport(logType); + maybeRemoveImport(factoryMethodPattern.substring(0, factoryMethodPattern.indexOf(' '))); maybeAddImport(logAnnotation); - removeImports(); return JavaTemplate .builder("@" + logAnnotation.substring(logAnnotation.lastIndexOf('.') + 1) + "\n") .javaParser(JavaParser.fromJavaVersion().classpath("lombok")) @@ -54,12 +59,6 @@ public J.ClassDeclaration visitClassDeclaration(J.ClassDeclaration classDecl, Ex return classDecl; } - protected abstract void removeImports(); - - protected abstract boolean methodPath(String path); - - protected abstract String expectedLoggerPath(); - @Override public J.@Nullable VariableDeclarations visitVariableDeclarations(J.VariableDeclarations multiVariable, ExecutionContext ctx) { @@ -75,25 +74,22 @@ public J.ClassDeclaration visitClassDeclaration(J.ClassDeclaration classDecl, Ex return multiVariable; } - JavaType.FullyQualified type0 = multiVariable.getTypeAsFullyQualified(); - String path = type0.getFullyQualifiedName(); - if (!expectedLoggerPath().equals(path)) + if (!TypeUtils.isAssignableTo(logType, multiVariable.getType())) { return multiVariable; + } //name needs to match the name of the field that lombok creates todo write name normalization recipe - if (fieldName != null && !fieldName.equals(var.getSimpleName())) + if (fieldName != null && !fieldName.equals(var.getSimpleName())) { return multiVariable; - - J.MethodInvocation methodCall = (J.MethodInvocation) var.getInitializer(); - - String leftSide = methodCall.getMethodType().getDeclaringType().getFullyQualifiedName() + "." + methodCall.getMethodType().getName(); + } //method call must match - if (!methodPath(leftSide)) { + if (!new MethodMatcher(factoryMethodPattern).matches(var.getInitializer())) { return multiVariable; } //argument must match + J.MethodInvocation methodCall = (J.MethodInvocation) var.getInitializer(); String className = getCursor().firstEnclosingOrThrow(J.ClassDeclaration.class).getSimpleName(); if (methodCall.getArguments().size() != 1 || !methodCall.getArguments().get(0).toString().equals(getFactoryParameter(className) diff --git a/src/main/java/org/openrewrite/java/migrate/lombok/log/UseCommonsLog.java b/src/main/java/org/openrewrite/java/migrate/lombok/log/UseCommonsLog.java index 885c9c903..f11551f52 100644 --- a/src/main/java/org/openrewrite/java/migrate/lombok/log/UseCommonsLog.java +++ b/src/main/java/org/openrewrite/java/migrate/lombok/log/UseCommonsLog.java @@ -46,24 +46,11 @@ public String getDescription() { @Override public TreeVisitor getVisitor() { - String fieldName_ = fieldName; - return new LogVisitor("lombok.extern.apachecommons.CommonsLog", fieldName_) { - @Override - protected void removeImports() { - maybeRemoveImport("org.apache.commons.logging.Log"); - maybeRemoveImport("org.apache.commons.logging.LogFactory"); - } - - @Override - protected String expectedLoggerPath() { - return "org.apache.commons.logging.Log"; - } - - @Override - protected boolean methodPath(String path) { - return "org.apache.commons.logging.LogFactory.getLog".equals(path); - } - }; + return new LogVisitor( + "org.apache.commons.logging.Log", + "org.apache.commons.logging.LogFactory getLog(..)", + "lombok.extern.apachecommons.CommonsLog", + fieldName); } } diff --git a/src/main/java/org/openrewrite/java/migrate/lombok/log/UseJBossLog.java b/src/main/java/org/openrewrite/java/migrate/lombok/log/UseJBossLog.java index a35887b3b..7e9a2a379 100644 --- a/src/main/java/org/openrewrite/java/migrate/lombok/log/UseJBossLog.java +++ b/src/main/java/org/openrewrite/java/migrate/lombok/log/UseJBossLog.java @@ -46,23 +46,11 @@ public String getDescription() { @Override public TreeVisitor getVisitor() { - String fieldName_ = fieldName; - return new LogVisitor("lombok.extern.jbosslog.JBossLog", fieldName_) { - @Override - protected void removeImports() { - maybeRemoveImport("org.jboss.logging.Logger"); - } - - @Override - protected String expectedLoggerPath() { - return "org.jboss.logging.Logger"; - } - - @Override - protected boolean methodPath(String path) { - return "org.jboss.logging.Logger.getLogger".equals(path); - } - }; + return new LogVisitor( + "org.jboss.logging.Logger", + "org.jboss.logging.Logger getLogger(..)", + "lombok.extern.jbosslog.JBossLog", + fieldName); } } diff --git a/src/main/java/org/openrewrite/java/migrate/lombok/log/UseLog.java b/src/main/java/org/openrewrite/java/migrate/lombok/log/UseLog.java index 3090d8bcc..bc617c1bd 100644 --- a/src/main/java/org/openrewrite/java/migrate/lombok/log/UseLog.java +++ b/src/main/java/org/openrewrite/java/migrate/lombok/log/UseLog.java @@ -46,22 +46,11 @@ public String getDescription() { @Override public TreeVisitor getVisitor() { - String fieldName_ = fieldName; - return new LogVisitor("lombok.extern.java.Log", fieldName_) { - @Override - protected void removeImports() { - maybeRemoveImport("java.util.logging.Logger"); - } - - @Override - protected String expectedLoggerPath() { - return "java.util.logging.Logger"; - } - - @Override - protected boolean methodPath(String path) { - return "java.util.logging.Logger.getLogger".equals(path); - } + return new LogVisitor( + "java.util.logging.Logger", + "java.util.logging.Logger getLogger(String)", + "lombok.extern.java.Log", + fieldName) { @Override protected String getFactoryParameter(String className) { diff --git a/src/main/java/org/openrewrite/java/migrate/lombok/log/UseLog4j2.java b/src/main/java/org/openrewrite/java/migrate/lombok/log/UseLog4j2.java index 577afcf91..44c0c1716 100644 --- a/src/main/java/org/openrewrite/java/migrate/lombok/log/UseLog4j2.java +++ b/src/main/java/org/openrewrite/java/migrate/lombok/log/UseLog4j2.java @@ -46,24 +46,11 @@ public String getDescription() { @Override public TreeVisitor getVisitor() { - String fieldName_ = fieldName; - return new LogVisitor("lombok.extern.log4j.Log4j2", fieldName_) { - @Override - protected void removeImports() { - maybeRemoveImport("org.apache.logging.log4j.Logger"); - maybeRemoveImport("org.apache.logging.log4j.LogManager"); - } - - @Override - protected String expectedLoggerPath() { - return "org.apache.logging.log4j.Logger"; - } - - @Override - protected boolean methodPath(String path) { - return "org.apache.logging.log4j.LogManager.getLogger".equals(path); - } - }; + return new LogVisitor( + "org.apache.logging.log4j.Logger", + "org.apache.logging.log4j.LogManager getLogger(..)", + "lombok.extern.log4j.Log4j2", + fieldName); } } diff --git a/src/main/java/org/openrewrite/java/migrate/lombok/log/UseSlf4j.java b/src/main/java/org/openrewrite/java/migrate/lombok/log/UseSlf4j.java index 4bc8fa809..e986e7682 100644 --- a/src/main/java/org/openrewrite/java/migrate/lombok/log/UseSlf4j.java +++ b/src/main/java/org/openrewrite/java/migrate/lombok/log/UseSlf4j.java @@ -46,24 +46,10 @@ public String getDescription() { @Override public TreeVisitor getVisitor() { - String fieldName_ = fieldName; - return new LogVisitor("lombok.extern.slf4j.Slf4j", fieldName_) { - @Override - protected void removeImports() { - maybeRemoveImport("org.slf4j.Logger"); - maybeRemoveImport("org.slf4j.LoggerFactory"); - } - - @Override - protected String expectedLoggerPath() { - return "org.slf4j.Logger"; - } - - @Override - protected boolean methodPath(String path) { - return "org.slf4j.LoggerFactory.getLogger".equals(path); - } - }; + return new LogVisitor("org.slf4j.Logger", + "org.slf4j.LoggerFactory getLogger(..)", + "lombok.extern.slf4j.Slf4j", + fieldName); } } diff --git a/src/test/java/org/openrewrite/java/migrate/lombok/log/ConvertAnyLogTest.java b/src/test/java/org/openrewrite/java/migrate/lombok/log/ConvertAnyLogTest.java index 11361a612..e77a65cb2 100644 --- a/src/test/java/org/openrewrite/java/migrate/lombok/log/ConvertAnyLogTest.java +++ b/src/test/java/org/openrewrite/java/migrate/lombok/log/ConvertAnyLogTest.java @@ -119,42 +119,4 @@ class E { ) ); } - - @Test - void allInOne() { - rewriteRun( - // language=java - java( - """ - import org.apache.logging.log4j.LogManager; - import java.util.logging.Logger; - import org.apache.commons.logging.Log; - import org.apache.commons.logging.LogFactory; - - class A { - private static final org.slf4j.Logger log1 = org.slf4j.LoggerFactory.getLogger(A.class); - private static final org.apache.logging.log4j.Logger log2 = org.apache.logging.log4j.LogManager.getLogger(A.class); - private static final Logger log3 = Logger.getLogger(A.class.getName()); - private static final org.jboss.logging.Logger log4 = org.jboss.logging.Logger.getLogger(A.class); - private static final Log log5 = LogFactory.getLog(A.class); - } - """, - """ - import lombok.extern.apachecommons.CommonsLog; - import lombok.extern.java.Log; - import lombok.extern.jbosslog.JBossLog; - import lombok.extern.log4j.Log4j2; - import lombok.extern.slf4j.Slf4j; - - @CommonsLog - @JBossLog - @Log - @Log4j2 - @Slf4j - class A { - } - """ - ) - ); - } } From f4fe6b97d4271d8f516bab7ca564b1a0b1af5899 Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Sun, 5 Jan 2025 16:50:30 +0100 Subject: [PATCH 09/15] Verify modifier handling --- .../java/migrate/lombok/log/LogVisitor.java | 13 ++++----- .../log/ConvertToLogAnnotationTest.java | 27 +++++++++++++++++++ 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/openrewrite/java/migrate/lombok/log/LogVisitor.java b/src/main/java/org/openrewrite/java/migrate/lombok/log/LogVisitor.java index 4af261db0..a4949c43d 100644 --- a/src/main/java/org/openrewrite/java/migrate/lombok/log/LogVisitor.java +++ b/src/main/java/org/openrewrite/java/migrate/lombok/log/LogVisitor.java @@ -64,13 +64,13 @@ public J.ClassDeclaration visitClassDeclaration(J.ClassDeclaration classDecl, Ex //there must be exactly one Logger per line //declaring two or more in one line is possible, but I don't care to support that - if (multiVariable.getVariables().size() != 1) + if (multiVariable.getVariables().size() != 1) { return multiVariable; + } - J.VariableDeclarations.NamedVariable var = multiVariable.getVariables().get(0); - - JavaType.Variable type = var.getVariableType(); - if (type == null || !type.hasFlags(Flag.Private, Flag.Static, Flag.Final)) { + if (!multiVariable.hasModifier(J.Modifier.Type.Private)|| + !multiVariable.hasModifier(J.Modifier.Type.Static)|| + !multiVariable.hasModifier(J.Modifier.Type.Final)) { return multiVariable; } @@ -78,7 +78,8 @@ public J.ClassDeclaration visitClassDeclaration(J.ClassDeclaration classDecl, Ex return multiVariable; } - //name needs to match the name of the field that lombok creates todo write name normalization recipe + //name needs to match the name of the field that lombok creates + J.VariableDeclarations.NamedVariable var = multiVariable.getVariables().get(0); if (fieldName != null && !fieldName.equals(var.getSimpleName())) { return multiVariable; } diff --git a/src/test/java/org/openrewrite/java/migrate/lombok/log/ConvertToLogAnnotationTest.java b/src/test/java/org/openrewrite/java/migrate/lombok/log/ConvertToLogAnnotationTest.java index eee95661f..a6e8d5e11 100644 --- a/src/test/java/org/openrewrite/java/migrate/lombok/log/ConvertToLogAnnotationTest.java +++ b/src/test/java/org/openrewrite/java/migrate/lombok/log/ConvertToLogAnnotationTest.java @@ -16,6 +16,8 @@ package org.openrewrite.java.migrate.lombok.log; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; import org.openrewrite.DocumentExample; import org.openrewrite.java.JavaParser; import org.openrewrite.test.RecipeSpec; @@ -134,6 +136,31 @@ class A { ); } + @ParameterizedTest + @ValueSource(strings = { + "public static final", + "protected static final", + "static final", + "private final", + "private static", + }) + void shouldNotReplaceWhenNotPrivateStaticFinal(String modifiers) { + rewriteRun( + spec -> spec.recipe(new UseSlf4j(null)) + .parser(JavaParser.fromJavaVersion() + .classpath("slf4j-api")), + + // language=java + java( + """ + class A { + %s org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(A.class); + } + """.formatted(modifiers) + ) + ); + } + @Test void replaceSlf4jWithPackage() { rewriteRun(// language=java From f21b0d5db10dce8f07baf1fb1345ab2e61f9944b Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Sun, 5 Jan 2025 17:02:07 +0100 Subject: [PATCH 10/15] Split methodPattern argument in constructor --- .../java/migrate/lombok/log/LogVisitor.java | 45 ++++++++----------- 1 file changed, 19 insertions(+), 26 deletions(-) diff --git a/src/main/java/org/openrewrite/java/migrate/lombok/log/LogVisitor.java b/src/main/java/org/openrewrite/java/migrate/lombok/log/LogVisitor.java index a4949c43d..ae39a8d7c 100644 --- a/src/main/java/org/openrewrite/java/migrate/lombok/log/LogVisitor.java +++ b/src/main/java/org/openrewrite/java/migrate/lombok/log/LogVisitor.java @@ -16,36 +16,41 @@ package org.openrewrite.java.migrate.lombok.log; import lombok.EqualsAndHashCode; -import lombok.RequiredArgsConstructor; import org.jspecify.annotations.Nullable; import org.openrewrite.ExecutionContext; import org.openrewrite.java.JavaIsoVisitor; import org.openrewrite.java.JavaParser; import org.openrewrite.java.JavaTemplate; import org.openrewrite.java.MethodMatcher; -import org.openrewrite.java.tree.Flag; import org.openrewrite.java.tree.J; -import org.openrewrite.java.tree.JavaType; import org.openrewrite.java.tree.TypeUtils; import static java.util.Comparator.comparing; -@RequiredArgsConstructor @EqualsAndHashCode(callSuper = false) class LogVisitor extends JavaIsoVisitor { private final String logType; - private final String factoryMethodPattern; + private final String factoryType; + private final MethodMatcher factoryMethodMatcher; private final String logAnnotation; @Nullable private final String fieldName; + LogVisitor(String logType, String factoryMethodPattern, String logAnnotation, @Nullable String fieldName) { + this.logType = logType; + this.factoryType = factoryMethodPattern.substring(0, factoryMethodPattern.indexOf(' ')); + this.factoryMethodMatcher = new MethodMatcher(factoryMethodPattern); + this.logAnnotation = logAnnotation; + this.fieldName = fieldName; + } + @Override public J.ClassDeclaration visitClassDeclaration(J.ClassDeclaration classDecl, ExecutionContext ctx) { J.ClassDeclaration visitClassDeclaration = super.visitClassDeclaration(classDecl, ctx); if (visitClassDeclaration != classDecl) { maybeRemoveImport(logType); - maybeRemoveImport(factoryMethodPattern.substring(0, factoryMethodPattern.indexOf(' '))); + maybeRemoveImport(factoryType); maybeAddImport(logAnnotation); return JavaTemplate .builder("@" + logAnnotation.substring(logAnnotation.lastIndexOf('.') + 1) + "\n") @@ -61,40 +66,28 @@ public J.ClassDeclaration visitClassDeclaration(J.ClassDeclaration classDecl, Ex @Override public J.@Nullable VariableDeclarations visitVariableDeclarations(J.VariableDeclarations multiVariable, ExecutionContext ctx) { - - //there must be exactly one Logger per line - //declaring two or more in one line is possible, but I don't care to support that - if (multiVariable.getVariables().size() != 1) { - return multiVariable; - } - - if (!multiVariable.hasModifier(J.Modifier.Type.Private)|| - !multiVariable.hasModifier(J.Modifier.Type.Static)|| - !multiVariable.hasModifier(J.Modifier.Type.Final)) { - return multiVariable; - } - - if (!TypeUtils.isAssignableTo(logType, multiVariable.getType())) { + if (!multiVariable.hasModifier(J.Modifier.Type.Private) || + !multiVariable.hasModifier(J.Modifier.Type.Static) || + !multiVariable.hasModifier(J.Modifier.Type.Final) || + multiVariable.getVariables().size() != 1 || + !TypeUtils.isAssignableTo(logType, multiVariable.getType())) { return multiVariable; } - //name needs to match the name of the field that lombok creates + // name needs to match the name of the field that lombok creates J.VariableDeclarations.NamedVariable var = multiVariable.getVariables().get(0); if (fieldName != null && !fieldName.equals(var.getSimpleName())) { return multiVariable; } - //method call must match - if (!new MethodMatcher(factoryMethodPattern).matches(var.getInitializer())) { + if (!factoryMethodMatcher.matches(var.getInitializer())) { return multiVariable; } - //argument must match J.MethodInvocation methodCall = (J.MethodInvocation) var.getInitializer(); String className = getCursor().firstEnclosingOrThrow(J.ClassDeclaration.class).getSimpleName(); if (methodCall.getArguments().size() != 1 || - !methodCall.getArguments().get(0).toString().equals(getFactoryParameter(className) - )) { + !getFactoryParameter(className).equals(methodCall.getArguments().get(0).toString())) { return multiVariable; } From 39246878dbd27373c8ebff44fa5f5e369efafe8b Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Sun, 5 Jan 2025 17:04:04 +0100 Subject: [PATCH 11/15] Add dependencies as test runtime only --- build.gradle.kts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 85c1ad972..8fbf549af 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -52,17 +52,17 @@ dependencies { testImplementation("com.google.guava:guava:33.0.0-jre") testImplementation("joda-time:joda-time:2.12.3") testImplementation("org.threeten:threeten-extra:1.8.0") - testImplementation("org.apache.logging.log4j:log4j-api:2.23.1") - testImplementation("org.jboss.logging:jboss-logging:3.6.0.Final") - testImplementation("commons-logging:commons-logging:1.3.2") testRuntimeOnly("com.fasterxml.jackson.datatype:jackson-datatype-jsr353") testRuntimeOnly("com.fasterxml.jackson.core:jackson-core") testRuntimeOnly("com.fasterxml.jackson.core:jackson-databind") testRuntimeOnly("com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider") testRuntimeOnly("com.fasterxml.jackson.module:jackson-module-jaxb-annotations") + testRuntimeOnly("commons-logging:commons-logging:1.3.2") + testRuntimeOnly("org.apache.logging.log4j:log4j-api:2.23.1") testRuntimeOnly("org.apache.johnzon:johnzon-core:1.2.18") testRuntimeOnly("org.codehaus.groovy:groovy:latest.release") + testRuntimeOnly("org.jboss.logging:jboss-logging:3.6.0.Final") testRuntimeOnly("jakarta.annotation:jakarta.annotation-api:2.1.1") testRuntimeOnly("org.springframework:spring-core:6.1.13") testRuntimeOnly("com.google.code.findbugs:jsr305:3.0.2") From 608536b1819d0f23c7f6c88b9ec535912d034ff4 Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Sun, 5 Jan 2025 17:06:28 +0100 Subject: [PATCH 12/15] Drop unnecesary markdown hints --- .../org/openrewrite/java/migrate/lombok/log/UseCommonsLog.java | 1 - .../org/openrewrite/java/migrate/lombok/log/UseJBossLog.java | 1 - .../java/org/openrewrite/java/migrate/lombok/log/UseLog.java | 1 - .../java/org/openrewrite/java/migrate/lombok/log/UseLog4j2.java | 1 - .../java/migrate/lombok/log/UseLogRecipeTemplate.java | 2 +- .../java/org/openrewrite/java/migrate/lombok/log/UseSlf4j.java | 1 - 6 files changed, 1 insertion(+), 6 deletions(-) diff --git a/src/main/java/org/openrewrite/java/migrate/lombok/log/UseCommonsLog.java b/src/main/java/org/openrewrite/java/migrate/lombok/log/UseCommonsLog.java index f11551f52..a1c10a0f9 100644 --- a/src/main/java/org/openrewrite/java/migrate/lombok/log/UseCommonsLog.java +++ b/src/main/java/org/openrewrite/java/migrate/lombok/log/UseCommonsLog.java @@ -33,7 +33,6 @@ public String getDisplayName() { @Override public String getDescription() { - //language=markdown return getDescription("@CommonsLog", "org.apache.commons.logging.Log"); } diff --git a/src/main/java/org/openrewrite/java/migrate/lombok/log/UseJBossLog.java b/src/main/java/org/openrewrite/java/migrate/lombok/log/UseJBossLog.java index 7e9a2a379..6acec98ff 100644 --- a/src/main/java/org/openrewrite/java/migrate/lombok/log/UseJBossLog.java +++ b/src/main/java/org/openrewrite/java/migrate/lombok/log/UseJBossLog.java @@ -33,7 +33,6 @@ public String getDisplayName() { @Override public String getDescription() { - //language=markdown return getDescription("@JBossLog", "org.jboss.logging.Logger"); } diff --git a/src/main/java/org/openrewrite/java/migrate/lombok/log/UseLog.java b/src/main/java/org/openrewrite/java/migrate/lombok/log/UseLog.java index bc617c1bd..cc724222e 100644 --- a/src/main/java/org/openrewrite/java/migrate/lombok/log/UseLog.java +++ b/src/main/java/org/openrewrite/java/migrate/lombok/log/UseLog.java @@ -33,7 +33,6 @@ public String getDisplayName() { @Override public String getDescription() { - //language=markdown return getDescription("@Log", "java.util.logging.Logger"); } diff --git a/src/main/java/org/openrewrite/java/migrate/lombok/log/UseLog4j2.java b/src/main/java/org/openrewrite/java/migrate/lombok/log/UseLog4j2.java index 44c0c1716..f1539a58a 100644 --- a/src/main/java/org/openrewrite/java/migrate/lombok/log/UseLog4j2.java +++ b/src/main/java/org/openrewrite/java/migrate/lombok/log/UseLog4j2.java @@ -33,7 +33,6 @@ public String getDisplayName() { @Override public String getDescription() { - //language=markdown return getDescription("@Log4j2", "org.apache.logging.log4j.Logger"); } diff --git a/src/main/java/org/openrewrite/java/migrate/lombok/log/UseLogRecipeTemplate.java b/src/main/java/org/openrewrite/java/migrate/lombok/log/UseLogRecipeTemplate.java index f4be0df33..37387cb3e 100644 --- a/src/main/java/org/openrewrite/java/migrate/lombok/log/UseLogRecipeTemplate.java +++ b/src/main/java/org/openrewrite/java/migrate/lombok/log/UseLogRecipeTemplate.java @@ -23,7 +23,7 @@ abstract class UseLogRecipeTemplate extends Recipe { "If not specified, the field name is not checked and any field that satisfies the other checks is converted."; protected String getDisplayName(String annotation) { - return String.format("Use `%s` instead of defining the field yourself", annotation); + return String.format("Use `%s` instead of explicit fields", annotation); } protected String getDescription(String annotation, String pathToLogger) { diff --git a/src/main/java/org/openrewrite/java/migrate/lombok/log/UseSlf4j.java b/src/main/java/org/openrewrite/java/migrate/lombok/log/UseSlf4j.java index e986e7682..239edd360 100644 --- a/src/main/java/org/openrewrite/java/migrate/lombok/log/UseSlf4j.java +++ b/src/main/java/org/openrewrite/java/migrate/lombok/log/UseSlf4j.java @@ -33,7 +33,6 @@ public String getDisplayName() { @Override public String getDescription() { - //language=markdown return getDescription("@Slf4", "org.slf4j.Logger"); } From 66dc402168e81904e64c603ce25873866cd6a781 Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Sun, 5 Jan 2025 17:26:14 +0100 Subject: [PATCH 13/15] Move and rename declarative recipe --- .../resources/META-INF/rewrite/lombok.yml | 13 ++++++++ .../rewrite/use-lombok-log-catchall.yml | 30 ------------------- 2 files changed, 13 insertions(+), 30 deletions(-) delete mode 100644 src/main/resources/META-INF/rewrite/use-lombok-log-catchall.yml diff --git a/src/main/resources/META-INF/rewrite/lombok.yml b/src/main/resources/META-INF/rewrite/lombok.yml index 554b8c427..4dd3207b5 100644 --- a/src/main/resources/META-INF/rewrite/lombok.yml +++ b/src/main/resources/META-INF/rewrite/lombok.yml @@ -43,3 +43,16 @@ recipeList: oldFullyQualifiedTypeName: lombok.experimental.val newFullyQualifiedTypeName: lombok.val - org.openrewrite.java.migrate.lombok.LombokValToFinalVar + +--- +type: specs.openrewrite.org/v1beta/recipe +name: org.openrewrite.java.migrate.lombok.log.UseLombokLogAnnotations +displayName: Use Lombok logger annotations instead of explicit fields +description: >- + Applies all recipes that replace logger declarations with class level annotations. +recipeList: + - org.openrewrite.java.migrate.lombok.log.UseCommonsLog + - org.openrewrite.java.migrate.lombok.log.UseJBossLog + - org.openrewrite.java.migrate.lombok.log.UseLog + - org.openrewrite.java.migrate.lombok.log.UseLog4j2 + - org.openrewrite.java.migrate.lombok.log.UseSlf4j diff --git a/src/main/resources/META-INF/rewrite/use-lombok-log-catchall.yml b/src/main/resources/META-INF/rewrite/use-lombok-log-catchall.yml deleted file mode 100644 index 68b384ebf..000000000 --- a/src/main/resources/META-INF/rewrite/use-lombok-log-catchall.yml +++ /dev/null @@ -1,30 +0,0 @@ -# -# Copyright 2024 the original author or authors. -#

-# 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 -#

-# https://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. -# - ---- -type: specs.openrewrite.org/v1beta/recipe -name: io.github.timoa.lombok.log.ConvertAnyLog -displayName: Use lomboks log annotation instead of defining the field yourself -description: >- - Applies all recipes that replace logger declarations with class level annotations. - If you know which logger framework is in use you can simply use the specific recipe. - If, for some reason you need to cover all frameworks you can use this recipe. -recipeList: - - org.openrewrite.java.migrate.lombok.log.UseSlf4j - - org.openrewrite.java.migrate.lombok.log.UseCommonsLog - - org.openrewrite.java.migrate.lombok.log.UseLog4j2 - - org.openrewrite.java.migrate.lombok.log.UseJBossLog - - org.openrewrite.java.migrate.lombok.log.UseLog From 34a2994690299070e33da536aeb5452389168f91 Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Sun, 5 Jan 2025 17:35:08 +0100 Subject: [PATCH 14/15] Rename usages of alternatively named logger fields --- .../java/migrate/lombok/log/LogVisitor.java | 18 +++++--- .../log/ConvertToLogAnnotationTest.java | 46 +++++++++++++++++++ 2 files changed, 58 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/openrewrite/java/migrate/lombok/log/LogVisitor.java b/src/main/java/org/openrewrite/java/migrate/lombok/log/LogVisitor.java index ae39a8d7c..9af922423 100644 --- a/src/main/java/org/openrewrite/java/migrate/lombok/log/LogVisitor.java +++ b/src/main/java/org/openrewrite/java/migrate/lombok/log/LogVisitor.java @@ -18,10 +18,7 @@ import lombok.EqualsAndHashCode; import org.jspecify.annotations.Nullable; import org.openrewrite.ExecutionContext; -import org.openrewrite.java.JavaIsoVisitor; -import org.openrewrite.java.JavaParser; -import org.openrewrite.java.JavaTemplate; -import org.openrewrite.java.MethodMatcher; +import org.openrewrite.java.*; import org.openrewrite.java.tree.J; import org.openrewrite.java.tree.TypeUtils; @@ -84,13 +81,22 @@ public J.ClassDeclaration visitClassDeclaration(J.ClassDeclaration classDecl, Ex return multiVariable; } + J.ClassDeclaration classDeclaration = getCursor().firstEnclosing(J.ClassDeclaration.class); + if (classDeclaration == null || classDeclaration.getType() == null) { + return multiVariable; + } + J.MethodInvocation methodCall = (J.MethodInvocation) var.getInitializer(); - String className = getCursor().firstEnclosingOrThrow(J.ClassDeclaration.class).getSimpleName(); if (methodCall.getArguments().size() != 1 || - !getFactoryParameter(className).equals(methodCall.getArguments().get(0).toString())) { + !getFactoryParameter(classDeclaration.getSimpleName()) + .equals(methodCall.getArguments().get(0).toString())) { return multiVariable; } + if (!"log".equals(var.getSimpleName())) { + doAfterVisit(new ChangeFieldName<>(classDeclaration.getType().getFullyQualifiedName(), var.getSimpleName(), "log")); + } + return null; } diff --git a/src/test/java/org/openrewrite/java/migrate/lombok/log/ConvertToLogAnnotationTest.java b/src/test/java/org/openrewrite/java/migrate/lombok/log/ConvertToLogAnnotationTest.java index a6e8d5e11..1af3f4391 100644 --- a/src/test/java/org/openrewrite/java/migrate/lombok/log/ConvertToLogAnnotationTest.java +++ b/src/test/java/org/openrewrite/java/migrate/lombok/log/ConvertToLogAnnotationTest.java @@ -15,6 +15,9 @@ */ package org.openrewrite.java.migrate.lombok.log; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; @@ -55,6 +58,49 @@ class A { ); } + @Nested + class RenameField { + + @BeforeAll + static void setUp() { + System.setProperty("rewrite.lombok", "true"); + } + + @AfterAll + static void tearDown() { + System.clearProperty("rewrite.lombok"); + } + + @Test + void replaceSlf4jAndRenameFieldUsages() { + rewriteRun( + // language=java + java( + """ + class A { + private static final org.slf4j.Logger renamed = org.slf4j.LoggerFactory.getLogger(A.class); + + void test() { + renamed.info("test"); + } + } + """, + """ + import lombok.extern.slf4j.Slf4j; + + @Slf4j + class A { + + void test() { + log.info("test"); + } + } + """ + ) + ); + } + } + @Test void replaceSlf4jImportedType() { rewriteRun(// language=java From 20df6f27b2faa78755a5352f89d3d995cc0fa292 Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Sun, 5 Jan 2025 17:57:58 +0100 Subject: [PATCH 15/15] Use correct recipe in test --- .../openrewrite/java/migrate/lombok/log/ConvertAnyLogTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/org/openrewrite/java/migrate/lombok/log/ConvertAnyLogTest.java b/src/test/java/org/openrewrite/java/migrate/lombok/log/ConvertAnyLogTest.java index e77a65cb2..6cbf558f3 100644 --- a/src/test/java/org/openrewrite/java/migrate/lombok/log/ConvertAnyLogTest.java +++ b/src/test/java/org/openrewrite/java/migrate/lombok/log/ConvertAnyLogTest.java @@ -27,7 +27,7 @@ class ConvertAnyLogTest implements RewriteTest { @Override public void defaults(RecipeSpec spec) { - spec.recipeFromResources("io.github.timoa.lombok.log.ConvertAnyLog") + spec.recipeFromResources("org.openrewrite.java.migrate.lombok.log.UseLombokLogAnnotations") .parser(JavaParser.fromJavaVersion() .classpath("slf4j-api", "log4j-api", "jboss-logging", "commons-logging")); }