BUG-8043: eliminate ConstraintFactory
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / stmt / rfc6020 / YangStatementSourceImpl.java
index fbaa1f83a6e1a96abd5522995da54690c4ab1932..8463c816ad6d99f62e4b466750aba34ca4d4b321 100644 (file)
@@ -8,28 +8,18 @@
 
 package org.opendaylight.yangtools.yang.parser.stmt.rfc6020;
 
-import com.google.common.base.Preconditions;
 import com.google.common.base.Throwables;
-import com.google.common.collect.ImmutableList;
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
 import java.net.URISyntaxException;
-import org.antlr.v4.runtime.ANTLRInputStream;
-import org.antlr.v4.runtime.CommonTokenStream;
-import org.antlr.v4.runtime.ParserRuleContext;
-import org.antlr.v4.runtime.tree.ErrorNode;
-import org.antlr.v4.runtime.tree.ParseTreeListener;
 import org.antlr.v4.runtime.tree.ParseTreeWalker;
-import org.antlr.v4.runtime.tree.TerminalNode;
-import org.opendaylight.yangtools.antlrv4.code.gen.YangStatementLexer;
-import org.opendaylight.yangtools.antlrv4.code.gen.YangStatementParser;
 import org.opendaylight.yangtools.antlrv4.code.gen.YangStatementParser.StatementContext;
+import org.opendaylight.yangtools.yang.common.YangVersion;
 import org.opendaylight.yangtools.yang.model.parser.api.YangSyntaxErrorException;
 import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier;
-import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource;
 import org.opendaylight.yangtools.yang.parser.impl.YangStatementParserListenerImpl;
-import org.opendaylight.yangtools.yang.parser.rfc6020.repo.YangErrorListener;
+import org.opendaylight.yangtools.yang.parser.rfc6020.repo.YangStatementStreamSource;
 import org.opendaylight.yangtools.yang.parser.spi.source.PrefixToModule;
 import org.opendaylight.yangtools.yang.parser.spi.source.QNameToStatementDefinition;
 import org.opendaylight.yangtools.yang.parser.spi.source.StatementStreamSource;
@@ -38,48 +28,22 @@ import org.opendaylight.yangtools.yang.parser.util.NamedFileInputStream;
 import org.opendaylight.yangtools.yang.parser.util.NamedInputStream;
 
 /**
- * This class represents implementation of StatementStreamSource
- * in order to emit YANG statements using supplied StatementWriter.
+ * This class represents implementation of StatementStreamSource in order to emit YANG statements using supplied
+ * StatementWriter.
+ *
+ * @deprecated Use {@link YangStatementStreamSource} instead.
  */
+@Deprecated
 public final class YangStatementSourceImpl implements StatementStreamSource {
-    private static final ParseTreeListener MAKE_IMMUTABLE_LISTENER = new ParseTreeListener() {
-        @Override
-        public void enterEveryRule(final ParserRuleContext ctx) {
-            // No-op
-        }
-
-        @Override
-        public void exitEveryRule(final ParserRuleContext ctx) {
-            ctx.children = ctx.children == null ? ImmutableList.of() : ImmutableList.copyOf(ctx.children);
-        }
-
-        @Override
-        public void visitTerminal(final TerminalNode node) {
-            // No-op
-        }
-
-        @Override
-        public void visitErrorNode(final ErrorNode node) {
-            // No-op
-        }
-    };
-
     private final YangStatementParserListenerImpl yangStatementModelParser;
     private final StatementContext statementContext;
     private final String sourceName;
 
-    private YangStatementSourceImpl(final YangStatementParserListenerImpl parser, final StatementContext context,
-            final String sourceName) {
-        this.yangStatementModelParser = Preconditions.checkNotNull(parser);
-        this.statementContext = Preconditions.checkNotNull(context);
-        this.sourceName = sourceName;
-    }
-
     public YangStatementSourceImpl(final String fileName, final boolean isAbsolute) {
         try {
             final NamedFileInputStream is = loadFile(fileName, isAbsolute);
             sourceName = is.toString();
-            statementContext = parseYangSource(is);
+            statementContext = YangStatementStreamSource.parseYangSource(is);
             yangStatementModelParser = new YangStatementParserListenerImpl(sourceName);
         } catch (IOException | URISyntaxException | YangSyntaxErrorException e) {
             throw Throwables.propagate(e);
@@ -89,7 +53,7 @@ public final class YangStatementSourceImpl implements StatementStreamSource {
     public YangStatementSourceImpl(final InputStream inputStream) {
         try {
             sourceName = inputStream instanceof NamedInputStream ? inputStream.toString() : null;
-            statementContext = parseYangSource(inputStream);
+            statementContext = YangStatementStreamSource.parseYangSource(inputStream);
             yangStatementModelParser = new YangStatementParserListenerImpl(sourceName);
         } catch (IOException | YangSyntaxErrorException e) {
             throw Throwables.propagate(e);
@@ -102,19 +66,6 @@ public final class YangStatementSourceImpl implements StatementStreamSource {
         yangStatementModelParser = new YangStatementParserListenerImpl(sourceName);
     }
 
-    public static YangStatementSourceImpl create(final YangTextSchemaSource source) throws IOException,
-            YangSyntaxErrorException {
-        final StatementContext context;
-        try (final InputStream stream = source.openStream()) {
-            context = parseYangSource(source.openStream());
-        }
-
-        final String sourceName = source.getSymbolicName().orElse(null);
-        final YangStatementParserListenerImpl parser = new YangStatementParserListenerImpl(sourceName);
-
-        return new YangStatementSourceImpl(parser, context, sourceName);
-    }
-
     @Override
     public void writePreLinkage(final StatementWriter writer, final QNameToStatementDefinition stmtDef) {
         yangStatementModelParser.setAttributes(writer, stmtDef);
@@ -124,21 +75,39 @@ public final class YangStatementSourceImpl implements StatementStreamSource {
     @Override
     public void writeLinkage(final StatementWriter writer, final QNameToStatementDefinition stmtDef,
             final PrefixToModule preLinkagePrefixes) {
-        yangStatementModelParser.setAttributes(writer, stmtDef, preLinkagePrefixes);
+        writeLinkage(writer, stmtDef, preLinkagePrefixes, YangVersion.VERSION_1);
+    }
+
+    @Override
+    public void writeLinkage(final StatementWriter writer, final QNameToStatementDefinition stmtDef,
+            final PrefixToModule preLinkagePrefixes, final YangVersion yangVersion) {
+        yangStatementModelParser.setAttributes(writer, stmtDef, preLinkagePrefixes, yangVersion);
         ParseTreeWalker.DEFAULT.walk(yangStatementModelParser, statementContext);
     }
 
     @Override
     public void writeLinkageAndStatementDefinitions(final StatementWriter writer,
             final QNameToStatementDefinition stmtDef, final PrefixToModule prefixes) {
-        yangStatementModelParser.setAttributes(writer, stmtDef, prefixes);
+        writeLinkageAndStatementDefinitions(writer, stmtDef, prefixes, YangVersion.VERSION_1);
+    }
+
+    @Override
+    public void writeLinkageAndStatementDefinitions(final StatementWriter writer,
+            final QNameToStatementDefinition stmtDef, final PrefixToModule prefixes, final YangVersion yangVersion) {
+        yangStatementModelParser.setAttributes(writer, stmtDef, prefixes, yangVersion);
         ParseTreeWalker.DEFAULT.walk(yangStatementModelParser, statementContext);
     }
 
     @Override
     public void writeFull(final StatementWriter writer, final QNameToStatementDefinition stmtDef,
             final PrefixToModule prefixes) {
-        yangStatementModelParser.setAttributes(writer, stmtDef, prefixes);
+        writeFull(writer, stmtDef, prefixes, YangVersion.VERSION_1);
+    }
+
+    @Override
+    public void writeFull(final StatementWriter writer, final QNameToStatementDefinition stmtDef,
+            final PrefixToModule prefixes, final YangVersion yangVersion) {
+        yangStatementModelParser.setAttributes(writer, stmtDef, prefixes, yangVersion);
         ParseTreeWalker.DEFAULT.walk(yangStatementModelParser, statementContext);
     }
 
@@ -149,28 +118,6 @@ public final class YangStatementSourceImpl implements StatementStreamSource {
                 : new NamedFileInputStream(new File(getClass().getResource(fileName).toURI()), fileName);
     }
 
-    private static StatementContext parseYangSource(final InputStream stream) throws IOException,
-            YangSyntaxErrorException {
-        final YangStatementLexer lexer = new YangStatementLexer(new ANTLRInputStream(stream));
-        final CommonTokenStream tokens = new CommonTokenStream(lexer);
-        final YangStatementParser parser = new YangStatementParser(tokens);
-        //disconnect from console error output
-        parser.removeErrorListeners();
-
-        final YangErrorListener errorListener = new YangErrorListener();
-        parser.addErrorListener(errorListener);
-
-        final StatementContext result = parser.statement();
-        errorListener.validate();
-
-        // Walk the resulting tree and replace each children with an immutable list, lowering memory requirements
-        // and making sure the resulting tree will not get accidentally modified. An alternative would be to use
-        // org.antlr.v4.runtime.Parser.TrimToSizeListener, but that does not make the tree immutable.
-        ParseTreeWalker.DEFAULT.walk(MAKE_IMMUTABLE_LISTENER, result);
-
-        return result;
-    }
-
     public StatementContext getYangAST() {
         return statementContext;
     }