Skip to content

Commit 812e1ac

Browse files
committed
add lazy loading to some modules
1 parent d9b49a0 commit 812e1ac

File tree

6 files changed

+82
-22
lines changed

6 files changed

+82
-22
lines changed
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package io.codemodder;
2+
3+
import com.google.inject.AbstractModule;
4+
import java.util.List;
5+
6+
/** A module that only loads if it is responsible for a codemod that's being loaded. */
7+
public abstract class LazyCodemodLoadingAbstractModule extends AbstractModule {
8+
9+
private final boolean shouldActivate;
10+
11+
/** Returns true if this module is responsible for any of the given codemods, so it doesn't . */
12+
protected LazyCodemodLoadingAbstractModule(
13+
final List<Class<? extends CodeChanger>> codemodTypes) {
14+
this.shouldActivate = codemodTypes.stream().anyMatch(this::isResponsibleFor);
15+
}
16+
17+
/** Returns true if this module is responsible for any of the given codemods, so it doesn't . */
18+
protected abstract boolean isResponsibleFor(Class<? extends CodeChanger> codemod);
19+
20+
@Override
21+
protected final void configure() {
22+
if (shouldActivate) {
23+
doConfigure();
24+
}
25+
}
26+
27+
/** Do the configuration that you would normally do in the configure method. */
28+
protected abstract void doConfigure();
29+
}

plugins/codemodder-plugin-appscan/src/main/java/io/codemodder/providers/sarif/appscan/AppScanModule.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
package io.codemodder.providers.sarif.appscan;
22

3-
import com.google.inject.AbstractModule;
43
import io.codemodder.CodeChanger;
4+
import io.codemodder.Codemod;
5+
import io.codemodder.LazyCodemodLoadingAbstractModule;
56
import io.codemodder.RuleSarif;
67
import java.lang.reflect.Constructor;
78
import java.util.List;
@@ -12,19 +13,25 @@
1213
import java.util.stream.Stream;
1314

1415
/** Responsible for distributing the SARIFS to AppScan based codemods based on rules. */
15-
public final class AppScanModule extends AbstractModule {
16+
public final class AppScanModule extends LazyCodemodLoadingAbstractModule {
1617

1718
private final List<Class<? extends CodeChanger>> codemodTypes;
1819
private final List<RuleSarif> allAppScanRuleSarifs;
1920

2021
public AppScanModule(
2122
final List<Class<? extends CodeChanger>> codemodTypes, final List<RuleSarif> sarifs) {
23+
super(codemodTypes);
2224
this.codemodTypes = Objects.requireNonNull(codemodTypes);
2325
this.allAppScanRuleSarifs = sarifs;
2426
}
2527

2628
@Override
27-
protected void configure() {
29+
protected boolean isResponsibleFor(final Class<? extends CodeChanger> codemod) {
30+
return codemod.getAnnotation(Codemod.class).id().startsWith("appscan:");
31+
}
32+
33+
@Override
34+
protected void doConfigure() {
2835
final Map<String, RuleSarif> map =
2936
allAppScanRuleSarifs.stream()
3037
.collect(Collectors.toUnmodifiableMap(RuleSarif::getRule, rs -> rs));

plugins/codemodder-plugin-codeql/src/main/java/io/codemodder/providers/sarif/codeql/CodeQLModule.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
package io.codemodder.providers.sarif.codeql;
22

3-
import com.google.inject.AbstractModule;
43
import io.codemodder.CodeChanger;
4+
import io.codemodder.Codemod;
5+
import io.codemodder.LazyCodemodLoadingAbstractModule;
56
import io.codemodder.RuleSarif;
67
import java.lang.reflect.Constructor;
78
import java.util.List;
@@ -12,19 +13,25 @@
1213
import java.util.stream.Stream;
1314

1415
/** Responsible for distributing the SARIFS to CodeQL based codemods based on rules. */
15-
public final class CodeQLModule extends AbstractModule {
16+
public final class CodeQLModule extends LazyCodemodLoadingAbstractModule {
1617

1718
private final List<Class<? extends CodeChanger>> codemodTypes;
1819
private final List<RuleSarif> allCodeqlRuleSarifs;
1920

2021
CodeQLModule(
2122
final List<Class<? extends CodeChanger>> codemodTypes, final List<RuleSarif> sarifs) {
23+
super(codemodTypes);
2224
this.codemodTypes = Objects.requireNonNull(codemodTypes);
2325
this.allCodeqlRuleSarifs = sarifs;
2426
}
2527

2628
@Override
27-
protected void configure() {
29+
protected boolean isResponsibleFor(final Class<? extends CodeChanger> codemod) {
30+
return codemod.getAnnotation(Codemod.class).id().startsWith("codeql:");
31+
}
32+
33+
@Override
34+
protected void doConfigure() {
2835
// What if there are multiple sarif files with a given rule?
2936
// We can safely ignore this case for now.
3037
final Map<String, RuleSarif> map =

plugins/codemodder-plugin-pmd/src/main/java/io/codemodder/providers/sarif/pmd/PmdModule.java

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,7 @@
22

33
import com.contrastsecurity.sarif.Result;
44
import com.contrastsecurity.sarif.SarifSchema210;
5-
import com.google.inject.AbstractModule;
6-
import io.codemodder.CodeChanger;
7-
import io.codemodder.LazyLoadingRuleSarif;
8-
import io.codemodder.RuleSarif;
5+
import io.codemodder.*;
96
import io.github.classgraph.*;
107
import java.lang.reflect.Executable;
118
import java.lang.reflect.Parameter;
@@ -16,7 +13,7 @@
1613
import org.slf4j.LoggerFactory;
1714

1815
/** Responsible for binding PMD-related things. */
19-
public final class PmdModule extends AbstractModule {
16+
public final class PmdModule extends LazyCodemodLoadingAbstractModule {
2017

2118
private final List<Class<? extends CodeChanger>> codemodTypes;
2219
private final Path codeDirectory;
@@ -27,14 +24,22 @@ public PmdModule(
2724
final Path codeDirectory,
2825
final List<Path> includedFiles,
2926
final List<Class<? extends CodeChanger>> codemodTypes) {
27+
super(codemodTypes);
3028
this.codemodTypes = Objects.requireNonNull(codemodTypes);
3129
this.codeDirectory = Objects.requireNonNull(codeDirectory);
3230
this.includedFiles = Objects.requireNonNull(includedFiles);
3331
this.pmdRunner = PmdRunner.createDefault();
3432
}
3533

3634
@Override
37-
protected void configure() {
35+
protected boolean isResponsibleFor(final Class<? extends CodeChanger> codemod) {
36+
Codemod annotation = codemod.getAnnotation(Codemod.class);
37+
String id = annotation.id();
38+
return id.startsWith("semgrep:") || id.startsWith("pixee:");
39+
}
40+
41+
@Override
42+
protected void doConfigure() {
3843
Set<String> packagesScanned = new HashSet<>();
3944

4045
List<PmdScanTarget> scanTargets = new ArrayList<>();

plugins/codemodder-plugin-semgrep/src/main/java/io/codemodder/providers/sarif/semgrep/SemgrepModule.java

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,7 @@
22

33
import com.contrastsecurity.sarif.Result;
44
import com.contrastsecurity.sarif.SarifSchema210;
5-
import com.google.inject.AbstractModule;
6-
import io.codemodder.CodeChanger;
7-
import io.codemodder.LazyLoadingRuleSarif;
8-
import io.codemodder.RuleSarif;
5+
import io.codemodder.*;
96
import io.github.classgraph.*;
107
import java.io.IOException;
118
import java.io.UncheckedIOException;
@@ -20,7 +17,7 @@
2017
import org.slf4j.LoggerFactory;
2118

2219
/** Responsible for binding Semgrep-related things. */
23-
public final class SemgrepModule extends AbstractModule {
20+
public final class SemgrepModule extends LazyCodemodLoadingAbstractModule {
2421

2522
private final List<Class<? extends CodeChanger>> codemodTypes;
2623
private final Path codeDirectory;
@@ -44,13 +41,14 @@ public SemgrepModule(
4441
new DefaultSemgrepRuleFactory());
4542
}
4643

47-
public SemgrepModule(
44+
SemgrepModule(
4845
final Path codeDirectory,
4946
final List<String> includePatterns,
5047
final List<String> excludePatterns,
5148
final List<Class<? extends CodeChanger>> codemodTypes,
5249
final List<RuleSarif> sarifs,
5350
final SemgrepRuleFactory semgrepRuleFactory) {
51+
super(codemodTypes);
5452
this.codemodTypes = Objects.requireNonNull(codemodTypes);
5553
this.codeDirectory = Objects.requireNonNull(codeDirectory);
5654
this.includePatterns = Objects.requireNonNull(includePatterns);
@@ -61,7 +59,14 @@ public SemgrepModule(
6159
}
6260

6361
@Override
64-
protected void configure() {
62+
protected boolean isResponsibleFor(final Class<? extends CodeChanger> codemod) {
63+
Codemod annotation = codemod.getAnnotation(Codemod.class);
64+
String id = annotation.id();
65+
return id.startsWith("semgrep:") || id.startsWith("pixee:");
66+
}
67+
68+
@Override
69+
protected void doConfigure() {
6570

6671
// find all the @ProvidedSemgrepScan annotations and bind them as is
6772
Set<String> packagesScanned = new HashSet<>();

plugins/codemodder-plugin-sonar/src/main/java/io/codemodder/providers/sonar/SonarModule.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
package io.codemodder.providers.sonar;
22

3-
import com.google.inject.AbstractModule;
43
import io.codemodder.CodeChanger;
4+
import io.codemodder.Codemod;
5+
import io.codemodder.LazyCodemodLoadingAbstractModule;
56
import io.codemodder.sonar.model.Hotspot;
67
import io.codemodder.sonar.model.Issue;
78
import io.codemodder.sonar.model.SonarFinding;
@@ -14,7 +15,7 @@
1415
import java.util.*;
1516
import javax.inject.Inject;
1617

17-
final class SonarModule<T extends SonarFinding> extends AbstractModule {
18+
final class SonarModule<T extends SonarFinding> extends LazyCodemodLoadingAbstractModule {
1819

1920
private final List<Class<? extends CodeChanger>> codemodTypes;
2021
private final Path repository;
@@ -27,14 +28,20 @@ final class SonarModule<T extends SonarFinding> extends AbstractModule {
2728
final Path repository,
2829
final List<T> findings,
2930
final Class<? extends RuleFinding<T>> ruleFindingClass) {
31+
super(codemodTypes);
3032
this.codemodTypes = Objects.requireNonNull(codemodTypes);
3133
this.repository = Objects.requireNonNull(repository);
3234
this.sonarFindings = findings;
3335
this.ruleFindingClass = ruleFindingClass;
3436
}
3537

3638
@Override
37-
protected void configure() {
39+
protected boolean isResponsibleFor(final Class<? extends CodeChanger> codemod) {
40+
return codemod.getAnnotation(Codemod.class).id().startsWith("sonar:");
41+
}
42+
43+
@Override
44+
protected void doConfigure() {
3845

3946
Map<String, List<T>> findingsByRuleMap = groupFindingsByRule(sonarFindings);
4047

0 commit comments

Comments
 (0)