Skip to content

Commit 2b8a19f

Browse files
committed
Merge #263 from branch '255-makeFindFieldsThreadSafeWithThreadLocal' of https://github.com/metafacture/metafacture-fix
2 parents ce9157f + 0f2a0df commit 2b8a19f

File tree

2 files changed

+22
-14
lines changed

2 files changed

+22
-14
lines changed

metafix/src/main/java/org/metafacture/metafix/Value.java

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -497,14 +497,18 @@ public static class Hash extends AbstractValueType {
497497

498498
// NOTE: Keep in sync with `WildcardTrie`/`SimpleRegexTrie` implementation in metafacture-core.
499499
private static final Pattern ALTERNATION_PATTERN = Pattern.compile(WildcardTrie.OR_STRING, Pattern.LITERAL);
500-
private static final Matcher PATTERN_MATCHER = Pattern.compile("[*?]|\\[[^\\]]").matcher("");
500+
private static final ThreadLocal<Matcher> PATTERN_MATCHER = ThreadLocal.withInitial(() -> Pattern.compile("[*?]|\\[[^\\]]").matcher(""));
501501

502-
private static final Map<String, String> PREFIX_CACHE = new HashMap<>();
502+
private static final ThreadLocal<Map<String, String>> PREFIX_CACHE = ThreadLocal.withInitial(HashMap::new);
503503

504-
private static final Map<String, Map<String, Boolean>> TRIE_CACHE = new HashMap<>();
505-
private static final SimpleRegexTrie<String> TRIE = new SimpleRegexTrie<>();
504+
private static final ThreadLocal<Map<String, Map<String, Boolean>>> TRIE_CACHE = ThreadLocal.withInitial(HashMap::new);
505+
private static final ThreadLocal<SimpleRegexTrie<String>> TRIE = ThreadLocal.withInitial(SimpleRegexTrie::new);
506506

507+
private final Map<String, Map<String, Boolean>> trieCache = TRIE_CACHE.get();
508+
private final Map<String, String> prefixCache = PREFIX_CACHE.get();
507509
private final Map<String, Value> map = new LinkedHashMap<>();
510+
private final Matcher patternMatcher = PATTERN_MATCHER.get();
511+
private final SimpleRegexTrie<String> trie = TRIE.get();
508512

509513
/**
510514
* Creates an empty instance of {@link Hash}.
@@ -782,28 +786,28 @@ private Set<String> findFields(final String pattern) {
782786
}
783787

784788
private void findFields(final String pattern, final Set<String> fieldSet) {
785-
if (!PREFIX_CACHE.containsKey(pattern)) {
786-
final Matcher patternMatcher = PATTERN_MATCHER.reset(pattern);
789+
if (!prefixCache.containsKey(pattern)) {
790+
final Matcher matcher = patternMatcher.reset(pattern);
787791

788-
if (patternMatcher.find()) {
789-
TRIE.put(pattern, pattern);
790-
TRIE_CACHE.put(pattern, new HashMap<>());
792+
if (matcher.find()) {
793+
trie.put(pattern, pattern);
794+
trieCache.put(pattern, new HashMap<>());
791795

792-
PREFIX_CACHE.put(pattern, pattern.substring(0, patternMatcher.start()));
796+
prefixCache.put(pattern, pattern.substring(0, matcher.start()));
793797
}
794798
else {
795-
PREFIX_CACHE.put(pattern, null);
799+
prefixCache.put(pattern, null);
796800
}
797801
}
798802

799-
final String prefix = PREFIX_CACHE.get(pattern);
803+
final String prefix = prefixCache.get(pattern);
800804

801805
if (prefix != null) {
802-
final Map<String, Boolean> fieldCache = TRIE_CACHE.get(pattern);
806+
final Map<String, Boolean> fieldCache = trieCache.get(pattern);
803807

804808
for (final String field : map.keySet()) {
805809
if (!fieldCache.containsKey(field)) {
806-
final boolean matches = field.startsWith(prefix) && TRIE.get(field).contains(pattern);
810+
final boolean matches = field.startsWith(prefix) && trie.get(field).contains(pattern);
807811
fieldCache.put(field, matches);
808812

809813
if (matches) {

metafix/src/test/java/org/metafacture/metafix/HashValueTest.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616

1717
package org.metafacture.metafix;
1818

19+
import org.metafacture.commons.tries.SimpleRegexTrie;
20+
1921
import nl.jqno.equalsverifier.EqualsVerifier;
2022
import org.junit.jupiter.api.Assertions;
2123
import org.junit.jupiter.api.Test;
@@ -42,6 +44,8 @@ public HashValueTest() {
4244
public void shouldSatisfyEqualsContract() {
4345
EqualsVerifier.forClass(Value.Hash.class)
4446
.withPrefabValues(Value.class, Value.newArray(), Value.newHash())
47+
.withPrefabValues(SimpleRegexTrie.class, new SimpleRegexTrie<String>(), new SimpleRegexTrie<String>())
48+
.withIgnoredFields("patternMatcher", "prefixCache", "trie", "trieCache")
4549
.verify();
4650
}
4751

0 commit comments

Comments
 (0)