Skip to content

Commit 59f711e

Browse files
committed
Grok Compiler: Abort when unable to find definition for rule
1 parent c199bd2 commit 59f711e

File tree

2 files changed

+43
-3
lines changed

2 files changed

+43
-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;
@@ -383,14 +385,19 @@ public void compile(String pattern, boolean namedOnly) throws GrokException {
383385
addPattern(group.get("pattern"), group.get("definition"));
384386
group.put("name", group.get("name") + "=" + group.get("definition"));
385387
} catch (GrokException e) {
386-
// Log the exeception
388+
throw new RuntimeException(e);
387389
}
388390
}
389391
int count = StringUtils.countMatches(namedRegex, "%{" + group.get("name") + "}");
390392
for (int i = 0; i < count; i++) {
391-
String replacement = String.format("(?<name%d>%s)", index, grokPatternDefinition.get(group.get("pattern")));
393+
String definitionOfPattern = grokPatternDefinition.get(group.get("pattern"));
394+
if (definitionOfPattern == null) {
395+
throw new GrokException(format("No definition for key '%s' found, aborting",
396+
group.get("pattern")));
397+
}
398+
String replacement = String.format("(?<name%d>%s)", index, definitionOfPattern);
392399
if (namedOnly && group.get("subname") == null) {
393-
replacement = String.format("(?:%s)", grokPatternDefinition.get(group.get("pattern")));
400+
replacement = String.format("(?:%s)", definitionOfPattern);
394401
}
395402
namedRegexCollection.put("name" + index,
396403
(group.get("subname") != null ? group.get("subname") : group.get("name")));

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

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,12 @@
1818
import org.junit.Test;
1919
import org.junit.runners.MethodSorters;
2020

21+
import java.io.BufferedReader;
22+
import java.io.FileReader;
23+
import java.util.*;
24+
25+
import static org.hamcrest.CoreMatchers.containsString;
26+
import static org.junit.Assert.*;
2127
import io.thekraken.grok.api.exception.GrokException;
2228

2329

@@ -597,16 +603,43 @@ public void testDisablingAutomaticConversion() throws GrokException {
597603
@Test
598604
public void test020_postfix_patterns() throws Throwable {
599605
final Grok grok = Grok.create("patterns/postfix");
606+
grok.addPatternFromFile("patterns/patterns");
600607
grok.compile("%{POSTFIX_SMTPD}", false);
601608

602609
assertTrue(grok.getPatterns().containsKey("POSTFIX_SMTPD"));
603610
}
611+
604612
@Test
605613
public void test021_postfix_patterns_with_named_captures_only() throws Throwable {
606614
final Grok grok = Grok.create("patterns/postfix");
615+
grok.addPatternFromFile("patterns/patterns");
607616
grok.compile("%{POSTFIX_SMTPD}", true);
608617

609618
assertTrue(grok.getPatterns().containsKey("POSTFIX_SMTPD"));
610619
}
611620

621+
@Test
622+
public void test022_named_captures_with_missing_definition() throws Throwable {
623+
ensureAbortsWithDefinitionMissing("FOO %{BAR}", "%{FOO}", true);
624+
}
625+
626+
@Test
627+
public void test023_captures_with_missing_definition() throws Throwable {
628+
ensureAbortsWithDefinitionMissing("FOO %{BAR}", "%{FOO:name}", false);
629+
}
630+
631+
@Test
632+
public void test024_captures_with_missing_definition() throws Throwable {
633+
ensureAbortsWithDefinitionMissing("FOO %{BAR}", "%{FOO}", false);
634+
}
635+
636+
private void ensureAbortsWithDefinitionMissing(String pattern, String compilePattern, boolean namedOnly) {
637+
try {
638+
final Grok grok = Grok.create(ResourceManager.PATTERNS, pattern);
639+
grok.compile(compilePattern, namedOnly);
640+
fail("should abort due to missing definition");
641+
} catch (GrokException e) {
642+
assertThat(e.getMessage(), containsString("No definition for key"));
643+
}
644+
}
612645
}

0 commit comments

Comments
 (0)