Promoted yang syntactic error handling. 06/1506/1
authorMartin Vitez <mvitez@cisco.com>
Mon, 30 Sep 2013 10:37:53 +0000 (12:37 +0200)
committerMartin Vitez <mvitez@cisco.com>
Mon, 30 Sep 2013 10:37:53 +0000 (12:37 +0200)
When antlr parser encounters syntactic error, it throws an exception instead of log.

Signed-off-by: Martin Vitez <mvitez@cisco.com>
code-generator/binding-generator-impl/src/test/resources/simple-bits-demo.yang
yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/impl/YangErrorListener.java

index d7e69d1c4e5093c2bac67cbd45108044534da2e9..160181bf56e94b931b8ae7882a8b0a0a40b27cd7 100644 (file)
@@ -36,7 +36,7 @@ module simple-bits-demo {
             bit eight-bit {
                 position 80;
             }       
-            
+        }
     }
 
     typedef jo {
index 2cb1b7be624800856ea4729f1aa7414ce6119619..16f6274bbdddfd2d8bec3758719991897f5f9bc6 100644 (file)
@@ -8,18 +8,38 @@
 package org.opendaylight.yangtools.yang.parser.impl;
 
 import org.antlr.v4.runtime.BaseErrorListener;
+import org.antlr.v4.runtime.Parser;
 import org.antlr.v4.runtime.RecognitionException;
 import org.antlr.v4.runtime.Recognizer;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.opendaylight.yangtools.yang.parser.util.YangParseException;
 
 final class YangErrorListener extends BaseErrorListener {
-    private static final Logger LOGGER = LoggerFactory.getLogger(YangErrorListener.class);
 
     @Override
     public void syntaxError(Recognizer<?, ?> recognizer, Object offendingSymbol, int line, int charPositionInLine,
             String msg, RecognitionException e) {
-        LOGGER.warn("line " + line + ":" + charPositionInLine + " " + msg);
+        String module = getModuleName(recognizer);
+        throw new YangParseException(module, line, msg);
+    }
+
+    private String getModuleName(Recognizer<?, ?> recognizer) {
+        String result;
+        if (recognizer instanceof Parser) {
+            try {
+                Parser parser = (Parser) recognizer;
+                String model = parser.getInputStream().getTokenSource().getInputStream().toString();
+                model = model.substring(0, model.indexOf("\n"));
+                model = model.substring(model.indexOf("module") + 6);
+                model = model.substring(0, model.indexOf("{"));
+                model = model.trim();
+                result = model;
+            } catch (Exception e) {
+                result = "";
+            }
+        } else {
+            result = "";
+        }
+        return result;
     }
 
 }