Improve SchemaUnawareCodec 83/103383/2
authorRobert Varga <robert.varga@pantheon.tech>
Fri, 25 Nov 2022 02:36:09 +0000 (03:36 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Fri, 25 Nov 2022 02:49:14 +0000 (03:49 +0100)
Propagate type safety a bit and reduce casts a bit.

JIRA: MDSAL-743
Change-Id: I05a727f9eb21f55f41c84b3dd5bb264aefd71a73
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/BitsCodec.java
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/EnumerationCodec.java
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/SchemaUnawareCodec.java

index ea16c388ab1f05d234b9e6549962b5cb56552979..dfd60003443243bda03b89b1669ec251a65a9cce 100644 (file)
@@ -30,12 +30,11 @@ import java.util.TreeSet;
 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.BitsTypeObject;
 import org.opendaylight.yangtools.yang.model.api.type.BitsTypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.BitsTypeDefinition.Bit;
 
 // FIXME: 'SchemaUnawareCodec' is not correct: we use BitsTypeDefinition in construction
-// FIXME: require the base class to be a TypeObject
-// FIXME: MDSAL-743: require BitsTypeObject base class
 final class BitsCodec extends SchemaUnawareCodec {
     /*
      * Use identity comparison for keys and allow classes to be GCd themselves.
@@ -47,8 +46,8 @@ final class BitsCodec extends SchemaUnawareCodec {
      *     "Virtual machine implementations are, however, encouraged to bias against clearing recently-created or
      *      recently-used soft references."
      */
-    private static final Cache<Class<?>, @NonNull BitsCodec> CACHE = CacheBuilder.newBuilder().weakKeys().softValues()
-        .build();
+    private static final Cache<Class<? extends BitsTypeObject>, @NonNull BitsCodec> CACHE =
+        CacheBuilder.newBuilder().weakKeys().softValues().build();
     private static final MethodType CONSTRUCTOR_INVOKE_TYPE = MethodType.methodType(Object.class, Boolean[].class);
 
     // Ordered by position
@@ -65,7 +64,7 @@ final class BitsCodec extends SchemaUnawareCodec {
 
     static @NonNull BitsCodec of(final Class<?> returnType, final BitsTypeDefinition rootType)
             throws ExecutionException {
-        return CACHE.get(returnType, () -> {
+        return CACHE.get(returnType.asSubclass(BitsTypeObject.class), () -> {
             final Map<String, Method> getters = new LinkedHashMap<>();
             final Set<String> ctorArgs = new TreeSet<>();
 
index aa77aa8d40584cb3ad8f7e0334424c2fad173fe7..6de6d512234420cae6f8ef9a78170319bff34242 100644 (file)
@@ -8,6 +8,7 @@
 package org.opendaylight.mdsal.binding.dom.codec.impl;
 
 import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Verify.verifyNotNull;
 import static java.util.Objects.requireNonNull;
 
 import com.google.common.cache.Cache;
@@ -38,8 +39,8 @@ final class EnumerationCodec extends SchemaUnawareCodec {
      *     "Virtual machine implementations are, however, encouraged to bias against clearing recently-created or
      *      recently-used soft references."
      */
-    private static final Cache<Class<?>, @NonNull EnumerationCodec> CACHE = CacheBuilder.newBuilder().weakKeys()
-        .softValues().build();
+    private static final Cache<Class<? extends EnumTypeObject>, @NonNull EnumerationCodec> CACHE =
+        CacheBuilder.newBuilder().weakKeys().softValues().build();
 
     private final ImmutableBiMap<String, Enum<?>> nameToEnum;
     private final Class<? extends Enum<?>> enumClass;
@@ -51,7 +52,7 @@ final class EnumerationCodec extends SchemaUnawareCodec {
 
     static @NonNull EnumerationCodec of(final Class<?> returnType, final EnumTypeDefinition def)
             throws ExecutionException {
-        return CACHE.get(returnType, () -> {
+        return CACHE.get(returnType.asSubclass(EnumTypeObject.class), () -> {
             final Class<? extends Enum<?>> enumType = castType(returnType);
 
             final Map<String, Enum<?>> mapping = Maps.uniqueIndex(Arrays.asList(enumType.getEnumConstants()),
@@ -82,7 +83,7 @@ final class EnumerationCodec extends SchemaUnawareCodec {
     @SuppressWarnings("unchecked")
     private static Class<? extends Enum<?>> castType(final Class<?> returnType) {
         checkArgument(Enum.class.isAssignableFrom(returnType));
-        return (Class<? extends Enum<?>>) returnType;
+        return (Class<? extends Enum<?>>) returnType.asSubclass(Enum.class);
     }
 
     @Override
@@ -96,7 +97,6 @@ final class EnumerationCodec extends SchemaUnawareCodec {
     @Override
     protected String serializeImpl(final Object input) {
         checkArgument(enumClass.isInstance(input), "Input %s is not a instance of %s", input, enumClass);
-        // FIXME: verifyNotNull here
-        return requireNonNull(nameToEnum.inverse().get(input));
+        return verifyNotNull(nameToEnum.inverse().get(input));
     }
 }
\ No newline at end of file
index 107a2c48d29feb180f09608bbd5897d8ce15f3c3..9c201fbdbf540262da2528c51b0badc41dce474e 100644 (file)
@@ -59,10 +59,10 @@ abstract class SchemaUnawareCodec extends AbstractValueCodec<Object, Object> {
         }
 
         try {
-            if (rootType instanceof EnumTypeDefinition) {
-                return EnumerationCodec.of(typeClz, (EnumTypeDefinition) rootType);
-            } else if (rootType instanceof BitsTypeDefinition) {
-                return BitsCodec.of(typeClz, (BitsTypeDefinition) rootType);
+            if (rootType instanceof EnumTypeDefinition enumType) {
+                return EnumerationCodec.of(typeClz, enumType);
+            } else if (rootType instanceof BitsTypeDefinition bitsType) {
+                return BitsCodec.of(typeClz, bitsType);
             } else {
                 return EncapsulatedValueCodec.of(typeClz);
             }