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

mariofusco pushed a commit to branch dev-new-parser
in repository https://gitbox.apache.org/repos/asf/incubator-kie-drools.git

commit 7f1f8b0a07bc0f8024c3ad6caec47d072647b35f
Author: Toshiya Kobayashi <[email protected]>
AuthorDate: Wed Apr 27 16:40:16 2022 +0900

    - Added DRLParserWrapper to store errors using DRLErrorListener (#5)
    
    - Added MiscDRLParserTest which is being ported from RuleParserTest to 
enhance coverage.
---
 drools-drl/drools-drl10-parser/pom.xml             |  6 +++
 .../java/org/drools/parser/DRLErrorListener.java   | 28 +++++++++++
 .../java/org/drools/parser/DRLParserError.java     | 54 ++++++++++++++++++++++
 .../java/org/drools/parser/DRLParserWrapper.java   | 45 ++++++++++++++++++
 .../java/org/drools/parser/MiscDRLParserTest.java  | 51 ++++++++++++++++++++
 .../src/test/resources/logback-test.xml            | 16 +++++++
 6 files changed, 200 insertions(+)

diff --git a/drools-drl/drools-drl10-parser/pom.xml 
b/drools-drl/drools-drl10-parser/pom.xml
index 2b88baa153..599ec8ab07 100644
--- a/drools-drl/drools-drl10-parser/pom.xml
+++ b/drools-drl/drools-drl10-parser/pom.xml
@@ -47,6 +47,12 @@
       <version>${version.junit}</version>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>ch.qos.logback</groupId>
+      <artifactId>logback-classic</artifactId>
+      <version>${version.ch.qos.logback}</version>
+      <scope>test</scope>
+    </dependency>
   </dependencies>
 
   <build>
diff --git 
a/drools-drl/drools-drl10-parser/src/main/java/org/drools/parser/DRLErrorListener.java
 
b/drools-drl/drools-drl10-parser/src/main/java/org/drools/parser/DRLErrorListener.java
new file mode 100644
index 0000000000..a15d12addd
--- /dev/null
+++ 
b/drools-drl/drools-drl10-parser/src/main/java/org/drools/parser/DRLErrorListener.java
@@ -0,0 +1,28 @@
+package org.drools.parser;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.antlr.v4.runtime.BaseErrorListener;
+import org.antlr.v4.runtime.RecognitionException;
+import org.antlr.v4.runtime.Recognizer;
+
+public class DRLErrorListener extends BaseErrorListener {
+
+    private final List<DRLParserError> errors = new ArrayList<>();
+
+    public List<DRLParserError> getErrors() {
+        return errors;
+    }
+
+    @Override
+    public void syntaxError(Recognizer<?, ?> recognizer,
+                            Object offendingSymbol,
+                            int line,
+                            int charPositionInLine,
+                            String msg,
+                            RecognitionException e) {
+
+        errors.add(new DRLParserError(line, charPositionInLine, msg));
+    }
+}
diff --git 
a/drools-drl/drools-drl10-parser/src/main/java/org/drools/parser/DRLParserError.java
 
b/drools-drl/drools-drl10-parser/src/main/java/org/drools/parser/DRLParserError.java
new file mode 100644
index 0000000000..6b9fe11694
--- /dev/null
+++ 
b/drools-drl/drools-drl10-parser/src/main/java/org/drools/parser/DRLParserError.java
@@ -0,0 +1,54 @@
+package org.drools.parser;
+
+public class DRLParserError {
+
+    private int lineNumber;
+    private int column;
+    private String message;
+
+    private Exception exception;
+
+    public DRLParserError(int lineNumber, int column, String message) {
+        this.lineNumber = lineNumber;
+        this.column = column;
+        this.message = message;
+    }
+
+    public DRLParserError(Exception exception) {
+        this.exception = exception;
+    }
+
+    public int getLineNumber() {
+        return lineNumber;
+    }
+
+    public void setLineNumber(int lineNumber) {
+        this.lineNumber = lineNumber;
+    }
+
+    public int getColumn() {
+        return column;
+    }
+
+    public void setColumn(int column) {
+        this.column = column;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+
+    @Override
+    public String toString() {
+        return "DRLParserError{" +
+                "lineNumber=" + lineNumber +
+                ", column=" + column +
+                ", message='" + message + '\'' +
+                ", exception=" + exception +
+                '}';
+    }
+}
diff --git 
a/drools-drl/drools-drl10-parser/src/main/java/org/drools/parser/DRLParserWrapper.java
 
b/drools-drl/drools-drl10-parser/src/main/java/org/drools/parser/DRLParserWrapper.java
new file mode 100644
index 0000000000..4b948cffca
--- /dev/null
+++ 
b/drools-drl/drools-drl10-parser/src/main/java/org/drools/parser/DRLParserWrapper.java
@@ -0,0 +1,45 @@
+package org.drools.parser;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.antlr.v4.runtime.tree.ParseTree;
+import org.drools.drl.ast.descr.PackageDescr;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class DRLParserWrapper {
+
+    private static final Logger LOGGER = 
LoggerFactory.getLogger(DRLParserWrapper.class);
+
+    private final List<DRLParserError> errors = new ArrayList<>();
+
+    public DRLParserWrapper() {
+    }
+
+    public PackageDescr parse(String drl) {
+        DRLParser drlParser = DRLParserHelper.createDrlParser(drl);
+        DRLErrorListener errorListener = new DRLErrorListener();
+        drlParser.addErrorListener(errorListener);
+
+        ParseTree parseTree = drlParser.compilationUnit();
+
+        errors.addAll(errorListener.getErrors());
+
+        try {
+            return DRLParserHelper.parseTree2PackageDescr(parseTree);
+        } catch (Exception e) {
+            LOGGER.error("Exception while creating PackageDescr", e);
+            errors.add(new DRLParserError(e));
+            return null;
+        }
+    }
+
+    public List<DRLParserError> getErrors() {
+        return errors;
+    }
+
+    public boolean hasErrors() {
+        return !errors.isEmpty();
+    }
+}
diff --git 
a/drools-drl/drools-drl10-parser/src/test/java/org/drools/parser/MiscDRLParserTest.java
 
b/drools-drl/drools-drl10-parser/src/test/java/org/drools/parser/MiscDRLParserTest.java
new file mode 100644
index 0000000000..9a6b31f2b7
--- /dev/null
+++ 
b/drools-drl/drools-drl10-parser/src/test/java/org/drools/parser/MiscDRLParserTest.java
@@ -0,0 +1,51 @@
+package org.drools.parser;
+
+import junit.framework.TestCase;
+import org.drools.drl.ast.descr.PackageDescr;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+/*
+ * This test class is being ported from 
org.drools.mvel.compiler.lang.RuleParserTest
+ */
+public class MiscDRLParserTest extends TestCase {
+
+    private DRLParserWrapper parser;
+
+    @Before
+    protected void setUp() throws Exception {
+        super.setUp();
+        parser = new DRLParserWrapper();
+    }
+
+    @After
+    protected void tearDown() throws Exception {
+        super.tearDown();
+    }
+
+    @Test
+    public void testPackage() throws Exception {
+        final String source = "package foo.bar.baz";
+        final PackageDescr pkg = parser.parse(source);
+        assertEquals("foo.bar.baz", pkg.getName());
+    }
+
+    @Test
+    public void testPackageWithErrorNode() throws Exception {
+        final String source = "package 12 foo.bar.baz";
+        final PackageDescr pkg = parser.parse(source);
+        assertTrue(parser.hasErrors());
+        // getText() combines an ErrorNode "12" so the result is different 
from DRL6Parser.
+        assertEquals("12foo.bar.baz", pkg.getName());
+    }
+
+    @Test
+    public void testPackageWithAllErrorNode() throws Exception {
+        final String source = "package 12 12312 231";
+        final PackageDescr pkg = parser.parse(source);
+        assertTrue(parser.hasErrors());
+        // NPE inside DRLVisitorImpl.visitIdentifier(). So pkg is null. 
Different from DRL6Parser.
+        assertNull(pkg);
+    }
+}
diff --git a/drools-drl/drools-drl10-parser/src/test/resources/logback-test.xml 
b/drools-drl/drools-drl10-parser/src/test/resources/logback-test.xml
new file mode 100644
index 0000000000..7740901e7d
--- /dev/null
+++ b/drools-drl/drools-drl10-parser/src/test/resources/logback-test.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration>
+
+  <appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
+    <encoder>
+      <pattern>%date{HH:mm:ss.SSS} [%thread] %-5level %class{36}.%method:%line 
- %msg%n</pattern>
+    </encoder>
+  </appender>
+
+  <logger name="org.kie" level="warn"/>
+  <logger name="org.drools" level="warn"/>
+
+  <root level="warn">
+    <appender-ref ref="consoleAppender" />
+  </root>
+</configuration>
\ No newline at end of file


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to