From fca15c1478d60794eaea5d5d0bda3014dede2329 Mon Sep 17 00:00:00 2001 From: Denielig Date: Wed, 29 May 2024 15:21:41 +0200 Subject: [PATCH 1/6] =?UTF-8?q?chore:=20=F0=9F=A7=AA=20Add=20false=20posit?= =?UTF-8?q?ive=20test=20case?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../checks/GCI3/ValidParamRegexPattern.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 src/it/test-projects/creedengo-java-plugin-test-project/src/main/java/org/greencodeinitiative/creedengo/java/checks/GCI3/ValidParamRegexPattern.java diff --git a/src/it/test-projects/creedengo-java-plugin-test-project/src/main/java/org/greencodeinitiative/creedengo/java/checks/GCI3/ValidParamRegexPattern.java b/src/it/test-projects/creedengo-java-plugin-test-project/src/main/java/org/greencodeinitiative/creedengo/java/checks/GCI3/ValidParamRegexPattern.java new file mode 100644 index 00000000..3dc91c79 --- /dev/null +++ b/src/it/test-projects/creedengo-java-plugin-test-project/src/main/java/org/greencodeinitiative/creedengo/java/checks/GCI3/ValidParamRegexPattern.java @@ -0,0 +1,27 @@ +/* + * ecoCode - Java language - Provides rules to reduce the environmental footprint of your Java programs + * Copyright © 2023 Green Code Initiative (https://www.ecocode.io) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package fr.greencodeinitiative.java.checks; + +import java.util.regex.Pattern; + +public class ValidParamRegexPattern { + + public void epjPatternWithParam(String codeEpj) { + final Pattern pattern = Pattern.compile("\"codeEpj\"\\s*:\\s" + codeEpj + ","); // Noncompliant {{Avoid using Pattern.compile() in a non-static context.}} + } +} From 8e4e25e9979dba09851ea3aa5a8a364f642a2600 Mon Sep 17 00:00:00 2001 From: Maxime Daniel Date: Thu, 30 May 2024 09:06:57 +0200 Subject: [PATCH 2/6] =?UTF-8?q?fix:=20=F0=9F=90=9B=20Added=20exception=20t?= =?UTF-8?q?o=20EC77=20for=20parameterized=20regex?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../creedengo/java/checks/GCI3/ValidParamRegexPattern.java | 3 ++- .../creedengo/java/checks/AvoidRegexPatternNotStatic.java | 5 ++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/it/test-projects/creedengo-java-plugin-test-project/src/main/java/org/greencodeinitiative/creedengo/java/checks/GCI3/ValidParamRegexPattern.java b/src/it/test-projects/creedengo-java-plugin-test-project/src/main/java/org/greencodeinitiative/creedengo/java/checks/GCI3/ValidParamRegexPattern.java index 3dc91c79..db73e098 100644 --- a/src/it/test-projects/creedengo-java-plugin-test-project/src/main/java/org/greencodeinitiative/creedengo/java/checks/GCI3/ValidParamRegexPattern.java +++ b/src/it/test-projects/creedengo-java-plugin-test-project/src/main/java/org/greencodeinitiative/creedengo/java/checks/GCI3/ValidParamRegexPattern.java @@ -22,6 +22,7 @@ public class ValidParamRegexPattern { public void epjPatternWithParam(String codeEpj) { - final Pattern pattern = Pattern.compile("\"codeEpj\"\\s*:\\s" + codeEpj + ","); // Noncompliant {{Avoid using Pattern.compile() in a non-static context.}} + final Pattern pattern = Pattern.compile("\"codeEpj\"\\s*:\\s" + codeEpj + ","); // Compliant - Pattern is used with a parameter + final Pattern pattern2 = Pattern.compile(codeEpj); // Compliant - Pattern is used with a parameter } } diff --git a/src/main/java/org/greencodeinitiative/creedengo/java/checks/AvoidRegexPatternNotStatic.java b/src/main/java/org/greencodeinitiative/creedengo/java/checks/AvoidRegexPatternNotStatic.java index beb1cea6..22c5a9be 100644 --- a/src/main/java/org/greencodeinitiative/creedengo/java/checks/AvoidRegexPatternNotStatic.java +++ b/src/main/java/org/greencodeinitiative/creedengo/java/checks/AvoidRegexPatternNotStatic.java @@ -26,6 +26,7 @@ import org.sonar.check.Rule; import org.sonar.plugins.java.api.IssuableSubscriptionVisitor; import org.sonar.plugins.java.api.semantic.MethodMatchers; +import org.sonar.plugins.java.api.tree.Arguments; import org.sonar.plugins.java.api.tree.BaseTreeVisitor; import org.sonar.plugins.java.api.tree.MethodInvocationTree; import org.sonar.plugins.java.api.tree.MethodTree; @@ -67,7 +68,9 @@ private class AvoidRegexPatternNotStaticVisitor extends BaseTreeVisitor { @Override public void visitMethodInvocation(@Nonnull MethodInvocationTree tree) { - if (PATTERN_COMPILE.matches(tree)) { + Arguments arguments = tree.arguments(); + boolean isArgumentStringLitteral = !arguments.isEmpty() && arguments.get(0).is(Tree.Kind.STRING_LITERAL); + if (PATTERN_COMPILE.matches(tree) && isArgumentStringLitteral){ reportIssue(tree, MESSAGE_RULE); } else { super.visitMethodInvocation(tree); From b09d46cb8f3e1ea3d0a1e07b7eed7c8af5002ffb Mon Sep 17 00:00:00 2001 From: Luc Fouin Date: Thu, 30 May 2024 12:08:03 +0200 Subject: [PATCH 3/6] =?UTF-8?q?docs:=20=F0=9F=93=9D=20Updating=20CHANGELOG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a5c8c92c..5bd554e1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - upgrade internal libraries versions - non retro-compatibility upgrades - refacto to have all the test files in the same place (for UT and IT), to avoid maintaining 2 test directories - refacto all test files to add sub-directories for each rule, to be more clear and to be able to add more tests for each rule in the future +- [#3](https://github.com/green-code-initiative/ecoCode-java/issues/3) Improvement: pattern declaration not only in a static way ### Deleted From 853d018b5fd3d2172ba09c414fdaf7cc923d8f49 Mon Sep 17 00:00:00 2001 From: Luc Fouin Date: Wed, 20 May 2026 00:57:28 +0200 Subject: [PATCH 4/6] feat: Integring Copilot review --- CHANGELOG.md | 2 +- .../java/checks/{GCI3 => GCI77}/ValidParamRegexPattern.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename src/it/test-projects/creedengo-java-plugin-test-project/src/main/java/org/greencodeinitiative/creedengo/java/checks/{GCI3 => GCI77}/ValidParamRegexPattern.java (95%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5bd554e1..49f6d26e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,7 +17,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - upgrade internal libraries versions - non retro-compatibility upgrades - refacto to have all the test files in the same place (for UT and IT), to avoid maintaining 2 test directories - refacto all test files to add sub-directories for each rule, to be more clear and to be able to add more tests for each rule in the future -- [#3](https://github.com/green-code-initiative/ecoCode-java/issues/3) Improvement: pattern declaration not only in a static way +- [#3](https://github.com/green-code-initiative/creedengo-java/issues/3) Improvement: pattern declaration not only in a static way ### Deleted diff --git a/src/it/test-projects/creedengo-java-plugin-test-project/src/main/java/org/greencodeinitiative/creedengo/java/checks/GCI3/ValidParamRegexPattern.java b/src/it/test-projects/creedengo-java-plugin-test-project/src/main/java/org/greencodeinitiative/creedengo/java/checks/GCI77/ValidParamRegexPattern.java similarity index 95% rename from src/it/test-projects/creedengo-java-plugin-test-project/src/main/java/org/greencodeinitiative/creedengo/java/checks/GCI3/ValidParamRegexPattern.java rename to src/it/test-projects/creedengo-java-plugin-test-project/src/main/java/org/greencodeinitiative/creedengo/java/checks/GCI77/ValidParamRegexPattern.java index db73e098..4e15dff7 100644 --- a/src/it/test-projects/creedengo-java-plugin-test-project/src/main/java/org/greencodeinitiative/creedengo/java/checks/GCI3/ValidParamRegexPattern.java +++ b/src/it/test-projects/creedengo-java-plugin-test-project/src/main/java/org/greencodeinitiative/creedengo/java/checks/GCI77/ValidParamRegexPattern.java @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package fr.greencodeinitiative.java.checks; +package org.greencodeinitiative.creedengo.java.checks; import java.util.regex.Pattern; From b15ffc2c5794a1de44fe035d436d7884406dbb27 Mon Sep 17 00:00:00 2001 From: "FOUIN Luc (BPCE-SI)" Date: Wed, 20 May 2026 09:27:22 +0200 Subject: [PATCH 5/6] feature: Detect string concatenation Improved test on STRING_LITERAL by recursively analyze Binary expression --- .../java/integration/tests/GCIRulesIT.java | 16 ++++++++++++++-- .../GCI77/AvoidRegexPatternNotStatic.java | 6 +++++- .../java/checks/AvoidRegexPatternNotStatic.java | 17 +++++++++++++++-- 3 files changed, 34 insertions(+), 5 deletions(-) diff --git a/src/it/java/org/greencodeinitiative/creedengo/java/integration/tests/GCIRulesIT.java b/src/it/java/org/greencodeinitiative/creedengo/java/integration/tests/GCIRulesIT.java index 477b8cde..af907668 100644 --- a/src/it/java/org/greencodeinitiative/creedengo/java/integration/tests/GCIRulesIT.java +++ b/src/it/java/org/greencodeinitiative/creedengo/java/integration/tests/GCIRulesIT.java @@ -238,8 +238,8 @@ void testGCI2_noIssue() { void testGCI77_invalid() { String filePath = "src/main/java/org/greencodeinitiative/creedengo/java/checks/GCI77/AvoidRegexPatternNotStatic.java"; - int[] startLines = new int[]{25}; - int[] endLines = new int[]{25}; + int[] startLines = new int[]{25, 26, 27}; + int[] endLines = new int[]{25, 26, 27}; String ruleId = "creedengo-java:GCI77"; String ruleMsg = "Avoid using Pattern.compile() in a non-static context."; @@ -282,6 +282,18 @@ void testGCI77_valid3() { checkIssuesForFile(filePath, ruleId, ruleMsg, startLines, endLines, SEVERITY, TYPE, EFFORT_20MIN); } + @Test + void testGCI77_valid4() { + + String filePath = "src/main/java/org/greencodeinitiative/creedengo/java/checks/GCI77/ValidParamRegexPattern.java"; + int[] startLines = new int[]{}; + int[] endLines = new int[]{}; + String ruleId = "creedengo-java:GCI77"; + String ruleMsg = "Avoid using Pattern.compile() in a non-static context."; + + checkIssuesForFile(filePath, ruleId, ruleMsg, startLines, endLines, SEVERITY, TYPE, EFFORT_20MIN); + } + @Test void testGCI78() { diff --git a/src/it/test-projects/creedengo-java-plugin-test-project/src/main/java/org/greencodeinitiative/creedengo/java/checks/GCI77/AvoidRegexPatternNotStatic.java b/src/it/test-projects/creedengo-java-plugin-test-project/src/main/java/org/greencodeinitiative/creedengo/java/checks/GCI77/AvoidRegexPatternNotStatic.java index 76387635..56466331 100644 --- a/src/it/test-projects/creedengo-java-plugin-test-project/src/main/java/org/greencodeinitiative/creedengo/java/checks/GCI77/AvoidRegexPatternNotStatic.java +++ b/src/it/test-projects/creedengo-java-plugin-test-project/src/main/java/org/greencodeinitiative/creedengo/java/checks/GCI77/AvoidRegexPatternNotStatic.java @@ -23,6 +23,10 @@ public class AvoidRegexPatternNotStatic { public boolean foo() { final Pattern pattern = Pattern.compile("foo"); // Noncompliant {{Avoid using Pattern.compile() in a non-static context.}} - return pattern.matcher("foo").find(); + final Pattern pattern2 = Pattern.compile("foo" + "bar"); // Noncompliant {{Avoid using Pattern.compile() in a non-static context.}} + final Pattern pattern3 = Pattern.compile("foo" + "bar" + "baz"); // Noncompliant {{Avoid using Pattern.compile() in a non-static context.}} + return pattern.matcher("foo").find() + && pattern2.matcher("foo").find() + && pattern3.matcher("foo").find(); } } diff --git a/src/main/java/org/greencodeinitiative/creedengo/java/checks/AvoidRegexPatternNotStatic.java b/src/main/java/org/greencodeinitiative/creedengo/java/checks/AvoidRegexPatternNotStatic.java index 22c5a9be..8298115c 100644 --- a/src/main/java/org/greencodeinitiative/creedengo/java/checks/AvoidRegexPatternNotStatic.java +++ b/src/main/java/org/greencodeinitiative/creedengo/java/checks/AvoidRegexPatternNotStatic.java @@ -28,6 +28,7 @@ import org.sonar.plugins.java.api.semantic.MethodMatchers; import org.sonar.plugins.java.api.tree.Arguments; import org.sonar.plugins.java.api.tree.BaseTreeVisitor; +import org.sonar.plugins.java.api.tree.BinaryExpressionTree; import org.sonar.plugins.java.api.tree.MethodInvocationTree; import org.sonar.plugins.java.api.tree.MethodTree; import org.sonar.plugins.java.api.tree.Tree; @@ -69,13 +70,25 @@ private class AvoidRegexPatternNotStaticVisitor extends BaseTreeVisitor { @Override public void visitMethodInvocation(@Nonnull MethodInvocationTree tree) { Arguments arguments = tree.arguments(); - boolean isArgumentStringLitteral = !arguments.isEmpty() && arguments.get(0).is(Tree.Kind.STRING_LITERAL); - if (PATTERN_COMPILE.matches(tree) && isArgumentStringLitteral){ + boolean isArgumentStringLiteral = !arguments.isEmpty() && isStringLiteralOrConcatenation(arguments.get(0)); + if (PATTERN_COMPILE.matches(tree) && isArgumentStringLiteral) { reportIssue(tree, MESSAGE_RULE); } else { super.visitMethodInvocation(tree); } } + private boolean isStringLiteralOrConcatenation(Tree tree) { + if (tree.is(Tree.Kind.STRING_LITERAL)) { + return true; + } + if (tree.is(Tree.Kind.PLUS)) { + BinaryExpressionTree binaryExpr = (BinaryExpressionTree) tree; + return isStringLiteralOrConcatenation(binaryExpr.leftOperand()) + && isStringLiteralOrConcatenation(binaryExpr.rightOperand()); + } + return false; + } + } } From d1ff0e397b0da9f413d9b505c3d616abe8dc1aad Mon Sep 17 00:00:00 2001 From: Luc Fouin Date: Wed, 20 May 2026 09:29:42 +0200 Subject: [PATCH 6/6] chore: Fixing license header --- .../creedengo/java/checks/GCI77/ValidParamRegexPattern.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/it/test-projects/creedengo-java-plugin-test-project/src/main/java/org/greencodeinitiative/creedengo/java/checks/GCI77/ValidParamRegexPattern.java b/src/it/test-projects/creedengo-java-plugin-test-project/src/main/java/org/greencodeinitiative/creedengo/java/checks/GCI77/ValidParamRegexPattern.java index 4e15dff7..0b959161 100644 --- a/src/it/test-projects/creedengo-java-plugin-test-project/src/main/java/org/greencodeinitiative/creedengo/java/checks/GCI77/ValidParamRegexPattern.java +++ b/src/it/test-projects/creedengo-java-plugin-test-project/src/main/java/org/greencodeinitiative/creedengo/java/checks/GCI77/ValidParamRegexPattern.java @@ -1,6 +1,6 @@ /* - * ecoCode - Java language - Provides rules to reduce the environmental footprint of your Java programs - * Copyright © 2023 Green Code Initiative (https://www.ecocode.io) + * creedengo - Java language - Provides rules to reduce the environmental footprint of your Java programs + * Copyright © 2024 Green Code Initiative (https://green-code-initiative.org/) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by