Skip to content

Commit

Permalink
Add new rule EC31: Prefer lighter formats for image files
Browse files Browse the repository at this point in the history
  • Loading branch information
salah-dev-inp committed May 30, 2024
1 parent d5bf295 commit b69c5f3
Show file tree
Hide file tree
Showing 7 changed files with 161 additions and 20 deletions.
7 changes: 5 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

### Added

### Changed

### Deleted
## [1.6.2] - 2024-05-30

### Added

- EC31 rule : Prefer lighter formats for image files

## [1.6.1] - 2024-05-15

Expand Down
19 changes: 3 additions & 16 deletions src/main/java/fr/greencodeinitiative/java/JavaCheckRegistrar.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,21 +20,7 @@
import java.util.Collections;
import java.util.List;

import fr.greencodeinitiative.java.checks.ArrayCopyCheck;
import fr.greencodeinitiative.java.checks.AvoidFullSQLRequest;
import fr.greencodeinitiative.java.checks.AvoidGettingSizeCollectionInLoop;
import fr.greencodeinitiative.java.checks.AvoidMultipleIfElseStatement;
import fr.greencodeinitiative.java.checks.AvoidRegexPatternNotStatic;
import fr.greencodeinitiative.java.checks.AvoidSQLRequestInLoop;
import fr.greencodeinitiative.java.checks.AvoidSetConstantInBatchUpdate;
import fr.greencodeinitiative.java.checks.AvoidSpringRepositoryCallInLoopOrStreamCheck;
import fr.greencodeinitiative.java.checks.AvoidStatementForDMLQueries;
import fr.greencodeinitiative.java.checks.AvoidUsageOfStaticCollections;
import fr.greencodeinitiative.java.checks.FreeResourcesOfAutoCloseableInterface;
import fr.greencodeinitiative.java.checks.IncrementCheck;
import fr.greencodeinitiative.java.checks.InitializeBufferWithAppropriateSize;
import fr.greencodeinitiative.java.checks.NoFunctionCallWhenDeclaringForLoop;
import fr.greencodeinitiative.java.checks.OptimizeReadFileExceptions;
import fr.greencodeinitiative.java.checks.*;
import org.sonar.plugins.java.api.CheckRegistrar;
import org.sonar.plugins.java.api.JavaCheck;
import org.sonarsource.api.sonarlint.SonarLintSide;
Expand Down Expand Up @@ -62,7 +48,8 @@ public class JavaCheckRegistrar implements CheckRegistrar {
InitializeBufferWithAppropriateSize.class,
AvoidSetConstantInBatchUpdate.class,
FreeResourcesOfAutoCloseableInterface.class,
AvoidMultipleIfElseStatement.class
AvoidMultipleIfElseStatement.class,
PreferLighterImageFormats.class
);

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
/*
* 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 <http://www.gnu.org/licenses/>.
*/
package fr.greencodeinitiative.java.checks;

import java.util.Arrays;
import java.util.List;
import org.sonar.check.Rule;
import org.sonar.plugins.java.api.IssuableSubscriptionVisitor;
import org.sonar.plugins.java.api.tree.Tree;
import org.sonar.plugins.java.api.tree.LiteralTree;
import org.sonarsource.analyzer.commons.annotations.DeprecatedRuleKey;
import org.sonar.api.utils.log.Logger;
import org.sonar.api.utils.log.Loggers;

@Rule(key = "EC31")
@DeprecatedRuleKey(repositoryKey = "greencodeinitiative-java", ruleKey = "EC31")
public class PreferLighterImageFormats extends IssuableSubscriptionVisitor {

private static final Logger LOGGER = Loggers.get(PreferLighterImageFormats.class);
private static final String MESSAGE = "Consider using lighter image formats like .webp or .avif instead of .jpg, .jpeg or .png";

private static final List<String> HEAVY_FORMATS = Arrays.asList(".jpg", ".jpeg", ".png");

@Override
public List<Tree.Kind> nodesToVisit() {
return Arrays.asList(Tree.Kind.STRING_LITERAL);
}

public void visitNode(Tree tree) {
if (tree.is(Tree.Kind.STRING_LITERAL)) {
LiteralTree literalTree = (LiteralTree) tree;
String value = literalTree.value();

// Remove the quotes around the literal value
if (value.length() > 2 && value.startsWith("\"") && value.endsWith("\"")) {
value = value.substring(1, value.length() - 1);
}

for (String format : HEAVY_FORMATS) {
if (value.endsWith(format)) {
reportIssue(literalTree, MESSAGE);
break;
}
}
}
}
}
56 changes: 56 additions & 0 deletions src/test/files/PreferLighterImageFormatsCheck.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
/*
* 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 <http://www.gnu.org/licenses/>.
*/
package fr.greencodeinitiative.java.checks;

import java.util.logging.Logger;

class PreferLighterImageFormatsCheck {

private static final Logger LOGGER = Logger.getLogger(PreferLighterImageFormatsCheck.class.getName());

public PreferLighterImageFormatsCheck(PreferLighterImageFormatsCheck checker) {
}


public void testDirectAssignments() {
String imagePath1 = "images/photo.jpg"; // Noncompliant
String imagePath2 = "images/graphic.png"; // Noncompliant
String imagePath3 = "images/photo.webp"; // Compliant
String imagePath4 = "images/graphic.avif"; // Compliant
}

public void testPathsInArray() {
String[] imagePaths = {
"assets/image1.jpg", // Noncompliant
"assets/image2.png", // Noncompliant
"assets/image3.webp", // Compliant
"assets/image4.avif" // Compliant
};

for (String imagePath : imagePaths) {
LOGGER.info("Image path: " + imagePath);
}
}

public void testPathsInMethods() {
logImagePath("icons/icon1.jpg"); // Noncompliant
logImagePath("icons/icon2.png"); // Noncompliant
logImagePath("icons/icon3.webp"); // Compliant
logImagePath("icons/icon4.avif"); // Compliant
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ void checkNumberRules() {
final JavaCheckRegistrar registrar = new JavaCheckRegistrar();
registrar.register(context);

assertThat(context.checkClasses()).hasSize(15);
assertThat(context.checkClasses()).hasSize(16);
assertThat(context.testCheckClasses()).isEmpty();

}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ void init() {
RulesDefinition.Context context = new RulesDefinition.Context();
rulesDefinition.define(context);
repository = context.repository(rulesDefinition.repositoryKey());
rulesSize = 15;
rulesSize = 16;
}

@Test
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
/*
* 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 <http://www.gnu.org/licenses/>.
*/
package fr.greencodeinitiative.java.checks;

import org.junit.jupiter.api.Test;
import org.sonar.java.checks.verifier.CheckVerifier;

class PreferLighterImageFormatsCheckTest {

@Test
void test() {
CheckVerifier.newVerifier()
.onFile("src/test/files/PreferLighterImageFormatsCheck.java")
.withCheck(new PreferLighterImageFormats())
.verifyIssues();
}
}

0 comments on commit b69c5f3

Please sign in to comment.