Move StatementNamespace to yang.binding.contract
[mdsal.git] / binding / mdsal-binding-generator / src / main / java / org / opendaylight / mdsal / binding / generator / impl / reactor / KeyGenerator.java
1 /*
2  * Copyright (c) 2021 PANTHEON.tech, s.r.o. and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.mdsal.binding.generator.impl.reactor;
9
10 import static com.google.common.base.Verify.verify;
11 import static java.util.Objects.requireNonNull;
12
13 import org.opendaylight.mdsal.binding.generator.impl.reactor.CollisionDomain.Member;
14 import org.opendaylight.mdsal.binding.generator.impl.rt.DefaultKeyRuntimeType;
15 import org.opendaylight.mdsal.binding.model.api.GeneratedTransferObject;
16 import org.opendaylight.mdsal.binding.model.api.Type;
17 import org.opendaylight.mdsal.binding.model.api.type.builder.GeneratedTypeBuilderBase;
18 import org.opendaylight.mdsal.binding.model.ri.BindingTypes;
19 import org.opendaylight.mdsal.binding.runtime.api.KeyRuntimeType;
20 import org.opendaylight.yangtools.yang.binding.contract.Naming;
21 import org.opendaylight.yangtools.yang.binding.contract.StatementNamespace;
22 import org.opendaylight.yangtools.yang.common.QName;
23 import org.opendaylight.yangtools.yang.model.api.stmt.KeyEffectiveStatement;
24 import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack;
25
26 final class KeyGenerator extends AbstractExplicitGenerator<KeyEffectiveStatement, KeyRuntimeType> {
27     private final ListGenerator listGen;
28
29     KeyGenerator(final KeyEffectiveStatement statement, final AbstractCompositeGenerator<?, ?> parent,
30             final ListGenerator listGen) {
31         super(statement, parent);
32         this.listGen = requireNonNull(listGen);
33     }
34
35     @Override
36     StatementNamespace namespace() {
37         return StatementNamespace.KEY;
38     }
39
40     @Override
41     void pushToInference(final SchemaInferenceStack inferenceStack) {
42         throw new UnsupportedOperationException();
43     }
44
45     @Override
46     Member createMember(final CollisionDomain domain) {
47         return domain.addSecondary(this, listGen.getMember(), Naming.KEY_SUFFIX);
48     }
49
50     @Override
51     GeneratedTransferObject createTypeImpl(final TypeBuilderFactory builderFactory) {
52         final var builder = builderFactory.newGeneratedTOBuilder(typeName());
53
54         builder.addImplementsType(BindingTypes.key(Type.of(listGen.typeName())));
55
56         final var leafNames = statement().argument();
57         for (var listChild : listGen) {
58             if (listChild instanceof LeafGenerator leafGen) {
59                 final QName qname = leafGen.statement().argument();
60                 if (leafNames.contains(qname)) {
61                     final var prop = builder
62                         .addProperty(Naming.getPropertyName(qname.getLocalName()))
63                         .setReturnType(leafGen.methodReturnType(builderFactory))
64                         .setReadOnly(true);
65
66 //                    addComment(propBuilder, leaf);
67
68                     builder.addEqualsIdentity(prop);
69                     builder.addHashIdentity(prop);
70                     builder.addToStringProperty(prop);
71                 }
72             }
73         }
74
75         // serialVersionUID
76         addSerialVersionUID(builder);
77
78         return builder.build();
79     }
80
81     @Override
82     KeyRuntimeType createExternalRuntimeType(final Type type) {
83         verify(type instanceof GeneratedTransferObject, "Unexpected type %s", type);
84         return new DefaultKeyRuntimeType((GeneratedTransferObject) type, statement());
85     }
86
87     @Override
88     KeyRuntimeType createInternalRuntimeType(final AugmentResolver resolver, final KeyEffectiveStatement statement,
89             final Type type) {
90         // The only reference to this runtime type is from ListGenerator which is always referencing the external type
91         throw new UnsupportedOperationException("Should never be called");
92     }
93
94     @Override
95     void addAsGetterMethod(final GeneratedTypeBuilderBase<?> builder, final TypeBuilderFactory builderFactory) {
96         // Keys are explicitly handled by their corresponding list
97     }
98 }