2 * Copyright (c) 2021 PANTHEON.tech, s.r.o. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.mdsal.binding.generator.impl.reactor;
10 import static java.util.Objects.requireNonNull;
12 import java.util.List;
13 import org.eclipse.jdt.annotation.NonNull;
14 import org.opendaylight.mdsal.binding.generator.impl.reactor.CollisionDomain.Member;
15 import org.opendaylight.mdsal.binding.generator.impl.rt.DefaultYangDataRuntimeType;
16 import org.opendaylight.mdsal.binding.model.api.GeneratedType;
17 import org.opendaylight.mdsal.binding.model.api.type.builder.GeneratedTypeBuilder;
18 import org.opendaylight.mdsal.binding.model.api.type.builder.GeneratedTypeBuilderBase;
19 import org.opendaylight.mdsal.binding.model.ri.BindingTypes;
20 import org.opendaylight.mdsal.binding.runtime.api.AugmentRuntimeType;
21 import org.opendaylight.mdsal.binding.runtime.api.RuntimeType;
22 import org.opendaylight.mdsal.binding.runtime.api.YangDataRuntimeType;
23 import org.opendaylight.yangtools.rfc8040.model.api.YangDataEffectiveStatement;
24 import org.opendaylight.yangtools.yang.common.UnresolvedQName;
25 import org.opendaylight.yangtools.yang.common.UnresolvedQName.Unqualified;
26 import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack;
29 * Generator corresponding to a {@code rc:yang-data} statement.
31 abstract sealed class YangDataGenerator
32 extends AbstractCompositeGenerator<YangDataEffectiveStatement, YangDataRuntimeType> {
33 private static final class WithIdentifier extends YangDataGenerator {
34 private final @NonNull Unqualified identifier;
36 WithIdentifier(final YangDataEffectiveStatement statement, final ModuleGenerator parent,
37 final Unqualified identifier) {
38 super(statement, parent);
39 this.identifier = requireNonNull(identifier);
43 CamelCaseNamingStrategy createNamingStrategy() {
44 return new CamelCaseNamingStrategy(namespace(), identifier);
48 private static final class WithString extends YangDataGenerator {
49 WithString(final YangDataEffectiveStatement statement, final ModuleGenerator parent) {
50 super(statement, parent);
54 YangDataNamingStrategy createNamingStrategy() {
55 return new YangDataNamingStrategy(statement().argument());
59 private YangDataGenerator(final YangDataEffectiveStatement statement, final ModuleGenerator parent) {
60 super(statement, parent);
63 static @NonNull YangDataGenerator of(final YangDataEffectiveStatement statement, final ModuleGenerator parent) {
64 // yang-data's argument is not guaranteed to comply with YANG 'identifier', but it usually does. If it does, we
65 // use the usual mechanics, but if it does not, we have to deal with any old string, similar to what we do for
66 // bit names. Here we decide which path to take.
67 final String templateName = statement.argument().name();
68 final var identifier = UnresolvedQName.tryLocalName(templateName);
69 return identifier != null ? new WithIdentifier(statement, parent, identifier)
70 : new WithString(statement, parent);
74 final void pushToInference(final SchemaInferenceStack dataTree) {
75 dataTree.enterYangData(statement().argument());
79 final ClassPlacement classPlacement() {
80 return ClassPlacement.TOP_LEVEL;
84 final Member createMember(final CollisionDomain domain) {
85 return domain.addPrimary(this, createNamingStrategy());
88 abstract @NonNull ClassNamingStrategy createNamingStrategy();
91 final StatementNamespace namespace() {
92 return StatementNamespace.YANG_DATA;
96 final GeneratedType createTypeImpl(final TypeBuilderFactory builderFactory) {
97 final GeneratedTypeBuilder builder = builderFactory.newGeneratedTypeBuilder(typeName());
99 builder.addImplementsType(BindingTypes.yangData(builder));
100 addUsesInterfaces(builder, builderFactory);
101 addConcreteInterfaceMethods(builder);
103 addGetterMethods(builder, builderFactory);
105 final var module = currentModule();
106 module.addNameConstant(builder, statement().argument());
108 builder.setModuleName(module.statement().argument().getLocalName());
109 builderFactory.addCodegenInformation(module, statement(), builder);
111 return builder.build();
115 final CompositeRuntimeTypeBuilder<YangDataEffectiveStatement, YangDataRuntimeType> createBuilder(
116 final YangDataEffectiveStatement statement) {
117 return new CompositeRuntimeTypeBuilder<>(statement) {
119 YangDataRuntimeType build(final GeneratedType type, final YangDataEffectiveStatement statement,
120 final List<RuntimeType> children, final List<AugmentRuntimeType> augments) {
121 return new DefaultYangDataRuntimeType(type, statement, children);
127 final void addAsGetterMethod(final GeneratedTypeBuilderBase<?> builder, final TypeBuilderFactory builderFactory) {
128 // is not a part of any structure