- public BindingNormalizedNodeCodecRegistry getCodecRegistry() {
- return this.codecRegistry;
- }
-
- @Override
- public void close() {
- // NOOP Intentionally
- }
-
- public BindingNormalizedNodeCodecRegistry getCodecFactory() {
- return this.codecRegistry;
- }
-
- // FIXME: This should be probably part of Binding Runtime context
- public ImmutableBiMap<Method, SchemaPath> getRpcMethodToSchemaPath(final Class<? extends RpcService> key) {
- final Module module = getModuleBlocking(key);
- final ImmutableBiMap.Builder<Method, SchemaPath> ret = ImmutableBiMap.<Method, SchemaPath>builder();
- try {
- for (final RpcDefinition rpcDef : module.getRpcs()) {
- final Method method = findRpcMethod(key, rpcDef);
- ret.put(method, rpcDef.getPath());
- }
- } catch (final NoSuchMethodException e) {
- throw new IllegalStateException("Rpc defined in model does not have representation in generated class.", e);
- }
- return ret.build();
- }
-
- protected ImmutableBiMap<Method, RpcDefinition> getRpcMethodToSchema(final Class<? extends RpcService> key) {
- final Module module = getModuleBlocking(key);
- final ImmutableBiMap.Builder<Method, RpcDefinition> ret = ImmutableBiMap.builder();
- try {
- for (final RpcDefinition rpcDef : module.getRpcs()) {
- final Method method = findRpcMethod(key, rpcDef);
- ret.put(method, rpcDef);
- }
- } catch (final NoSuchMethodException e) {
- throw new IllegalStateException("Rpc defined in model does not have representation in generated class.", e);
- }
- return ret.build();
- }
-
- private Module getModuleBlocking(final Class<?> modeledClass) {
- final QNameModule moduleName = BindingReflections.getQNameModule(modeledClass);
- final URI namespace = moduleName.getNamespace();
- final Date revision = moduleName.getRevision();
- Module module = runtimeContext().getSchemaContext().findModuleByNamespaceAndRevision(namespace, revision);
- if((module == null) && this.futureSchema.waitForSchema(namespace,revision)) {
- module = runtimeContext().getSchemaContext().findModuleByNamespaceAndRevision(namespace, revision);
- }
- Preconditions.checkState(module != null, "Schema for %s is not available.", modeledClass);
- return module;
- }
-
- private void waitForSchema(final Collection<Class<?>> binding, final MissingSchemaException e) {
- LOG.warn("Blocking thread to wait for schema convergence updates for {} {}", this.futureSchema.getDuration(),
- this.futureSchema.getUnit());
- if(this.futureSchema.waitForSchema(binding)) {
- return;
- }
-
- throw e;
- }
-
- private Method findRpcMethod(final Class<? extends RpcService> key, final RpcDefinition rpcDef) throws NoSuchMethodException {
- final String methodName = BindingMapping.getMethodName(rpcDef.getQName());
- if(rpcDef.getInput() != null && isExplicitStatement(rpcDef.getInput())) {
- final Class<?> inputClz = runtimeContext().getClassForSchema(rpcDef.getInput());
- return key.getMethod(methodName, inputClz);
- }
- return key.getMethod(methodName);
- }
-
- private static boolean isExplicitStatement(final ContainerSchemaNode node) {
- return node instanceof EffectiveStatement
- && ((EffectiveStatement) node).getDeclared().getStatementSource() == StatementSource.DECLARATION;
- }
-
- private BindingRuntimeContext runtimeContext() {
- return this.futureSchema.runtimeContext();
- }
-