Clean up YangModelDependencyInfo
[yangtools.git] / parser / yang-parser-rfc7950 / src / main / java / org / opendaylight / yangtools / yang / parser / rfc7950 / repo / YangModelDependencyInfo.java
index 2051d5ad7eabe82881ce23a512ffe509991cbd0a..c1d35a7b2cbd498aed5699a5bd8799b4b1eb2196 100644 (file)
@@ -9,6 +9,7 @@ package org.opendaylight.yangtools.yang.parser.rfc7950.repo;
 
 import static java.util.Objects.requireNonNull;
 
+import com.google.common.base.MoreObjects;
 import com.google.common.collect.ImmutableSet;
 import java.io.IOException;
 import java.util.Collection;
@@ -53,6 +54,38 @@ import org.opendaylight.yangtools.yang.parser.spi.source.ExplicitStatement;
  * @see SubmoduleDependencyInfo
  */
 public abstract sealed class YangModelDependencyInfo {
+    /**
+     * Dependency information for a YANG module.
+     */
+    public static final class ModuleDependencyInfo extends YangModelDependencyInfo {
+        private ModuleDependencyInfo(final String name, final Revision revision,
+                final ImmutableSet<ModuleImport> imports, final ImmutableSet<ModuleImport> includes) {
+            super(name, revision, imports, includes);
+        }
+    }
+
+    /**
+     * Dependency information for a YANG submodule, also provides name for parent module.
+     */
+    public static final class SubmoduleDependencyInfo extends YangModelDependencyInfo {
+        private final @NonNull Unqualified belongsTo;
+
+        private SubmoduleDependencyInfo(final String name, final Revision revision, final Unqualified belongsTo,
+                final ImmutableSet<ModuleImport> imports, final ImmutableSet<ModuleImport> includes) {
+            super(name, revision, imports, includes);
+            this.belongsTo = requireNonNull(belongsTo);
+        }
+
+        /**
+         * Returns name of parent module.
+         *
+         * @return The module this info belongs to
+         */
+        public @NonNull Unqualified getParentModule() {
+            return belongsTo;
+        }
+    }
+
     private static final String BELONGS_TO = YangStmtMapping.BELONGS_TO.getStatementName().getLocalName();
     private static final String IMPORT = YangStmtMapping.IMPORT.getStatementName().getLocalName();
     private static final String INCLUDE = YangStmtMapping.INCLUDE.getStatementName().getLocalName();
@@ -64,30 +97,19 @@ public abstract sealed class YangModelDependencyInfo {
     private static final String SUBMODULE = YangStmtMapping.SUBMODULE.getStatementName().getLocalName();
     private static final String YANG_VERSION = YangStmtMapping.YANG_VERSION.getStatementName().getLocalName();
 
-    private final String name;
-    private final Revision revision;
-    private final ImmutableSet<ModuleImport> submoduleIncludes;
-    private final ImmutableSet<ModuleImport> moduleImports;
-    private final ImmutableSet<ModuleImport> dependencies;
+    private final @NonNull String name;
+    private final @Nullable Revision revision;
+    private final @NonNull ImmutableSet<ModuleImport> submoduleIncludes;
+    private final @NonNull ImmutableSet<ModuleImport> moduleImports;
+    private final @NonNull ImmutableSet<ModuleImport> dependencies;
 
-    YangModelDependencyInfo(final String name, final String formattedRevision, final ImmutableSet<ModuleImport> imports,
+    YangModelDependencyInfo(final String name, final Revision revision, final ImmutableSet<ModuleImport> imports,
             final ImmutableSet<ModuleImport> includes) {
-        this.name = name;
-        revision = Revision.ofNullable(formattedRevision).orElse(null);
-        moduleImports = imports;
-        submoduleIncludes = includes;
-        dependencies = ImmutableSet.<ModuleImport>builder()
-                .addAll(moduleImports).addAll(submoduleIncludes).build();
-    }
-
-    /**
-     * Returns immutable collection of all module imports. This collection contains both <code>import</code> statements
-     * and <code>include</code> statements for submodules.
-     *
-     * @return Immutable collection of imports.
-     */
-    public ImmutableSet<ModuleImport> getDependencies() {
-        return dependencies;
+        this.name = requireNonNull(name);
+        this.revision = revision;
+        moduleImports = requireNonNull(imports);
+        submoduleIncludes = requireNonNull(includes);
+        dependencies = ImmutableSet.<ModuleImport>builder().addAll(moduleImports).addAll(submoduleIncludes).build();
     }
 
     /**
@@ -95,17 +117,18 @@ public abstract sealed class YangModelDependencyInfo {
      *
      * @return model name
      */
-    public String getName() {
+    public final String getName() {
         return name;
     }
 
     /**
      * Returns formatted revision string.
      *
-     * @return formatted revision string
+     * @return formatted revision string, or {@code null}
      */
-    public String getFormattedRevision() {
-        return revision != null ? revision.toString() : null;
+    public final @Nullable String getFormattedRevision() {
+        final var local = revision;
+        return local != null ? local.toString() : null;
     }
 
     /**
@@ -113,25 +136,40 @@ public abstract sealed class YangModelDependencyInfo {
      *
      * @return revision, potentially null
      */
-    public Optional<Revision> getRevision() {
+    public final Optional<Revision> getRevision() {
         return Optional.ofNullable(revision);
     }
 
+    /**
+     * Returns immutable collection of all module imports. This collection contains both <code>import</code> statements
+     * and <code>include</code> statements for submodules.
+     *
+     * @return Immutable collection of imports.
+     */
+    public final ImmutableSet<ModuleImport> getDependencies() {
+        return dependencies;
+    }
+
     @Override
-    public int hashCode() {
-        final int prime = 31;
-        int result = 1;
-        result = prime * result + Objects.hashCode(name);
-        result = prime * result + Objects.hashCode(revision);
-        return result;
+    public final int hashCode() {
+        return Objects.hash(name, revision);
     }
 
     @Override
-    public boolean equals(final Object obj) {
+    public final boolean equals(final Object obj) {
         return this == obj || obj instanceof YangModelDependencyInfo other
             && Objects.equals(name, other.name) && Objects.equals(revision, other.revision);
     }
 
+    @Override
+    public final String toString() {
+        return MoreObjects.toStringHelper(this).omitNullValues()
+            .add("name", getName())
+            .add("revision", getRevision())
+            .add("dependencies", getDependencies())
+            .toString();
+    }
+
     /**
      * Extracts {@link YangModelDependencyInfo} from an intermediate representation root statement of a YANG model.
      *
@@ -179,15 +217,13 @@ public abstract sealed class YangModelDependencyInfo {
     }
 
     public static @NonNull ModuleDependencyInfo forSourceInfo(final @NonNull ModuleSourceInfo info) {
-        final var rev = latestRevision(info.revisions());
-        return new ModuleDependencyInfo(info.name().getLocalName(), rev == null ? null : rev.toString(),
+        return new ModuleDependencyInfo(info.name().getLocalName(), latestRevision(info.revisions()),
             info.imports().stream().map(ModuleImportImpl::new).collect(ImmutableSet.toImmutableSet()),
             info.includes().stream().map(ModuleImportImpl::new).collect(ImmutableSet.toImmutableSet()));
     }
 
     public static @NonNull SubmoduleDependencyInfo forSourceInfo(final @NonNull SubmoduleSourceInfo info) {
-        final var rev = latestRevision(info.revisions());
-        return new SubmoduleDependencyInfo(info.name().getLocalName(), rev == null ? null : rev.toString(),
+        return new SubmoduleDependencyInfo(info.name().getLocalName(), latestRevision(info.revisions()),
             info.belongsTo(), info.imports().stream().map(ModuleImportImpl::new).collect(ImmutableSet.toImmutableSet()),
             info.includes().stream().map(ModuleImportImpl::new).collect(ImmutableSet.toImmutableSet()));
     }
@@ -325,52 +361,6 @@ public abstract sealed class YangModelDependencyInfo {
         return ExplicitStatement.atPosition(source.name().getLocalName(), stmt.startLine(), stmt.startColumn() + 1);
     }
 
-    /**
-     * Dependency information for YANG module.
-     */
-    public static final class ModuleDependencyInfo extends YangModelDependencyInfo {
-        ModuleDependencyInfo(final String name, final String latestRevision, final ImmutableSet<ModuleImport> imports,
-                final ImmutableSet<ModuleImport> includes) {
-            super(name, latestRevision, imports, includes);
-        }
-
-        @Override
-        public String toString() {
-            return "Module [name=" + getName() + ", revision=" + getRevision()
-                + ", dependencies=" + getDependencies()
-                + "]";
-        }
-    }
-
-    /**
-     * Dependency information for submodule, also provides name for parent module.
-     */
-    public static final class SubmoduleDependencyInfo extends YangModelDependencyInfo {
-        private final Unqualified belongsTo;
-
-        private SubmoduleDependencyInfo(final String name, final String latestRevision, final Unqualified belongsTo,
-                final ImmutableSet<ModuleImport> imports, final ImmutableSet<ModuleImport> includes) {
-            super(name, latestRevision, imports, includes);
-            this.belongsTo = belongsTo;
-        }
-
-        /**
-         * Returns name of parent module.
-         *
-         * @return The module this info belongs to
-         */
-        public Unqualified getParentModule() {
-            return belongsTo;
-        }
-
-        @Override
-        public String toString() {
-            return "Submodule [name=" + getName() + ", revision=" + getRevision()
-                + ", dependencies=" + getDependencies()
-                + "]";
-        }
-    }
-
     /**
      * Utility implementation of {@link ModuleImport} to be used by {@link YangModelDependencyInfo}.
      */