diff --git a/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/service/HeuristicCallGraphEngine.java b/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/service/HeuristicCallGraphEngine.java index 5f0eb1d..eef8111 100644 --- a/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/service/HeuristicCallGraphEngine.java +++ b/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/service/HeuristicCallGraphEngine.java @@ -20,7 +20,13 @@ public class HeuristicCallGraphEngine extends AbstractCallGraphEngine { super(context); } + @SuppressWarnings("unchecked") protected Map> buildCallGraph() { + Map> cached = (Map>) context.getCache().get("heuristicCallGraph"); + if (cached != null) { + this.graph = cached; + return cached; + } graph = new HashMap<>(); for (CompilationUnit cu : context.getCompilationUnits()) { cu.accept(new ASTVisitor() { @@ -131,6 +137,7 @@ public class HeuristicCallGraphEngine extends AbstractCallGraphEngine { } }); } + context.getCache().put("heuristicCallGraph", graph); return graph; } diff --git a/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/service/JdtCallGraphEngine.java b/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/service/JdtCallGraphEngine.java index 4adb003..9520ce5 100644 --- a/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/service/JdtCallGraphEngine.java +++ b/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/service/JdtCallGraphEngine.java @@ -24,7 +24,13 @@ public class JdtCallGraphEngine extends AbstractCallGraphEngine { this.injectionAnalyzer = injectionAnalyzer; } + @SuppressWarnings("unchecked") protected Map> buildCallGraph() { + Map> cached = (Map>) context.getCache().get("jdtCallGraph"); + if (cached != null) { + this.graph = cached; + return cached; + } graph = new HashMap<>(); for (CompilationUnit cu : context.getCompilationUnits()) { cu.accept(new ASTVisitor() { @@ -131,6 +137,7 @@ public class JdtCallGraphEngine extends AbstractCallGraphEngine { } }); } + context.getCache().put("jdtCallGraph", graph); return graph; } diff --git a/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/service/JdtIntelligenceProvider.java b/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/service/JdtIntelligenceProvider.java index b554d3c..e379f7b 100644 --- a/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/service/JdtIntelligenceProvider.java +++ b/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/service/JdtIntelligenceProvider.java @@ -29,6 +29,8 @@ public class JdtIntelligenceProvider implements CodebaseIntelligenceProvider { private final LifecycleDetector lifecycleDetector; private final InterceptorDetector interceptorDetector; private final SpringComponentDetector componentDetector; + private List cachedTriggers; + private List cachedEntryPoints; public JdtIntelligenceProvider(CodebaseContext context, Path rootDir) { this.context = context; @@ -54,6 +56,9 @@ public class JdtIntelligenceProvider implements CodebaseIntelligenceProvider { @Override public List findTriggerPoints() { + if (cachedTriggers != null) { + return cachedTriggers; + } List allTriggers = new ArrayList<>(); var cus = context.getCompilationUnits(); log.info("JdtIntelligenceProvider scanning {} compilation units for triggers", cus.size()); @@ -62,11 +67,15 @@ public class JdtIntelligenceProvider implements CodebaseIntelligenceProvider { allTriggers.addAll(lifecycleDetector.detect(cu)); } log.info("Found {} triggers (including lifecycle) in total", allTriggers.size()); + cachedTriggers = allTriggers; return allTriggers; } @Override public List findEntryPoints() { + if (cachedEntryPoints != null) { + return cachedEntryPoints; + } List allEntryPoints = new ArrayList<>(); var cus = context.getCompilationUnits(); log.info("JdtIntelligenceProvider scanning {} compilation units for entry points", cus.size()); @@ -77,6 +86,7 @@ public class JdtIntelligenceProvider implements CodebaseIntelligenceProvider { allEntryPoints.addAll(componentDetector.detect(cu)); } log.info("Found {} entry points (including interceptors and listeners) in total", allEntryPoints.size()); + cachedEntryPoints = allEntryPoints; return allEntryPoints; } diff --git a/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/ast/common/CodebaseContext.java b/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/ast/common/CodebaseContext.java index a24e662..55143b9 100644 --- a/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/ast/common/CodebaseContext.java +++ b/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/ast/common/CodebaseContext.java @@ -41,6 +41,11 @@ public class CodebaseContext { private List libraryHints = new ArrayList<>(); private final ObjectMapper objectMapper = new ObjectMapper(); private Path projectRoot; + private final Map cache = new HashMap<>(); + + public Map getCache() { + return cache; + } public void setProjectRoot(Path root) { this.projectRoot = root; diff --git a/state_machine_exporter/src/test/java/click/kamil/springstatemachineexporter/analysis/enricher/matching/HeuristicEventMatchingEngineTest.java b/state_machine_exporter/src/test/java/click/kamil/springstatemachineexporter/analysis/enricher/matching/HeuristicEventMatchingEngineTest.java index ee7a2dd..0f3b939 100644 --- a/state_machine_exporter/src/test/java/click/kamil/springstatemachineexporter/analysis/enricher/matching/HeuristicEventMatchingEngineTest.java +++ b/state_machine_exporter/src/test/java/click/kamil/springstatemachineexporter/analysis/enricher/matching/HeuristicEventMatchingEngineTest.java @@ -125,4 +125,26 @@ class HeuristicEventMatchingEngineTest { assertThat(engine.matches(smEvent, triggerPoint)).isFalse(); } + + @Test + void shouldMatchWildcardIfTypeMatches() { + Event smEvent = Event.of("PAY", "com.example.OrderEvents.PAY"); + TriggerPoint triggerPoint = TriggerPoint.builder() + .event("event") + .eventTypeFqn("com.example.OrderEvents") + .build(); + + assertThat(engine.matches(smEvent, triggerPoint)).isTrue(); + } + + @Test + void shouldNotMatchWildcardIfTypeMismatches() { + Event smEvent = Event.of("PAY", "com.example.InvoiceEvents.PAY"); + TriggerPoint triggerPoint = TriggerPoint.builder() + .event("event") + .eventTypeFqn("com.example.OrderEvents") + .build(); + + assertThat(engine.matches(smEvent, triggerPoint)).isFalse(); + } }