Skip to content

Commit c5a5c82

Browse files
ghislainpiotsonartech
authored andcommitted
SONARPY-2817 Cache the result of resource loading in checks (#225)
GitOrigin-RevId: 6f8ab7b3193267443bcc2f725915b7b7e683ee82
1 parent 25b452b commit c5a5c82

2 files changed

Lines changed: 20 additions & 12 deletions

File tree

python-checks/src/main/java/org/sonar/python/checks/HardcodedCredentialsCallCheck.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import java.util.Map;
2424
import java.util.Objects;
2525
import java.util.Optional;
26+
import java.util.concurrent.ConcurrentHashMap;
2627
import java.util.function.Function;
2728
import java.util.function.Predicate;
2829
import java.util.stream.Collectors;
@@ -161,15 +162,16 @@ private static class CredentialMethodsLoader {
161162
private static final String CHECKS_DIR = "/org/sonar/python/checks";
162163
private static final String GENERATED_METHODS_RESOURCE_PATH = CHECKS_DIR + "/generated_hardcoded_credentials_call_check_meta.json";
163164
private static final String MANUAL_METHODS_RESOURCE_PATH = CHECKS_DIR + "/manual_hardcoded_credentials_call_check_meta.json";
165+
private static final Map<String, CredentialMethod[]> CACHED_METHODS = new ConcurrentHashMap<>();
164166
private final Gson gson;
165167

166168
private CredentialMethodsLoader() {
167169
gson = new Gson();
168170
}
169171

170172
private Map<String, CredentialMethod> load() {
171-
var generatedCredentialMethods = loadMethodsFromResource(GENERATED_METHODS_RESOURCE_PATH);
172-
var manualCredentialMethods = loadMethodsFromResource(MANUAL_METHODS_RESOURCE_PATH);
173+
var generatedCredentialMethods = CACHED_METHODS.computeIfAbsent(GENERATED_METHODS_RESOURCE_PATH, this::loadMethodsFromResource);
174+
var manualCredentialMethods = CACHED_METHODS.computeIfAbsent(MANUAL_METHODS_RESOURCE_PATH, this::loadMethodsFromResource);
173175
return Stream.concat(Stream.of(generatedCredentialMethods), Stream.of(manualCredentialMethods))
174176
.collect(Collectors.toMap(CredentialMethod::name, Function.identity())); // Will throw an exception if there are duplicates
175177
}

python-checks/src/main/java/org/sonar/python/checks/cdk/ResourceAccessPolicyCheck.java

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,12 @@
2222
import java.io.InputStreamReader;
2323
import java.nio.charset.StandardCharsets;
2424
import java.util.ArrayList;
25-
import java.util.Collections;
2625
import java.util.HashSet;
2726
import java.util.List;
27+
import java.util.Map;
2828
import java.util.Optional;
2929
import java.util.Set;
30+
import java.util.concurrent.ConcurrentHashMap;
3031
import java.util.function.Predicate;
3132
import javax.annotation.Nullable;
3233
import org.slf4j.Logger;
@@ -44,26 +45,31 @@ public class ResourceAccessPolicyCheck extends AbstractIamPolicyStatementCheck {
4445
private static final Logger LOG = LoggerFactory.getLogger(ResourceAccessPolicyCheck.class);
4546
private static final String MESSAGE = "Make sure granting access to all resources is safe here.";
4647
private static final String SECONDARY_MESSAGE = "Related effect";
48+
private static final Map<String, Set<String>> CACHED_RESOURCES = new ConcurrentHashMap<>();
4749
// visible for testing
4850
String resourceNameSensitiveAwsActions = "ResourceAccessPolicyCheck.txt";
4951
private Set<String> sensitiveAwsActions = null;
5052

5153
void init() {
52-
try {
53-
sensitiveAwsActions = new HashSet<>(loadResource(resourceNameSensitiveAwsActions));
54-
} catch (IOException e) {
55-
sensitiveAwsActions = Collections.emptySet();
56-
LOG.error("Couldn't load resource '" + resourceNameSensitiveAwsActions + "', rule [S6304] ResourceAccessPolicyCheck will be disabled.", e);
57-
}
58-
}
54+
sensitiveAwsActions = CACHED_RESOURCES.computeIfAbsent(resourceNameSensitiveAwsActions, ResourceAccessPolicyCheck::loadResourceWrapper);
5955

56+
}
6057
@Override
6158
public void initialize(SubscriptionCheck.Context context) {
6259
super.initialize(context);
6360
init();
6461
}
6562

66-
private static List<String> loadResource(String resourceName) throws IOException {
63+
private static Set<String> loadResourceWrapper(String resourceName) {
64+
try {
65+
return loadResource(resourceName);
66+
} catch (IOException e) {
67+
LOG.error("Couldn't load resource '{}', rule [S6304] ResourceAccessPolicyCheck will be disabled.", resourceName, e);
68+
return Set.of();
69+
}
70+
}
71+
72+
private static Set<String> loadResource(String resourceName) throws IOException {
6773
try (InputStream is = ResourceAccessPolicyCheck.class.getResourceAsStream(resourceName)) {
6874
if (is == null) {
6975
throw new IOException("Cannot find resource file '" + resourceName + "'");
@@ -75,7 +81,7 @@ private static List<String> loadResource(String resourceName) throws IOException
7581
while((line = br.readLine()) != null) {
7682
result.add(line);
7783
}
78-
return result;
84+
return new HashSet<>(result);
7985
}
8086
}
8187
}

0 commit comments

Comments
 (0)