From 023c253c932da76d82864403f6c1cc1a92c83f00 Mon Sep 17 00:00:00 2001 From: robert-bor Date: Tue, 22 Sep 2015 20:14:48 +0200 Subject: [PATCH] Issue #16 #20 #21 adopted pull request from remen which makes sure the failure states are constructed as part of the trie construction. This prevents the NPE which the referenced issues are complaining about. --- src/main/java/org/ahocorasick/trie/Trie.java | 11 +++--- .../java/org/ahocorasick/trie/TrieTest.java | 36 ++++++++++--------- 2 files changed, 26 insertions(+), 21 deletions(-) diff --git a/src/main/java/org/ahocorasick/trie/Trie.java b/src/main/java/org/ahocorasick/trie/Trie.java index 3fa533d..0301e19 100644 --- a/src/main/java/org/ahocorasick/trie/Trie.java +++ b/src/main/java/org/ahocorasick/trie/Trie.java @@ -40,7 +40,7 @@ public class Trie { public Collection tokenize(String text) { - Collection tokens = new ArrayList(); + Collection tokens = new ArrayList<>(); Collection collectedEmits = parseText(text); int lastCollectedPosition = -1; @@ -86,8 +86,6 @@ public class Trie { } public void parseText(CharSequence text, EmitHandler emitHandler) { - checkForConstructedFailureStates(); - State currentState = this.rootState; for (int position = 0; position < text.length(); position++) { Character character = text.charAt(position); @@ -130,7 +128,7 @@ public class Trie { } private void constructFailureStates() { - Queue queue = new LinkedBlockingDeque(); + Queue queue = new LinkedBlockingDeque<>(); // First, set the fail state of all depth 1 states to the root state for (State depthOneState : this.rootState.getStates()) { @@ -201,6 +199,11 @@ public class Trie { return this; } + public TrieBuilder stopOnHit() { + trie.trieConfig.setStopOnHit(true); + return this; + } + public Trie build() { trie.constructFailureStates(); return trie; diff --git a/src/test/java/org/ahocorasick/trie/TrieTest.java b/src/test/java/org/ahocorasick/trie/TrieTest.java index 5665059..8bd4593 100644 --- a/src/test/java/org/ahocorasick/trie/TrieTest.java +++ b/src/test/java/org/ahocorasick/trie/TrieTest.java @@ -46,12 +46,13 @@ public class TrieTest { @Test public void ushersTestAndStopOnHit() { - Trie trie = new Trie(); - trie.addKeyword("hers"); - trie.addKeyword("his"); - trie.addKeyword("she"); - trie.addKeyword("he"); - trie.stopOnHit(); + Trie trie = Trie.builder() + .addKeyword("hers") + .addKeyword("his") + .addKeyword("she") + .addKeyword("he") + .stopOnHit() + .build(); Collection emits = trie.parseText("ushers"); assertEquals(2, emits.size()); // she @ 3, he @ 3, hers @ 5 Iterator iterator = emits.iterator(); @@ -62,11 +63,11 @@ public class TrieTest { @Test public void ushersTest() { Trie trie = Trie.builder() - .addKeyword("hers") - .addKeyword("his") - .addKeyword("she") - .addKeyword("he") - .build(); + .addKeyword("hers") + .addKeyword("his") + .addKeyword("she") + .addKeyword("he") + .build(); Collection emits = trie.parseText("ushers"); assertEquals(3, emits.size()); // she @ 3, he @ 3, hers @ 5 Iterator iterator = emits.iterator(); @@ -77,11 +78,12 @@ public class TrieTest { @Test public void ushersTestByCallback() { - Trie trie = new Trie(); - trie.addKeyword("hers"); - trie.addKeyword("his"); - trie.addKeyword("she"); - trie.addKeyword("he"); + Trie trie = Trie.builder() + .addKeyword("hers") + .addKeyword("his") + .addKeyword("she") + .addKeyword("he") + .build(); final List emits = new ArrayList<>(); EmitHandler emitHandler = new EmitHandler() { @@ -262,7 +264,7 @@ public class TrieTest { @Test public void unicodeIssueBug8ReportedByDwyerk() { String target = "LİKE THIS"; // The second character ('İ') is Unicode, which was read by AC as a 2-byte char - assertEquals("THIS", target.substring(5,9)); // Java does it the right way + assertEquals("THIS", target.substring(5, 9)); // Java does it the right way Trie trie = Trie.builder().caseInsensitive().onlyWholeWords() .addKeyword("this") .build();