diff --git a/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/enricher/TransitionLinkerEnricher.java b/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/enricher/TransitionLinkerEnricher.java index 2241112..7f17edf 100644 --- a/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/enricher/TransitionLinkerEnricher.java +++ b/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/enricher/TransitionLinkerEnricher.java @@ -195,7 +195,7 @@ public class TransitionLinkerEnricher implements AnalysisEnricher { } private final java.util.Map simplifyCache = new java.util.HashMap<>(); - private final java.util.Map guardedCache = new java.util.HashMap<>(); + private final java.util.Map, Boolean> guardedCache = new java.util.HashMap<>(); private static final java.util.regex.Pattern SUFFIX_PATTERN = java.util.regex.Pattern.compile("(?i)(.+)(Event|Action|Transition|Command)(s)?$"); private static final java.util.regex.Pattern FQN_PATTERN = java.util.regex.Pattern.compile("^.*\\.([A-Z0-9_]+)$"); @@ -217,7 +217,9 @@ public class TransitionLinkerEnricher implements AnalysisEnricher { private boolean isGuardedContains(String smEvent, String triggerEvent) { if (smEvent == null || triggerEvent == null) return false; - String cacheKey = smEvent + "|" + triggerEvent; + + // Use a strictly immutable pair to guarantee 100% collision-free caching regardless of string content + java.util.Map.Entry cacheKey = new java.util.AbstractMap.SimpleImmutableEntry<>(smEvent, triggerEvent); if (guardedCache.containsKey(cacheKey)) return guardedCache.get(cacheKey); boolean result = calculateGuardedContains(smEvent, triggerEvent); diff --git a/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/enricher/matching/HeuristicEventMatchingEngine.java b/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/enricher/matching/HeuristicEventMatchingEngine.java index b996a7b..2c88a47 100644 --- a/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/enricher/matching/HeuristicEventMatchingEngine.java +++ b/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/enricher/matching/HeuristicEventMatchingEngine.java @@ -88,13 +88,14 @@ public class HeuristicEventMatchingEngine implements EventMatchingEngine { } private final java.util.Map simplifyCache = new java.util.HashMap<>(); - private final java.util.Map guardedCache = new java.util.HashMap<>(); + private final java.util.Map, Boolean> guardedCache = new java.util.HashMap<>(); private static final java.util.regex.Pattern SUFFIX_PATTERN = java.util.regex.Pattern.compile("(?i)(.+)(Event|Action|Transition|Command)(s)?$"); private static final java.util.regex.Pattern FQN_PATTERN = java.util.regex.Pattern.compile("^.*\\.([A-Z0-9_]+)$"); private boolean isGuardedContains(String smEvent, String triggerEvent) { if (smEvent == null || triggerEvent == null) return false; - String cacheKey = smEvent + "|" + triggerEvent; + + java.util.Map.Entry cacheKey = new java.util.AbstractMap.SimpleImmutableEntry<>(smEvent, triggerEvent); if (guardedCache.containsKey(cacheKey)) return guardedCache.get(cacheKey); boolean result = calculateGuardedContains(smEvent, triggerEvent);