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%2Freactor%2FRFC7950Reactors.java;h=7bac557ebe7d16e1c36101ea28d1552520c319eb;hb=6682a8e2a8c02ed7a66bddb8b7a86009ffbbb98d;hp=8d84e46a34d80f63457a1ccf7548a7c1e1c2e589;hpb=8f92eac51fa72dd2ebd98a5f1a9ca0799491633f;p=yangtools.git diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/reactor/RFC7950Reactors.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/reactor/RFC7950Reactors.java index 8d84e46a34..7bac557ebe 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/reactor/RFC7950Reactors.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/reactor/RFC7950Reactors.java @@ -11,21 +11,20 @@ import static org.opendaylight.yangtools.yang.common.YangVersion.VERSION_1; import static org.opendaylight.yangtools.yang.common.YangVersion.VERSION_1_1; import com.google.common.annotations.Beta; -import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Sets; -import java.util.Collection; -import java.util.Map; +import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.yangtools.yang.common.YangVersion; -import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition; import org.opendaylight.yangtools.yang.parser.openconfig.stmt.OpenConfigVersionSupport; -import org.opendaylight.yangtools.yang.parser.rfc7950.namespace.ChildSchemaNodeNamespace; -import org.opendaylight.yangtools.yang.parser.rfc7950.namespace.SchemaNodeIdentifierBuildNamespace; +import org.opendaylight.yangtools.yang.parser.rfc7950.namespace.ModuleQNameToPrefix; import org.opendaylight.yangtools.yang.parser.rfc7950.namespace.URIStringToImportPrefix; +import org.opendaylight.yangtools.yang.parser.rfc7950.namespace.YangNamespaceContextNamespace; +import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.XPathSupport; import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.action.ActionStatementSupport; import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.anydata.AnydataStatementSupport; import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.anyxml.AnyxmlStatementSupport; import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.argument.ArgumentStatementSupport; +import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.augment.AugmentImplicitHandlingNamespace; import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.augment.AugmentStatementRFC6020Support; import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.augment.AugmentStatementRFC7950Support; import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.base.BaseStatementSupport; @@ -68,6 +67,7 @@ import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.leaf.LeafStatementSup import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.leaf_list.LeafListStatementRFC6020Support; import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.leaf_list.LeafListStatementRFC7950Support; import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.length.LengthStatementSupport; +import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.list.ConfigListWarningNamespace; import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.list.ListStatementRFC6020Support; import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.list.ListStatementRFC7950Support; import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.mandatory.MandatoryStatementSupport; @@ -119,16 +119,14 @@ import org.opendaylight.yangtools.yang.parser.spi.IdentityNamespace; import org.opendaylight.yangtools.yang.parser.spi.ModuleNamespace; import org.opendaylight.yangtools.yang.parser.spi.NamespaceToModule; import org.opendaylight.yangtools.yang.parser.spi.PreLinkageModuleNamespace; +import org.opendaylight.yangtools.yang.parser.spi.SchemaTreeNamespace; import org.opendaylight.yangtools.yang.parser.spi.SubmoduleNamespace; import org.opendaylight.yangtools.yang.parser.spi.TypeNamespace; -import org.opendaylight.yangtools.yang.parser.spi.meta.DerivedIdentitiesNamespace; import org.opendaylight.yangtools.yang.parser.spi.meta.ModelProcessingPhase; -import org.opendaylight.yangtools.yang.parser.spi.meta.QNameCacheNamespace; import org.opendaylight.yangtools.yang.parser.spi.meta.SemanticVersionModuleNamespace; import org.opendaylight.yangtools.yang.parser.spi.meta.SemanticVersionNamespace; import org.opendaylight.yangtools.yang.parser.spi.meta.StatementDefinitionNamespace; import org.opendaylight.yangtools.yang.parser.spi.meta.StatementSupportBundle; -import org.opendaylight.yangtools.yang.parser.spi.source.AugmentToChoiceNamespace; import org.opendaylight.yangtools.yang.parser.spi.source.BelongsToModuleContext; import org.opendaylight.yangtools.yang.parser.spi.source.BelongsToPrefixToModuleCtx; import org.opendaylight.yangtools.yang.parser.spi.source.BelongsToPrefixToModuleName; @@ -147,11 +145,11 @@ import org.opendaylight.yangtools.yang.parser.spi.source.ModuleQNameToModuleName import org.opendaylight.yangtools.yang.parser.spi.source.ModulesDeviatedByModules; import org.opendaylight.yangtools.yang.parser.spi.source.PrefixToModule; import org.opendaylight.yangtools.yang.parser.spi.source.QNameToStatementDefinition; -import org.opendaylight.yangtools.yang.parser.spi.source.StmtOrderingNamespace; import org.opendaylight.yangtools.yang.parser.spi.source.SupportedFeaturesNamespace; import org.opendaylight.yangtools.yang.parser.spi.validation.ValidationBundlesNamespace; import org.opendaylight.yangtools.yang.parser.spi.validation.ValidationBundlesNamespace.ValidationBundleType; import org.opendaylight.yangtools.yang.parser.stmt.reactor.CrossSourceStatementReactor; +import org.opendaylight.yangtools.yang.xpath.api.YangXPathParserFactory; /** * Utility class holding entrypoints for assembling RFC6020/RFC7950 statement {@link CrossSourceStatementReactor}s. @@ -203,12 +201,12 @@ public final class RFC7950Reactors { .addSupport(ModuleCtxToSourceIdentifier.BEHAVIOUR) .addSupport(ModuleQNameToModuleName.BEHAVIOUR) .addSupport(PrefixToModule.BEHAVIOUR) - .addSupport(QNameCacheNamespace.getInstance()) .addSupport(ImportedModuleContext.BEHAVIOUR) .addSupport(IncludedModuleContext.BEHAVIOUR) .addSupport(IncludedSubmoduleNameToModuleCtx.BEHAVIOUR) .addSupport(ImportPrefixToModuleCtx.BEHAVIOUR) .addSupport(BelongsToPrefixToModuleCtx.BEHAVIOUR) + .addSupport(ModuleQNameToPrefix.BEHAVIOUR) .addSupport(URIStringToImportPrefix.BEHAVIOUR) .addSupport(BelongsToModuleContext.BEHAVIOUR) .addSupport(QNameToStatementDefinition.BEHAVIOUR) @@ -220,8 +218,7 @@ public final class RFC7950Reactors { .addSupport(YinElementStatementSupport.getInstance()) .addSupport(ArgumentStatementSupport.getInstance()) .addSupport(ExtensionStatementSupport.getInstance()) - .addSupport(new ChildSchemaNodeNamespace<>()) - .addSupport(new SchemaNodeIdentifierBuildNamespace()) + .addSupport(SchemaTreeNamespace.getInstance()) .addSupport(ExtensionNamespace.BEHAVIOUR) .addSupport(TypedefStatementSupport.getInstance()) .addSupport(TypeNamespace.BEHAVIOUR) @@ -251,6 +248,7 @@ public final class RFC7950Reactors { .addVersionSpecificSupport(VERSION_1_1, GroupingStatementRFC7950Support.getInstance()) .addVersionSpecificSupport(VERSION_1, ListStatementRFC6020Support.getInstance()) .addVersionSpecificSupport(VERSION_1_1, ListStatementRFC7950Support.getInstance()) + .addSupport(ConfigListWarningNamespace.BEHAVIOUR) .addSupport(UniqueStatementSupport.getInstance()) .addVersionSpecificSupport(VERSION_1_1, ActionStatementSupport.getInstance()) .addVersionSpecificSupport(VERSION_1, RpcStatementRFC6020Support.getInstance()) @@ -263,73 +261,12 @@ public final class RFC7950Reactors { .addVersionSpecificSupport(VERSION_1_1, NotificationStatementRFC7950Support.getInstance()) .addSupport(FractionDigitsStatementSupport.getInstance()) .addSupport(BaseStatementSupport.getInstance()) - .addSupport(DerivedIdentitiesNamespace.BEHAVIOUR) .addSupport(StatementDefinitionNamespace.BEHAVIOUR) .build(); - private static final StatementSupportBundle FULL_DECL_BUNDLE = StatementSupportBundle - .derivedFrom(STMT_DEF_BUNDLE) - .addSupport(LeafStatementSupport.getInstance()) - .addSupport(ConfigStatementSupport.getInstance()) - .addSupport(DeviationStatementSupport.getInstance()) - .addVersionSpecificSupport(VERSION_1, DeviateStatementRFC6020Support.getInstance()) - .addVersionSpecificSupport(VERSION_1_1, DeviateStatementRFC7950Support.getInstance()) - .addVersionSpecificSupport(VERSION_1, ChoiceStatementRFC6020Support.getInstance()) - .addVersionSpecificSupport(VERSION_1_1, ChoiceStatementRFC7950Support.getInstance()) - .addVersionSpecificSupport(VERSION_1, CaseStatementRFC6020Support.getInstance()) - .addVersionSpecificSupport(VERSION_1_1, CaseStatementRFC7950Support.getInstance()) - .addSupport(MustStatementSupport.getInstance()) - .addSupport(MandatoryStatementSupport.getInstance()) - .addSupport(AnyxmlStatementSupport.getInstance()) - .addVersionSpecificSupport(VERSION_1_1, AnydataStatementSupport.getInstance()) - .addSupport(FeatureNamespace.BEHAVIOUR) - .addSupport(IfFeatureStatementSupport.getInstance()) - .addSupport(UsesStatementSupport.getInstance()) - .addSupport(GroupingNamespace.BEHAVIOUR) - .addSupport(ErrorMessageStatementSupport.getInstance()) - .addSupport(ErrorAppTagStatementSupport.getInstance()) - .addVersionSpecificSupport(VERSION_1, LeafListStatementRFC6020Support.getInstance()) - .addVersionSpecificSupport(VERSION_1_1, LeafListStatementRFC7950Support.getInstance()) - .addSupport(PresenceStatementSupport.getInstance()) - .addSupport(MaxElementsStatementSupport.getInstance()) - .addSupport(MinElementsStatementSupport.getInstance()) - .addSupport(OrderedByStatementSupport.getInstance()) - .addSupport(WhenStatementSupport.getInstance()) - .addVersionSpecificSupport(VERSION_1, AugmentStatementRFC6020Support.getInstance()) - .addVersionSpecificSupport(VERSION_1_1, AugmentStatementRFC7950Support.getInstance()) - .addSupport(AugmentToChoiceNamespace.BEHAVIOUR) - .addVersionSpecificSupport(VERSION_1, RefineStatementRFC6020Support.getInstance()) - .addVersionSpecificSupport(VERSION_1_1, RefineStatementRFC7950Support.getInstance()) - .addSupport(FeatureStatementSupport.getInstance()) - .addSupport(PositionStatementSupport.getInstance()) - .addSupport(ValueStatementSupport.getInstance()) - .addSupport(StmtOrderingNamespace.BEHAVIOUR) - .build(); - - private static final Map RFC7950_BUNDLES = - ImmutableMap.builder() - .put(ModelProcessingPhase.INIT, INIT_BUNDLE) - .put(ModelProcessingPhase.SOURCE_PRE_LINKAGE, PRE_LINKAGE_BUNDLE) - .put(ModelProcessingPhase.SOURCE_LINKAGE, LINKAGE_BUNDLE) - .put(ModelProcessingPhase.STATEMENT_DEFINITION, STMT_DEF_BUNDLE) - .put(ModelProcessingPhase.FULL_DECLARATION, FULL_DECL_BUNDLE) - .put(ModelProcessingPhase.EFFECTIVE_MODEL, FULL_DECL_BUNDLE) - .build(); - - private static final Map> RFC6020_VALIDATION_BUNDLE = - ImmutableMap.>builder() - .put(ValidationBundleType.SUPPORTED_REFINE_SUBSTATEMENTS, - YangValidationBundles.SUPPORTED_REFINE_SUBSTATEMENTS) - .put(ValidationBundleType.SUPPORTED_AUGMENT_TARGETS, YangValidationBundles.SUPPORTED_AUGMENT_TARGETS) - .put(ValidationBundleType.SUPPORTED_CASE_SHORTHANDS, YangValidationBundles.SUPPORTED_CASE_SHORTHANDS) - .put(ValidationBundleType.SUPPORTED_DATA_NODES, YangValidationBundles.SUPPORTED_DATA_NODES) - .build(); - - private static final CrossSourceStatementReactor DEFAULT_RFC6020_RFC7950_REACTOR = defaultReactorBuilder().build(); - private static final CrossSourceStatementReactor VANILLA_RFC6020_RFC7950_REACTOR = vanillaReactorBuilder().build(); private RFC7950Reactors() { - throw new UnsupportedOperationException(); + // Hidden on purpose } /** @@ -339,8 +276,8 @@ public final class RFC7950Reactors { * * @return A shared reactor instance. */ - public static CrossSourceStatementReactor defaultReactor() { - return DEFAULT_RFC6020_RFC7950_REACTOR; + public static @NonNull CrossSourceStatementReactor defaultReactor() { + return ServiceLoaderState.DefaultReactor.INSTANCE; } /** @@ -349,8 +286,18 @@ public final class RFC7950Reactors { * * @return A new {@link CustomCrossSourceStatementReactorBuilder}. */ - public static CustomCrossSourceStatementReactorBuilder defaultReactorBuilder() { - return vanillaReactorBuilder() + public static @NonNull CustomCrossSourceStatementReactorBuilder defaultReactorBuilder() { + return addExtensions(vanillaReactorBuilder()); + } + + public static @NonNull CustomCrossSourceStatementReactorBuilder defaultReactorBuilder( + final YangXPathParserFactory xpathFactory) { + return addExtensions(vanillaReactorBuilder(xpathFactory)); + } + + private static @NonNull CustomCrossSourceStatementReactorBuilder addExtensions( + final @NonNull CustomCrossSourceStatementReactorBuilder builder) { + return builder // Semantic version support .addStatementSupport(ModelProcessingPhase.SOURCE_LINKAGE, OpenConfigVersionSupport.getInstance()) .addNamespaceSupport(ModelProcessingPhase.SOURCE_LINKAGE, SemanticVersionNamespace.BEHAVIOUR) @@ -366,8 +313,8 @@ public final class RFC7950Reactors { * * @return A shared reactor instance. */ - public static CrossSourceStatementReactor vanillaReactor() { - return VANILLA_RFC6020_RFC7950_REACTOR; + public static @NonNull CrossSourceStatementReactor vanillaReactor() { + return ServiceLoaderState.VanillaReactor.INSTANCE; } /** @@ -376,15 +323,76 @@ public final class RFC7950Reactors { * * @return A new {@link CustomCrossSourceStatementReactorBuilder}. */ - public static CustomCrossSourceStatementReactorBuilder vanillaReactorBuilder() { - return addDefaultRFC7950Bundles(new CustomCrossSourceStatementReactorBuilder(SUPPORTED_VERSIONS)); + public static @NonNull CustomCrossSourceStatementReactorBuilder vanillaReactorBuilder() { + return vanillaReactorBuilder(ServiceLoaderState.XPath.INSTANCE); + } + + public static @NonNull CustomCrossSourceStatementReactorBuilder vanillaReactorBuilder( + final @NonNull YangXPathParserFactory xpathFactory) { + return vanillaReactorBuilder(new XPathSupport(xpathFactory)); + } + + private static @NonNull CustomCrossSourceStatementReactorBuilder vanillaReactorBuilder( + final @NonNull XPathSupport xpathSupport) { + final StatementSupportBundle fullDeclarationBundle = fullDeclarationBundle(xpathSupport); + return new CustomCrossSourceStatementReactorBuilder(SUPPORTED_VERSIONS) + .addAllSupports(ModelProcessingPhase.INIT, INIT_BUNDLE) + .addAllSupports(ModelProcessingPhase.SOURCE_PRE_LINKAGE, PRE_LINKAGE_BUNDLE) + .addAllSupports(ModelProcessingPhase.SOURCE_LINKAGE, LINKAGE_BUNDLE) + .addAllSupports(ModelProcessingPhase.STATEMENT_DEFINITION, STMT_DEF_BUNDLE) + .addAllSupports(ModelProcessingPhase.FULL_DECLARATION, fullDeclarationBundle) + .addAllSupports(ModelProcessingPhase.EFFECTIVE_MODEL, fullDeclarationBundle) + .addValidationBundle(ValidationBundleType.SUPPORTED_REFINE_SUBSTATEMENTS, + YangValidationBundles.SUPPORTED_REFINE_SUBSTATEMENTS) + .addValidationBundle(ValidationBundleType.SUPPORTED_AUGMENT_TARGETS, + YangValidationBundles.SUPPORTED_AUGMENT_TARGETS) + + // FIXME: 7.0.0: we do not seem to need this validation bundle + .addValidationBundle(ValidationBundleType.SUPPORTED_CASE_SHORTHANDS, + YangValidationBundles.SUPPORTED_CASE_SHORTHANDS) + + .addValidationBundle(ValidationBundleType.SUPPORTED_DATA_NODES, + YangValidationBundles.SUPPORTED_DATA_NODES); } - private static CustomCrossSourceStatementReactorBuilder addDefaultRFC7950Bundles( - final CustomCrossSourceStatementReactorBuilder builder) { - RFC7950_BUNDLES.entrySet().forEach(entry -> builder.addAllSupports(entry.getKey(), entry.getValue())); - RFC6020_VALIDATION_BUNDLE.entrySet().forEach( - entry -> builder.addValidationBundle(entry.getKey(), entry.getValue())); - return builder; + private static @NonNull StatementSupportBundle fullDeclarationBundle(final XPathSupport xpathSupport) { + return StatementSupportBundle + .derivedFrom(STMT_DEF_BUNDLE) + .addSupport(LeafStatementSupport.getInstance()) + .addSupport(ConfigStatementSupport.getInstance()) + .addSupport(DeviationStatementSupport.getInstance()) + .addVersionSpecificSupport(VERSION_1, DeviateStatementRFC6020Support.getInstance()) + .addVersionSpecificSupport(VERSION_1_1, DeviateStatementRFC7950Support.getInstance()) + .addVersionSpecificSupport(VERSION_1, ChoiceStatementRFC6020Support.getInstance()) + .addVersionSpecificSupport(VERSION_1_1, ChoiceStatementRFC7950Support.getInstance()) + .addVersionSpecificSupport(VERSION_1, CaseStatementRFC6020Support.getInstance()) + .addVersionSpecificSupport(VERSION_1_1, CaseStatementRFC7950Support.getInstance()) + .addSupport(MustStatementSupport.createInstance(xpathSupport)) + .addSupport(MandatoryStatementSupport.getInstance()) + .addSupport(AnyxmlStatementSupport.getInstance()) + .addVersionSpecificSupport(VERSION_1_1, AnydataStatementSupport.getInstance()) + .addSupport(FeatureNamespace.BEHAVIOUR) + .addSupport(IfFeatureStatementSupport.getInstance()) + .addSupport(UsesStatementSupport.getInstance()) + .addSupport(GroupingNamespace.BEHAVIOUR) + .addSupport(ErrorMessageStatementSupport.getInstance()) + .addSupport(ErrorAppTagStatementSupport.getInstance()) + .addVersionSpecificSupport(VERSION_1, LeafListStatementRFC6020Support.getInstance()) + .addVersionSpecificSupport(VERSION_1_1, LeafListStatementRFC7950Support.getInstance()) + .addSupport(PresenceStatementSupport.getInstance()) + .addSupport(MaxElementsStatementSupport.getInstance()) + .addSupport(MinElementsStatementSupport.getInstance()) + .addSupport(OrderedByStatementSupport.getInstance()) + .addSupport(WhenStatementSupport.createInstance(xpathSupport)) + .addSupport(AugmentImplicitHandlingNamespace.BEHAVIOUR) + .addVersionSpecificSupport(VERSION_1, AugmentStatementRFC6020Support.getInstance()) + .addVersionSpecificSupport(VERSION_1_1, AugmentStatementRFC7950Support.getInstance()) + .addVersionSpecificSupport(VERSION_1, RefineStatementRFC6020Support.getInstance()) + .addVersionSpecificSupport(VERSION_1_1, RefineStatementRFC7950Support.getInstance()) + .addSupport(FeatureStatementSupport.getInstance()) + .addSupport(PositionStatementSupport.getInstance()) + .addSupport(ValueStatementSupport.getInstance()) + .addSupport(YangNamespaceContextNamespace.BEHAVIOUR) + .build(); } }