-
- // FIXME: This should be probably part of Binding Runtime context and RpcServices perhaps should have their own
- // RuntimeType
- ImmutableBiMap<Method, RpcRuntimeType> getRpcMethodToSchema(final Class<? extends RpcService> key) {
- final var runtimeContext = getRuntimeContext();
- final var types = runtimeContext.getTypes();
- final var qnameModule = BindingReflections.getQNameModule(key);
-
- // We are dancing a bit here to reconstruct things a RpcServiceRuntimeType could easily hold
- final var module = runtimeContext.getEffectiveModelContext().findModuleStatement(qnameModule)
- .orElseThrow(() -> new IllegalStateException("No module found for " + qnameModule + " service " + key));
- return module.streamEffectiveSubstatements(RpcEffectiveStatement.class)
- .map(rpc -> {
- final var rpcName = rpc.argument();
- final var inputClz = runtimeContext.getRpcInput(rpcName);
- final var methodName = BindingMapping.getRpcMethodName(rpcName);
-
- final Method method;
- try {
- method = key.getMethod(methodName, inputClz);
- } catch (NoSuchMethodException e) {
- throw new IllegalStateException("Cannot find RPC method for " + rpc, e);
- }
-
- final var type = types.schemaTreeChild(rpcName);
- if (!(type instanceof RpcRuntimeType rpcType)) {
- throw new IllegalStateException("Unexpected run-time type " + type + " for " + rpcName);
- }
- return Map.entry(method, rpcType);
- })
- .collect(ImmutableBiMap.toImmutableBiMap(Entry::getKey, Entry::getValue));
- }
-
- // FIXME: This should be probably part of Binding Runtime context
- ImmutableBiMap<Method, QName> getRpcMethodToQName(final Class<? extends RpcService> key) {
- final Module module = getModule(key);
- final ImmutableBiMap.Builder<Method, QName> ret = ImmutableBiMap.builder();
- try {
- for (final RpcDefinition rpcDef : module.getRpcs()) {
- final Method method = findRpcMethod(key, rpcDef);
- ret.put(method,rpcDef.getQName());
- }
- } catch (final NoSuchMethodException e) {
- throw new IllegalStateException("Rpc defined in model does not have representation in generated class.", e);
- }
- return ret.build();
- }
-
- private Module getModule(final Class<?> modeledClass) {
- final QNameModule moduleName = BindingReflections.getQNameModule(modeledClass);
- final BindingRuntimeContext localRuntimeContext = getRuntimeContext();
- final Module module = localRuntimeContext.getEffectiveModelContext().findModule(moduleName).orElse(null);
- if (module != null) {
- return module;
- }
-
- LOG.trace("Schema for {} is not available; expected module name: {}; BindingRuntimeContext: {}",
- modeledClass, moduleName, localRuntimeContext);
- throw new IllegalStateException(String.format("Schema for %s is not available; expected module name: %s; "
- + "full BindingRuntimeContext available in trace log", modeledClass, moduleName));
- }
-
- private Method findRpcMethod(final Class<? extends RpcService> key, final RpcDefinition rpcDef)
- throws NoSuchMethodException {
- final var rpcName = rpcDef.getQName();
- final var inputClz = getRuntimeContext().getRpcInput(rpcName);
- return key.getMethod(BindingMapping.getRpcMethodName(rpcName), inputClz);
- }