From: Robert Varga Date: Thu, 12 Jul 2018 15:29:58 +0000 (+0200) Subject: Teach BindingToNormalizedNodeCodec action paths X-Git-Tag: release/fluorine~100 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=refs%2Fchanges%2F89%2F73989%2F4;p=mdsal.git Teach BindingToNormalizedNodeCodec action paths This adds the first step in bridging DOM/Binding action invocation, which is to acquire the SchemaPath of a particular action. Change-Id: I8a6c07652a2b7b352ee2e77444b33ad2434011c5 Signed-off-by: Robert Varga --- diff --git a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingToNormalizedNodeCodec.java b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingToNormalizedNodeCodec.java index 9648fedf73..80af970f5c 100644 --- a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingToNormalizedNodeCodec.java +++ b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingToNormalizedNodeCodec.java @@ -7,12 +7,12 @@ */ package org.opendaylight.mdsal.binding.dom.adapter; +import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkState; import static java.util.Objects.requireNonNull; import com.google.common.base.Function; import com.google.common.base.Optional; -import com.google.common.base.Preconditions; import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; @@ -43,6 +43,7 @@ import org.opendaylight.mdsal.binding.generator.util.JavassistUtils; import org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier; import org.opendaylight.mdsal.dom.api.DOMSchemaService; import org.opendaylight.yangtools.concepts.ListenerRegistration; +import org.opendaylight.yangtools.yang.binding.Action; import org.opendaylight.yangtools.yang.binding.BindingMapping; import org.opendaylight.yangtools.yang.binding.DataContainer; import org.opendaylight.yangtools.yang.binding.DataObject; @@ -58,6 +59,7 @@ import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; import org.opendaylight.yangtools.yang.data.impl.codec.DeserializationException; import org.opendaylight.yangtools.yang.data.impl.schema.Builders; import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes; +import org.opendaylight.yangtools.yang.model.api.ActionDefinition; import org.opendaylight.yangtools.yang.model.api.DocumentedNode.WithStatus; import org.opendaylight.yangtools.yang.model.api.ListSchemaNode; import org.opendaylight.yangtools.yang.model.api.Module; @@ -101,8 +103,8 @@ public class BindingToNormalizedNodeCodec implements BindingCodecTreeFactory, public BindingToNormalizedNodeCodec(final ClassLoadingStrategy classLoadingStrategy, final BindingNormalizedNodeCodecRegistry codecRegistry, final boolean waitForSchema) { - this.classLoadingStrategy = Preconditions.checkNotNull(classLoadingStrategy, "classLoadingStrategy"); - this.codecRegistry = Preconditions.checkNotNull(codecRegistry, "codecRegistry"); + this.classLoadingStrategy = requireNonNull(classLoadingStrategy, "classLoadingStrategy"); + this.codecRegistry = requireNonNull(codecRegistry, "codecRegistry"); this.futureSchema = FutureSchema.create(WAIT_DURATION_SEC, TimeUnit.SECONDS, waitForSchema); } @@ -316,7 +318,7 @@ public class BindingToNormalizedNodeCodec implements BindingCodecTreeFactory, localRuntimeContext.getSchemaContext().findModule(moduleName).orElse(null); if (module == null && futureSchema.waitForSchema(moduleName)) { localRuntimeContext = runtimeContext(); - Preconditions.checkState(localRuntimeContext != null, "BindingRuntimeContext is not available."); + checkState(localRuntimeContext != null, "BindingRuntimeContext is not available."); module = localRuntimeContext.getSchemaContext().findModule(moduleName).orElse(null); } checkState(module != null, "Schema for %s is not available; expected module name: %s.", modeledClass, @@ -355,7 +357,7 @@ public class BindingToNormalizedNodeCodec implements BindingCodecTreeFactory, final BindingCodecTree currentCodecTree = codecRegistry.getCodecContext(); final InstanceIdentifier bindingPath = codecRegistry.fromYangInstanceIdentifier(domIdentifier); - Preconditions.checkArgument(bindingPath != null); + checkArgument(bindingPath != null); /** * If we are able to deserialize YANG instance identifier, getSubtreeCodec must * return non-null value. @@ -381,6 +383,12 @@ public class BindingToNormalizedNodeCodec implements BindingCodecTreeFactory, return result; } + SchemaPath getActionPath(final Class> type) { + final ActionDefinition schema = runtimeContext().getActionDefinition(type); + checkArgument(schema != null, "Failed to find schema for %s", type); + return schema.getPath(); + } + private BindingRuntimeContext runtimeContext() { return futureSchema.runtimeContext(); } diff --git a/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/ActionLookupTest.java b/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/ActionLookupTest.java new file mode 100644 index 0000000000..e9ebd1d0f3 --- /dev/null +++ b/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/ActionLookupTest.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.mdsal.binding.dom.adapter; + +import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.mock; + +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; +import org.opendaylight.mdsal.binding.dom.codec.impl.BindingNormalizedNodeCodecRegistry; +import org.opendaylight.mdsal.binding.generator.impl.ModuleInfoBackedContext; +import org.opendaylight.yang.gen.v1.urn.odl.actions.norev.Cont; +import org.opendaylight.yang.gen.v1.urn.odl.actions.norev.Grpcont; +import org.opendaylight.yang.gen.v1.urn.odl.actions.norev.Othercont; +import org.opendaylight.yang.gen.v1.urn.odl.actions.norev.cont.Foo; +import org.opendaylight.yang.gen.v1.urn.odl.actions.norev.grpcont.Bar; +import org.opendaylight.yangtools.yang.binding.util.BindingReflections; +import org.opendaylight.yangtools.yang.model.api.SchemaPath; + +public class ActionLookupTest { + private static BindingToNormalizedNodeCodec CODEC; + + @BeforeClass + public static void beforeClass() { + final ModuleInfoBackedContext ctx = ModuleInfoBackedContext.create(); + ctx.addModuleInfos(BindingReflections.loadModuleInfos()); + + final BindingNormalizedNodeCodecRegistry registry = mock(BindingNormalizedNodeCodecRegistry.class); + CODEC = new BindingToNormalizedNodeCodec(ctx, registry); + CODEC.onGlobalContextUpdated(ctx.tryToCreateSchemaContext().get()); + } + + @AfterClass + public static void afterClass() { + CODEC = null; + } + + @Test + public void testActionSchemaPath() { + assertEquals(SchemaPath.create(true, Cont.QNAME, Foo.QNAME), CODEC.getActionPath(Foo.class)); + assertEquals(SchemaPath.create(true, Grpcont.QNAME, Bar.QNAME), CODEC.getActionPath(Bar.class)); + assertEquals(SchemaPath.create(true, Othercont.QNAME, Bar.QNAME), + CODEC.getActionPath(org.opendaylight.yang.gen.v1.urn.odl.actions.norev.othercont.Bar.class)); + } +} diff --git a/binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/mdsal/binding/generator/util/BindingRuntimeContext.java b/binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/mdsal/binding/generator/util/BindingRuntimeContext.java index f1c900d3f7..9b2cbcc613 100644 --- a/binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/mdsal/binding/generator/util/BindingRuntimeContext.java +++ b/binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/mdsal/binding/generator/util/BindingRuntimeContext.java @@ -42,10 +42,12 @@ import org.opendaylight.mdsal.binding.model.api.Type; import org.opendaylight.mdsal.binding.model.api.type.builder.GeneratedTypeBuilder; import org.opendaylight.mdsal.binding.model.util.ReferencedTypeImpl; import org.opendaylight.yangtools.concepts.Immutable; +import org.opendaylight.yangtools.yang.binding.Action; import org.opendaylight.yangtools.yang.binding.Augmentation; import org.opendaylight.yangtools.yang.binding.BindingMapping; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.AugmentationIdentifier; +import org.opendaylight.yangtools.yang.model.api.ActionDefinition; import org.opendaylight.yangtools.yang.model.api.AugmentationSchemaNode; import org.opendaylight.yangtools.yang.model.api.AugmentationTarget; import org.opendaylight.yangtools.yang.model.api.CaseSchemaNode; @@ -176,11 +178,16 @@ public final class BindingRuntimeContext implements Immutable { * @return Schema node, from which class was generated. */ public DataSchemaNode getSchemaDefinition(final Class cls) { - checkArgument(!Augmentation.class.isAssignableFrom(cls), "Supplied class must not be augmentation (%s is)", + checkArgument(!Augmentation.class.isAssignableFrom(cls), "Supplied class must not be an augmentation (%s is)", cls); + checkArgument(!Action.class.isAssignableFrom(cls), "Supplied class must not be an action (%s is)", cls); return (DataSchemaNode) runtimeTypes.findSchema(referencedType(cls)).orElse(null); } + public ActionDefinition getActionDefinition(final Class> cls) { + return (ActionDefinition) runtimeTypes.findSchema(referencedType(cls)).orElse(null); + } + public Entry getResolvedAugmentationSchema( final DataNodeContainer target, final Class> aug) { final AugmentationSchemaNode origSchema = getAugmentationDefinition(aug);