Promote SchemaUnawareCodec to a top-level construct 33/100533/1
authorRobert Varga <robert.varga@pantheon.tech>
Mon, 11 Apr 2022 14:09:15 +0000 (16:09 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Mon, 11 Apr 2022 14:09:15 +0000 (16:09 +0200)
The encapsulation in ValueTypeCodec seems to be rather unfortunate,
as it is obscuring what codec classes there are.

Change-Id: I25a3cf02b952da9293ad6c4937646c3198fbd6e6
JIRA: MDSAL-704
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/BindingCodecContext.java
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/EncapsulatedValueCodec.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 [new file with mode: 0644]
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/ValueTypeCodec.java
binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/UnionValueOptionContextTest.java

index 5c6b327413ca05a136b0e868115f8ae2e34aca83..57426e2e42e27fe92bf577034e1f22b925110d50 100644 (file)
@@ -435,7 +435,7 @@ public final class BindingCodecContext extends AbstractBindingNormalizedNodeSeri
         }
         // FIXME: MDSAL-670: this is right for most situations, but we must never return NOOP_CODEC for
         //                   valueType=Object.class
-        return ValueTypeCodec.NOOP_CODEC;
+        return SchemaUnawareCodec.NOOP_CODEC;
     }
 
     @SuppressWarnings("checkstyle:illegalCatch")
@@ -467,7 +467,7 @@ public final class BindingCodecContext extends AbstractBindingNormalizedNodeSeri
             }
             return getCodec(valueType, def);
         }
-        return ValueTypeCodec.getCodecFor(valueType, typeDef);
+        return SchemaUnawareCodec.of(valueType, typeDef);
     }
 
     @Override
index f5b0908961deabb7e0a6d253e47ad8043053e928..9a4238e9dcb9d891cac7002c9bb319395edc070b 100644 (file)
@@ -29,7 +29,6 @@ import java.util.Set;
 import java.util.TreeSet;
 import java.util.concurrent.ExecutionException;
 import org.eclipse.jdt.annotation.NonNull;
-import org.opendaylight.mdsal.binding.dom.codec.impl.ValueTypeCodec.SchemaUnawareCodec;
 import org.opendaylight.mdsal.binding.spec.naming.BindingMapping;
 import org.opendaylight.yangtools.yang.model.api.type.BitsTypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.BitsTypeDefinition.Bit;
index c756c0b8fd5f6db53277ee98ece26c2343c152fd..4bc09db2cc7e8d5d8eff5b3e0b7a5cfbd9560cd1 100644 (file)
@@ -19,7 +19,6 @@ 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.dom.codec.impl.ValueTypeCodec.SchemaUnawareCodec;
 import org.opendaylight.mdsal.binding.spec.naming.BindingMapping;
 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
 
index 076ff1935f135b9a014c5c7ff1347ec14cd17393..bd7d1614ff8b9cafb4ff987e456051b4eb376310 100644 (file)
@@ -20,7 +20,6 @@ import java.util.Set;
 import java.util.concurrent.ExecutionException;
 import java.util.stream.Collectors;
 import org.eclipse.jdt.annotation.NonNull;
-import org.opendaylight.mdsal.binding.dom.codec.impl.ValueTypeCodec.SchemaUnawareCodec;
 import org.opendaylight.yangtools.yang.binding.Enumeration;
 import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition.EnumPair;
diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/SchemaUnawareCodec.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/SchemaUnawareCodec.java
new file mode 100644 (file)
index 0000000..e5f5476
--- /dev/null
@@ -0,0 +1,74 @@
+/*
+ * Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.mdsal.binding.dom.codec.impl;
+
+import static java.util.Objects.requireNonNull;
+
+import java.util.concurrent.ExecutionException;
+import org.eclipse.jdt.annotation.NonNull;
+import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections;
+import org.opendaylight.yangtools.concepts.IllegalArgumentCodec;
+import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
+import org.opendaylight.yangtools.yang.model.api.type.BitsTypeDefinition;
+import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition;
+
+/**
+ * Marker interface for codecs, which functionality will not be affected by schema change (introduction of new YANG
+ * modules) they may have one static instance generated when first time needed.
+ */
+// FIXME: IllegalArgumentCodec is perhaps not appropriate here due to null behavior
+interface SchemaUnawareCodec extends IllegalArgumentCodec<Object, Object> {
+    /**
+     * No-op Codec, Java YANG Binding uses same types as NormalizedNode model for base YANG types, representing numbers,
+     * binary, strings and empty.
+     */
+    @NonNull SchemaUnawareCodec NOOP_CODEC = new SchemaUnawareCodec() {
+        @Override
+        public Object serialize(final Object input) {
+            return input;
+        }
+
+        @Override
+        public Object deserialize(final Object input) {
+            return input;
+        }
+    };
+
+    static @NonNull SchemaUnawareCodec of(final Class<?> typeClz, final TypeDefinition<?> def) {
+        if (BindingReflections.isBindingClass(typeClz)) {
+            return getCachedSchemaUnawareCodec(typeClz, def);
+        }
+        return NOOP_CODEC;
+    }
+
+    private static @NonNull SchemaUnawareCodec getCachedSchemaUnawareCodec(final Class<?> typeClz,
+            final TypeDefinition<?> def) {
+        // FIXME: extract this only when really needed
+        var rootType = requireNonNull(def);
+        while (true) {
+            final var base = rootType.getBaseType();
+            if (base != null) {
+                rootType = base;
+            } else {
+                break;
+            }
+        }
+
+        try {
+            if (rootType instanceof EnumTypeDefinition) {
+                return EnumerationCodec.of(typeClz, (EnumTypeDefinition) rootType);
+            } else if (rootType instanceof BitsTypeDefinition) {
+                return BitsCodec.of(typeClz, (BitsTypeDefinition) rootType);
+            } else {
+                return EncapsulatedValueCodec.of(typeClz, def);
+            }
+        } catch (ExecutionException e) {
+            throw new IllegalStateException(e);
+        }
+    }
+}
index 253fffae4041fbd9dde50001f69ce8be55f6b880..d9e3255027a60fb2c92e442c24088b58fd85f874 100644 (file)
@@ -7,80 +7,18 @@
  */
 package org.opendaylight.mdsal.binding.dom.codec.impl;
 
-import static java.util.Objects.requireNonNull;
-
-import java.util.concurrent.ExecutionException;
-import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections;
 import org.opendaylight.yangtools.concepts.IllegalArgumentCodec;
 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
-import org.opendaylight.yangtools.yang.model.api.type.BitsTypeDefinition;
-import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition;
 
 /**
  * Value codec, which serializes / deserializes values from DOM simple values.
  */
 // FIXME: IllegalArgumentCodec is perhaps not appropriate here due to null behavior
 abstract class ValueTypeCodec implements IllegalArgumentCodec<Object, Object> {
-    /**
-     * Marker interface for codecs, which functionality will not be affected by schema change (introduction of new YANG
-     * modules) they may have one static instance generated when first time needed.
-     */
-    // FIXME: IllegalArgumentCodec is perhaps not appropriate here due to null behavior
-    interface SchemaUnawareCodec extends IllegalArgumentCodec<Object, Object> {
-
-    }
-
-    /**
-     * No-op Codec, Java YANG Binding uses same types as NormalizedNode model for base YANG types, representing numbers,
-     * binary, strings and empty.
-     */
-    public static final SchemaUnawareCodec NOOP_CODEC = new SchemaUnawareCodec() {
-        @Override
-        public Object serialize(final Object input) {
-            return input;
-        }
-
-        @Override
-        public Object deserialize(final Object input) {
-            return input;
-        }
-    };
-
-    public static SchemaUnawareCodec getCodecFor(final Class<?> typeClz, final TypeDefinition<?> def) {
-        if (BindingReflections.isBindingClass(typeClz)) {
-            return getCachedSchemaUnawareCodec(typeClz, def);
-        }
-        return NOOP_CODEC;
-    }
-
-    private static SchemaUnawareCodec getCachedSchemaUnawareCodec(final Class<?> typeClz, final TypeDefinition<?> def) {
-        // FIXME: extract this only when really needed
-        var rootType = requireNonNull(def);
-        while (true) {
-            final var base = rootType.getBaseType();
-            if (base != null) {
-                rootType = base;
-            } else {
-                break;
-            }
-        }
-
-        try {
-            if (rootType instanceof EnumTypeDefinition) {
-                return EnumerationCodec.of(typeClz, (EnumTypeDefinition) rootType);
-            } else if (rootType instanceof BitsTypeDefinition) {
-                return BitsCodec.of(typeClz, (BitsTypeDefinition) rootType);
-            } else {
-                return EncapsulatedValueCodec.of(typeClz, def);
-            }
-        } catch (ExecutionException e) {
-            throw new IllegalStateException(e);
-        }
-    }
 
     @SuppressWarnings("rawtypes")
     static ValueTypeCodec encapsulatedValueCodecFor(final Class<?> typeClz, final TypeDefinition<?> typeDef,
              final IllegalArgumentCodec delegate) {
-        return new CompositeValueCodec(getCachedSchemaUnawareCodec(typeClz, typeDef), delegate);
+        return new CompositeValueCodec(SchemaUnawareCodec.of(typeClz, typeDef), delegate);
     }
 }
index 794659b176edb6b937502202f5307dbf1c2e5191..a71dbd1313095f0186fe803b2303ab5f01b71288 100644 (file)
@@ -25,16 +25,16 @@ public class UnionValueOptionContextTest {
         final Method methodFoo1 = TestDataObject1.class.getMethod("foo");
         final Method methodFoo2 = TestDataObject2.class.getMethod("foo");
         TEST_UVOC_1 = new UnionValueOptionContext(TestUnion.class, TestDataObject1.class, methodFoo1,
-            ValueTypeCodec.NOOP_CODEC);
+            SchemaUnawareCodec.NOOP_CODEC);
         TEST_UVOC_2 = new UnionValueOptionContext(TestUnion.class, TestDataObject2.class, methodFoo2,
-            ValueTypeCodec.NOOP_CODEC);
+            SchemaUnawareCodec.NOOP_CODEC);
     }
 
     @Test
     public void hashCodeTest() throws Exception {
         final Method methodFoo1 = TestDataObject1.class.getMethod("foo");
         final UnionValueOptionContext test_uvoc = new UnionValueOptionContext(TestUnion.class, TestDataObject1.class,
-            methodFoo1, ValueTypeCodec.NOOP_CODEC);
+            methodFoo1, SchemaUnawareCodec.NOOP_CODEC);
 
         assertEquals("HashCode", test_uvoc.hashCode(), TEST_UVOC_1.hashCode());
         assertNotEquals("HashCode", TEST_UVOC_1.hashCode(), TEST_UVOC_2.hashCode());
@@ -44,7 +44,7 @@ public class UnionValueOptionContextTest {
     public void equalsTest() throws Exception {
         final Method methodFoo1 = TestDataObject1.class.getMethod("foo");
         final UnionValueOptionContext test_uvoc = new UnionValueOptionContext(TestUnion.class, TestDataObject1.class,
-            methodFoo1, ValueTypeCodec.NOOP_CODEC);
+            methodFoo1, SchemaUnawareCodec.NOOP_CODEC);
 
         assertTrue("Equals", TEST_UVOC_1.equals(test_uvoc));
         assertFalse("Not equals", TEST_UVOC_1.equals(TEST_UVOC_2));