Refactor mdsal-binding-generator artifacts
[mdsal.git] / binding / mdsal-binding-generator / src / main / java / org / opendaylight / mdsal / binding / generator / impl / reactor / OperationContainerGenerator.java
diff --git a/binding/mdsal-binding-generator/src/main/java/org/opendaylight/mdsal/binding/generator/impl/reactor/OperationContainerGenerator.java b/binding/mdsal-binding-generator/src/main/java/org/opendaylight/mdsal/binding/generator/impl/reactor/OperationContainerGenerator.java
new file mode 100644 (file)
index 0000000..d9dc18a
--- /dev/null
@@ -0,0 +1,79 @@
+/*
+ * Copyright (c) 2021 PANTHEON.tech, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.mdsal.binding.generator.impl.reactor;
+
+import org.opendaylight.mdsal.binding.model.api.ConcreteType;
+import org.opendaylight.mdsal.binding.model.api.GeneratedType;
+import org.opendaylight.mdsal.binding.model.api.type.builder.GeneratedTypeBuilder;
+import org.opendaylight.mdsal.binding.model.ri.Types;
+import org.opendaylight.yangtools.yang.binding.RpcInput;
+import org.opendaylight.yangtools.yang.binding.RpcOutput;
+import org.opendaylight.yangtools.yang.model.api.stmt.InputEffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.OutputEffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.SchemaTreeEffectiveStatement;
+import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack;
+
+/**
+ * Generator corresponding to an {@code input} or an {@code output} statement.
+ */
+class OperationContainerGenerator extends AbstractCompositeGenerator<SchemaTreeEffectiveStatement<?>> {
+    private static final ConcreteType RPC_INPUT = Types.typeForClass(RpcInput.class);
+    private static final ConcreteType RPC_OUTPUT = Types.typeForClass(RpcOutput.class);
+
+    private final ConcreteType baseInterface;
+
+    OperationContainerGenerator(final InputEffectiveStatement statement, final AbstractCompositeGenerator<?> parent) {
+        super(statement, parent);
+        baseInterface = RPC_INPUT;
+    }
+
+    OperationContainerGenerator(final OutputEffectiveStatement statement, final AbstractCompositeGenerator<?> parent) {
+        super(statement, parent);
+        baseInterface = RPC_OUTPUT;
+    }
+
+    @Override
+    final void pushToInference(final SchemaInferenceStack dataTree) {
+        dataTree.enterSchemaTree(statement().getIdentifier());
+    }
+
+    @Override
+    final GeneratedType createTypeImpl(final TypeBuilderFactory builderFactory) {
+        final AbstractCompositeGenerator<?> parent = getParent();
+        if (parent instanceof ActionGenerator && ((ActionGenerator) parent).isAddedByUses()) {
+            //        final ActionDefinition orig = findOrigAction(parentSchema, action).get();
+            //        // Original definition may live in a different module, make sure we account for that
+            //        final ModuleContext origContext = moduleContext(
+            //            orig.getPath().getPathFromRoot().iterator().next().getModule());
+            //        input = context.addAliasType(origContext, orig.getInput(), action.getInput());
+            //        output = context.addAliasType(origContext, orig.getOutput(), action.getOutput());
+
+            throw new UnsupportedOperationException("Lookup in original");
+        }
+
+        final GeneratedTypeBuilder builder = builderFactory.newGeneratedTypeBuilder(typeName());
+        builder.addImplementsType(baseInterface);
+        addAugmentable(builder);
+
+        addUsesInterfaces(builder, builderFactory);
+        addConcreteInterfaceMethods(builder);
+        addGetterMethods(builder, builderFactory);
+
+        final ModuleGenerator module = currentModule();
+        module.addQNameConstant(builder, localName());
+
+        annotateDeprecatedIfNecessary(builder);
+        if (builderFactory instanceof TypeBuilderFactory.Codegen) {
+            addCodegenInformation(module, statement(), builder);
+        }
+//                builder.setSchemaPath(schemaNode.getPath());
+        builder.setModuleName(module.statement().argument().getLocalName());
+
+        return builder.build();
+    }
+}