Override Rpc/Action invoke method
[mdsal.git] / binding / mdsal-binding-generator / src / main / java / org / opendaylight / mdsal / binding / generator / impl / reactor / RpcGenerator.java
index a79d27f3a3e07f366b702a530727548bbb11aa16..c431fb355b9bbef8da8260c9f92dbef808a6649a 100644 (file)
@@ -7,37 +7,55 @@
  */
 package org.opendaylight.mdsal.binding.generator.impl.reactor;
 
+import java.util.List;
+import org.opendaylight.mdsal.binding.generator.impl.rt.DefaultRpcRuntimeType;
 import org.opendaylight.mdsal.binding.model.api.GeneratedType;
-import org.opendaylight.mdsal.binding.model.api.type.builder.GeneratedTypeBuilderBase;
+import org.opendaylight.mdsal.binding.model.api.type.builder.GeneratedTypeBuilder;
+import org.opendaylight.mdsal.binding.model.ri.BindingTypes;
+import org.opendaylight.mdsal.binding.model.ri.Types;
+import org.opendaylight.mdsal.binding.runtime.api.RpcRuntimeType;
+import org.opendaylight.mdsal.binding.runtime.api.RuntimeType;
+import org.opendaylight.yangtools.yang.binding.contract.Naming;
+import org.opendaylight.yangtools.yang.binding.contract.StatementNamespace;
 import org.opendaylight.yangtools.yang.model.api.stmt.RpcEffectiveStatement;
-import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack;
 
 /**
  * Generator corresponding to a {@code rpc} statement.
  */
-final class RpcGenerator extends AbstractCompositeGenerator<RpcEffectiveStatement> {
-    RpcGenerator(final RpcEffectiveStatement statement, final AbstractCompositeGenerator<?> parent) {
+final class RpcGenerator extends AbstractInvokableGenerator<RpcEffectiveStatement, RpcRuntimeType> {
+    RpcGenerator(final RpcEffectiveStatement statement, final ModuleGenerator parent) {
         super(statement, parent);
     }
 
     @Override
-    void pushToInference(final SchemaInferenceStack dataTree) {
-        dataTree.enterSchemaTree(statement().argument());
+    StatementNamespace namespace() {
+        return StatementNamespace.RPC;
     }
 
     @Override
-    // FIXME: switch to the same thing we are using for 'action'
     ClassPlacement classPlacement() {
-        return ClassPlacement.PHANTOM;
+        return ClassPlacement.TOP_LEVEL;
     }
 
     @Override
-    GeneratedType createTypeImpl(final TypeBuilderFactory builderFactory) {
-        throw new UnsupportedOperationException();
+    void addImplementedType(final TypeBuilderFactory builderFactory, final GeneratedTypeBuilder builder,
+            final GeneratedType input, final GeneratedType output) {
+        builder.addImplementsType(BindingTypes.rpc(input, output));
+        builder.addMethod(Naming.RPC_INVOKE_NAME).setAbstract(true)
+            .addParameter(input, "input")
+            .setReturnType(Types.listenableFutureTypeFor(BindingTypes.rpcResult(output)))
+            .addAnnotation(OVERRIDE_ANNOTATION);
     }
 
     @Override
-    void addAsGetterMethod(final GeneratedTypeBuilderBase<?> builder, final TypeBuilderFactory builderFactory) {
-        // RPCs are a separate concept
+    CompositeRuntimeTypeBuilder<RpcEffectiveStatement, RpcRuntimeType> createBuilder(
+            final RpcEffectiveStatement statement) {
+        return new InvokableRuntimeTypeBuilder<>(statement) {
+            @Override
+            RpcRuntimeType build(final GeneratedType generatedType, final RpcEffectiveStatement statement,
+                    final List<RuntimeType> childTypes) {
+                return new DefaultRpcRuntimeType(generatedType, statement, childTypes);
+            }
+        };
     }
 }