From c4d4ec8b44becb12d2ea0c2a2be8f24994c2b58d Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Mon, 11 Apr 2022 16:09:15 +0200 Subject: [PATCH] Promote SchemaUnawareCodec to a top-level construct 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 --- .../dom/codec/impl/BindingCodecContext.java | 4 +- .../binding/dom/codec/impl/BitsCodec.java | 1 - .../codec/impl/EncapsulatedValueCodec.java | 1 - .../dom/codec/impl/EnumerationCodec.java | 1 - .../dom/codec/impl/SchemaUnawareCodec.java | 74 +++++++++++++++++++ .../dom/codec/impl/ValueTypeCodec.java | 64 +--------------- .../impl/UnionValueOptionContextTest.java | 8 +- 7 files changed, 81 insertions(+), 72 deletions(-) create mode 100644 binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/SchemaUnawareCodec.java 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 5c6b327413..57426e2e42 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 @@ -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 diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/BitsCodec.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/BitsCodec.java index f5b0908961..9a4238e9dc 100644 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/BitsCodec.java +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/BitsCodec.java @@ -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; diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/EncapsulatedValueCodec.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/EncapsulatedValueCodec.java index c756c0b8fd..4bc09db2cc 100644 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/EncapsulatedValueCodec.java +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/EncapsulatedValueCodec.java @@ -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; diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/EnumerationCodec.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/EnumerationCodec.java index 076ff1935f..bd7d1614ff 100644 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/EnumerationCodec.java +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/EnumerationCodec.java @@ -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 index 0000000000..e5f54760e0 --- /dev/null +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/SchemaUnawareCodec.java @@ -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 { + /** + * 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); + } + } +} 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 253fffae40..d9e3255027 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 @@ -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 { - /** - * 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 { - - } - - /** - * 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); } } diff --git a/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/UnionValueOptionContextTest.java b/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/UnionValueOptionContextTest.java index 794659b176..a71dbd1313 100644 --- a/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/UnionValueOptionContextTest.java +++ b/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/UnionValueOptionContextTest.java @@ -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)); -- 2.36.6