This is an automated email from the ASF dual-hosted git repository.

sgoeschl pushed a commit to branch FREEMARKER-181
in repository https://gitbox.apache.org/repos/asf/freemarker-generator.git


The following commit(s) were added to refs/heads/FREEMARKER-181 by this push:
     new 3b4077b  FREEMARKER-181 Support custom pattern definitions for Grok 
tool
3b4077b is described below

commit 3b4077bf8bd074d9e705b1966dcb2bf6862af1b5
Author: Siegfried Goeschl <[email protected]>
AuthorDate: Mon May 24 12:54:08 2021 +0200

    FREEMARKER-181 Support custom pattern definitions for Grok tool
---
 .../templates/accesslog/combined-access.ftl        |  4 +-
 .../templates/logs/csv/serverlog-to-csv.ftl        |  4 +-
 .../site/markdown/cli/usage/parsing-with-grok.md   |  8 +--
 .../freemarker/generator/cli/ExamplesTest.java     |  1 +
 .../freemarker/generator/tools/grok/GrokTool.java  | 57 +++++++++-------------
 .../generator/tools/grok/impl/GrokWrapper.java     | 45 -----------------
 .../generator/tools/grok/GrokToolTest.java         | 12 +++--
 pom.xml                                            |  1 +
 8 files changed, 40 insertions(+), 92 deletions(-)

diff --git 
a/freemarker-generator-cli/src/app/examples/templates/accesslog/combined-access.ftl
 
b/freemarker-generator-cli/src/app/examples/templates/accesslog/combined-access.ftl
index af78768..944a826 100644
--- 
a/freemarker-generator-cli/src/app/examples/templates/accesslog/combined-access.ftl
+++ 
b/freemarker-generator-cli/src/app/examples/templates/accesslog/combined-access.ftl
@@ -15,14 +15,14 @@
   specific language governing permissions and limitations
   under the License.
 -->
-<#assign grok = tools.grok.compile("%{COMBINEDAPACHELOG}")>
+<#assign grok = tools.grok.create("%{COMBINEDAPACHELOG}")>
 <#assign dataSource = dataSources?values[0]>
 <#assign lines = dataSource.getLineIterator()>
 
 <#compress>
     TIMESTAMP;VERB;REQUEST;HTTPVERSION
     <#list lines as line>
-        <#assign parts = grok.match(line)>
+        <#assign parts = grok.match(line).capture()>
         <#assign timestamp = parts.timestamp>
         <#assign verb = parts.verb>
         <#assign request = parts.request>
diff --git 
a/freemarker-generator-cli/src/app/examples/templates/logs/csv/serverlog-to-csv.ftl
 
b/freemarker-generator-cli/src/app/examples/templates/logs/csv/serverlog-to-csv.ftl
index bccad9a..544975f 100644
--- 
a/freemarker-generator-cli/src/app/examples/templates/logs/csv/serverlog-to-csv.ftl
+++ 
b/freemarker-generator-cli/src/app/examples/templates/logs/csv/serverlog-to-csv.ftl
@@ -29,7 +29,7 @@
 }>
 
 <#-- Instantiante the grok tool -->
-<#assign grok = tools.grok.compile("%{MY_SERVERLOG}", patternDefinitions)>
+<#assign grok = tools.grok.create("%{MY_SERVERLOG}", patternDefinitions)>
 
 <#-- Iterate over all data sources and convert matching lines to CSV output -->
 <#compress>
@@ -37,7 +37,7 @@
     <#if dataSources?has_content>
         <#list dataSources?values as dataSource>
             <#list dataSource.getLineIterator() as line>
-                <#assign parts = grok.match(line)>
+                <#assign parts = grok.match(line).capture()>
                 <#if parts?has_content>
                     <#-- Skip all response times less than 5 ms because these 
are boring pings -->
                     <#if parts.response_time?number gt 5>
diff --git 
a/freemarker-generator-cli/src/site/markdown/cli/usage/parsing-with-grok.md 
b/freemarker-generator-cli/src/site/markdown/cli/usage/parsing-with-grok.md
index 7e974b5..5cbadda 100644
--- a/freemarker-generator-cli/src/site/markdown/cli/usage/parsing-with-grok.md
+++ b/freemarker-generator-cli/src/site/markdown/cli/usage/parsing-with-grok.md
@@ -32,14 +32,14 @@ using the following FreeMarker template
 
 ```text
 <#ftl output_format="plainText" strip_whitespace=true>
-<#assign grok = tools.grok.compile("%{COMBINEDAPACHELOG}")>
+<#assign grok = tools.grok.create("%{COMBINEDAPACHELOG}")>
 <#assign dataSource = dataSources?values[0]>
 <#assign lines = dataSource.getLineIterator()>
 
 <#compress>
     TIMESTAMP;VERB;REQUEST;HTTPVERSION
     <#list lines as line>
-        <#assign parts = grok.match(line)>
+        <#assign parts = grok.match(line).capture()>
         <#assign timestamp = parts["timestamp"]>
         <#assign verb = parts["verb"]>
         <#assign request = parts["request"]>
@@ -87,7 +87,7 @@ In technical terms the FTL
 }>
 
 <#-- Instantiante the grok tool -->
-<#assign grok = tools.grok.compile("%{MY_SERVERLOG}", patternDefinitions)>
+<#assign grok = tools.grok.create("%{MY_SERVERLOG}", patternDefinitions)>
 
 <#-- Iterate over all data sources and convert matching lines to CSV output -->
 <#compress>
@@ -95,7 +95,7 @@ In technical terms the FTL
     <#if dataSources?has_content>
         <#list dataSources?values as dataSource>
             <#list dataSource.getLineIterator() as line>
-                <#assign parts = grok.match(line)>
+                <#assign parts = grok.match(line).capture()>
                 <#if parts?has_content>
                     <#-- Skip all response times less than 5 ms because these 
are boring pings -->
                     <#if parts.response_time?number gt 5>
diff --git 
a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ExamplesTest.java
 
b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ExamplesTest.java
index 88067b2..49e536f 100644
--- 
a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ExamplesTest.java
+++ 
b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ExamplesTest.java
@@ -105,6 +105,7 @@ public class ExamplesTest extends AbstractMainTest {
     @Test
     public void shouldRunGrokExamples() throws IOException {
         assertValid(execute("-t 
src/app/examples/templates/accesslog/combined-access.ftl 
src/app/examples/data/accesslog/combined-access.log"));
+        assertValid(execute("-t 
src/app/examples/templates/logs/csv/serverlog-to-csv.ftl 
src/app/examples/data/logs/server.01.log"));
     }
 
     @Test
diff --git 
a/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/grok/GrokTool.java
 
b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/grok/GrokTool.java
index 207c54d..5f3a485 100644
--- 
a/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/grok/GrokTool.java
+++ 
b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/grok/GrokTool.java
@@ -18,8 +18,9 @@ package org.apache.freemarker.generator.tools.grok;
 
 import io.krakens.grok.api.Grok;
 import io.krakens.grok.api.GrokCompiler;
-import org.apache.freemarker.generator.tools.grok.impl.GrokWrapper;
+import org.apache.freemarker.generator.base.util.Validate;
 
+import java.util.HashMap;
 import java.util.Map;
 
 public class GrokTool {
@@ -27,54 +28,42 @@ public class GrokTool {
     private static final String DEFAULT_PATTERN_FILE = "/patterns/patterns";
 
     /**
-     * Compile the Grok pattern.
+     * Create a default Grok instance using the the default pattern files 
loaded
+     * from the classpath.
      *
      * @param pattern Grok pattern to compile
-     * @return Grok wrapper
+     * @return Grok object
      */
-    public GrokWrapper compile(String pattern) {
-        return compile(DEFAULT_PATTERN_FILE, pattern);
+    public Grok create(String pattern) {
+        return create(pattern, new HashMap<>());
     }
 
     /**
-     * Compile the Grok pattern.
+     * Get a default Grok instance using the the default pattern files loaded
+     * from the classpath.
      *
      * @param pattern            Grok pattern to compile
      * @param patternDefinitions custom patterns to be registered
-     * @return Grok wrapper
+     * @return Grok object
      */
-    public GrokWrapper compile(String pattern, Map<String, String> 
patternDefinitions) {
-        return compile(DEFAULT_PATTERN_FILE, pattern, patternDefinitions);
+    public Grok create(String pattern, Map<String, String> patternDefinitions) 
{
+        Validate.notEmpty(pattern, "Grok pattern to compile is empty");
+        final GrokCompiler grokCompiler = grokCompiler();
+        grokCompiler.registerPatternFromClasspath(DEFAULT_PATTERN_FILE);
+        if (patternDefinitions != null) {
+            grokCompiler.register(patternDefinitions);
+        }
+        return grokCompiler.compile(pattern);
     }
 
     /**
-     * Compile the Grok pattern.
+     * Create a new Grok compiler instance. This is just
+     * a convinience method if the caller requires full control.
      *
-     * @param path    classpath file for default patterns to register
-     * @param pattern Grok pattern to compile
-     * @return Grok wrapper
-     */
-    public GrokWrapper compile(String path, String pattern) {
-        final GrokCompiler grokCompiler = GrokCompiler.newInstance();
-        grokCompiler.registerPatternFromClasspath(path);
-        final Grok grok = grokCompiler.compile(pattern);
-        return new GrokWrapper(grok);
-    }
-
-    /**
-     * Compile the Grok pattern.
-     *
-     * @param path               classpath file for default patterns to 
register
-     * @param pattern            Grok pattern to compile
-     * @param patternDefinitions custom patterns to be registered
-     * @return Grok wrapper
+     * @return Grok compiler
      */
-    public GrokWrapper compile(String path, String pattern, Map<String, 
String> patternDefinitions) {
-        final GrokCompiler grokCompiler = GrokCompiler.newInstance();
-        grokCompiler.registerPatternFromClasspath(path);
-        grokCompiler.register(patternDefinitions);
-        final Grok grok = grokCompiler.compile(pattern);
-        return new GrokWrapper(grok);
+    public GrokCompiler grokCompiler() {
+        return GrokCompiler.newInstance();
     }
 
     @Override
diff --git 
a/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/grok/impl/GrokWrapper.java
 
b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/grok/impl/GrokWrapper.java
deleted file mode 100644
index 0589469..0000000
--- 
a/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/grok/impl/GrokWrapper.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.freemarker.generator.tools.grok.impl;
-
-import io.krakens.grok.api.Grok;
-import org.apache.freemarker.generator.base.util.StringUtils;
-
-import java.util.Collections;
-import java.util.Map;
-
-import static java.util.Objects.requireNonNull;
-
-/**
- * Convenience wrapper around Grok instance.
- */
-public class GrokWrapper {
-
-    private final Grok grok;
-
-    public GrokWrapper(Grok grok) {
-        this.grok = requireNonNull(grok);
-    }
-
-    public Map<String, Object> match(String line) {
-        if (StringUtils.isEmpty(line)) {
-            return Collections.emptyMap();
-        }
-
-        return grok.match(line).capture();
-    }
-}
diff --git 
a/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/grok/GrokToolTest.java
 
b/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/grok/GrokToolTest.java
index 816654b..ef24bf7 100644
--- 
a/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/grok/GrokToolTest.java
+++ 
b/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/grok/GrokToolTest.java
@@ -16,7 +16,8 @@
  */
 package org.apache.freemarker.generator.tools.grok;
 
-import org.apache.freemarker.generator.tools.grok.impl.GrokWrapper;
+import io.krakens.grok.api.Grok;
+import io.krakens.grok.api.Match;
 import org.junit.Test;
 
 import java.util.Map;
@@ -30,9 +31,10 @@ public class GrokToolTest {
     @Test
     public void shallParseCombinedAccessLog() {
         final String line = "112.169.19.192 - - [06/Mar/2013:01:36:30 +0900] 
\"GET / HTTP/1.1\" 200 44346 \"-\" \"Mozilla/5.0 (Macintosh; Intel Mac OS X 
10_8_2) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.152 
Safari/537.22\"";
-        final GrokWrapper grok = grokTool().compile("%{COMBINEDAPACHELOG}");
+        final Grok grok = grokTool().create("%{COMBINEDAPACHELOG}");
 
-        final Map<String, Object> map = grok.match(line);
+        final Match match = grok.match(line);
+        final Map<String, Object> map = match.capture();
 
         assertEquals("GET", map.get("verb"));
         assertEquals("06/Mar/2013:01:36:30 +0900", map.get("timestamp"));
@@ -52,9 +54,9 @@ public class GrokToolTest {
                 { "MY_SERVERLOG", "%{MY_TIMESTAMP} 
%{LOGLEVEL}%{SPACE:UNWANTED}%{MY_MODULE} %{MY_THREAD} message response handled 
in: %{INT:response_time} ms; %{GREEDYDATA:UNWANTED}" },
         }).collect(Collectors.toMap(data -> data[0], data -> data[1]));
 
-        final GrokWrapper grok = grokTool().compile("%{MY_SERVERLOG}", 
patternDefinitions);
+        final Grok grok = grokTool().create("%{MY_SERVERLOG}", 
patternDefinitions);
 
-        final Map<String, Object> map = grok.match(line);
+        final Map<String, Object> map = grok.match(line).capture();
 
         assertEquals(16, map.size());
         assertEquals("2019-05-17", map.get("date"));
diff --git a/pom.xml b/pom.xml
index e0480b5..8a38d18 100644
--- a/pom.xml
+++ b/pom.xml
@@ -149,6 +149,7 @@
         </dependencies>
     </dependencyManagement>
     <build>
+        <defaultGoal>clean install</defaultGoal>
         <pluginManagement>
             <plugins>
                 <plugin>

Reply via email to