Unify GeneratedType verification
[mdsal.git] / binding / mdsal-binding-generator / src / main / java / org / opendaylight / mdsal / binding / generator / impl / reactor / OpaqueObjectGenerator.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 org.eclipse.jdt.annotation.NonNull;
11 import org.opendaylight.mdsal.binding.generator.impl.rt.DefaultAnydataRuntimeType;
12 import org.opendaylight.mdsal.binding.generator.impl.rt.DefaultAnyxmlRuntimeType;
13 import org.opendaylight.mdsal.binding.model.api.GeneratedType;
14 import org.opendaylight.mdsal.binding.model.api.Type;
15 import org.opendaylight.mdsal.binding.model.api.type.builder.GeneratedTypeBuilderBase;
16 import org.opendaylight.mdsal.binding.model.ri.BindingTypes;
17 import org.opendaylight.mdsal.binding.runtime.api.AnydataRuntimeType;
18 import org.opendaylight.mdsal.binding.runtime.api.AnyxmlRuntimeType;
19 import org.opendaylight.mdsal.binding.runtime.api.OpaqueRuntimeType;
20 import org.opendaylight.yangtools.yang.binding.contract.StatementNamespace;
21 import org.opendaylight.yangtools.yang.model.api.stmt.AnydataEffectiveStatement;
22 import org.opendaylight.yangtools.yang.model.api.stmt.AnyxmlEffectiveStatement;
23 import org.opendaylight.yangtools.yang.model.api.stmt.DataTreeEffectiveStatement;
24 import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack;
25
26 /**
27  * Common generator for {@code anydata} and {@code anyxml}.
28  */
29 abstract class OpaqueObjectGenerator<S extends DataTreeEffectiveStatement<?>, R extends OpaqueRuntimeType>
30         extends AbstractExplicitGenerator<S, R> {
31     static final class Anydata extends OpaqueObjectGenerator<AnydataEffectiveStatement, AnydataRuntimeType> {
32         Anydata(final AnydataEffectiveStatement statement, final AbstractCompositeGenerator<?, ?> parent) {
33             super(statement, parent);
34         }
35
36         @Override
37         StatementNamespace namespace() {
38             return StatementNamespace.ANYDATA;
39         }
40
41         @Override
42         AnydataRuntimeType createExternalRuntimeType(final GeneratedType type) {
43             return new DefaultAnydataRuntimeType(type, statement());
44         }
45
46         @Override
47         AnydataRuntimeType createInternalRuntimeType(final AnydataEffectiveStatement statement,
48                 final GeneratedType type) {
49             return new DefaultAnydataRuntimeType(type, statement);
50         }
51     }
52
53     static final class Anyxml extends OpaqueObjectGenerator<AnyxmlEffectiveStatement, AnyxmlRuntimeType> {
54         Anyxml(final AnyxmlEffectiveStatement statement, final AbstractCompositeGenerator<?, ?> parent) {
55             super(statement, parent);
56         }
57
58         @Override
59         StatementNamespace namespace() {
60             return StatementNamespace.ANYXML;
61         }
62
63         @Override
64         AnyxmlRuntimeType createExternalRuntimeType(final GeneratedType type) {
65             return new DefaultAnyxmlRuntimeType(type, statement());
66         }
67
68         @Override
69         AnyxmlRuntimeType createInternalRuntimeType(final AnyxmlEffectiveStatement statement,
70                 final GeneratedType type) {
71             return new DefaultAnyxmlRuntimeType(type, statement);
72         }
73     }
74
75     OpaqueObjectGenerator(final S statement, final AbstractCompositeGenerator<?, ?> parent) {
76         super(statement, parent);
77     }
78
79     @Override
80     void pushToInference(final SchemaInferenceStack dataTree) {
81         dataTree.enterDataTree(statement().argument());
82     }
83
84     @Override
85     GeneratedType createTypeImpl(final TypeBuilderFactory builderFactory) {
86         final var builder = builderFactory.newGeneratedTypeBuilder(typeName());
87         builder.addImplementsType(BindingTypes.opaqueObject(builder));
88         addImplementsChildOf(builder);
89         defaultImplementedInterace(builder);
90         annotateDeprecatedIfNecessary(builder);
91
92         final var module = currentModule();
93         module.addQNameConstant(builder, localName());
94
95         builderFactory.addCodegenInformation(module, statement(), builder);
96         builder.setModuleName(module.statement().argument().getLocalName());
97 //        newType.setSchemaPath(schemaNode.getPath());
98
99         return builder.build();
100     }
101
102     @Override
103     void constructRequire(final GeneratedTypeBuilderBase<?> builder, final Type returnType) {
104         constructRequireImpl(builder, returnType);
105     }
106
107     @Override
108     final R createExternalRuntimeType(final Type type) {
109         return createExternalRuntimeType(verifyGeneratedType(type));
110     }
111
112     abstract @NonNull R createExternalRuntimeType(@NonNull GeneratedType type);
113
114     @Override
115     final R createInternalRuntimeType(final AugmentResolver resolver, final S statement, final Type type) {
116         return createInternalRuntimeType(statement, verifyGeneratedType(type));
117     }
118
119     abstract @NonNull R createInternalRuntimeType(@NonNull S statement, @NonNull GeneratedType type);
120 }