Loosen BindingDataContainerCodecTreeNode.getBindingClass()
[mdsal.git] / binding / mdsal-binding-dom-codec / src / main / java / org / opendaylight / mdsal / binding / dom / codec / impl / EncapsulatedValueCodec.java
index 6f8bcce74a6dc3b7049708a00cd37f671cee54ea..e1036085285a5a2071a20a644265bc321c3bfde2 100644 (file)
@@ -7,6 +7,7 @@
  */
 package org.opendaylight.mdsal.binding.dom.codec.impl;
 
+import static com.google.common.base.Verify.verifyNotNull;
 import static java.util.Objects.requireNonNull;
 
 import com.google.common.base.Throwables;
@@ -15,12 +16,11 @@ 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.Method;
 import java.util.concurrent.ExecutionException;
 import org.eclipse.jdt.annotation.NonNull;
-import org.opendaylight.mdsal.binding.spec.naming.BindingMapping;
+import org.opendaylight.yangtools.yang.binding.ScalarTypeObject;
+import org.opendaylight.yangtools.yang.binding.contract.Naming;
 
 /**
  * Derived YANG types are just immutable value holders for simple value
@@ -39,17 +39,18 @@ final class EncapsulatedValueCodec extends SchemaUnawareCodec {
      *     "Virtual machine implementations are, however, encouraged to bias against clearing recently-created or
      *      recently-used soft references."
      */
-    private static final LoadingCache<Class<?>, EncapsulatedValueCodec> CACHE = CacheBuilder.newBuilder().weakKeys()
-        .softValues().build(new CacheLoader<>() {
+    @SuppressWarnings("rawtypes")
+    private static final LoadingCache<Class<? extends ScalarTypeObject>, @NonNull EncapsulatedValueCodec> CACHE =
+        CacheBuilder.newBuilder().weakKeys().softValues().build(new CacheLoader<>() {
             @Override
-            public EncapsulatedValueCodec load(final Class<?> key) throws ReflectiveOperationException {
-                final Method m = key.getMethod(BindingMapping.SCALAR_TYPE_OBJECT_GET_VALUE_NAME);
-                final Lookup lookup = MethodHandles.publicLookup();
-                final MethodHandle getter = lookup.unreflect(m).asType(OBJ_METHOD);
-                final Class<?> valueType = m.getReturnType();
-                final MethodHandle constructor = lookup.findConstructor(key,
-                    MethodType.methodType(void.class, valueType)).asType(OBJ_METHOD);
-                return new EncapsulatedValueCodec(constructor, getter, valueType);
+            public EncapsulatedValueCodec load(final Class<? extends ScalarTypeObject> key)
+                    throws ReflectiveOperationException {
+                final var method = key.getMethod(Naming.SCALAR_TYPE_OBJECT_GET_VALUE_NAME);
+                final var lookup = MethodHandles.publicLookup();
+                final var retType = method.getReturnType();
+                return new EncapsulatedValueCodec(lookup.findConstructor(key,
+                    MethodType.methodType(void.class, retType)).asType(OBJ_METHOD),
+                    lookup.unreflect(method).asType(OBJ_METHOD), retType);
             }
         });
 
@@ -65,7 +66,11 @@ final class EncapsulatedValueCodec extends SchemaUnawareCodec {
     }
 
     static @NonNull EncapsulatedValueCodec of(final Class<?> typeClz) throws ExecutionException {
-        return CACHE.get(typeClz);
+        return CACHE.get(typeClz.asSubclass(ScalarTypeObject.class));
+    }
+
+    static @NonNull EncapsulatedValueCodec ofUnchecked(final Class<?> typeClz) {
+        return CACHE.getUnchecked(typeClz.asSubclass(ScalarTypeObject.class));
     }
 
     /**
@@ -79,8 +84,8 @@ final class EncapsulatedValueCodec extends SchemaUnawareCodec {
     }
 
     @Override
-    @SuppressWarnings("checkstyle:illegalCatch")
-    public Object deserialize(final Object input) {
+    @SuppressWarnings({ "null", "checkstyle:illegalCatch" })
+    protected Object deserializeImpl(final Object input) {
         try {
             return constructor.invokeExact(input);
         } catch (Throwable e) {
@@ -91,9 +96,9 @@ final class EncapsulatedValueCodec extends SchemaUnawareCodec {
 
     @Override
     @SuppressWarnings("checkstyle:illegalCatch")
-    public Object serialize(final Object input) {
+    protected Object serializeImpl(final Object input) {
         try {
-            return getter.invokeExact(input);
+            return verifyNotNull(getter.invokeExact(input));
         } catch (Throwable e) {
             Throwables.throwIfUnchecked(e);
             throw new IllegalStateException(e);