Remove EffectiveStatement namespaces
[yangtools.git] / model / yang-model-export / src / main / java / org / opendaylight / yangtools / yang / model / export / YinXMLEventReader.java
index 6395959c8fd7bc2f3531eae54d0ef09726d29f5a..6eeb2adc47dd04e41d66676e13d5a772ad2f6aae 100644 (file)
@@ -17,9 +17,7 @@ import java.util.ArrayDeque;
 import java.util.Arrays;
 import java.util.Deque;
 import java.util.Iterator;
-import java.util.Map.Entry;
 import java.util.NoSuchElementException;
-import java.util.Optional;
 import java.util.Queue;
 import javax.xml.XMLConstants;
 import javax.xml.stream.XMLEventFactory;
@@ -36,18 +34,10 @@ import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
 import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
 
 final class YinXMLEventReader implements XMLEventReader {
-    private static final class OpenElement {
-        final Iterator<? extends DeclaredStatement<?>> children;
-        final QName name;
-
-        OpenElement(final Iterator<? extends DeclaredStatement<?>> children) {
-            this.children = requireNonNull(children);
-            this.name = null;
-        }
-
-        OpenElement(final QName name, final Iterator<? extends DeclaredStatement<?>> children) {
-            this.children = requireNonNull(children);
-            this.name = requireNonNull(name);
+    private record OpenElement(QName name, Iterator<? extends DeclaredStatement<?>> children) {
+        OpenElement {
+            requireNonNull(name);
+            requireNonNull(children);
         }
     }
 
@@ -68,9 +58,10 @@ final class YinXMLEventReader implements XMLEventReader {
         final ArgumentDefinition arg = def.getArgumentDefinition().get();
 
         events.add(eventFactory.createStartElement(XMLConstants.DEFAULT_NS_PREFIX, name.getNamespace().toString(),
-            name.getLocalName(), singletonIterator(attribute(arg.getArgumentName(), root.rawArgument())),
-            transform(namespaceContext.prefixesAndNamespaces().entrySet().iterator(),
-                e -> eventFactory.createNamespace(e.getKey(), e.getValue())),
+            name.getLocalName(), singletonIterator(attribute(arg.argumentName(), root.rawArgument())),
+            transform(namespaceContext.importedModules().iterator(),
+                e -> eventFactory.createNamespace(e.getKey(),
+                    e.getValue().localQNameModule().getNamespace().toString())),
             namespaceContext));
 
         stack.push(new OpenElement(name, root.declaredSubstatements().iterator()));
@@ -116,7 +107,7 @@ final class YinXMLEventReader implements XMLEventReader {
 
     @Override
     public String getElementText() throws XMLStreamException {
-        XMLEvent current = peek();
+        var current = peek();
         if (current == null) {
             throw new XMLStreamException("End of event stream");
         }
@@ -125,10 +116,10 @@ final class YinXMLEventReader implements XMLEventReader {
         }
 
         current = next();
-        if (!(current instanceof Characters)) {
+        if (!(current instanceof Characters chars)) {
             throw new XMLStreamException("Encountered non-text event " + current);
         }
-        final String ret = ((Characters)current).getData();
+        final String ret = chars.getData();
 
         current = next();
         if (!(current instanceof EndElement)) {
@@ -139,7 +130,7 @@ final class YinXMLEventReader implements XMLEventReader {
 
     @Override
     public XMLEvent nextTag() throws XMLStreamException {
-        final XMLEvent next = next();
+        final var next = next();
         if (next instanceof Characters) {
             throw new XMLStreamException("Significant characters encountered: " + next);
         }
@@ -158,44 +149,31 @@ final class YinXMLEventReader implements XMLEventReader {
     }
 
     private Attribute attribute(final QName qname, final String value) {
-        final Entry<String, String> ns = namespaceContext.prefixAndNamespaceFor(qname.getModule());
+        final var ns = namespaceContext.prefixAndNamespaceFor(qname.getModule());
         return eventFactory.createAttribute(ns.getKey(), ns.getValue(), qname.getLocalName(), value);
     }
 
     private StartElement startElement(final QName qname) {
-        final Entry<String, String> ns = namespaceContext.prefixAndNamespaceFor(qname.getModule());
+        final var ns = namespaceContext.prefixAndNamespaceFor(qname.getModule());
         return eventFactory.createStartElement(ns.getKey(), ns.getValue(), qname.getLocalName(), emptyIterator(),
             emptyIterator(), namespaceContext);
     }
 
     private EndElement endElement(final QName qname) {
-        final Entry<String, String> ns = namespaceContext.prefixAndNamespaceFor(qname.getModule());
+        final var ns = namespaceContext.prefixAndNamespaceFor(qname.getModule());
         return eventFactory.createEndElement(ns.getKey(), ns.getValue(), qname.getLocalName());
     }
 
     private void nextStatement() {
-        OpenElement current = stack.peek();
+        final var current = stack.peek();
         if (current == null) {
             return;
         }
 
         do {
-            while (current.children.hasNext()) {
-                // We have to mind child statement origin and not emit empty implicit children
-                final DeclaredStatement<?> child = current.children.next();
-                switch (child.statementOrigin()) {
-                    case CONTEXT:
-                        final Iterator<? extends DeclaredStatement<?>> it = child.declaredSubstatements().iterator();
-                        if (it.hasNext()) {
-                            current = new OpenElement(it);
-                        }
-                        break;
-                    case DECLARATION:
-                        addStatement(child);
-                        return;
-                    default:
-                        throw new IllegalStateException("Unhandled statement origin " + child.statementOrigin());
-                }
+            if (current.children.hasNext()) {
+                addStatement(current.children.next());
+                return;
             }
 
             if (current.name != null) {
@@ -209,17 +187,17 @@ final class YinXMLEventReader implements XMLEventReader {
     }
 
     private void addStatement(final DeclaredStatement<?> statement) {
-        final StatementDefinition def = statement.statementDefinition();
-        final QName name = def.getStatementName();
-        final Optional<ArgumentDefinition> optArgDef = def.getArgumentDefinition();
+        final var def = statement.statementDefinition();
+        final var name = def.getStatementName();
+        final var optArgDef = def.getArgumentDefinition();
         if (optArgDef.isPresent()) {
-            final ArgumentDefinition argDef = optArgDef.get();
-            final QName argName = argDef.getArgumentName();
+            final var argDef = optArgDef.orElseThrow();
+            final var argName = argDef.argumentName();
             if (argDef.isYinElement()) {
                 events.addAll(Arrays.asList(startElement(name), startElement(argName),
                     eventFactory.createCharacters(statement.rawArgument()), endElement(argName)));
             } else {
-                final Entry<String, String> ns = namespaceContext.prefixAndNamespaceFor(name.getModule());
+                final var ns = namespaceContext.prefixAndNamespaceFor(name.getModule());
                 events.add(eventFactory.createStartElement(ns.getKey(), ns.getValue(), name.getLocalName(),
                     singletonIterator(attribute(argName, statement.rawArgument())), emptyIterator(), namespaceContext));
             }