2 * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
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
9 package org.opendaylight.yangtools.yang.parser.stmt.rfc6020;
11 import com.google.common.base.Preconditions;
12 import com.google.common.io.ByteStreams;
13 import java.io.BufferedInputStream;
14 import java.io.ByteArrayInputStream;
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;
33 * This class represents implementation of StatementStreamSource
34 * in order to emit YIN statements using supplied StatementWriter
37 public class YinStatementSourceImpl implements StatementStreamSource {
39 private static final Logger LOG = LoggerFactory.getLogger(YinStatementSourceImpl.class);
40 private static XMLInputFactory xmlInputFactory = XMLInputFactory.newFactory();
42 private YinStatementParserImpl yinStatementModelParser;
43 private XMLStreamReader streamReader;
44 private InputStream inputStream;
45 private String fileName;
46 private boolean isAbsolute;
48 public YinStatementSourceImpl(final InputStream inputStream) {
49 yinStatementModelParser = new YinStatementParserImpl(inputStream.toString());
50 this.inputStream = new BufferedInputStream(inputStream);
51 this.inputStream.mark(Integer.MAX_VALUE);
54 public YinStatementSourceImpl(final String fileName, final boolean isAbsolute) {
55 yinStatementModelParser = new YinStatementParserImpl(fileName);
56 this.fileName = Preconditions.checkNotNull(fileName);
57 this.isAbsolute = isAbsolute;
61 public void writePreLinkage(StatementWriter writer, QNameToStatementDefinition stmtDef) {
63 yinStatementModelParser.setAttributes(writer, stmtDef);
64 yinStatementModelParser.walk(streamReader);
68 public void writeLinkage(StatementWriter writer, QNameToStatementDefinition stmtDef, final PrefixToModule preLinkagePrefixes) {
70 yinStatementModelParser.setAttributes(writer, stmtDef, preLinkagePrefixes);
71 yinStatementModelParser.walk(streamReader);
75 public void writeLinkageAndStatementDefinitions(StatementWriter writer, QNameToStatementDefinition stmtDef,
76 PrefixToModule prefixes) {
78 yinStatementModelParser.setAttributes(writer, stmtDef, prefixes);
79 yinStatementModelParser.walk(streamReader);
83 public void writeFull(StatementWriter writer, QNameToStatementDefinition stmtDef, PrefixToModule prefixes) {
85 yinStatementModelParser.setAttributes(writer, stmtDef, prefixes);
86 yinStatementModelParser.walk(streamReader);
90 private void initializeReader() {
92 if (fileName != null) {
93 inputStream = loadFile(fileName, isAbsolute);
94 streamReader = xmlInputFactory.createXMLStreamReader(inputStream);
97 streamReader = xmlInputFactory.createXMLStreamReader(new ByteArrayInputStream(ByteStreams.toByteArray
100 } catch (XMLStreamException e) {
101 LOG.warn("Error while creating XMLStreamReader from input stream", e);
102 } catch (URISyntaxException e) {
103 LOG.warn("File name {} cannot be parsed as URI reference", fileName, e);
104 } catch (IOException e) {
105 LOG.warn("File {} cannot be found or read into string ", fileName, e);
109 private void closeReader() {
112 streamReader.close();
113 } catch (XMLStreamException e) {
114 LOG.warn("Error occured while freeing associated resources", e);
115 } catch (IOException e) {
116 LOG.warn("I/O error occured during closing the input stream", e);
120 private InputStream loadFile(final String fileName, boolean isAbsolute) throws URISyntaxException, IOException {
123 file = new File(fileName);
125 file = new File(getClass().getResource(fileName).toURI());
128 return new NamedFileInputStream(file, fileName);