X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=binding%2Fmdsal-binding-dom-adapter%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fmdsal%2Fbinding%2Fdom%2Fadapter%2FCurrentAdapterSerializer.java;h=c5b99844f2ce0c23528a1163b8ee9c634168fb11;hb=caa883d073dc41475a3153f406166910ba197c11;hp=ac9277cb1b395316bcff786b3906d7cbdd40e74b;hpb=6adfe2c3b7b67eefb8fae6bc02fe4fc572bcc062;p=mdsal.git diff --git a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/CurrentAdapterSerializer.java b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/CurrentAdapterSerializer.java index ac9277cb1b..c5b99844f2 100644 --- a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/CurrentAdapterSerializer.java +++ b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/CurrentAdapterSerializer.java @@ -13,17 +13,10 @@ import static java.util.Objects.requireNonNull; import com.google.common.annotations.Beta; import com.google.common.annotations.VisibleForTesting; +import com.google.common.base.VerifyException; import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; -import com.google.common.collect.ImmutableBiMap; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.Maps; -import com.google.common.util.concurrent.ListenableFuture; -import java.lang.invoke.MethodHandle; -import java.lang.invoke.MethodHandles; -import java.lang.invoke.MethodType; -import java.lang.reflect.Method; import java.util.Collection; import java.util.Map; import java.util.Map.Entry; @@ -38,23 +31,22 @@ import org.opendaylight.mdsal.binding.api.InstanceNotificationSpec; import org.opendaylight.mdsal.binding.dom.codec.spi.BindingDOMCodecServices; import org.opendaylight.mdsal.binding.dom.codec.spi.ForwardingBindingDOMCodecServices; import org.opendaylight.mdsal.binding.model.api.JavaTypeName; +import org.opendaylight.mdsal.binding.runtime.api.ActionRuntimeType; import org.opendaylight.mdsal.binding.runtime.api.InputRuntimeType; -import org.opendaylight.mdsal.binding.spec.naming.BindingMapping; -import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections; +import org.opendaylight.mdsal.binding.runtime.api.NotificationRuntimeType; +import org.opendaylight.mdsal.binding.runtime.api.RuntimeType; import org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier; +import org.opendaylight.yangtools.yang.binding.BindingContract; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; -import org.opendaylight.yangtools.yang.binding.RpcInput; -import org.opendaylight.yangtools.yang.binding.RpcService; -import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.QNameModule; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.AugmentationIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier; import org.opendaylight.yangtools.yang.model.api.stmt.ActionEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.ListEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.NotificationEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute; +import org.opendaylight.yangtools.yang.model.api.stmt.SchemaTreeEffectiveStatement; import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -63,9 +55,6 @@ import org.slf4j.LoggerFactory; @VisibleForTesting public final class CurrentAdapterSerializer extends ForwardingBindingDOMCodecServices { private static final Logger LOG = LoggerFactory.getLogger(CurrentAdapterSerializer.class); - @Deprecated - private static final MethodType RPC_SERVICE_METHOD_SIGNATURE = MethodType.methodType(ListenableFuture.class, - RpcService.class, RpcInput.class); private final LoadingCache, YangInstanceIdentifier> cache = CacheBuilder.newBuilder() .softValues().build(new CacheLoader, YangInstanceIdentifier>() { @@ -76,9 +65,6 @@ public final class CurrentAdapterSerializer extends ForwardingBindingDOMCodecSer }); private final ConcurrentMap extractors = new ConcurrentHashMap<>(); - @Deprecated - private final ConcurrentMap, ImmutableMap> rpcMethods = - new ConcurrentHashMap<>(); private final @NonNull BindingDOMCodecServices delegate; public CurrentAdapterSerializer(final BindingDOMCodecServices delegate) { @@ -99,7 +85,7 @@ public final class CurrentAdapterSerializer extends ForwardingBindingDOMCodecSer } DOMDataTreeIdentifier toDOMDataTreeIdentifier(final DataTreeIdentifier path) { - return new DOMDataTreeIdentifier(path.getDatastoreType(), toYangInstanceIdentifier(path.getRootIdentifier())); + return DOMDataTreeIdentifier.of(path.datastore(), toYangInstanceIdentifier(path.path())); } Collection toDOMDataTreeIdentifiers(final Collection> subtrees) { @@ -107,20 +93,36 @@ public final class CurrentAdapterSerializer extends ForwardingBindingDOMCodecSer } @NonNull Absolute getActionPath(final @NonNull ActionSpec spec) { - final var entry = resolvePath(spec.path()); - final var stack = entry.getKey(); - final var stmt = stack.enterSchemaTree(BindingReflections.findQName(spec.type()).bindTo(entry.getValue())); - verify(stmt instanceof ActionEffectiveStatement, "Action %s resolved to unexpected statement %s", spec, stmt); - return stack.toSchemaNodeIdentifier(); + return getSchemaNodeIdentifier(spec.path(), spec.type(), ActionRuntimeType.class, + ActionEffectiveStatement.class); } @NonNull Absolute getNotificationPath(final @NonNull InstanceNotificationSpec spec) { - final var entry = resolvePath(spec.path()); + return getSchemaNodeIdentifier(spec.path(), spec.type(), NotificationRuntimeType.class, + NotificationEffectiveStatement.class); + } + + private @NonNull Absolute getSchemaNodeIdentifier(final @NonNull InstanceIdentifier path, + final @NonNull Class> type, final @NonNull Class expectedRuntime, + final @NonNull Class> expectedStatement) { + final var typeName = JavaTypeName.create(type); + final var runtimeType = getRuntimeContext().getTypes().findSchema(typeName) + .orElseThrow(() -> new IllegalArgumentException(typeName + " is not known")); + final T casted; + try { + casted = expectedRuntime.cast(runtimeType); + } catch (ClassCastException e) { + throw new IllegalArgumentException(typeName + " resolved to unexpected " + runtimeType, e); + } + final var qname = expectedStatement.cast(casted.statement()).argument(); + + final var entry = resolvePath(path); final var stack = entry.getKey(); - final var stmt = stack.enterSchemaTree(BindingReflections.findQName(spec.type()).bindTo(entry.getValue())); - verify(stmt instanceof NotificationEffectiveStatement, "Notification %s resolved to unexpected statement %s", - spec, stmt); - return stack.toSchemaNodeIdentifier(); + final var stmt = stack.enterSchemaTree(qname.bindTo(entry.getValue())); + if (expectedStatement.isInstance(stmt)) { + return stack.toSchemaNodeIdentifier(); + } + throw new VerifyException(path + " child " + typeName + " resolved to unexpected statement" + stmt); } @Nullable ContextReferenceExtractor findExtractor(final @NonNull InputRuntimeType inputType) { @@ -149,49 +151,6 @@ public final class CurrentAdapterSerializer extends ForwardingBindingDOMCodecSer return raced != null ? raced : created; } - @Deprecated - @NonNull ImmutableMap getRpcMethods(final @NonNull Class serviceType) { - return rpcMethods.computeIfAbsent(serviceType, ignored -> { - final var lookup = MethodHandles.publicLookup(); - return ImmutableMap.copyOf(Maps.transformValues(createQNameToMethod(serviceType), method -> { - final MethodHandle raw; - try { - raw = lookup.unreflect(method); - } catch (IllegalAccessException e) { - throw new IllegalStateException("Lookup on public method failed", e); - } - return raw.asType(RPC_SERVICE_METHOD_SIGNATURE); - })); - }); - } - - @Deprecated - @VisibleForTesting - // FIXME: This should be probably part of Binding Runtime context - ImmutableMap createQNameToMethod(final Class key) { - final var moduleName = BindingReflections.getQNameModule(key); - final var runtimeContext = getRuntimeContext(); - final var module = runtimeContext.getEffectiveModelContext().findModule(moduleName).orElse(null); - if (module == null) { - LOG.trace("Schema for {} is not available; expected module name: {}; BindingRuntimeContext: {}", - key, moduleName, runtimeContext); - throw new IllegalStateException(String.format("Schema for %s is not available; expected module name: %s;" - + " full BindingRuntimeContext available in trace log", key, moduleName)); - } - - final var ret = ImmutableBiMap.builder(); - try { - for (var rpcDef : module.getRpcs()) { - final var rpcName = rpcDef.getQName(); - ret.put(rpcName, key.getMethod(BindingMapping.getRpcMethodName(rpcName), - runtimeContext.getRpcInput(rpcName))); - } - } catch (NoSuchMethodException e) { - throw new IllegalStateException("Rpc defined in model does not have representation in generated class.", e); - } - return ret.build(); - } - private @NonNull Entry resolvePath(final @NonNull InstanceIdentifier path) { final var stack = SchemaInferenceStack.of(getRuntimeContext().getEffectiveModelContext()); final var it = toYangInstanceIdentifier(path).getPathArguments().iterator(); @@ -200,13 +159,6 @@ public final class CurrentAdapterSerializer extends ForwardingBindingDOMCodecSer QNameModule lastNamespace; do { final var arg = it.next(); - if (arg instanceof AugmentationIdentifier) { - final var augChildren = ((AugmentationIdentifier) arg).getPossibleChildNames(); - verify(!augChildren.isEmpty(), "Invalid empty augmentation %s", arg); - lastNamespace = augChildren.iterator().next().getModule(); - continue; - } - final var qname = arg.getNodeType(); final var stmt = stack.enterDataTree(qname); lastNamespace = qname.getModule();