Skip to content

Commit af44c67

Browse files
Recipe to migrate deprecated JBoss Logging calls (#245)
* Recipe to migrate deprecated JBoss Logging calls * `DocumentExample` does not support `ParameterizedTest` * Show for now expected conversion of explicit object array --------- Co-authored-by: Tim te Beek <[email protected]>
1 parent c185014 commit af44c67

File tree

3 files changed

+271
-0
lines changed

3 files changed

+271
-0
lines changed

build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ dependencies {
3535
exclude("com.github.spotbugs", "spotbugs-annotations").because("https://github.com/apache/logging-log4j2/issues/3754")
3636
}
3737
implementation("org.slf4j:slf4j-api:2.+")
38+
implementation("org.jboss.logging:jboss-logging:3.+")
3839

3940
annotationProcessor("org.openrewrite:rewrite-templating:$rewriteVersion")
4041
implementation("org.openrewrite:rewrite-templating:$rewriteVersion")
Lines changed: 172 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,172 @@
1+
/*
2+
* Copyright 2025 the original author or authors.
3+
* <p>
4+
* Licensed under the Moderne Source Available License (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
* <p>
8+
* https://docs.moderne.io/licensing/moderne-source-available-license
9+
* <p>
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package org.openrewrite.java.logging.jboss;
17+
18+
import com.google.errorprone.refaster.annotation.AfterTemplate;
19+
import com.google.errorprone.refaster.annotation.BeforeTemplate;
20+
import org.jboss.logging.Logger;
21+
import org.openrewrite.java.template.RecipeDescriptor;
22+
23+
@RecipeDescriptor(
24+
name = "Replace deprecated JBoss Logging Logger formatted message invocations with the v-version of methods",
25+
description = "Replace `logger.level(\"hello {0}\", arg)` with `logger.levelv(\"hello {0}\", arg)`."
26+
)
27+
@SuppressWarnings({"deprecation", "unused"})
28+
public class FormattedArgumentsToVMethod {
29+
public static class TraceToVTrace {
30+
@BeforeTemplate
31+
void before(Logger logger, String message, Object[] args) {
32+
logger.trace(message, args);
33+
}
34+
35+
@AfterTemplate
36+
void after(Logger logger, String message, Object[] args) {
37+
logger.tracev(message, args);
38+
}
39+
}
40+
41+
public static class TraceToVTraceWithThrowable {
42+
@BeforeTemplate
43+
void before(Logger logger, String message, Object[] args, Throwable t) {
44+
logger.trace((Object) message, args, t);
45+
}
46+
47+
@AfterTemplate
48+
void after(Logger logger, String message, Object[] args, Throwable t) {
49+
logger.tracev(message, args, t);
50+
}
51+
}
52+
53+
public static class DebugToVDebug {
54+
@BeforeTemplate
55+
void before(Logger logger, String message, Object[] args) {
56+
logger.debug(message, args);
57+
}
58+
59+
@AfterTemplate
60+
void after(Logger logger, String message, Object[] args) {
61+
logger.debugv(message, args);
62+
}
63+
}
64+
65+
public static class DebugToVDebugWithThrowable {
66+
@BeforeTemplate
67+
void before(Logger logger, String message, Object[] args, Throwable t) {
68+
logger.debug((Object) message, args, t);
69+
}
70+
71+
@AfterTemplate
72+
void after(Logger logger, String message, Object[] args, Throwable t) {
73+
logger.debugv(message, args, t);
74+
}
75+
}
76+
77+
public static class InfoToVInfo {
78+
@BeforeTemplate
79+
void before(Logger logger, String message, Object[] args) {
80+
logger.info(message, args);
81+
}
82+
83+
@AfterTemplate
84+
void after(Logger logger, String message, Object[] args) {
85+
logger.infov(message, args);
86+
}
87+
}
88+
89+
public static class InfoToVInfoWithThrowable {
90+
@BeforeTemplate
91+
void before(Logger logger, String message, Object[] args, Throwable t) {
92+
logger.info((Object) message, args, t);
93+
}
94+
95+
@AfterTemplate
96+
void after(Logger logger, String message, Object[] args, Throwable t) {
97+
logger.infov(message, args, t);
98+
}
99+
}
100+
101+
public static class WarnToVWarn {
102+
@BeforeTemplate
103+
void before(Logger logger, String message, Object[] args) {
104+
logger.warn(message, args);
105+
}
106+
107+
@AfterTemplate
108+
void after(Logger logger, String message, Object[] args) {
109+
logger.warnv(message, args);
110+
}
111+
}
112+
113+
public static class WarnToVWarnWithThrowable {
114+
@BeforeTemplate
115+
void before(Logger logger, String message, Object[] args, Throwable t) {
116+
logger.warn((Object) message, args, t);
117+
}
118+
119+
@AfterTemplate
120+
void after(Logger logger, String message, Object[] args, Throwable t) {
121+
logger.warnv(message, args, t);
122+
}
123+
}
124+
125+
public static class ErrorToVError {
126+
@BeforeTemplate
127+
void before(Logger logger, String message, Object[] args) {
128+
logger.error(message, args);
129+
}
130+
131+
@AfterTemplate
132+
void after(Logger logger, String message, Object[] args) {
133+
logger.errorv(message, args);
134+
}
135+
}
136+
137+
public static class ErrorToVErrorWithThrowable {
138+
@BeforeTemplate
139+
void before(Logger logger, String message, Object[] args, Throwable t) {
140+
logger.error((Object) message, args, t);
141+
}
142+
143+
@AfterTemplate
144+
void after(Logger logger, String message, Object[] args, Throwable t) {
145+
logger.errorv(message, args, t);
146+
}
147+
}
148+
149+
public static class FatalToVFatal {
150+
@BeforeTemplate
151+
void before(Logger logger, String message, Object[] args) {
152+
logger.fatal(message, args);
153+
}
154+
155+
@AfterTemplate
156+
void after(Logger logger, String message, Object[] args) {
157+
logger.fatalv(message, args);
158+
}
159+
}
160+
161+
public static class FatalToVFatalWithThrowable {
162+
@BeforeTemplate
163+
void before(Logger logger, String message, Object[] args, Throwable t) {
164+
logger.fatal((Object) message, args, t);
165+
}
166+
167+
@AfterTemplate
168+
void after(Logger logger, String message, Object[] args, Throwable t) {
169+
logger.fatalv(message, args, t);
170+
}
171+
}
172+
}
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
/*
2+
* Copyright 2025 the original author or authors.
3+
* <p>
4+
* Licensed under the Moderne Source Available License (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
* <p>
8+
* https://docs.moderne.io/licensing/moderne-source-available-license
9+
* <p>
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package org.openrewrite.java.logging.jboss;
17+
18+
import org.junit.jupiter.api.Test;
19+
import org.junit.jupiter.params.ParameterizedTest;
20+
import org.junit.jupiter.params.provider.ValueSource;
21+
import org.openrewrite.DocumentExample;
22+
import org.openrewrite.test.RecipeSpec;
23+
import org.openrewrite.test.RewriteTest;
24+
25+
import static org.openrewrite.java.Assertions.java;
26+
27+
class FormattedArgumentsToVMethodTest implements RewriteTest {
28+
@Override
29+
public void defaults(RecipeSpec spec) {
30+
spec.recipe(new FormattedArgumentsToVMethodRecipes());
31+
}
32+
33+
@DocumentExample
34+
@Test
35+
void convertInfo() {
36+
rewriteRun(
37+
//language=java
38+
java(
39+
"""
40+
import org.jboss.logging.Logger;
41+
42+
class Test {
43+
void test(Logger logger, String msg, Throwable t, Object[] formatArgs, Object o) {
44+
logger.info(msg, formatArgs);
45+
logger.info(msg, new Object[]{o});
46+
logger.info((Object)msg, formatArgs, t);
47+
logger.info(o, formatArgs, t);
48+
}
49+
}
50+
""",
51+
"""
52+
import org.jboss.logging.Logger;
53+
54+
class Test {
55+
void test(Logger logger, String msg, Throwable t, Object[] formatArgs, Object o) {
56+
logger.infov(msg, formatArgs);
57+
logger.infov(msg, new Object[]{o});
58+
logger.infov(msg, formatArgs, t);
59+
logger.info(o, formatArgs, t);
60+
}
61+
}
62+
"""
63+
)
64+
);
65+
}
66+
67+
@ParameterizedTest
68+
@ValueSource(strings = {"trace", "debug", "info", "warn", "error", "fatal"})
69+
void deprecatedParametrizedCallsToVCalls(String level) {
70+
rewriteRun(
71+
//language=java
72+
java(
73+
"""
74+
import org.jboss.logging.Logger;
75+
76+
class Test {
77+
void test(Logger logger, String msg, Throwable t, Object[] formatArgs, Object o) {
78+
logger.%1$s(msg, formatArgs);
79+
logger.%1$s((Object)msg, formatArgs, t);
80+
logger.%1$s(o, formatArgs, t);
81+
}
82+
}
83+
""".formatted(level),
84+
"""
85+
import org.jboss.logging.Logger;
86+
87+
class Test {
88+
void test(Logger logger, String msg, Throwable t, Object[] formatArgs, Object o) {
89+
logger.%1$sv(msg, formatArgs);
90+
logger.%1$sv(msg, formatArgs, t);
91+
logger.%1$s(o, formatArgs, t);
92+
}
93+
}
94+
""".formatted(level)
95+
)
96+
);
97+
}
98+
}

0 commit comments

Comments
 (0)