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 com.google.common.base.Verify.verify;
11 import static java.util.Objects.requireNonNull;
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.GeneratedType;
18 import org.opendaylight.mdsal.binding.model.api.Type;
19 import org.opendaylight.mdsal.binding.model.api.type.builder.GeneratedPropertyBuilder;
20 import org.opendaylight.mdsal.binding.model.api.type.builder.GeneratedTOBuilder;
21 import org.opendaylight.mdsal.binding.model.api.type.builder.GeneratedTypeBuilderBase;
22 import org.opendaylight.mdsal.binding.model.ri.BindingTypes;
23 import org.opendaylight.mdsal.binding.runtime.api.KeyRuntimeType;
24 import org.opendaylight.mdsal.binding.spec.naming.BindingMapping;
25 import org.opendaylight.yangtools.yang.common.QName;
26 import org.opendaylight.yangtools.yang.model.api.stmt.KeyEffectiveStatement;
27 import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack;
29 final class KeyGenerator extends AbstractExplicitGenerator<KeyEffectiveStatement, KeyRuntimeType> {
30 private final ListGenerator listGen;
32 KeyGenerator(final KeyEffectiveStatement statement, final AbstractCompositeGenerator<?, ?> parent,
33 final ListGenerator listGen) {
34 super(statement, parent);
35 this.listGen = requireNonNull(listGen);
39 void pushToInference(final SchemaInferenceStack inferenceStack) {
40 throw new UnsupportedOperationException();
44 Member createMember(final CollisionDomain domain) {
45 return domain.addSecondary(this, listGen.getMember(), BindingMapping.KEY_SUFFIX);
49 GeneratedTransferObject createTypeImpl(final TypeBuilderFactory builderFactory) {
50 final GeneratedTOBuilder builder = builderFactory.newGeneratedTOBuilder(typeName());
52 builder.addImplementsType(BindingTypes.identifier(Type.of(listGen.typeName())));
54 final Set<QName> leafNames = statement().argument();
55 for (Generator listChild : listGen) {
56 if (listChild instanceof LeafGenerator) {
57 final LeafGenerator leafGen = (LeafGenerator) listChild;
58 final QName qname = leafGen.statement().argument();
59 if (leafNames.contains(qname)) {
60 final GeneratedPropertyBuilder prop = builder
61 .addProperty(BindingMapping.getPropertyName(qname.getLocalName()))
62 .setReturnType(leafGen.methodReturnType(builderFactory))
65 // addComment(propBuilder, leaf);
67 builder.addEqualsIdentity(prop);
68 builder.addHashIdentity(prop);
69 builder.addToStringProperty(prop);
75 addSerialVersionUID(builder);
77 return builder.build();
81 GeneratedType runtimeJavaType() {
82 return generatedType().orElse(null);
86 KeyRuntimeType createExternalRuntimeType(final Type type) {
87 verify(type instanceof GeneratedTransferObject, "Unexpected type %s", type);
88 return new DefaultKeyRuntimeType((GeneratedTransferObject) type, statement());
92 KeyRuntimeType createInternalRuntimeType(final ChildLookup lookup,final KeyEffectiveStatement statement,
94 // The only reference to this runtime type is from ListGenerator which is always referencing the external type
95 throw new UnsupportedOperationException("Should never be called");
99 void addAsGetterMethod(final GeneratedTypeBuilderBase<?> builder, final TypeBuilderFactory builderFactory) {
100 // Keys are explicitly handled by their corresponding list