X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=yang%2Fyang-parser-rfc7950%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Fyang%2Fparser%2Frfc7950%2Fstmt%2FAbstractEffectiveModule.java;h=aab5cb9ac333835b953d68c5fee8a504e4a12408;hb=60aaa85b10b02b29f357fb53fed5723a498e1cef;hp=055188be4e45d478916d8e92689f99619d2fc2f8;hpb=6ba759ce6949dfa7ebbaf90a2a937674f3c52542;p=yangtools.git diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/AbstractEffectiveModule.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/AbstractEffectiveModule.java index 055188be4e..aab5cb9ac3 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/AbstractEffectiveModule.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/AbstractEffectiveModule.java @@ -7,24 +7,26 @@ */ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt; +import static com.google.common.base.Verify.verifyNotNull; import static java.util.Objects.requireNonNull; import com.google.common.annotations.Beta; import com.google.common.base.MoreObjects; +import com.google.common.collect.Collections2; import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableMap.Builder; import com.google.common.collect.ImmutableSet; -import java.net.URI; -import java.util.ArrayList; -import java.util.HashSet; +import java.util.Collection; import java.util.LinkedHashSet; -import java.util.List; +import java.util.Map; import java.util.Optional; import java.util.Set; import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.yangtools.concepts.SemVer; import org.opendaylight.yangtools.openconfig.model.api.OpenConfigVersionEffectiveStatement; import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.common.Revision; +import org.opendaylight.yangtools.yang.common.UnqualifiedQName; import org.opendaylight.yangtools.yang.common.YangVersion; import org.opendaylight.yangtools.yang.model.api.AugmentationSchemaNode; import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; @@ -33,105 +35,68 @@ import org.opendaylight.yangtools.yang.model.api.ExtensionDefinition; import org.opendaylight.yangtools.yang.model.api.FeatureDefinition; import org.opendaylight.yangtools.yang.model.api.GroupingDefinition; import org.opendaylight.yangtools.yang.model.api.IdentitySchemaNode; -import org.opendaylight.yangtools.yang.model.api.Module; import org.opendaylight.yangtools.yang.model.api.ModuleImport; +import org.opendaylight.yangtools.yang.model.api.ModuleLike; import org.opendaylight.yangtools.yang.model.api.NotificationDefinition; import org.opendaylight.yangtools.yang.model.api.RpcDefinition; import org.opendaylight.yangtools.yang.model.api.TypeDefinition; import org.opendaylight.yangtools.yang.model.api.UsesNode; import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; +import org.opendaylight.yangtools.yang.model.api.meta.IdentifierNamespace; import org.opendaylight.yangtools.yang.model.api.stmt.ContactEffectiveStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.DataTreeAwareEffectiveStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.ImportEffectiveStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.ModuleEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.OrganizationEffectiveStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.PrefixEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.PrefixStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.SchemaTreeAwareEffectiveStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.SchemaTreeEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.TypedefEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.YangVersionEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.compat.NotificationNodeContainerCompat; +import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredEffectiveStatement.DefaultWithDataTree.WithSubstatements; +import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStatementMixins.DocumentedNodeMixin; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils; +import org.opendaylight.yangtools.yang.parser.spi.source.ImportPrefixToModuleCtx; import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; @Beta -public abstract class AbstractEffectiveModule> extends - AbstractSchemaEffectiveDocumentedNode implements Module, - NotificationNodeContainerCompat { - private final String name; +public abstract class AbstractEffectiveModule, + E extends DataTreeAwareEffectiveStatement> + extends WithSubstatements + implements ModuleLike, DocumentedNodeMixin, + NotificationNodeContainerCompat { private final String prefix; - private final YangVersion yangVersion; - private final String organization; - private final String contact; - private final ImmutableSet imports; - private final ImmutableSet features; - private final @NonNull ImmutableSet notifications; - private final ImmutableSet augmentations; - private final ImmutableSet rpcs; - private final ImmutableSet deviations; - private final ImmutableList extensionNodes; - private final ImmutableSet identities; private final ImmutableSet groupings; private final ImmutableSet uses; private final ImmutableSet> typeDefinitions; - private final ImmutableSet publicChildNodes; - private final SemVer semanticVersion; + private final ImmutableMap> schemaTreeNamespace; - protected AbstractEffectiveModule( - final @NonNull StmtContext> ctx, - final @NonNull String prefix) { - super(ctx); + protected AbstractEffectiveModule(final D declared, + final StmtContext> ctx, + final ImmutableList> substatements, final String prefix) { + super(declared, ctx, substatements); + + // This check is rather weird, but comes from our desire to lower memory footprint while providing both + // EffectiveStatements and SchemaNode interfaces -- which do not overlap completely where child lookups are + // concerned. This ensures that we have SchemaTree index available for use with child lookups. + final Map> schemaTree = + createSchemaTreeNamespace(ctx.getStatementSourceReference(), effectiveSubstatements()); + schemaTreeNamespace = ImmutableMap.copyOf(schemaTree); + + // Data tree check, not currently used + createDataTreeNamespace(ctx.getStatementSourceReference(), schemaTree.values(), schemaTreeNamespace); - this.name = argument(); this.prefix = requireNonNull(prefix); - this.yangVersion = findFirstEffectiveSubstatementArgument(YangVersionEffectiveStatement.class) - .orElse(YangVersion.VERSION_1); - this.semanticVersion = findFirstEffectiveSubstatementArgument(OpenConfigVersionEffectiveStatement.class) - .orElse(null); - this.organization = findFirstEffectiveSubstatementArgument(OrganizationEffectiveStatement.class) - .orElse(null); - this.contact = findFirstEffectiveSubstatementArgument(ContactEffectiveStatement.class) - .orElse(null); - - final Set augmentationsInit = new LinkedHashSet<>(); - final Set importsInit = new HashSet<>(); - final Set notificationsInit = new HashSet<>(); - final Set rpcsInit = new HashSet<>(); - final Set deviationsInit = new HashSet<>(); - final Set identitiesInit = new HashSet<>(); - final Set featuresInit = new HashSet<>(); - final List extensionNodesInit = new ArrayList<>(); - - final Set mutableGroupings = new HashSet<>(); - final Set mutableUses = new HashSet<>(); + + final Set mutableGroupings = new LinkedHashSet<>(); + final Set mutableUses = new LinkedHashSet<>(); final Set> mutableTypeDefinitions = new LinkedHashSet<>(); - final Set mutablePublicChildNodes = new LinkedHashSet<>(); for (final EffectiveStatement effectiveStatement : effectiveSubstatements()) { - if (effectiveStatement instanceof AugmentationSchemaNode) { - augmentationsInit.add((AugmentationSchemaNode) effectiveStatement); - } - if (effectiveStatement instanceof ModuleImport) { - importsInit.add((ModuleImport) effectiveStatement); - } - if (effectiveStatement instanceof NotificationDefinition) { - notificationsInit.add((NotificationDefinition) effectiveStatement); - } - if (effectiveStatement instanceof RpcDefinition) { - rpcsInit.add((RpcDefinition) effectiveStatement); - } - if (effectiveStatement instanceof Deviation) { - deviationsInit.add((Deviation) effectiveStatement); - } - if (effectiveStatement instanceof IdentitySchemaNode) { - identitiesInit.add((IdentitySchemaNode) effectiveStatement); - } - if (effectiveStatement instanceof FeatureDefinition) { - featuresInit.add((FeatureDefinition) effectiveStatement); - } - if (effectiveStatement instanceof ExtensionDefinition) { - extensionNodesInit.add((ExtensionDefinition) effectiveStatement); - } - if (effectiveStatement instanceof DataSchemaNode) { - mutablePublicChildNodes.add((DataSchemaNode) effectiveStatement); - } if (effectiveStatement instanceof UsesNode && !mutableUses.add((UsesNode) effectiveStatement)) { throw EffectiveStmtUtils.createNameCollisionSourceException(ctx, effectiveStatement); } @@ -147,34 +112,19 @@ public abstract class AbstractEffectiveModule getRevision() { - return getQNameModule().getRevision(); + return argument().getLocalName(); } @Override @@ -184,98 +134,110 @@ public abstract class AbstractEffectiveModule getOrganization() { - return Optional.ofNullable(organization); + return findFirstEffectiveSubstatementArgument(OrganizationEffectiveStatement.class); } @Override public Optional getContact() { - return Optional.ofNullable(contact); + return findFirstEffectiveSubstatementArgument(ContactEffectiveStatement.class); } @Override - public Set getImports() { - return imports; + public Collection getImports() { + return filterSubstatements(ModuleImport.class); } @Override - public Set getFeatures() { - return features; + public Collection getFeatures() { + return filterSubstatements(FeatureDefinition.class); } @Override - public Set getNotifications() { - return notifications; + public Collection getNotifications() { + return filterSubstatements(NotificationDefinition.class); } @Override - public Set getAugmentations() { - return augmentations; + public Collection getAugmentations() { + return filterSubstatements(AugmentationSchemaNode.class); } @Override - public Set getRpcs() { - return rpcs; + public Collection getRpcs() { + return filterSubstatements(RpcDefinition.class); } @Override - public Set getDeviations() { - return deviations; + public Collection getDeviations() { + return filterSubstatements(Deviation.class); } @Override - public List getExtensionSchemaNodes() { - return extensionNodes; + public Collection getExtensionSchemaNodes() { + return filterSubstatements(ExtensionDefinition.class); } @Override - public Set getIdentities() { - return identities; + public Collection getIdentities() { + return filterSubstatements(IdentitySchemaNode.class); } @Override - public final Set> getTypeDefinitions() { + public final Collection> getTypeDefinitions() { return typeDefinitions; } @Override - public final Set getChildNodes() { - return publicChildNodes; + public final Collection getChildNodes() { + return filterSubstatements(DataSchemaNode.class); } @Override - public final Set getGroupings() { + public final Collection getGroupings() { return groupings; } @Override @SuppressWarnings("checkstyle:hiddenField") public final Optional findDataChildByName(final QName name) { - return findDataSchemaNode(name); + final SchemaTreeEffectiveStatement child = schemaTreeNamespace.get(requireNonNull(name)); + return child instanceof DataSchemaNode ? Optional.of((DataSchemaNode) child) : Optional.empty(); } @Override - public Set getUses() { + public Collection getUses() { return uses; } @Override public Optional getSemanticVersion() { - return Optional.ofNullable(semanticVersion); + return findFirstEffectiveSubstatementArgument(OpenConfigVersionEffectiveStatement.class); + } + + @Override + @SuppressWarnings("unchecked") + protected > Optional> getNamespaceContents( + final Class namespace) { + if (SchemaTreeAwareEffectiveStatement.Namespace.class.equals(namespace)) { + return Optional.of((Map) schemaTreeNamespace); + } + return super.getNamespaceContents(namespace); } @Override public String toString() { return MoreObjects.toStringHelper(this).omitNullValues() - .add("name", name) + .add("name", getName()) .add("namespace", getNamespace()) .add("revision", getRevision().orElse(null)) .add("prefix", prefix) - .add("yangVersion", yangVersion) + .add("yangVersion", getYangVersion()) .toString(); } @@ -285,4 +247,22 @@ public abstract class AbstractEffectiveModule ctx, + final Builder builder) { + streamEffectiveSubstatements(ImportEffectiveStatement.class) + .map(imp -> imp.findFirstEffectiveSubstatementArgument(PrefixEffectiveStatement.class).get()) + .forEach(pfx -> { + final StmtContext importedCtx = + verifyNotNull(ctx.getFromNamespace(ImportPrefixToModuleCtx.class, pfx), + "Failed to resolve prefix %s", pfx); + builder.put(pfx, (ModuleEffectiveStatement) importedCtx.buildEffective()); + }); + } + + @SuppressWarnings("unchecked") + private @NonNull Collection filterSubstatements(final Class type) { + return (Collection) Collections2.filter(effectiveSubstatements(), type::isInstance); + } }