Bug 4662: Introduce a SemanticVersion concept - import processing
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / stmt / rfc6020 / YinStatementSourceImpl.java
1 /*
2  * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8
9 package org.opendaylight.yangtools.yang.parser.stmt.rfc6020;
10
11 import com.google.common.base.Preconditions;
12 import com.google.common.io.ByteStreams;
13 import java.io.BufferedInputStream;
14 import java.io.ByteArrayInputStream;
15 import java.io.File;
16 import java.io.IOException;
17 import java.io.InputStream;
18 import java.net.URISyntaxException;
19 import javax.xml.stream.XMLInputFactory;
20 import javax.xml.stream.XMLStreamException;
21 import javax.xml.stream.XMLStreamReader;
22 import org.opendaylight.yangtools.yang.parser.impl.YinStatementParserImpl;
23 import org.opendaylight.yangtools.yang.parser.spi.source.PrefixToModule;
24 import org.opendaylight.yangtools.yang.parser.spi.source.QNameToStatementDefinition;
25 import org.opendaylight.yangtools.yang.parser.spi.source.StatementStreamSource;
26 import org.opendaylight.yangtools.yang.parser.spi.source.StatementWriter;
27 import org.opendaylight.yangtools.yang.parser.util.NamedFileInputStream;
28 import org.slf4j.Logger;
29 import org.slf4j.LoggerFactory;
30
31 /**
32  *
33  * This class represents implementation of StatementStreamSource
34  * in order to emit YIN statements using supplied StatementWriter
35  *
36  */
37 public class YinStatementSourceImpl implements StatementStreamSource {
38
39     private static final Logger LOG = LoggerFactory.getLogger(YinStatementSourceImpl.class);
40     private static XMLInputFactory xmlInputFactory = XMLInputFactory.newFactory();
41
42     private YinStatementParserImpl yinStatementModelParser;
43     private XMLStreamReader streamReader;
44     private InputStream inputStream;
45     private String fileName;
46     private boolean isAbsolute;
47
48     // FIXME IO exception: input stream closed when called from StmtTestUtils parserseYinSources method
49     public YinStatementSourceImpl(final InputStream inputStream) {
50         yinStatementModelParser = new YinStatementParserImpl(inputStream.toString());
51         this.inputStream = new BufferedInputStream(inputStream);
52         this.inputStream.mark(Integer.MAX_VALUE);
53     }
54
55     public YinStatementSourceImpl(final String fileName, final boolean isAbsolute) {
56         yinStatementModelParser = new YinStatementParserImpl(fileName);
57         this.fileName = Preconditions.checkNotNull(fileName);
58         this.isAbsolute = isAbsolute;
59     }
60
61     @Override
62     public void writePreLinkage(StatementWriter writer, QNameToStatementDefinition stmtDef) {
63         initializeReader();
64         yinStatementModelParser.setAttributes(writer, stmtDef);
65         yinStatementModelParser.walk(streamReader);
66     }
67
68     @Override
69     public void writeLinkage(StatementWriter writer, QNameToStatementDefinition stmtDef, final PrefixToModule preLinkagePrefixes) {
70         initializeReader();
71         yinStatementModelParser.setAttributes(writer, stmtDef, preLinkagePrefixes);
72         yinStatementModelParser.walk(streamReader);
73     }
74
75     @Override
76     public void writeLinkageAndStatementDefinitions(StatementWriter writer, QNameToStatementDefinition stmtDef,
77             PrefixToModule prefixes) {
78         initializeReader();
79         yinStatementModelParser.setAttributes(writer, stmtDef, prefixes);
80         yinStatementModelParser.walk(streamReader);
81     }
82
83     @Override
84     public void writeFull(StatementWriter writer, QNameToStatementDefinition stmtDef, PrefixToModule prefixes) {
85         initializeReader();
86         yinStatementModelParser.setAttributes(writer, stmtDef, prefixes);
87         yinStatementModelParser.walk(streamReader);
88         closeReader();
89     }
90
91     private void initializeReader() {
92         try {
93             if (fileName != null) {
94                 inputStream = loadFile(fileName, isAbsolute);
95                 streamReader = xmlInputFactory.createXMLStreamReader(inputStream);
96             } else {
97                 inputStream.reset();
98                 streamReader = xmlInputFactory.createXMLStreamReader(new ByteArrayInputStream(ByteStreams.toByteArray
99                         (inputStream)));
100             }
101         } catch (XMLStreamException e) {
102             LOG.warn("Error while creating XMLStreamReader from input stream", e);
103         } catch (URISyntaxException e) {
104             LOG.warn("File name {} cannot be parsed as URI reference", fileName, e);
105         } catch (IOException e) {
106             LOG.warn("File {} cannot be found or read into string ", fileName, e);
107         }
108     }
109
110     private void closeReader() {
111         try {
112             inputStream.close();
113             streamReader.close();
114         } catch (XMLStreamException e) {
115             LOG.warn("Error occured while freeing associated resources", e);
116         } catch (IOException e) {
117             LOG.warn("I/O error occured during closing the input stream", e);
118         }
119     }
120
121     private InputStream loadFile(final String fileName, boolean isAbsolute) throws URISyntaxException, IOException {
122         final File file;
123         if (isAbsolute) {
124             file = new File(fileName);
125         } else {
126             file = new File(getClass().getResource(fileName).toURI());
127         }
128
129         return new NamedFileInputStream(file, fileName);
130     }
131 }