*/
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);
+ }
+ };
}
}