From: Robert Varga Date: Wed, 26 Oct 2022 09:43:44 +0000 (+0200) Subject: Use local variable type inference in yang-model-export X-Git-Tag: v10.0.0~31 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=275bba7ab0f20216587e364c3bc3a6df9ddf87eb;p=yangtools.git Use local variable type inference in yang-model-export This cleans up some of the code verbosity. Change-Id: I6d026214ad3229852984e06deb08b5a2148015f0 Signed-off-by: Robert Varga --- diff --git a/model/yang-model-export/src/main/java/org/opendaylight/yangtools/yang/model/export/ModuleNamespaceContext.java b/model/yang-model-export/src/main/java/org/opendaylight/yangtools/yang/model/export/ModuleNamespaceContext.java index 96e8f0e26e..c5638c86f0 100644 --- a/model/yang-model-export/src/main/java/org/opendaylight/yangtools/yang/model/export/ModuleNamespaceContext.java +++ b/model/yang-model-export/src/main/java/org/opendaylight/yangtools/yang/model/export/ModuleNamespaceContext.java @@ -11,12 +11,10 @@ import static com.google.common.base.Preconditions.checkArgument; import static java.util.Objects.requireNonNull; import com.google.common.collect.ImmutableListMultimap; -import com.google.common.collect.ImmutableListMultimap.Builder; import com.google.common.collect.Iterators; import com.google.common.collect.ListMultimap; import com.google.common.collect.Maps; import java.util.Iterator; -import java.util.List; import java.util.Map; import java.util.Map.Entry; import javax.xml.XMLConstants; @@ -40,9 +38,9 @@ final class ModuleNamespaceContext implements NamespaceContext { prefixToModule = requireNonNull(module.getAll(PrefixToEffectiveModuleNamespace.class)); moduleToPrefix = requireNonNull(module.getAll(QNameModuleToPrefixNamespace.class)); - final Builder namespaces = ImmutableListMultimap.builder(); - for (Entry e : moduleToPrefix.entrySet()) { - namespaces.put(e.getKey().getNamespace().toString(), e.getValue()); + final var namespaces = ImmutableListMultimap.builder(); + for (var entry : moduleToPrefix.entrySet()) { + namespaces.put(entry.getKey().getNamespace().toString(), entry.getValue()); } namespaceToPrefix = namespaces.build(); } @@ -56,7 +54,7 @@ final class ModuleNamespaceContext implements NamespaceContext { case XMLConstants.XML_NS_PREFIX -> XMLConstants.XML_NS_URI; case XMLConstants.XMLNS_ATTRIBUTE -> XMLConstants.XMLNS_ATTRIBUTE_NS_URI; default -> { - final ModuleEffectiveStatement module = prefixToModule.get(prefix); + final var module = prefixToModule.get(prefix); yield module != null ? module.localQNameModule().getNamespace().toString() : XMLConstants.NULL_NS_URI; } }; @@ -71,7 +69,7 @@ final class ModuleNamespaceContext implements NamespaceContext { case XMLConstants.XML_NS_URI -> XMLConstants.XML_NS_PREFIX; case XMLConstants.XMLNS_ATTRIBUTE_NS_URI -> XMLConstants.XMLNS_ATTRIBUTE; default -> { - final List<@NonNull String> prefixes = namespaceToPrefix.get(namespaceURI); + final var prefixes = namespaceToPrefix.get(namespaceURI); yield prefixes.isEmpty() ? null : prefixes.get(0); } }; diff --git a/model/yang-model-export/src/main/java/org/opendaylight/yangtools/yang/model/export/StatementPrefixResolver.java b/model/yang-model-export/src/main/java/org/opendaylight/yangtools/yang/model/export/StatementPrefixResolver.java index b9432312b7..446ed3d3b6 100644 --- a/model/yang-model-export/src/main/java/org/opendaylight/yangtools/yang/model/export/StatementPrefixResolver.java +++ b/model/yang-model-export/src/main/java/org/opendaylight/yangtools/yang/model/export/StatementPrefixResolver.java @@ -21,7 +21,6 @@ import com.google.common.collect.Multimap; import java.util.AbstractMap.SimpleImmutableEntry; import java.util.Collection; import java.util.HashMap; -import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import java.util.Optional; @@ -56,7 +55,7 @@ final class StatementPrefixResolver { if (haystack == needle) { return true; } - for (DeclaredStatement child : haystack.declaredSubstatements()) { + for (var child : haystack.declaredSubstatements()) { if (contains(child, needle)) { return true; } @@ -76,25 +75,24 @@ final class StatementPrefixResolver { } static StatementPrefixResolver forModule(final ModuleEffectiveStatement module) { - final Map imports = module.getAll(QNameModuleToPrefixNamespace.class); - final Collection submodules = module.getAll( - NameToEffectiveSubmoduleNamespace.class).values(); + final var imports = module.getAll(QNameModuleToPrefixNamespace.class); + final var submodules = module.getAll(NameToEffectiveSubmoduleNamespace.class).values(); if (submodules.isEmpty()) { // Simple: it's just the module return new StatementPrefixResolver(imports); } // Stage one: check what everyone thinks about imports - final Map>> prefixToNamespaces = new HashMap<>(); + final var prefixToNamespaces = new HashMap>>(); indexPrefixes(prefixToNamespaces, imports, module); - for (SubmoduleEffectiveStatement submodule : submodules) { + for (var submodule : submodules) { indexPrefixes(prefixToNamespaces, submodule.getAll(QNameModuleToPrefixNamespace.class), submodule); } // Stage two: see what QNameModule -> prefix mappings there are. We will need to understand this in step three - final Multimap namespaceToPrefixes = HashMultimap.create(); - for (Entry>> entry : prefixToNamespaces.entrySet()) { - for (QNameModule namespace : entry.getValue().keySet()) { + final var namespaceToPrefixes = HashMultimap.create(); + for (var entry : prefixToNamespaces.entrySet()) { + for (var namespace : entry.getValue().keySet()) { namespaceToPrefixes.put(namespace, entry.getKey()); } } @@ -103,14 +101,13 @@ final class StatementPrefixResolver { final Builder builder = ImmutableMap.builderWithExpectedSize(prefixToNamespaces.size()); // ... first resolve unambiguous mappings ... - final Iterator>>> it = - prefixToNamespaces.entrySet().iterator(); + final var it = prefixToNamespaces.entrySet().iterator(); while (it.hasNext()) { - final Entry>> entry = it.next(); - final Multimap> modules = entry.getValue(); + final var entry = it.next(); + final var modules = entry.getValue(); if (modules.size() == 1) { // Careful now: the namespace needs to be unambiguous - final QNameModule namespace = modules.keys().iterator().next(); + final var namespace = modules.keys().iterator().next(); if (namespaceToPrefixes.get(namespace).size() == 1) { builder.put(namespace, entry.getKey()); it.remove(); @@ -120,11 +117,11 @@ final class StatementPrefixResolver { // .. check for any remaining conflicts ... if (!prefixToNamespaces.isEmpty()) { - final Multimap, String>> conflicts = ArrayListMultimap.create(); - for (Entry>> entry : prefixToNamespaces.entrySet()) { - for (Entry> namespace : entry.getValue().entries()) { - conflicts.put(namespace.getKey(), new SimpleImmutableEntry<>(namespace.getValue().getDeclared(), - entry.getKey())); + final var conflicts = ArrayListMultimap., String>>create(); + for (var entry : prefixToNamespaces.entrySet()) { + for (var namespaceEntry : entry.getValue().entries()) { + conflicts.put(namespaceEntry.getKey(), + new SimpleImmutableEntry<>(namespaceEntry.getValue().getDeclared(), entry.getKey())); } } @@ -139,12 +136,12 @@ final class StatementPrefixResolver { } Optional findPrefix(final DeclaredStatement stmt) { - final QNameModule module = stmt.statementDefinition().getStatementName().getModule(); + final var module = stmt.statementDefinition().getStatementName().getModule(); if (YangConstants.RFC6020_YIN_MODULE.equals(module)) { return Optional.empty(); } - final Object obj = lookup.get(module); + final var obj = lookup.get(module); if (obj != null) { return decodeEntry(obj, stmt); } @@ -159,8 +156,8 @@ final class StatementPrefixResolver { // - or DeclaredStatement should provide the prefix? // The second one seems cleaner, as that means we would not have perform any lookup at all... Entry match = null; - for (Entry entry : lookup.entrySet()) { - final QNameModule ns = entry.getKey(); + for (var entry : lookup.entrySet()) { + final var ns = entry.getKey(); if (module.equals(ns.withoutRevision()) && (match == null || Revision.compare(match.getKey().getRevision(), ns.getRevision()) < 0)) { match = entry; @@ -185,7 +182,7 @@ final class StatementPrefixResolver { private static void indexPrefixes(final Map>> map, final Map imports, final EffectiveStatement stmt) { - for (Entry entry : imports.entrySet()) { + for (var entry : imports.entrySet()) { map.computeIfAbsent(entry.getValue(), key -> ArrayListMultimap.create()).put(entry.getKey(), stmt); } } diff --git a/model/yang-model-export/src/main/java/org/opendaylight/yangtools/yang/model/export/YangTextSnippetIterator.java b/model/yang-model-export/src/main/java/org/opendaylight/yangtools/yang/model/export/YangTextSnippetIterator.java index 9f974db2d5..5767437019 100644 --- a/model/yang-model-export/src/main/java/org/opendaylight/yangtools/yang/model/export/YangTextSnippetIterator.java +++ b/model/yang-model-export/src/main/java/org/opendaylight/yangtools/yang/model/export/YangTextSnippetIterator.java @@ -17,10 +17,8 @@ import com.google.common.collect.AbstractIterator; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import java.util.ArrayDeque; -import java.util.Collection; import java.util.Deque; import java.util.Iterator; -import java.util.Optional; import java.util.Queue; import java.util.Set; import org.eclipse.jdt.annotation.NonNull; @@ -153,12 +151,12 @@ final class YangTextSnippetIterator extends AbstractIterator<@NonNull String> { * @return True if the statement was pushed. False if the statement was suppressed. */ private boolean pushStatement(final DeclaredStatement stmt) { - final StatementDefinition def = stmt.statementDefinition(); + final var def = stmt.statementDefinition(); if (ignoredStatements.contains(def)) { return false; } - final Collection> children = stmt.declaredSubstatements(); + final var children = stmt.declaredSubstatements(); if (omitDefaultStatements && children.isEmpty()) { // This statement does not have substatements, check if its value matches the declared default, like // "config true", "mandatory false", etc. @@ -172,7 +170,7 @@ final class YangTextSnippetIterator extends AbstractIterator<@NonNull String> { addIndent(); // Add statement prefixed with namespace if needed - final Optional prefix = resolver.findPrefix(stmt); + final var prefix = resolver.findPrefix(stmt); if (prefix.isPresent()) { strings.add(prefix.get()); strings.add(":"); diff --git a/model/yang-model-export/src/main/java/org/opendaylight/yangtools/yang/model/export/YinExportUtils.java b/model/yang-model-export/src/main/java/org/opendaylight/yangtools/yang/model/export/YinExportUtils.java index 5c88626adf..58d62c4651 100644 --- a/model/yang-model-export/src/main/java/org/opendaylight/yangtools/yang/model/export/YinExportUtils.java +++ b/model/yang-model-export/src/main/java/org/opendaylight/yangtools/yang/model/export/YinExportUtils.java @@ -15,7 +15,6 @@ import java.util.Optional; import javax.xml.stream.XMLEventReader; import javax.xml.stream.XMLStreamException; import javax.xml.transform.OutputKeys; -import javax.xml.transform.Transformer; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.stax.StAXSource; @@ -92,7 +91,7 @@ public final class YinExportUtils { private static void writeReaderToOutput(final XMLEventReader reader, final OutputStream output) throws XMLStreamException { try { - final Transformer transformer = TRANSFORMER_FACTORY.newTransformer(); + final var transformer = TRANSFORMER_FACTORY.newTransformer(); transformer.setOutputProperty(OutputKeys.INDENT, "yes"); transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no"); transformer.transform(new StAXSource(reader), new StreamResult(output)); diff --git a/model/yang-model-export/src/main/java/org/opendaylight/yangtools/yang/model/export/YinXMLEventReader.java b/model/yang-model-export/src/main/java/org/opendaylight/yangtools/yang/model/export/YinXMLEventReader.java index 75b6f6d0f6..043b2a1e30 100644 --- a/model/yang-model-export/src/main/java/org/opendaylight/yangtools/yang/model/export/YinXMLEventReader.java +++ b/model/yang-model-export/src/main/java/org/opendaylight/yangtools/yang/model/export/YinXMLEventReader.java @@ -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; @@ -116,7 +114,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"); } @@ -139,7 +137,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,23 +156,23 @@ final class YinXMLEventReader implements XMLEventReader { } private Attribute attribute(final QName qname, final String value) { - final Entry 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 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 ns = namespaceContext.prefixAndNamespaceFor(qname.getModule()); + final var ns = namespaceContext.prefixAndNamespaceFor(qname.getModule()); return eventFactory.createEndElement(ns.getKey(), ns.getValue(), qname.getLocalName()); } private void nextStatement() { - final OpenElement current = stack.peek(); + final var current = stack.peek(); if (current == null) { return; } @@ -196,17 +194,17 @@ final class YinXMLEventReader implements XMLEventReader { } private void addStatement(final DeclaredStatement statement) { - final StatementDefinition def = statement.statementDefinition(); - final QName name = def.getStatementName(); - final Optional 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.getArgumentName(); if (argDef.isYinElement()) { events.addAll(Arrays.asList(startElement(name), startElement(argName), eventFactory.createCharacters(statement.rawArgument()), endElement(argName))); } else { - final Entry 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)); } diff --git a/model/yang-model-export/src/main/java/org/opendaylight/yangtools/yang/model/export/YinXMLEventReaderFactory.java b/model/yang-model-export/src/main/java/org/opendaylight/yangtools/yang/model/export/YinXMLEventReaderFactory.java index 7485dd7593..c468823b40 100644 --- a/model/yang-model-export/src/main/java/org/opendaylight/yangtools/yang/model/export/YinXMLEventReaderFactory.java +++ b/model/yang-model-export/src/main/java/org/opendaylight/yangtools/yang/model/export/YinXMLEventReaderFactory.java @@ -15,9 +15,7 @@ import javax.xml.stream.Location; import javax.xml.stream.XMLEventFactory; import javax.xml.stream.XMLEventReader; import org.opendaylight.yangtools.yang.model.api.stmt.ModuleEffectiveStatement; -import org.opendaylight.yangtools.yang.model.api.stmt.ModuleStatement; import org.opendaylight.yangtools.yang.model.api.stmt.SubmoduleEffectiveStatement; -import org.opendaylight.yangtools.yang.model.api.stmt.SubmoduleStatement; /** * Factory for creating {@link XMLEventReader} instances reporting events equivalent to reading a YIN document defining @@ -56,7 +54,7 @@ public final class YinXMLEventReaderFactory { private static final YinXMLEventReaderFactory DEFAULT; static { - final XMLEventFactory eventFactory = XMLEventFactory.newFactory(); + final var eventFactory = XMLEventFactory.newFactory(); eventFactory.setLocation(DUMMY_LOCATION); DEFAULT = new YinXMLEventReaderFactory(eventFactory); } @@ -89,9 +87,8 @@ public final class YinXMLEventReaderFactory { * @throws IllegalArgumentException if the specified module does not expose declared model */ public XMLEventReader createXMLEventReader(final ModuleEffectiveStatement module) { - final ModuleStatement declared = module.getDeclared(); + final var declared = module.getDeclared(); checkArgument(declared != null, "Module %s does not expose declared model", module); - return new YinXMLEventReader(eventFactory, new ModuleNamespaceContext(module), declared); } @@ -106,7 +103,7 @@ public final class YinXMLEventReaderFactory { */ public XMLEventReader createXMLEventReader(final ModuleEffectiveStatement module, final SubmoduleEffectiveStatement submodule) { - final SubmoduleStatement declared = submodule.getDeclared(); + final var declared = submodule.getDeclared(); checkArgument(declared != null, "Submodule %s does not expose declared model", submodule); return new YinXMLEventReader(eventFactory, new ModuleNamespaceContext(module), declared); }