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.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;
28 final class KeyGenerator extends AbstractExplicitGenerator<KeyEffectiveStatement, KeyRuntimeType> {
29 private final ListGenerator listGen;
31 KeyGenerator(final KeyEffectiveStatement statement, final AbstractCompositeGenerator<?, ?> parent,
32 final ListGenerator listGen) {
33 super(statement, parent);
34 this.listGen = requireNonNull(listGen);
38 void pushToInference(final SchemaInferenceStack inferenceStack) {
39 throw new UnsupportedOperationException();
43 Member createMember(final CollisionDomain domain) {
44 return domain.addSecondary(this, listGen.getMember(), BindingMapping.KEY_SUFFIX);
48 GeneratedTransferObject createTypeImpl(final TypeBuilderFactory builderFactory) {
49 final GeneratedTOBuilder builder = builderFactory.newGeneratedTOBuilder(typeName());
51 builder.addImplementsType(BindingTypes.identifier(Type.of(listGen.typeName())));
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))
64 // addComment(propBuilder, leaf);
66 builder.addEqualsIdentity(prop);
67 builder.addHashIdentity(prop);
68 builder.addToStringProperty(prop);
74 addSerialVersionUID(builder);
76 return builder.build();
80 KeyRuntimeType createRuntimeType() {
81 return generatedType().map(type -> {
82 verify(type instanceof GeneratedTransferObject, "Unexpected type %s", type);
83 return new DefaultKeyRuntimeType((GeneratedTransferObject) type, statement());
88 KeyRuntimeType rebaseRuntimeType(final KeyRuntimeType type, final KeyEffectiveStatement statement) {
89 return new DefaultKeyRuntimeType(type.javaType(), statement);
93 void addAsGetterMethod(final GeneratedTypeBuilderBase<?> builder, final TypeBuilderFactory builderFactory) {
94 // Keys are explicitly handled by their corresponding list