From 2cd00f1a5d28cb5df491e07ac18848c50338a4c5 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Mon, 23 Jul 2018 17:25:34 +0200 Subject: [PATCH] Move BindingReflections to mdsal-binding-spec-util This is the first stage of movement: create a copy of the class and migrate the test suite. Change-Id: I0d229ccd4277b917c99414dd8ba698f497629ec3 Signed-off-by: Robert Varga --- .../dom/adapter/ActionServiceAdapter.java | 2 +- ...BindingDOMNotificationListenerAdapter.java | 4 +- .../BindingDOMRpcImplementationAdapter.java | 2 +- .../adapter/BindingDOMRpcServiceAdapter.java | 2 +- .../adapter/BindingToNormalizedNodeCodec.java | 2 +- .../LazySerializedDOMNotification.java | 2 +- .../dom/adapter/RpcServiceAdapter.java | 2 +- .../invoke/AbstractMappedRpcInvoker.java | 2 +- .../invoke/ClassBasedRpcServiceInvoker.java | 2 +- .../invoke/NotificationListenerInvoker.java | 2 +- .../dom/adapter/invoke/RpcMethodInvoker.java | 4 +- .../binding/dom/adapter/ActionLookupTest.java | 2 +- .../adapter/test/AbstractSchemaAwareTest.java | 2 +- .../dom/adapter/test/Bug5524augmentUses.java | 4 +- .../adapter/test/Bug5845booleanKeyTest.java | 4 +- .../test/DataTreeChangeListenerTest.java | 2 +- .../ForwardedNotificationAdapterTest.java | 2 +- .../adapter/test/util/BindingTestContext.java | 2 +- .../api/BindingNormalizedNodeSerializer.java | 2 +- .../impl/AbstractStreamWriterGenerator.java | 2 +- .../dom/codec/impl/BindingCodecContext.java | 2 +- .../BindingNormalizedNodeCodecRegistry.java | 2 +- .../codec/impl/ChoiceNodeCodecContext.java | 2 +- .../codec/impl/DataObjectCodecContext.java | 2 +- .../binding/dom/codec/impl/IdentityCodec.java | 4 +- .../dom/codec/impl/LazyDataObject.java | 2 +- .../codec/impl/SchemaRootCodecContext.java | 4 +- .../dom/codec/impl/ValueTypeCodec.java | 2 +- .../util/AugmentableDispatchSerializer.java | 4 +- .../test/AbstractBindingRuntimeTest.java | 2 +- ...entationClassDiscoveredAfterCodecTest.java | 2 +- .../codec/test/ExceptionReportingTest.java | 2 +- binding/mdsal-binding-generator-impl/pom.xml | 12 +- .../impl/BindingSchemaContextUtils.java | 2 +- .../impl/ModuleInfoBackedContext.java | 2 +- .../generator/util/BindingRuntimeContext.java | 2 +- .../spec/reflect/AugmentationFieldGetter.java | 107 +++ .../spec/reflect/BindingReflections.java | 626 ++++++++++++++++++ .../reflect}/AugmentationFieldGetterTest.java | 4 +- .../spec/reflect}/BindingReflectionsTest.java | 8 +- .../mdsal/binding/spec/util/FooChild.java | 14 + .../mdsal/binding/spec/util/GroupingFoo.java | 12 + .../binding/util/AugmentationFieldGetter.java | 1 + .../yang/binding/util/BindingReflections.java | 1 + 44 files changed, 817 insertions(+), 52 deletions(-) create mode 100644 binding/mdsal-binding-spec-util/src/main/java/org/opendaylight/mdsal/binding/spec/reflect/AugmentationFieldGetter.java create mode 100644 binding/mdsal-binding-spec-util/src/main/java/org/opendaylight/mdsal/binding/spec/reflect/BindingReflections.java rename binding/{yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/util => mdsal-binding-spec-util/src/test/java/org/opendaylight/mdsal/binding/spec/reflect}/AugmentationFieldGetterTest.java (94%) rename binding/{yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/util => mdsal-binding-spec-util/src/test/java/org/opendaylight/mdsal/binding/spec/reflect}/BindingReflectionsTest.java (93%) create mode 100644 binding/mdsal-binding-spec-util/src/test/java/org/opendaylight/mdsal/binding/spec/util/FooChild.java create mode 100644 binding/mdsal-binding-spec-util/src/test/java/org/opendaylight/mdsal/binding/spec/util/GroupingFoo.java diff --git a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/ActionServiceAdapter.java b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/ActionServiceAdapter.java index ad85ca1513..04c74e630e 100644 --- a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/ActionServiceAdapter.java +++ b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/ActionServiceAdapter.java @@ -19,6 +19,7 @@ import java.util.Set; import org.eclipse.jdt.annotation.NonNullByDefault; import org.opendaylight.mdsal.binding.api.ActionService; import org.opendaylight.mdsal.binding.api.DataTreeIdentifier; +import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections; import org.opendaylight.mdsal.dom.api.DOMOperationService; import org.opendaylight.yangtools.concepts.Delegator; import org.opendaylight.yangtools.yang.binding.Action; @@ -26,7 +27,6 @@ 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.RpcOutput; -import org.opendaylight.yangtools.yang.binding.util.BindingReflections; import org.opendaylight.yangtools.yang.common.RpcResult; @Beta diff --git a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMNotificationListenerAdapter.java b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMNotificationListenerAdapter.java index 6c5e43a733..1ef252843f 100644 --- a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMNotificationListenerAdapter.java +++ b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMNotificationListenerAdapter.java @@ -17,11 +17,11 @@ import java.util.Set; import javax.annotation.Nonnull; import org.opendaylight.mdsal.binding.dom.adapter.invoke.NotificationListenerInvoker; import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer; +import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections; import org.opendaylight.mdsal.dom.api.DOMNotification; import org.opendaylight.mdsal.dom.api.DOMNotificationListener; import org.opendaylight.yangtools.yang.binding.Notification; import org.opendaylight.yangtools.yang.binding.NotificationListener; -import org.opendaylight.yangtools.yang.binding.util.BindingReflections; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.SchemaPath; @@ -91,4 +91,4 @@ class BindingDOMNotificationListenerAdapter implements DOMNotificationListener { } return ret; } -} \ No newline at end of file +} diff --git a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMRpcImplementationAdapter.java b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMRpcImplementationAdapter.java index 0e57c92cc5..a1a0602c4a 100644 --- a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMRpcImplementationAdapter.java +++ b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMRpcImplementationAdapter.java @@ -20,13 +20,13 @@ import java.util.concurrent.ExecutionException; import javax.annotation.Nonnull; import org.opendaylight.mdsal.binding.dom.adapter.invoke.RpcServiceInvoker; import org.opendaylight.mdsal.binding.dom.codec.impl.BindingNormalizedNodeCodecRegistry; +import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections; import org.opendaylight.mdsal.dom.api.DOMRpcException; import org.opendaylight.mdsal.dom.api.DOMRpcIdentifier; import org.opendaylight.mdsal.dom.api.DOMRpcImplementation; import org.opendaylight.mdsal.dom.api.DOMRpcResult; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.RpcService; -import org.opendaylight.yangtools.yang.binding.util.BindingReflections; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.RpcResult; import org.opendaylight.yangtools.yang.common.YangConstants; diff --git a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMRpcServiceAdapter.java b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMRpcServiceAdapter.java index 33457c3776..3faeade145 100644 --- a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMRpcServiceAdapter.java +++ b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMRpcServiceAdapter.java @@ -14,10 +14,10 @@ import com.google.common.collect.ImmutableSet; import java.util.Set; import org.opendaylight.mdsal.binding.api.RpcConsumerRegistry; import org.opendaylight.mdsal.binding.dom.adapter.BindingDOMAdapterBuilder.Factory; +import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections; import org.opendaylight.mdsal.dom.api.DOMRpcService; import org.opendaylight.mdsal.dom.api.DOMService; import org.opendaylight.yangtools.yang.binding.RpcService; -import org.opendaylight.yangtools.yang.binding.util.BindingReflections; public class BindingDOMRpcServiceAdapter extends AbstractBindingLoadingAdapter, RpcServiceAdapter> 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 9d32031c38..45ac5b2816 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 @@ -41,6 +41,7 @@ import org.opendaylight.mdsal.binding.dom.codec.impl.MissingSchemaException; import org.opendaylight.mdsal.binding.generator.api.ClassLoadingStrategy; import org.opendaylight.mdsal.binding.generator.util.BindingRuntimeContext; import org.opendaylight.mdsal.binding.generator.util.JavassistUtils; +import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections; import org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier; import org.opendaylight.mdsal.dom.api.DOMSchemaService; import org.opendaylight.yangtools.concepts.ListenerRegistration; @@ -54,7 +55,6 @@ import org.opendaylight.yangtools.yang.binding.Notification; import org.opendaylight.yangtools.yang.binding.RpcInput; import org.opendaylight.yangtools.yang.binding.RpcOutput; import org.opendaylight.yangtools.yang.binding.RpcService; -import org.opendaylight.yangtools.yang.binding.util.BindingReflections; import org.opendaylight.yangtools.yang.common.QNameModule; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier; diff --git a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/LazySerializedDOMNotification.java b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/LazySerializedDOMNotification.java index e3dfbd6dbc..4246537b9a 100644 --- a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/LazySerializedDOMNotification.java +++ b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/LazySerializedDOMNotification.java @@ -8,9 +8,9 @@ package org.opendaylight.mdsal.binding.dom.adapter; import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer; +import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections; import org.opendaylight.mdsal.dom.api.DOMNotification; import org.opendaylight.yangtools.yang.binding.Notification; -import org.opendaylight.yangtools.yang.binding.util.BindingReflections; import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode; import org.opendaylight.yangtools.yang.model.api.SchemaPath; diff --git a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/RpcServiceAdapter.java b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/RpcServiceAdapter.java index e835735996..0c36a7f533 100644 --- a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/RpcServiceAdapter.java +++ b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/RpcServiceAdapter.java @@ -18,6 +18,7 @@ import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.util.Map.Entry; import org.opendaylight.mdsal.binding.dom.codec.impl.BindingNormalizedNodeCodecRegistry; +import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections; import org.opendaylight.mdsal.dom.api.DOMRpcResult; import org.opendaylight.mdsal.dom.api.DOMRpcService; import org.opendaylight.mdsal.dom.spi.RpcRoutingStrategy; @@ -25,7 +26,6 @@ import org.opendaylight.yangtools.yang.binding.DataContainer; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.binding.RpcService; -import org.opendaylight.yangtools.yang.binding.util.BindingReflections; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.RpcResult; import org.opendaylight.yangtools.yang.common.YangConstants; diff --git a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/invoke/AbstractMappedRpcInvoker.java b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/invoke/AbstractMappedRpcInvoker.java index 19920c4e3a..50761508ea 100644 --- a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/invoke/AbstractMappedRpcInvoker.java +++ b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/invoke/AbstractMappedRpcInvoker.java @@ -17,9 +17,9 @@ import java.util.Map; import java.util.Map.Entry; import javax.annotation.Nonnull; import javax.annotation.Nullable; +import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.RpcService; -import org.opendaylight.yangtools.yang.binding.util.BindingReflections; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.RpcResult; import org.slf4j.Logger; diff --git a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/invoke/ClassBasedRpcServiceInvoker.java b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/invoke/ClassBasedRpcServiceInvoker.java index cf33a63037..34d52b7451 100644 --- a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/invoke/ClassBasedRpcServiceInvoker.java +++ b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/invoke/ClassBasedRpcServiceInvoker.java @@ -14,9 +14,9 @@ import com.google.common.cache.LoadingCache; import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map; +import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections; import org.opendaylight.yangtools.yang.binding.BindingMapping; import org.opendaylight.yangtools.yang.binding.RpcService; -import org.opendaylight.yangtools.yang.binding.util.BindingReflections; import org.opendaylight.yangtools.yang.common.QName; final class ClassBasedRpcServiceInvoker extends AbstractMappedRpcInvoker { diff --git a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/invoke/NotificationListenerInvoker.java b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/invoke/NotificationListenerInvoker.java index d217173cc5..5c5dd1dd1c 100644 --- a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/invoke/NotificationListenerInvoker.java +++ b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/invoke/NotificationListenerInvoker.java @@ -22,9 +22,9 @@ import java.lang.reflect.Method; import java.util.Map; import javax.annotation.Nonnull; import javax.annotation.Nullable; +import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections; import org.opendaylight.yangtools.yang.binding.DataContainer; import org.opendaylight.yangtools.yang.binding.NotificationListener; -import org.opendaylight.yangtools.yang.binding.util.BindingReflections; import org.opendaylight.yangtools.yang.common.QName; /** diff --git a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/invoke/RpcMethodInvoker.java b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/invoke/RpcMethodInvoker.java index a8a4eb7f39..973899638c 100644 --- a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/invoke/RpcMethodInvoker.java +++ b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/invoke/RpcMethodInvoker.java @@ -13,10 +13,10 @@ import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodHandles.Lookup; import java.lang.reflect.Method; +import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections; import org.opendaylight.yangtools.yang.binding.DataContainer; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.RpcService; -import org.opendaylight.yangtools.yang.binding.util.BindingReflections; import org.opendaylight.yangtools.yang.common.RpcResult; abstract class RpcMethodInvoker { @@ -39,4 +39,4 @@ abstract class RpcMethodInvoker { } return new RpcMethodInvokerWithoutInput(methodHandle); } -} \ No newline at end of file +} 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 index e9ebd1d0f3..71de2ebc18 100644 --- 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 @@ -15,12 +15,12 @@ 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.mdsal.binding.spec.reflect.BindingReflections; 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 { diff --git a/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/AbstractSchemaAwareTest.java b/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/AbstractSchemaAwareTest.java index 69ff0578ce..dc72e8bc59 100644 --- a/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/AbstractSchemaAwareTest.java +++ b/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/AbstractSchemaAwareTest.java @@ -9,8 +9,8 @@ package org.opendaylight.mdsal.binding.dom.adapter.test; import org.junit.Before; import org.opendaylight.mdsal.binding.generator.impl.ModuleInfoBackedContext; +import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections; import org.opendaylight.yangtools.yang.binding.YangModuleInfo; -import org.opendaylight.yangtools.yang.binding.util.BindingReflections; import org.opendaylight.yangtools.yang.model.api.SchemaContext; public abstract class AbstractSchemaAwareTest { diff --git a/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/Bug5524augmentUses.java b/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/Bug5524augmentUses.java index 1b66a2e41c..623bbb4e3b 100644 --- a/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/Bug5524augmentUses.java +++ b/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/Bug5524augmentUses.java @@ -21,6 +21,7 @@ import org.opendaylight.mdsal.binding.dom.codec.impl.BindingNormalizedNodeCodecR import org.opendaylight.mdsal.binding.generator.impl.GeneratedClassLoadingStrategy; import org.opendaylight.mdsal.binding.generator.impl.ModuleInfoBackedContext; import org.opendaylight.mdsal.binding.generator.util.JavassistUtils; +import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections; import org.opendaylight.yang.gen.v1.urn.test.opendaylight.bug._5524.module1.rev160101.grouping.module1.ListModule11Builder; import org.opendaylight.yang.gen.v1.urn.test.opendaylight.bug._5524.module1.rev160101.grouping.module1.list.module1._1.ListModule12Builder; import org.opendaylight.yang.gen.v1.urn.test.opendaylight.bug._5524.module1.rev160101.grouping.module1.list.module1._1.list.module1._2.ContainerModule1Builder; @@ -39,7 +40,6 @@ import org.opendaylight.yang.gen.v1.urn.test.opendaylight.bug._5524.module4.rev1 import org.opendaylight.yang.gen.v1.urn.test.opendaylight.bug._5524.module4.rev160101.module4.main.container.module._4.ManualContainerModule11; import org.opendaylight.yang.gen.v1.urn.test.opendaylight.bug._5524.module4.rev160101.module4.main.container.module._4.ManualContainerModule11Builder; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; -import org.opendaylight.yangtools.yang.binding.util.BindingReflections; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; public class Bug5524augmentUses extends AbstractDataBrokerTest { @@ -88,4 +88,4 @@ public class Bug5524augmentUses extends AbstractDataBrokerTest { assertNotNull(manualSerialized); assertNotNull(containerManualSerialized); } -} \ No newline at end of file +} diff --git a/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/Bug5845booleanKeyTest.java b/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/Bug5845booleanKeyTest.java index d09296f6ed..a2c23f5261 100644 --- a/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/Bug5845booleanKeyTest.java +++ b/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/Bug5845booleanKeyTest.java @@ -21,6 +21,7 @@ import org.opendaylight.mdsal.binding.dom.codec.impl.BindingNormalizedNodeCodecR import org.opendaylight.mdsal.binding.generator.impl.GeneratedClassLoadingStrategy; import org.opendaylight.mdsal.binding.generator.impl.ModuleInfoBackedContext; import org.opendaylight.mdsal.binding.generator.util.JavassistUtils; +import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections; import org.opendaylight.yang.gen.v1.urn.yang.foo.rev160101.BooleanContainer; import org.opendaylight.yang.gen.v1.urn.yang.foo.rev160101.BooleanContainerBuilder; import org.opendaylight.yang.gen.v1.urn.yang.foo.rev160101._boolean.container.BooleanListBuilder; @@ -28,7 +29,6 @@ import org.opendaylight.yang.gen.v1.urn.yang.foo.rev160101._boolean.container.Bo import org.opendaylight.yang.gen.v1.urn.yang.foo.rev160101._boolean.container.BooleanListIntKey; import org.opendaylight.yang.gen.v1.urn.yang.foo.rev160101._boolean.container.BooleanListKey; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; -import org.opendaylight.yangtools.yang.binding.util.BindingReflections; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; public class Bug5845booleanKeyTest extends AbstractDataBrokerTest { @@ -65,4 +65,4 @@ public class Bug5845booleanKeyTest extends AbstractDataBrokerTest { final NormalizedNode serialized = subtreeCodec.serialize(booleanContainer); assertNotNull(serialized); } -} \ No newline at end of file +} diff --git a/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/DataTreeChangeListenerTest.java b/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/DataTreeChangeListenerTest.java index 05690ca368..35e79fa12e 100644 --- a/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/DataTreeChangeListenerTest.java +++ b/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/DataTreeChangeListenerTest.java @@ -33,6 +33,7 @@ import org.opendaylight.mdsal.binding.api.DataTreeIdentifier; import org.opendaylight.mdsal.binding.api.DataTreeModification; import org.opendaylight.mdsal.binding.api.WriteTransaction; import org.opendaylight.mdsal.binding.dom.adapter.BindingDOMDataBrokerAdapter; +import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections; import org.opendaylight.mdsal.common.api.LogicalDatastoreType; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.augment.rev140709.TreeComplexUsesAugment; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.binding.rev140701.Top; @@ -42,7 +43,6 @@ import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.PathArgument; import org.opendaylight.yangtools.yang.binding.YangModuleInfo; -import org.opendaylight.yangtools.yang.binding.util.BindingReflections; public class DataTreeChangeListenerTest extends AbstractDataBrokerTest { diff --git a/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/ForwardedNotificationAdapterTest.java b/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/ForwardedNotificationAdapterTest.java index 0850c3fded..e621e40cb6 100644 --- a/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/ForwardedNotificationAdapterTest.java +++ b/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/ForwardedNotificationAdapterTest.java @@ -22,6 +22,7 @@ import java.util.concurrent.TimeoutException; import org.junit.Assert; import org.junit.Test; import org.opendaylight.mdsal.binding.api.NotificationPublishService; +import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.binding.rev140701.OpendaylightMdsalBindingTestListener; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.binding.rev140701.TwoLevelListChanged; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.binding.rev140701.TwoLevelListChangedBuilder; @@ -29,7 +30,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.te import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.binding.rev140701.two.level.list.TopLevelListKey; import org.opendaylight.yangtools.concepts.ListenerRegistration; import org.opendaylight.yangtools.yang.binding.YangModuleInfo; -import org.opendaylight.yangtools.yang.binding.util.BindingReflections; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/util/BindingTestContext.java b/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/util/BindingTestContext.java index 78f52c72f3..9eb9df47df 100644 --- a/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/util/BindingTestContext.java +++ b/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/util/BindingTestContext.java @@ -33,6 +33,7 @@ import org.opendaylight.mdsal.binding.dom.codec.impl.BindingNormalizedNodeCodecR import org.opendaylight.mdsal.binding.generator.impl.GeneratedClassLoadingStrategy; import org.opendaylight.mdsal.binding.generator.impl.ModuleInfoBackedContext; import org.opendaylight.mdsal.binding.generator.util.JavassistUtils; +import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections; import org.opendaylight.mdsal.common.api.LogicalDatastoreType; import org.opendaylight.mdsal.dom.api.DOMDataBroker; import org.opendaylight.mdsal.dom.api.DOMMountPointService; @@ -47,7 +48,6 @@ import org.opendaylight.mdsal.dom.broker.SerializedDOMDataBroker; import org.opendaylight.mdsal.dom.spi.store.DOMStore; import org.opendaylight.mdsal.dom.store.inmemory.InMemoryDOMDataStore; import org.opendaylight.yangtools.yang.binding.YangModuleInfo; -import org.opendaylight.yangtools.yang.binding.util.BindingReflections; import org.opendaylight.yangtools.yang.model.api.SchemaContext; @Beta diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/api/BindingNormalizedNodeSerializer.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/api/BindingNormalizedNodeSerializer.java index a78a296472..cfd2d118e2 100644 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/api/BindingNormalizedNodeSerializer.java +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/api/BindingNormalizedNodeSerializer.java @@ -12,6 +12,7 @@ import java.util.Map.Entry; import javax.annotation.Nonnull; import javax.annotation.Nullable; import org.eclipse.jdt.annotation.NonNull; +import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections; import org.opendaylight.yangtools.yang.binding.Action; import org.opendaylight.yangtools.yang.binding.DataContainer; import org.opendaylight.yangtools.yang.binding.DataObject; @@ -19,7 +20,6 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.binding.Notification; import org.opendaylight.yangtools.yang.binding.RpcInput; import org.opendaylight.yangtools.yang.binding.RpcOutput; -import org.opendaylight.yangtools.yang.binding.util.BindingReflections; import org.opendaylight.yangtools.yang.common.YangConstants; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier; diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/gen/impl/AbstractStreamWriterGenerator.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/gen/impl/AbstractStreamWriterGenerator.java index 325446040e..51ef432039 100644 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/gen/impl/AbstractStreamWriterGenerator.java +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/gen/impl/AbstractStreamWriterGenerator.java @@ -28,13 +28,13 @@ import org.opendaylight.mdsal.binding.generator.util.BindingRuntimeContext; import org.opendaylight.mdsal.binding.generator.util.JavassistUtils; import org.opendaylight.mdsal.binding.model.api.GeneratedType; import org.opendaylight.mdsal.binding.model.util.Types; +import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections; import org.opendaylight.yangtools.util.ClassLoaderUtils; import org.opendaylight.yangtools.yang.binding.BindingStreamEventWriter; import org.opendaylight.yangtools.yang.binding.DataContainer; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.DataObjectSerializerImplementation; import org.opendaylight.yangtools.yang.binding.DataObjectSerializerRegistry; -import org.opendaylight.yangtools.yang.binding.util.BindingReflections; import org.opendaylight.yangtools.yang.model.api.AugmentationSchemaNode; import org.opendaylight.yangtools.yang.model.api.CaseSchemaNode; import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode; diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/BindingCodecContext.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/BindingCodecContext.java index 177a511a2b..d0bc62deea 100644 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/BindingCodecContext.java +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/BindingCodecContext.java @@ -27,6 +27,7 @@ import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTreeNode; import org.opendaylight.mdsal.binding.dom.codec.impl.NodeCodecContext.CodecContextFactory; import org.opendaylight.mdsal.binding.generator.util.BindingRuntimeContext; import org.opendaylight.mdsal.binding.model.api.GeneratedType; +import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections; import org.opendaylight.yangtools.concepts.Codec; import org.opendaylight.yangtools.concepts.Immutable; import org.opendaylight.yangtools.util.ClassLoaderUtils; @@ -41,7 +42,6 @@ import org.opendaylight.yangtools.yang.binding.Identifier; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.IdentifiableItem; import org.opendaylight.yangtools.yang.binding.Notification; -import org.opendaylight.yangtools.yang.binding.util.BindingReflections; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates; diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/BindingNormalizedNodeCodecRegistry.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/BindingNormalizedNodeCodecRegistry.java index c280c8d615..8828154629 100644 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/BindingNormalizedNodeCodecRegistry.java +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/BindingNormalizedNodeCodecRegistry.java @@ -31,6 +31,7 @@ import org.opendaylight.mdsal.binding.dom.codec.gen.impl.DataObjectSerializerGen import org.opendaylight.mdsal.binding.dom.codec.util.AbstractBindingLazyContainerNode; import org.opendaylight.mdsal.binding.generator.impl.ModuleInfoBackedContext; import org.opendaylight.mdsal.binding.generator.util.BindingRuntimeContext; +import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections; import org.opendaylight.yangtools.concepts.Delegator; import org.opendaylight.yangtools.yang.binding.Action; import org.opendaylight.yangtools.yang.binding.BindingStreamEventWriter; @@ -44,7 +45,6 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.PathArgument; import org.opendaylight.yangtools.yang.binding.Notification; import org.opendaylight.yangtools.yang.binding.RpcInput; import org.opendaylight.yangtools.yang.binding.RpcOutput; -import org.opendaylight.yangtools.yang.binding.util.BindingReflections; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.ChoiceNode; diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/ChoiceNodeCodecContext.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/ChoiceNodeCodecContext.java index 5f1be30abf..912051e4ee 100644 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/ChoiceNodeCodecContext.java +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/ChoiceNodeCodecContext.java @@ -29,9 +29,9 @@ import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import javax.annotation.Nonnull; import javax.annotation.Nullable; +import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.PathArgument; -import org.opendaylight.yangtools.yang.binding.util.BindingReflections; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.ChoiceNode; diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/DataObjectCodecContext.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/DataObjectCodecContext.java index dd4958aa3c..051cf3d0c7 100644 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/DataObjectCodecContext.java +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/DataObjectCodecContext.java @@ -32,13 +32,13 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; import org.opendaylight.mdsal.binding.generator.api.ClassLoadingStrategy; import org.opendaylight.mdsal.binding.model.api.Type; +import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections; import org.opendaylight.yangtools.yang.binding.Augmentable; import org.opendaylight.yangtools.yang.binding.Augmentation; import org.opendaylight.yangtools.yang.binding.AugmentationHolder; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.Item; -import org.opendaylight.yangtools.yang.binding.util.BindingReflections; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.AugmentationIdentifier; diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/IdentityCodec.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/IdentityCodec.java index ffd7cc2b31..06c8c2718f 100644 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/IdentityCodec.java +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/IdentityCodec.java @@ -9,9 +9,9 @@ package org.opendaylight.mdsal.binding.dom.codec.impl; import com.google.common.base.Preconditions; import org.opendaylight.mdsal.binding.generator.util.BindingRuntimeContext; +import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections; import org.opendaylight.yangtools.concepts.Codec; import org.opendaylight.yangtools.yang.binding.BaseIdentity; -import org.opendaylight.yangtools.yang.binding.util.BindingReflections; import org.opendaylight.yangtools.yang.common.QName; final class IdentityCodec implements Codec> { @@ -32,4 +32,4 @@ final class IdentityCodec implements Codec> { Preconditions.checkArgument(BaseIdentity.class.isAssignableFrom(input)); return BindingReflections.findQName(input); } -} \ No newline at end of file +} diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/LazyDataObject.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/LazyDataObject.java index 79e26fcbe2..18dcc01881 100644 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/LazyDataObject.java +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/LazyDataObject.java @@ -21,11 +21,11 @@ import java.util.Map; import java.util.Objects; import java.util.concurrent.ConcurrentHashMap; import org.opendaylight.mdsal.binding.dom.codec.util.AugmentationReader; +import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections; import org.opendaylight.yangtools.yang.binding.Augmentable; import org.opendaylight.yangtools.yang.binding.Augmentation; import org.opendaylight.yangtools.yang.binding.BindingMapping; import org.opendaylight.yangtools.yang.binding.DataObject; -import org.opendaylight.yangtools.yang.binding.util.BindingReflections; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNodeContainer; diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/SchemaRootCodecContext.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/SchemaRootCodecContext.java index 4eb21e2f66..92e4d45684 100644 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/SchemaRootCodecContext.java +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/SchemaRootCodecContext.java @@ -19,6 +19,7 @@ import com.google.common.cache.LoadingCache; import com.google.common.util.concurrent.UncheckedExecutionException; import java.lang.reflect.Type; import java.util.List; +import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections; import org.opendaylight.yangtools.util.ClassLoaderUtils; import org.opendaylight.yangtools.yang.binding.Action; import org.opendaylight.yangtools.yang.binding.BindingMapping; @@ -29,7 +30,6 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.binding.Notification; import org.opendaylight.yangtools.yang.binding.RpcInput; import org.opendaylight.yangtools.yang.binding.RpcOutput; -import org.opendaylight.yangtools.yang.binding.util.BindingReflections; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.QNameModule; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; @@ -335,4 +335,4 @@ final class SchemaRootCodecContext extends DataContainerCo throw e; } } -} \ No newline at end of file +} diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/ValueTypeCodec.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/ValueTypeCodec.java index e0a4162b8c..2b8b69d08e 100644 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/ValueTypeCodec.java +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/ValueTypeCodec.java @@ -11,8 +11,8 @@ import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; +import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections; import org.opendaylight.yangtools.concepts.Codec; -import org.opendaylight.yangtools.yang.binding.util.BindingReflections; import org.opendaylight.yangtools.yang.common.Empty; import org.opendaylight.yangtools.yang.model.api.TypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.BitsTypeDefinition; diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/util/AugmentableDispatchSerializer.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/util/AugmentableDispatchSerializer.java index 3aa7a92493..0c5c4ba7b0 100644 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/util/AugmentableDispatchSerializer.java +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/util/AugmentableDispatchSerializer.java @@ -14,6 +14,7 @@ import java.lang.reflect.Proxy; import java.util.Collections; import java.util.Map; import java.util.Map.Entry; +import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections; import org.opendaylight.yangtools.yang.binding.Augmentable; import org.opendaylight.yangtools.yang.binding.Augmentation; import org.opendaylight.yangtools.yang.binding.BindingStreamEventWriter; @@ -21,7 +22,6 @@ import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.DataObjectSerializer; import org.opendaylight.yangtools.yang.binding.DataObjectSerializerImplementation; import org.opendaylight.yangtools.yang.binding.DataObjectSerializerRegistry; -import org.opendaylight.yangtools.yang.binding.util.BindingReflections; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -79,4 +79,4 @@ public class AugmentableDispatchSerializer implements DataObjectSerializerImplem LOG.warn("DataObjectSerializer is not present for {} in registry {}", type, registry); } } -} \ No newline at end of file +} diff --git a/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/test/AbstractBindingRuntimeTest.java b/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/test/AbstractBindingRuntimeTest.java index 93b06ff40a..ab129931c7 100644 --- a/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/test/AbstractBindingRuntimeTest.java +++ b/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/test/AbstractBindingRuntimeTest.java @@ -11,7 +11,7 @@ import org.junit.AfterClass; import org.junit.BeforeClass; import org.opendaylight.mdsal.binding.generator.impl.ModuleInfoBackedContext; import org.opendaylight.mdsal.binding.generator.util.BindingRuntimeContext; -import org.opendaylight.yangtools.yang.binding.util.BindingReflections; +import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections; import org.opendaylight.yangtools.yang.model.api.SchemaContext; public abstract class AbstractBindingRuntimeTest { diff --git a/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/test/AugmentationClassDiscoveredAfterCodecTest.java b/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/test/AugmentationClassDiscoveredAfterCodecTest.java index ab71cd69cb..4b8602af55 100644 --- a/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/test/AugmentationClassDiscoveredAfterCodecTest.java +++ b/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/test/AugmentationClassDiscoveredAfterCodecTest.java @@ -23,6 +23,7 @@ import org.opendaylight.mdsal.binding.generator.impl.GeneratedClassLoadingStrate import org.opendaylight.mdsal.binding.generator.impl.ModuleInfoBackedContext; import org.opendaylight.mdsal.binding.generator.util.BindingRuntimeContext; import org.opendaylight.mdsal.binding.generator.util.JavassistUtils; +import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.augment.rev140709.TreeComplexUsesAugment; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.augment.rev140709.TreeLeafOnlyAugment; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.augment.rev140709.TreeLeafOnlyAugmentBuilder; @@ -31,7 +32,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.te import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.binding.rev140701.two.level.list.TopLevelListBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.binding.rev140701.two.level.list.TopLevelListKey; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; -import org.opendaylight.yangtools.yang.binding.util.BindingReflections; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; import org.opendaylight.yangtools.yang.model.api.SchemaContext; diff --git a/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/test/ExceptionReportingTest.java b/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/test/ExceptionReportingTest.java index d3b0fd936f..eaa748b8e5 100644 --- a/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/test/ExceptionReportingTest.java +++ b/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/test/ExceptionReportingTest.java @@ -17,6 +17,7 @@ import org.opendaylight.mdsal.binding.dom.codec.impl.MissingSchemaForClassExcept import org.opendaylight.mdsal.binding.generator.impl.ModuleInfoBackedContext; import org.opendaylight.mdsal.binding.generator.util.BindingRuntimeContext; import org.opendaylight.mdsal.binding.generator.util.JavassistUtils; +import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.augment.rev140709.TreeComplexUsesAugment; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.augment.rev140709.TreeLeafOnlyAugment; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.binding.rev140701.Top; @@ -25,7 +26,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.te import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.yangtools.test.union.rev150121.LowestLevel1; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.binding.YangModuleInfo; -import org.opendaylight.yangtools.yang.binding.util.BindingReflections; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.model.api.SchemaContext; diff --git a/binding/mdsal-binding-generator-impl/pom.xml b/binding/mdsal-binding-generator-impl/pom.xml index 9ed253c8a9..be93eb9681 100644 --- a/binding/mdsal-binding-generator-impl/pom.xml +++ b/binding/mdsal-binding-generator-impl/pom.xml @@ -51,17 +51,21 @@ org.opendaylight.yangtools yang-data-impl + + org.opendaylight.yangtools + yang-parser-impl + org.opendaylight.mdsal - mdsal-binding-generator-api + mdsal-binding-spec-util org.opendaylight.mdsal - mdsal-binding-generator-util + mdsal-binding-generator-api - org.opendaylight.yangtools - yang-parser-impl + org.opendaylight.mdsal + mdsal-binding-generator-util diff --git a/binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/mdsal/binding/generator/impl/BindingSchemaContextUtils.java b/binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/mdsal/binding/generator/impl/BindingSchemaContextUtils.java index f930017c9b..2c67e53148 100644 --- a/binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/mdsal/binding/generator/impl/BindingSchemaContextUtils.java +++ b/binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/mdsal/binding/generator/impl/BindingSchemaContextUtils.java @@ -13,13 +13,13 @@ import com.google.common.base.Preconditions; import java.util.HashSet; import java.util.Iterator; import java.util.Set; +import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections; import org.opendaylight.yangtools.yang.binding.Augmentation; import org.opendaylight.yangtools.yang.binding.BindingMapping; import org.opendaylight.yangtools.yang.binding.ChildOf; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.PathArgument; -import org.opendaylight.yangtools.yang.binding.util.BindingReflections; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.QNameModule; import org.opendaylight.yangtools.yang.model.api.AugmentationSchemaNode; diff --git a/binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/mdsal/binding/generator/impl/ModuleInfoBackedContext.java b/binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/mdsal/binding/generator/impl/ModuleInfoBackedContext.java index 227824237b..e6d07c038a 100644 --- a/binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/mdsal/binding/generator/impl/ModuleInfoBackedContext.java +++ b/binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/mdsal/binding/generator/impl/ModuleInfoBackedContext.java @@ -15,11 +15,11 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import org.opendaylight.mdsal.binding.generator.api.ClassLoadingStrategy; import org.opendaylight.mdsal.binding.generator.api.ModuleInfoRegistry; +import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections; import org.opendaylight.yangtools.concepts.AbstractObjectRegistration; import org.opendaylight.yangtools.concepts.ObjectRegistration; import org.opendaylight.yangtools.util.ClassLoaderUtils; import org.opendaylight.yangtools.yang.binding.YangModuleInfo; -import org.opendaylight.yangtools.yang.binding.util.BindingReflections; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.SchemaContext; import org.opendaylight.yangtools.yang.model.api.SchemaContextProvider; 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 9b2cbcc613..2e57cbe00a 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 @@ -70,7 +70,7 @@ import org.slf4j.LoggerFactory; *

Runtime Context provides additional insight in Java YANG Binding, * binding classes and underlying YANG schema, it contains * runtime information, which could not be derived from generated - * classes alone using {@link org.opendaylight.yangtools.yang.binding.util.BindingReflections}. + * classes alone using {@link org.opendaylight.mdsal.binding.spec.reflect.BindingReflections}. * *

Some of this information are for example list of all available * children for cases {@link #getChoiceCaseChildren(DataNodeContainer)}, since diff --git a/binding/mdsal-binding-spec-util/src/main/java/org/opendaylight/mdsal/binding/spec/reflect/AugmentationFieldGetter.java b/binding/mdsal-binding-spec-util/src/main/java/org/opendaylight/mdsal/binding/spec/reflect/AugmentationFieldGetter.java new file mode 100644 index 0000000000..44ae45e46f --- /dev/null +++ b/binding/mdsal-binding-spec-util/src/main/java/org/opendaylight/mdsal/binding/spec/reflect/AugmentationFieldGetter.java @@ -0,0 +1,107 @@ +/* + * 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.spec.reflect; + +import static java.util.Objects.requireNonNull; + +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodHandles.Lookup; +import java.lang.invoke.MethodType; +import java.lang.reflect.Field; +import java.util.Collections; +import java.util.Map; +import org.opendaylight.yangtools.yang.binding.Augmentation; +import org.opendaylight.yangtools.yang.binding.AugmentationHolder; +import org.opendaylight.yangtools.yang.binding.BindingMapping; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +abstract class AugmentationFieldGetter { + + private static final Logger LOG = LoggerFactory.getLogger(AugmentationFieldGetter.class); + + private static final AugmentationFieldGetter DUMMY = new AugmentationFieldGetter() { + @Override + protected Map>, Augmentation> getAugmentations(final Object input) { + return Collections.emptyMap(); + } + }; + + private static final AugmentationFieldGetter AUGMENTATION_HOLDER_GETTER = new AugmentationFieldGetter() { + @Override + @SuppressWarnings({"unchecked", "rawtypes"}) + protected Map>, Augmentation> getAugmentations(final Object input) { + return (Map) ((AugmentationHolder) input).augmentations(); + } + }; + + private static final LoadingCache, AugmentationFieldGetter> AUGMENTATION_GETTERS = + CacheBuilder.newBuilder().weakKeys().build(new AugmentationGetterLoader()); + + /** + * Retrieves augmentations from supplied object. + * + * @param input Input Data object, from which augmentations should be extracted + * @return Map of Augmentation class to augmentation + */ + protected abstract Map>, Augmentation> getAugmentations(Object input); + + public static AugmentationFieldGetter getGetter(final Class clz) { + if (AugmentationHolder.class.isAssignableFrom(clz)) { + return AUGMENTATION_HOLDER_GETTER; + } + return AUGMENTATION_GETTERS.getUnchecked(clz); + } + + private static final class AugmentationGetterLoader extends CacheLoader, AugmentationFieldGetter> { + private static final MethodType GETTER_TYPE = MethodType.methodType(Map.class, Object.class); + private static final Lookup LOOKUP = MethodHandles.lookup(); + + @Override + public AugmentationFieldGetter load(final Class key) throws IllegalAccessException { + final Field field; + try { + field = key.getDeclaredField(BindingMapping.AUGMENTATION_FIELD); + field.setAccessible(true); + } catch (NoSuchFieldException | SecurityException e) { + LOG.warn("Failed to acquire augmentation field {}, ignoring augmentations in class {}", + BindingMapping.AUGMENTATION_FIELD, key, e); + return DUMMY; + } + if (!Map.class.isAssignableFrom(field.getType())) { + LOG.warn("Class {} field {} is not a Map, ignoring augmentations", key, + BindingMapping.AUGMENTATION_FIELD); + return DUMMY; + } + + return new ReflectionAugmentationFieldGetter(LOOKUP.unreflectGetter(field).asType(GETTER_TYPE)); + } + } + + private static final class ReflectionAugmentationFieldGetter extends AugmentationFieldGetter { + private final MethodHandle fieldGetter; + + ReflectionAugmentationFieldGetter(final MethodHandle mh) { + this.fieldGetter = requireNonNull(mh); + } + + @Override + @SuppressWarnings("checkstyle:illegalCatch") + protected Map>, Augmentation> getAugmentations(final Object input) { + try { + return (Map>, Augmentation>) fieldGetter.invokeExact(input); + } catch (Throwable e) { + throw new IllegalStateException("Failed to access augmentation field on " + input, e); + } + } + } +} diff --git a/binding/mdsal-binding-spec-util/src/main/java/org/opendaylight/mdsal/binding/spec/reflect/BindingReflections.java b/binding/mdsal-binding-spec-util/src/main/java/org/opendaylight/mdsal/binding/spec/reflect/BindingReflections.java new file mode 100644 index 0000000000..90d8ec52df --- /dev/null +++ b/binding/mdsal-binding-spec-util/src/main/java/org/opendaylight/mdsal/binding/spec/reflect/BindingReflections.java @@ -0,0 +1,626 @@ +/* + * Copyright (c) 2013 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.spec.reflect; + +import static com.google.common.base.Preconditions.checkArgument; +import static com.google.common.base.Preconditions.checkState; + +import com.google.common.base.Optional; +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.ImmutableSet.Builder; +import com.google.common.collect.Sets; +import com.google.common.util.concurrent.ListenableFuture; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.Type; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.ServiceLoader; +import java.util.concurrent.TimeUnit; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import javax.annotation.RegEx; +import org.opendaylight.yangtools.util.ClassLoaderUtils; +import org.opendaylight.yangtools.yang.binding.Action; +import org.opendaylight.yangtools.yang.binding.Augmentable; +import org.opendaylight.yangtools.yang.binding.Augmentation; +import org.opendaylight.yangtools.yang.binding.BaseIdentity; +import org.opendaylight.yangtools.yang.binding.BindingMapping; +import org.opendaylight.yangtools.yang.binding.ChildOf; +import org.opendaylight.yangtools.yang.binding.DataContainer; +import org.opendaylight.yangtools.yang.binding.DataObject; +import org.opendaylight.yangtools.yang.binding.Notification; +import org.opendaylight.yangtools.yang.binding.RpcService; +import org.opendaylight.yangtools.yang.binding.YangModelBindingProvider; +import org.opendaylight.yangtools.yang.binding.YangModuleInfo; +import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.common.QNameModule; +import org.opendaylight.yangtools.yang.common.YangConstants; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public final class BindingReflections { + + private static final long EXPIRATION_TIME = 60; + + @RegEx + private static final String ROOT_PACKAGE_PATTERN_STRING = + "(org.opendaylight.yang.gen.v1.[a-z0-9_\\.]*\\.(?:rev[0-9][0-9][0-1][0-9][0-3][0-9]|norev))"; + private static final Pattern ROOT_PACKAGE_PATTERN = Pattern.compile(ROOT_PACKAGE_PATTERN_STRING); + private static final Logger LOG = LoggerFactory.getLogger(BindingReflections.class); + + private static final LoadingCache, Optional> CLASS_TO_QNAME = CacheBuilder.newBuilder() + .weakKeys() + .expireAfterAccess(EXPIRATION_TIME, TimeUnit.SECONDS) + .build(new ClassToQNameLoader()); + + private BindingReflections() { + throw new UnsupportedOperationException("Utility class."); + } + + /** + * Find augmentation target class from concrete Augmentation class. This method uses first generic argument of + * implemented {@link Augmentation} interface. + * + * @param augmentation + * {@link Augmentation} subclass for which we want to determine + * augmentation target. + * @return Augmentation target - class which augmentation provides additional extensions. + */ + public static Class> findAugmentationTarget( + final Class> augmentation) { + return ClassLoaderUtils.findFirstGenericArgument(augmentation, Augmentation.class); + } + + /** + * Find data hierarchy parent from concrete Data class. This method uses first generic argument of implemented + * {@link ChildOf} interface. + * + * @param childClass + * child class for which we want to find the parent class. + * @return Parent class, e.g. class of which the childClass is ChildOf. + */ + public static Class findHierarchicalParent(final Class> childClass) { + return ClassLoaderUtils.findFirstGenericArgument(childClass, ChildOf.class); + } + + /** + * Find data hierarchy parent from concrete Data class. This method is shorthand which gets DataObject class by + * invoking {@link DataObject#getImplementedInterface()} and uses {@link #findHierarchicalParent(Class)}. + * + * @param child + * Child object for which the parent needs to be located. + * @return Parent class, or null if a parent is not found. + */ + public static Class findHierarchicalParent(final DataObject child) { + if (child instanceof ChildOf) { + return ClassLoaderUtils.findFirstGenericArgument(child.getImplementedInterface(), ChildOf.class); + } + return null; + } + + /** + * Returns a QName associated to supplied type. + * + * @param dataType Data type class + * @return QName associated to supplied dataType. If dataType is Augmentation method does not return canonical + * QName, but QName with correct namespace revision, but virtual local name, since augmentations do not + * have name. May return null if QName is not present. + */ + public static QName findQName(final Class dataType) { + return CLASS_TO_QNAME.getUnchecked(dataType).orNull(); + } + + /** + * Checks if method is RPC invocation. + * + * @param possibleMethod + * Method to check + * @return true if method is RPC invocation, false otherwise. + */ + public static boolean isRpcMethod(final Method possibleMethod) { + return possibleMethod != null && RpcService.class.isAssignableFrom(possibleMethod.getDeclaringClass()) + && ListenableFuture.class.isAssignableFrom(possibleMethod.getReturnType()) + // length <= 2: it seemed to be impossible to get correct RpcMethodInvoker because of + // resolveRpcInputClass() check.While RpcMethodInvoker counts with one argument for + // non input type and two arguments for input type, resolveRpcInputClass() counting + // with zero for non input and one for input type + && possibleMethod.getParameterTypes().length <= 2; + } + + /** + * Extracts Output class for RPC method. + * + * @param targetMethod + * method to scan + * @return Optional.absent() if result type could not be get, or return type is Void. + */ + @SuppressWarnings("rawtypes") + public static Optional> resolveRpcOutputClass(final Method targetMethod) { + checkState(isRpcMethod(targetMethod), "Supplied method is not a RPC invocation method"); + Type futureType = targetMethod.getGenericReturnType(); + Type rpcResultType = ClassLoaderUtils.getFirstGenericParameter(futureType); + Type rpcResultArgument = ClassLoaderUtils.getFirstGenericParameter(rpcResultType); + if (rpcResultArgument instanceof Class && !Void.class.equals(rpcResultArgument)) { + return Optional.of((Class) rpcResultArgument); + } + return Optional.absent(); + } + + /** + * Extracts input class for RPC method. + * + * @param targetMethod + * method to scan + * @return Optional.absent() if RPC has no input, RPC input type otherwise. + */ + @SuppressWarnings("rawtypes") + public static Optional> resolveRpcInputClass(final Method targetMethod) { + for (Class clazz : targetMethod.getParameterTypes()) { + if (DataContainer.class.isAssignableFrom(clazz)) { + return Optional.of(clazz); + } + } + return Optional.absent(); + } + + public static QName getQName(final Class context) { + return findQName(context); + } + + /** + * Checks if class is child of augmentation. + */ + public static boolean isAugmentationChild(final Class clazz) { + // FIXME: Current resolver could be still confused when child node was added by grouping + checkArgument(clazz != null); + + @SuppressWarnings({ "rawtypes", "unchecked" }) + Class parent = findHierarchicalParent((Class) clazz); + if (parent == null) { + LOG.debug("Did not find a parent for class {}", clazz); + return false; + } + + String clazzModelPackage = getModelRootPackageName(clazz.getPackage()); + String parentModelPackage = getModelRootPackageName(parent.getPackage()); + + return !clazzModelPackage.equals(parentModelPackage); + } + + /** + * Returns root package name for suplied package. + * + * @param pkg + * Package for which find model root package. + * @return Package of model root. + */ + public static String getModelRootPackageName(final Package pkg) { + return getModelRootPackageName(pkg.getName()); + } + + /** + * Returns root package name for supplied package name. + * + * @param name + * Package for which find model root package. + * @return Package of model root. + */ + public static String getModelRootPackageName(final String name) { + checkArgument(name != null, "Package name should not be null."); + checkArgument(name.startsWith(BindingMapping.PACKAGE_PREFIX), "Package name not starting with %s, is: %s", + BindingMapping.PACKAGE_PREFIX, name); + Matcher match = ROOT_PACKAGE_PATTERN.matcher(name); + checkArgument(match.find(), "Package name '%s' does not match required pattern '%s'", name, + ROOT_PACKAGE_PATTERN_STRING); + return match.group(0); + } + + @SuppressWarnings("checkstyle:illegalCatch") + public static QNameModule getQNameModule(final Class clz) { + if (DataContainer.class.isAssignableFrom(clz) || BaseIdentity.class.isAssignableFrom(clz) + || Action.class.isAssignableFrom(clz)) { + return findQName(clz).getModule(); + } + try { + return BindingReflections.getModuleInfo(clz).getName().getModule(); + } catch (Exception e) { + throw new IllegalStateException("Unable to get QName of defining model.", e); + } + } + + /** + * Extract a QNameModule from YangModuleInfo. + * + * @param modInfo Module info + * @return QNameModule for the module + * @throws NullPointerException in modInfo is null + * + * @deprecated Use {@code YangModuleInfo.getName().getModule()} instead. + */ + @Deprecated + public static QNameModule getQNameModule(final YangModuleInfo modInfo) { + return modInfo.getName().getModule(); + } + + /** + * Returns instance of {@link YangModuleInfo} of declaring model for specific class. + * + * @param cls data object class + * @return Instance of {@link YangModuleInfo} associated with model, from + * which this class was derived. + */ + public static YangModuleInfo getModuleInfo(final Class cls) throws Exception { + checkArgument(cls != null); + String packageName = getModelRootPackageName(cls.getPackage()); + final String potentialClassName = getModuleInfoClassName(packageName); + return ClassLoaderUtils.callWithClassLoader(cls.getClassLoader(), () -> { + Class moduleInfoClass = Thread.currentThread().getContextClassLoader().loadClass(potentialClassName); + return (YangModuleInfo) moduleInfoClass.getMethod("getInstance").invoke(null); + }); + } + + public static String getModuleInfoClassName(final String packageName) { + return packageName + "." + BindingMapping.MODULE_INFO_CLASS_NAME; + } + + /** + * Check if supplied class is derived from YANG model. + * + * @param cls + * Class to check + * @return true if class is derived from YANG model. + */ + public static boolean isBindingClass(final Class cls) { + if (DataContainer.class.isAssignableFrom(cls) || Augmentation.class.isAssignableFrom(cls)) { + return true; + } + return cls.getName().startsWith(BindingMapping.PACKAGE_PREFIX); + } + + /** + * Checks if supplied method is callback for notifications. + * + * @param method method to check + * @return true if method is notification callback. + */ + public static boolean isNotificationCallback(final Method method) { + checkArgument(method != null); + if (method.getName().startsWith("on") && method.getParameterTypes().length == 1) { + Class potentialNotification = method.getParameterTypes()[0]; + if (isNotification(potentialNotification) + && method.getName().equals("on" + potentialNotification.getSimpleName())) { + return true; + } + } + return false; + } + + /** + * Checks is supplied class is a {@link Notification}. + * + * @param potentialNotification class to examine + * @return True if the class represents a Notification. + */ + public static boolean isNotification(final Class potentialNotification) { + checkArgument(potentialNotification != null, "potentialNotification must not be null."); + return Notification.class.isAssignableFrom(potentialNotification); + } + + /** + * Loads {@link YangModuleInfo} infos available on current classloader. This method is shorthand for + * {@link #loadModuleInfos(ClassLoader)} with {@link Thread#getContextClassLoader()} for current thread. + * + * @return Set of {@link YangModuleInfo} available for current classloader. + */ + public static ImmutableSet loadModuleInfos() { + return loadModuleInfos(Thread.currentThread().getContextClassLoader()); + } + + /** + * Loads {@link YangModuleInfo} infos available on supplied classloader. + * + *

+ * {@link YangModuleInfo} are discovered using {@link ServiceLoader} for {@link YangModelBindingProvider}. + * {@link YangModelBindingProvider} are simple classes which holds only pointers to actual instance + * {@link YangModuleInfo}. + * + *

+ * When {@link YangModuleInfo} is available, all dependencies are recursively collected into returning set by + * collecting results of {@link YangModuleInfo#getImportedModules()}. + * + * @param loader + * Classloader for which {@link YangModuleInfo} should be + * retrieved. + * @return Set of {@link YangModuleInfo} available for supplied classloader. + */ + public static ImmutableSet loadModuleInfos(final ClassLoader loader) { + Builder moduleInfoSet = ImmutableSet.builder(); + ServiceLoader serviceLoader = ServiceLoader.load(YangModelBindingProvider.class, + loader); + for (YangModelBindingProvider bindingProvider : serviceLoader) { + YangModuleInfo moduleInfo = bindingProvider.getModuleInfo(); + checkState(moduleInfo != null, "Module Info for %s is not available.", bindingProvider.getClass()); + collectYangModuleInfo(bindingProvider.getModuleInfo(), moduleInfoSet); + } + return moduleInfoSet.build(); + } + + private static void collectYangModuleInfo(final YangModuleInfo moduleInfo, + final Builder moduleInfoSet) { + moduleInfoSet.add(moduleInfo); + for (YangModuleInfo dependency : moduleInfo.getImportedModules()) { + collectYangModuleInfo(dependency, moduleInfoSet); + } + } + + /** + * Checks if supplied class represents RPC Input / RPC Output. + * + * @param targetType + * Class to be checked + * @return true if class represents RPC Input or RPC Output class. + */ + public static boolean isRpcType(final Class targetType) { + return DataContainer.class.isAssignableFrom(targetType) + && !ChildOf.class.isAssignableFrom(targetType) + && !Notification.class.isAssignableFrom(targetType) + && (targetType.getName().endsWith("Input") || targetType.getName().endsWith("Output")); + } + + /** + * Scans supplied class and returns an iterable of all data children classes. + * + * @param type + * YANG Modeled Entity derived from DataContainer + * @return Iterable of all data children, which have YANG modeled entity + */ + @SuppressWarnings("unchecked") + public static Iterable> getChildrenClasses(final Class type) { + checkArgument(type != null, "Target type must not be null"); + checkArgument(DataContainer.class.isAssignableFrom(type), "Supplied type must be derived from DataContainer"); + List> ret = new LinkedList<>(); + for (Method method : type.getMethods()) { + Optional> entity = getYangModeledReturnType(method); + if (entity.isPresent()) { + ret.add((Class) entity.get()); + } + } + return ret; + } + + /** + * Scans supplied class and returns an iterable of all data children classes. + * + * @param type + * YANG Modeled Entity derived from DataContainer + * @return Iterable of all data children, which have YANG modeled entity + */ + public static Map, Method> getChildrenClassToMethod(final Class type) { + checkArgument(type != null, "Target type must not be null"); + checkArgument(DataContainer.class.isAssignableFrom(type), "Supplied type %s must be derived from DataContainer", + type); + Map, Method> ret = new HashMap<>(); + for (Method method : type.getMethods()) { + Optional> entity = getYangModeledReturnType(method); + if (entity.isPresent()) { + ret.put(entity.get(), method); + } + } + return ret; + } + + @SuppressWarnings({ "unchecked", "rawtypes", "checkstyle:illegalCatch" }) + private static Optional> getYangModeledReturnType(final Method method) { + if ("getClass".equals(method.getName()) || !method.getName().startsWith("get") + || method.getParameterTypes().length > 0) { + return Optional.absent(); + } + + Class returnType = method.getReturnType(); + if (DataContainer.class.isAssignableFrom(returnType)) { + return Optional.of(returnType); + } else if (List.class.isAssignableFrom(returnType)) { + try { + return ClassLoaderUtils.callWithClassLoader(method.getDeclaringClass().getClassLoader(), () -> { + Type listResult = ClassLoaderUtils.getFirstGenericParameter(method.getGenericReturnType()); + if (listResult instanceof Class + && DataContainer.class.isAssignableFrom((Class) listResult)) { + return Optional.of((Class) listResult); + } + return Optional.absent(); + }); + } catch (Exception e) { + /* + * It is safe to log this this exception on debug, since this + * method should not fail. Only failures are possible if the + * runtime / backing. + */ + LOG.debug("Unable to find YANG modeled return type for {}", method, e); + } + } + return Optional.absent(); + } + + private static class ClassToQNameLoader extends CacheLoader, Optional> { + + @Override + public Optional load(@SuppressWarnings("NullableProblems") final Class key) throws Exception { + return resolveQNameNoCache(key); + } + + /** + * Tries to resolve QName for supplied class. Looks up for static field with name from constant + * {@link BindingMapping#QNAME_STATIC_FIELD_NAME} and returns value if present. If field is not present uses + * {@link #computeQName(Class)} to compute QName for missing types. + */ + private static Optional resolveQNameNoCache(final Class key) { + try { + final Field field; + try { + field = key.getField(BindingMapping.QNAME_STATIC_FIELD_NAME); + } catch (NoSuchFieldException e) { + LOG.debug("{} does not have a {} field, falling back to computation", key, + BindingMapping.QNAME_STATIC_FIELD_NAME, e); + return Optional.of(computeQName(key)); + } + + final Object obj = field.get(null); + if (obj instanceof QName) { + return Optional.of((QName) obj); + } + } catch (SecurityException | IllegalArgumentException | IllegalAccessException e) { + /* + * It is safe to log this this exception on debug, since this method should not fail. Only failures are + * possible if the runtime / backing is inconsistent. + */ + LOG.debug("Unexpected exception during extracting QName for {}", key, e); + } + return Optional.absent(); + } + + /** + * Computes QName for supplied class. Namespace and revision are same as {@link YangModuleInfo} associated with + * supplied class. + * + *

+ * If class is + *

    + *
  • rpc input: local name is "input". + *
  • rpc output: local name is "output". + *
  • augmentation: local name is "module name". + *
+ * + *

+ * There is also fallback, if it is not possible to compute QName using following algorithm returns module + * QName. + * + * @throws IllegalStateException If YangModuleInfo could not be resolved + * @throws IllegalArgumentException If supplied class was not derived from YANG model. + */ + // FIXME: Extend this algorithm to also provide QName for YANG modeled simple types. + @SuppressWarnings({ "rawtypes", "unchecked", "checkstyle:illegalCatch" }) + private static QName computeQName(final Class key) { + checkArgument(isBindingClass(key), "Supplied class %s is not derived from YANG.", key); + + YangModuleInfo moduleInfo; + try { + moduleInfo = getModuleInfo(key); + } catch (Exception e) { + throw new IllegalStateException("Unable to get QName for " + key + ". YangModuleInfo was not found.", + e); + } + final QName module = moduleInfo.getName(); + if (Augmentation.class.isAssignableFrom(key)) { + return module; + } else if (isRpcType(key)) { + final String className = key.getSimpleName(); + if (className.endsWith(BindingMapping.RPC_OUTPUT_SUFFIX)) { + return YangConstants.operationOutputQName(module.getModule()).intern(); + } + + return YangConstants.operationInputQName(module.getModule()).intern(); + } + + /* + * Fallback for Binding types which do not have QNAME field + */ + return module; + } + } + + /** + * Given a {@link YangModuleInfo}, create a QName representing it. The QName is formed by reusing the module's + * namespace and revision using the module's name as the QName's local name. + * + * @param moduleInfo + * module information + * @return QName representing the module + * + * @deprecated Use {@link YangModuleInfo#getName()} instead. + */ + @Deprecated + public static QName getModuleQName(final YangModuleInfo moduleInfo) { + checkArgument(moduleInfo != null, "moduleInfo must not be null."); + return moduleInfo.getName(); + } + + /** + * Extracts augmentation from Binding DTO field using reflection. + * + * @param input + * Instance of DataObject which is augmentable and may contain + * augmentation + * @return Map of augmentations if read was successful, otherwise empty map. + */ + public static Map>, Augmentation> getAugmentations(final Augmentable input) { + return AugmentationFieldGetter.getGetter(input.getClass()).getAugmentations(input); + } + + /** + * Determines if two augmentation classes or case classes represents same + * data. + * + *

+ * Two augmentations or cases could be substituted only if and if: + *

    + *
  • Both implements same interfaces
  • + *
  • Both have same children
  • + *
  • If augmentations: Both have same augmentation target class. Target + * class was generated for data node in grouping.
  • + *
  • If cases: Both are from same choice. Choice class was generated for + * data node in grouping.
  • + *
+ * + *

+ * Explanation: Binding Specification reuses classes generated for + * groupings as part of normal data tree, this classes from grouping could + * be used at various locations and user may not be aware of it and may use + * incorrect case or augmentation in particular subtree (via copy + * constructors, etc). + * + * @param potential + * Class which is potential substitution + * @param target + * Class which should be used at particular subtree + * @return true if and only if classes represents same data. + */ + @SuppressWarnings({ "rawtypes", "unchecked" }) + public static boolean isSubstitutionFor(final Class potential, final Class target) { + HashSet subImplemented = Sets.newHashSet(potential.getInterfaces()); + HashSet targetImplemented = Sets.newHashSet(target.getInterfaces()); + if (!subImplemented.equals(targetImplemented)) { + return false; + } + if (Augmentation.class.isAssignableFrom(potential) + && !BindingReflections.findAugmentationTarget(potential).equals( + BindingReflections.findAugmentationTarget(target))) { + return false; + } + for (Method potentialMethod : potential.getMethods()) { + try { + Method targetMethod = target.getMethod(potentialMethod.getName(), potentialMethod.getParameterTypes()); + if (!potentialMethod.getReturnType().equals(targetMethod.getReturnType())) { + return false; + } + } catch (NoSuchMethodException e) { + // Counterpart method is missing, so classes could not be substituted. + return false; + } catch (SecurityException e) { + throw new IllegalStateException("Could not compare methods", e); + } + } + return true; + } +} diff --git a/binding/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/util/AugmentationFieldGetterTest.java b/binding/mdsal-binding-spec-util/src/test/java/org/opendaylight/mdsal/binding/spec/reflect/AugmentationFieldGetterTest.java similarity index 94% rename from binding/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/util/AugmentationFieldGetterTest.java rename to binding/mdsal-binding-spec-util/src/test/java/org/opendaylight/mdsal/binding/spec/reflect/AugmentationFieldGetterTest.java index 5e0e89454b..6ae8170679 100644 --- a/binding/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/util/AugmentationFieldGetterTest.java +++ b/binding/mdsal-binding-spec-util/src/test/java/org/opendaylight/mdsal/binding/spec/reflect/AugmentationFieldGetterTest.java @@ -5,14 +5,14 @@ * 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.yangtools.yang.binding.util; +package org.opendaylight.mdsal.binding.spec.reflect; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.mockito.Mockito.mock; -import static org.opendaylight.yangtools.yang.binding.util.AugmentationFieldGetter.getGetter; +import static org.opendaylight.mdsal.binding.spec.reflect.AugmentationFieldGetter.getGetter; import java.util.HashMap; import java.util.Map; diff --git a/binding/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/util/BindingReflectionsTest.java b/binding/mdsal-binding-spec-util/src/test/java/org/opendaylight/mdsal/binding/spec/reflect/BindingReflectionsTest.java similarity index 93% rename from binding/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/util/BindingReflectionsTest.java rename to binding/mdsal-binding-spec-util/src/test/java/org/opendaylight/mdsal/binding/spec/reflect/BindingReflectionsTest.java index c83459e8cd..9f473a7758 100644 --- a/binding/yang-binding/src/test/java/org/opendaylight/yangtools/yang/binding/util/BindingReflectionsTest.java +++ b/binding/mdsal-binding-spec-util/src/test/java/org/opendaylight/mdsal/binding/spec/reflect/BindingReflectionsTest.java @@ -5,7 +5,7 @@ * 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.yangtools.yang.binding.util; +package org.opendaylight.mdsal.binding.spec.reflect; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -13,7 +13,7 @@ import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; -import static org.opendaylight.yangtools.yang.binding.util.BindingReflections.findHierarchicalParent; +import static org.opendaylight.mdsal.binding.spec.reflect.BindingReflections.findHierarchicalParent; import com.google.common.util.concurrent.ListenableFuture; import java.lang.reflect.Constructor; @@ -21,13 +21,13 @@ import java.lang.reflect.InvocationTargetException; import java.util.Collections; import java.util.List; import org.junit.Test; +import org.opendaylight.mdsal.binding.spec.util.FooChild; +import org.opendaylight.mdsal.binding.spec.util.GroupingFoo; import org.opendaylight.yangtools.yang.binding.Augmentation; import org.opendaylight.yangtools.yang.binding.BaseIdentity; import org.opendaylight.yangtools.yang.binding.ChildOf; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.RpcService; -import org.opendaylight.yangtools.yang.binding.test.mock.FooChild; -import org.opendaylight.yangtools.yang.binding.test.mock.GroupingFoo; import org.opendaylight.yangtools.yang.common.QName; public class BindingReflectionsTest { diff --git a/binding/mdsal-binding-spec-util/src/test/java/org/opendaylight/mdsal/binding/spec/util/FooChild.java b/binding/mdsal-binding-spec-util/src/test/java/org/opendaylight/mdsal/binding/spec/util/FooChild.java new file mode 100644 index 0000000000..c8c655256d --- /dev/null +++ b/binding/mdsal-binding-spec-util/src/test/java/org/opendaylight/mdsal/binding/spec/util/FooChild.java @@ -0,0 +1,14 @@ +/* + * 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.spec.util; + +import org.opendaylight.yangtools.yang.binding.ChildOf; + +public interface FooChild extends ChildOf { + +} diff --git a/binding/mdsal-binding-spec-util/src/test/java/org/opendaylight/mdsal/binding/spec/util/GroupingFoo.java b/binding/mdsal-binding-spec-util/src/test/java/org/opendaylight/mdsal/binding/spec/util/GroupingFoo.java new file mode 100644 index 0000000000..eb3fb35256 --- /dev/null +++ b/binding/mdsal-binding-spec-util/src/test/java/org/opendaylight/mdsal/binding/spec/util/GroupingFoo.java @@ -0,0 +1,12 @@ +/* + * 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.spec.util; + +public interface GroupingFoo { + +} diff --git a/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/util/AugmentationFieldGetter.java b/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/util/AugmentationFieldGetter.java index db69fbb6d7..d0980975d6 100644 --- a/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/util/AugmentationFieldGetter.java +++ b/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/util/AugmentationFieldGetter.java @@ -24,6 +24,7 @@ import org.opendaylight.yangtools.yang.binding.BindingMapping; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +@Deprecated abstract class AugmentationFieldGetter { private static final Logger LOG = LoggerFactory.getLogger(AugmentationFieldGetter.class); diff --git a/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/util/BindingReflections.java b/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/util/BindingReflections.java index 3d03e31217..d1c3fbdd15 100644 --- a/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/util/BindingReflections.java +++ b/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/util/BindingReflections.java @@ -50,6 +50,7 @@ import org.opendaylight.yangtools.yang.common.YangConstants; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +@Deprecated public final class BindingReflections { private static final long EXPIRATION_TIME = 60; -- 2.36.6