Bug 2366 - Effective statements impl for new yang parser.
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / stmt / rfc6020 / YangStatementSourceImpl.java
1 package org.opendaylight.yangtools.yang.parser.stmt.rfc6020;
2
3 import org.antlr.v4.runtime.ANTLRInputStream;
4 import org.antlr.v4.runtime.CommonTokenStream;
5 import org.antlr.v4.runtime.tree.ParseTreeWalker;
6 import org.opendaylight.yangtools.antlrv4.code.gen.YangStatementLexer;
7 import org.opendaylight.yangtools.antlrv4.code.gen.YangStatementParser;
8 import org.opendaylight.yangtools.yang.model.api.meta.StatementSource;
9 import org.opendaylight.yangtools.yang.model.parser.api.YangSyntaxErrorException;
10 import org.opendaylight.yangtools.yang.parser.impl.YangStatementParserListenerImpl;
11 import org.opendaylight.yangtools.yang.parser.spi.source.PrefixToModule;
12 import org.opendaylight.yangtools.yang.parser.spi.source.QNameToStatementDefinition;
13 import org.opendaylight.yangtools.yang.parser.spi.source.SourceException;
14 import org.opendaylight.yangtools.yang.parser.spi.source.StatementSourceReference;
15 import org.opendaylight.yangtools.yang.parser.spi.source.StatementStreamSource;
16 import org.opendaylight.yangtools.yang.parser.spi.source.StatementWriter;
17
18 import java.io.File;
19 import java.io.FileInputStream;
20 import java.io.IOException;
21 import java.io.InputStream;
22
23 /**
24  *
25  * This class represents implementation of StatementStreamSource
26  * in order to emit YANG statements using supplied StatementWriter
27  *
28  */
29
30 public class YangStatementSourceImpl implements StatementStreamSource {
31
32     private YangStatementParserListenerImpl yangStatementModelParser;
33     private YangStatementParser.StatementContext statementContext;
34     private ParseTreeWalker walker;
35
36     public YangStatementSourceImpl(String fileName) {
37         try {
38             statementContext = parseYangSource(loadFile(fileName));
39             walker = new ParseTreeWalker();
40             yangStatementModelParser = new YangStatementParserListenerImpl(REF);
41         } catch (Exception e) {
42             e.printStackTrace();
43         }
44     }
45
46     private StatementSourceReference REF = new StatementSourceReference() {
47
48         @Override
49         public StatementSource getStatementSource() {
50             return StatementSource.DECLARATION;
51         }
52     };
53
54     @Override
55     public void writeLinkage(StatementWriter writer, QNameToStatementDefinition stmtDef) throws SourceException {
56         yangStatementModelParser.setAttributes(writer, stmtDef);
57         walker.walk(yangStatementModelParser, statementContext);
58     }
59
60     @Override
61     public void writeLinkageAndStatementDefinitions(StatementWriter writer, QNameToStatementDefinition stmtDef, PrefixToModule prefixes) throws SourceException {
62         yangStatementModelParser.setAttributes(writer, stmtDef, prefixes);
63         walker.walk(yangStatementModelParser, statementContext);
64     }
65
66     @Override
67     public void writeFull(StatementWriter writer, QNameToStatementDefinition stmtDef, PrefixToModule prefixes) throws SourceException {
68         yangStatementModelParser.setAttributes(writer, stmtDef, prefixes);
69         walker.walk(yangStatementModelParser, statementContext);
70     }
71
72     private FileInputStream loadFile(String fileName) throws Exception {
73         return new FileInputStream(new File(getClass().getResource(fileName).toURI()));
74     }
75
76     private YangStatementParser.StatementContext parseYangSource(final InputStream stream) throws IOException, YangSyntaxErrorException {
77         final YangStatementLexer lexer = new YangStatementLexer(new ANTLRInputStream(stream));
78         final CommonTokenStream tokens = new CommonTokenStream(lexer);
79         final YangStatementParser parser = new YangStatementParser(tokens);
80         final YangStatementParser.StatementContext result = parser.statement();
81         return result;
82     }
83 }