Rework BindingRuntimeTypes
[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 java.util.Set;
14 import org.opendaylight.mdsal.binding.generator.impl.reactor.CollisionDomain.Member;
15 import org.opendaylight.mdsal.binding.generator.impl.rt.DefaultKeyRuntimeType;
16 import org.opendaylight.mdsal.binding.model.api.GeneratedTransferObject;
17 import org.opendaylight.mdsal.binding.model.api.Type;
18 import org.opendaylight.mdsal.binding.model.api.type.builder.GeneratedPropertyBuilder;
19 import org.opendaylight.mdsal.binding.model.api.type.builder.GeneratedTOBuilder;
20 import org.opendaylight.mdsal.binding.model.api.type.builder.GeneratedTypeBuilderBase;
21 import org.opendaylight.mdsal.binding.model.ri.BindingTypes;
22 import org.opendaylight.mdsal.binding.runtime.api.KeyRuntimeType;
23 import org.opendaylight.mdsal.binding.spec.naming.BindingMapping;
24 import org.opendaylight.yangtools.yang.common.QName;
25 import org.opendaylight.yangtools.yang.model.api.stmt.KeyEffectiveStatement;
26 import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack;
27
28 final class KeyGenerator extends AbstractExplicitGenerator<KeyEffectiveStatement, KeyRuntimeType> {
29     private final ListGenerator listGen;
30
31     KeyGenerator(final KeyEffectiveStatement statement, final AbstractCompositeGenerator<?, ?> parent,
32             final ListGenerator listGen) {
33         super(statement, parent);
34         this.listGen = requireNonNull(listGen);
35     }
36
37     @Override
38     void pushToInference(final SchemaInferenceStack inferenceStack) {
39         throw new UnsupportedOperationException();
40     }
41
42     @Override
43     Member createMember(final CollisionDomain domain) {
44         return domain.addSecondary(this, listGen.getMember(), BindingMapping.KEY_SUFFIX);
45     }
46
47     @Override
48     GeneratedTransferObject createTypeImpl(final TypeBuilderFactory builderFactory) {
49         final GeneratedTOBuilder builder = builderFactory.newGeneratedTOBuilder(typeName());
50
51         builder.addImplementsType(BindingTypes.identifier(Type.of(listGen.typeName())));
52
53         final Set<QName> leafNames = statement().argument();
54         for (Generator listChild : listGen) {
55             if (listChild instanceof LeafGenerator) {
56                 final LeafGenerator leafGen = (LeafGenerator) listChild;
57                 final QName qname = leafGen.statement().argument();
58                 if (leafNames.contains(qname)) {
59                     final GeneratedPropertyBuilder prop = builder
60                         .addProperty(BindingMapping.getPropertyName(qname.getLocalName()))
61                         .setReturnType(leafGen.methodReturnType(builderFactory))
62                         .setReadOnly(true);
63
64 //                    addComment(propBuilder, leaf);
65
66                     builder.addEqualsIdentity(prop);
67                     builder.addHashIdentity(prop);
68                     builder.addToStringProperty(prop);
69                 }
70             }
71         }
72
73         // serialVersionUID
74         addSerialVersionUID(builder);
75
76         return builder.build();
77     }
78
79     @Override
80     KeyRuntimeType createRuntimeType() {
81         return generatedType().map(type -> {
82             verify(type instanceof GeneratedTransferObject, "Unexpected type %s", type);
83             return new DefaultKeyRuntimeType((GeneratedTransferObject) type, statement());
84         }).orElse(null);
85     }
86
87     @Override
88     KeyRuntimeType rebaseRuntimeType(final KeyRuntimeType type, final KeyEffectiveStatement statement) {
89         return new DefaultKeyRuntimeType(type.javaType(), statement);
90     }
91
92     @Override
93     void addAsGetterMethod(final GeneratedTypeBuilderBase<?> builder, final TypeBuilderFactory builderFactory) {
94         // Keys are explicitly handled by their corresponding list
95     }
96 }