4b6f415f721ed11248908db2e89be7a42776ffe7
[mdsal.git] / binding / mdsal-binding-generator / src / main / java / org / opendaylight / mdsal / binding / generator / impl / reactor / NotificationServiceGenerator.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.List;
14 import org.opendaylight.mdsal.binding.model.api.AccessModifier;
15 import org.opendaylight.mdsal.binding.model.api.GeneratedType;
16 import org.opendaylight.mdsal.binding.model.api.type.builder.GeneratedTypeBuilder;
17 import org.opendaylight.mdsal.binding.model.api.type.builder.MethodSignatureBuilder;
18 import org.opendaylight.mdsal.binding.model.ri.BindingTypes;
19 import org.opendaylight.mdsal.binding.model.ri.Types;
20 import org.opendaylight.mdsal.binding.spec.naming.BindingMapping;
21 import org.opendaylight.yangtools.yang.model.api.DocumentedNode.WithStatus;
22 import org.opendaylight.yangtools.yang.model.api.Status;
23 import org.opendaylight.yangtools.yang.model.api.stmt.NotificationEffectiveStatement;
24
25 final class NotificationServiceGenerator extends AbstractImplicitGenerator {
26     private final List<NotificationGenerator> notifs;
27
28     NotificationServiceGenerator(final ModuleGenerator parent, final List<NotificationGenerator> notifs) {
29         super(parent);
30         this.notifs = requireNonNull(notifs);
31     }
32
33     @Override
34     String classSuffix() {
35         return BindingMapping.NOTIFICATION_LISTENER_SUFFIX;
36     }
37
38     @Override
39     GeneratedType createTypeImpl(final TypeBuilderFactory builderFactory) {
40         final GeneratedTypeBuilder builder = builderFactory.newGeneratedTypeBuilder(typeName());
41         builder.addImplementsType(BindingTypes.NOTIFICATION_LISTENER);
42
43         for (NotificationGenerator gen : notifs) {
44             final MethodSignatureBuilder notificationMethod = builder.addMethod("on" + gen.assignedName())
45                 .setAccessModifier(AccessModifier.PUBLIC)
46                 .addParameter(gen.getGeneratedType(builderFactory), "notification")
47                 .setReturnType(Types.primitiveVoidType());
48
49             final NotificationEffectiveStatement stmt = gen.statement();
50             verify(stmt instanceof WithStatus, "Unexpected statement %s", stmt);
51             final WithStatus withStatus = (WithStatus) stmt;
52
53             annotateDeprecatedIfNecessary(withStatus, notificationMethod);
54             if (withStatus.getStatus() == Status.OBSOLETE) {
55                 notificationMethod.setDefault(true);
56             }
57
58             // FIXME: finish this up
59             // addComment(notificationMethod, notification);
60         }
61
62         return builder.build();
63     }
64 }