Skip to content

Commit 1fc8bd7

Browse files
committed
Grok Compiler: Abort when unable to find definition for rule
1 parent 6d424e2 commit 1fc8bd7

File tree

2 files changed

+38
-3
lines changed

2 files changed

+38
-3
lines changed

src/main/java/io/thekraken/grok/api/Grok.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
*******************************************************************************/
1616
package io.thekraken.grok.api;
1717

18+
import static java.lang.String.format;
19+
1820
import java.io.BufferedReader;
1921
import java.io.File;
2022
import java.io.FileNotFoundException;
@@ -367,14 +369,19 @@ public void compile(String pattern, boolean namedOnly) throws GrokException {
367369
addPattern(group.get("pattern"), group.get("definition"));
368370
group.put("name", group.get("name") + "=" + group.get("definition"));
369371
} catch (GrokException e) {
370-
// Log the exeception
372+
throw new RuntimeException(e);
371373
}
372374
}
373375
int count = StringUtils.countMatches(namedRegex, "%{" + group.get("name") + "}");
374376
for (int i = 0; i < count; i++) {
375-
String replacement = String.format("(?<name%d>%s)", index, grokPatternDefinition.get(group.get("pattern")));
377+
String definitionOfPattern = grokPatternDefinition.get(group.get("pattern"));
378+
if (definitionOfPattern == null) {
379+
throw new GrokException(format("No definition for key '%s' found, aborting",
380+
group.get("pattern")));
381+
}
382+
String replacement = String.format("(?<name%d>%s)", index, definitionOfPattern);
376383
if (namedOnly && group.get("subname") == null) {
377-
replacement = grokPatternDefinition.get(group.get("pattern"));
384+
replacement = definitionOfPattern;
378385
}
379386
namedRegexCollection.put("name" + index,
380387
(group.get("subname") != null ? group.get("subname") : group.get("name")));

src/test/java/io/thekraken/grok/api/GrokTest.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import java.io.FileReader;
1010
import java.util.*;
1111

12+
import static org.hamcrest.CoreMatchers.containsString;
1213
import static org.junit.Assert.*;
1314

1415

@@ -525,15 +526,42 @@ public void test017_nonMachingList() throws GrokException {
525526
@Test
526527
public void test021_postfix_patterns() throws Throwable {
527528
final Grok grok = Grok.create("patterns/postfix");
529+
grok.addPatternFromFile("patterns/patterns");
528530
grok.compile("%{POSTFIX_SMTPD}", false);
529531

530532
assertTrue(grok.getPatterns().containsKey("POSTFIX_SMTPD"));
531533
}
532534
@Test
533535
public void test022_postfix_patterns_with_named_captures_only() throws Throwable {
534536
final Grok grok = Grok.create("patterns/postfix");
537+
grok.addPatternFromFile("patterns/patterns");
535538
grok.compile("%{POSTFIX_SMTPD}", true);
536539

537540
assertTrue(grok.getPatterns().containsKey("POSTFIX_SMTPD"));
538541
}
542+
543+
@Test
544+
public void test023_named_captures_with_missing_definition() throws Throwable {
545+
546+
ensureAbortsWithDefinitionMissing("FOO %{BAR}", "%{FOO}", true);
547+
}
548+
@Test
549+
public void test024_named_captures_with_missing_definition() throws Throwable {
550+
ensureAbortsWithDefinitionMissing("FOO %{BAR}", "%{FOO:name}", false);
551+
552+
}
553+
@Test
554+
public void test025_captures_with_missing_definition() throws Throwable {
555+
ensureAbortsWithDefinitionMissing("FOO %{BAR}", "%{FOO}", false);
556+
}
557+
558+
private void ensureAbortsWithDefinitionMissing(String pattern, String compilePattern, boolean namedOnly) {
559+
try {
560+
final Grok grok = Grok.create(ResourceManager.PATTERNS, pattern);
561+
grok.compile(compilePattern, namedOnly);
562+
fail("should abort due to missing definition");
563+
} catch (GrokException e) {
564+
assertThat(e.getMessage(), containsString("No definition for key"));
565+
}
566+
}
539567
}

0 commit comments

Comments
 (0)