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, ExecutionContext> 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, ExecutionContext> 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, ExecutionContext> 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, ExecutionContext> 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, ExecutionContext> 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, ExecutionContext> 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, ExecutionContext> 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, ExecutionContext> 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, ExecutionContext> 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, ExecutionContext> 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, ExecutionContext> 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, ExecutionContext> 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, ExecutionContext> 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, ExecutionContext> 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, ExecutionContext> 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"));
}