X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=binding%2Fmdsal-binding-spec-util%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fmdsal%2Fbinding%2Fspec%2Freflect%2FBindingReflections.java;h=2a0cbed23da3be91ff41ca4f0cb0b21f546abfb5;hb=6087dda3aa2e148c5046fb2d8e7b0f75a5eee844;hp=f82d8aa401d58f7a39f4c7549d4b0bccfdce1165;hpb=73c3eac37dce53601b42010eb4ddcdb3b7c0d8d8;p=mdsal.git 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 index f82d8aa401..2a0cbed23d 100644 --- 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 @@ -9,6 +9,7 @@ package org.opendaylight.mdsal.binding.spec.reflect; 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.annotations.Beta; import com.google.common.cache.CacheBuilder; @@ -33,6 +34,7 @@ import java.util.concurrent.TimeUnit; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.checkerframework.checker.regex.qual.Regex; +import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.mdsal.binding.spec.naming.BindingMapping; import org.opendaylight.yangtools.util.ClassLoaderUtils; import org.opendaylight.yangtools.yang.binding.Action; @@ -189,9 +191,10 @@ public final class BindingReflections { return Optional.empty(); } - // FIXME: 4.0.0: check that the QName is actually resolved, i.e. guarantee @NonNull here - public static QName getQName(final Class context) { - return findQName(context); + public static @NonNull QName getQName(final Class bindingClass) { + final Optional qname = CLASS_TO_QNAME.getUnchecked(requireNonNull(bindingClass)); + checkState(qname.isPresent(), "Failed to resolve QName of %s", bindingClass); + return qname.get(); } /** @@ -454,7 +457,7 @@ public final class BindingReflections { return getChildrenClassToMethod(type, BindingMapping.NONNULL_PREFIX); } - @SuppressWarnings({ "unchecked", "rawtypes", "checkstyle:illegalCatch" }) + @SuppressWarnings("checkstyle:illegalCatch") private static Optional> getYangModeledReturnType(final Method method, final String prefix) { final String methodName = method.getName(); @@ -462,16 +465,14 @@ public final class BindingReflections { return Optional.empty(); } - Class returnType = method.getReturnType(); + final Class returnType = method.getReturnType(); if (DataContainer.class.isAssignableFrom(returnType)) { - return Optional.of(returnType); - } - if (List.class.isAssignableFrom(returnType)) { + return optionalDataContainer(returnType); + } else if (List.class.isAssignableFrom(returnType)) { try { return ClassLoaderUtils.callWithClassLoader(method.getDeclaringClass().getClassLoader(), () -> { return ClassLoaderUtils.getFirstGenericParameter(method.getGenericReturnType()).flatMap( - result -> result instanceof Class && DataContainer.class.isAssignableFrom((Class) result) - ? Optional.of((Class) result) : Optional.empty()); + result -> result instanceof Class ? optionalCast((Class) result) : Optional.empty()); }); } catch (Exception e) { /* @@ -485,6 +486,14 @@ public final class BindingReflections { return Optional.empty(); } + private static Optional> optionalCast(final Class type) { + return DataContainer.class.isAssignableFrom(type) ? optionalDataContainer(type) : Optional.empty(); + } + + private static Optional> optionalDataContainer(final Class type) { + return Optional.of(type.asSubclass(DataContainer.class)); + } + private static class ClassToQNameLoader extends CacheLoader, Optional> { @Override