Split up OpaqueNodeCodecContext 24/106724/1
authorRobert Varga <robert.varga@pantheon.tech>
Tue, 27 Jun 2023 15:38:01 +0000 (17:38 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Tue, 27 Jun 2023 15:38:01 +0000 (17:38 +0200)
We have two specializations, make promote them to top-level classes and
rename OpaqueNodeCodecContext to AbstractOpaqueCodecContext.

Change-Id: Ibe18324a5e5a408cfcf8bbbe6b77065f19a3bfa5
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/AbstractOpaqueCodecContext.java [moved from binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/OpaqueNodeCodecContext.java with 66% similarity]
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/AnydataCodecContext.java [new file with mode: 0644]
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/AnyxmlCodecContext.java [new file with mode: 0644]
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/ValueNodeCodecContext.java

@@ -8,7 +8,6 @@
 package org.opendaylight.mdsal.binding.dom.codec.impl;
 
 import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Verify.verify;
 import static java.util.Objects.requireNonNull;
 
 import com.google.common.base.Throwables;
@@ -25,56 +24,12 @@ import org.opendaylight.mdsal.binding.loader.BindingClassLoader;
 import org.opendaylight.mdsal.binding.loader.BindingClassLoader.GeneratorResult;
 import org.opendaylight.yangtools.yang.binding.OpaqueData;
 import org.opendaylight.yangtools.yang.binding.OpaqueObject;
-import org.opendaylight.yangtools.yang.data.api.schema.AnydataNode;
-import org.opendaylight.yangtools.yang.data.api.schema.DOMSourceAnyxmlNode;
 import org.opendaylight.yangtools.yang.data.api.schema.ForeignDataNode;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
-import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
-import org.opendaylight.yangtools.yang.model.api.AnydataSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.AnyxmlSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
 
-abstract sealed class OpaqueNodeCodecContext<T extends OpaqueObject<T>> extends ValueNodeCodecContext
-        implements BindingOpaqueObjectCodecTreeNode<T> {
-    static final class Anyxml<T extends OpaqueObject<T>> extends OpaqueNodeCodecContext<T> {
-        Anyxml(final AnyxmlSchemaNode schema, final String getterName, final Class<T> bindingClass,
-                final BindingClassLoader loader) {
-            super(schema, getterName, bindingClass, loader);
-        }
-
-        @Override
-        ForeignDataNode<?> serializedData(final OpaqueData<?> opaqueData) {
-            final Class<?> model = opaqueData.getObjectModel();
-            verify(DOMSource.class.isAssignableFrom(model), "Cannot just yet support object model %s", model);
-            return Builders.anyXmlBuilder().withNodeIdentifier(getDomPathArgument())
-                    .withValue((DOMSource) opaqueData.getData()).build();
-        }
-
-        @Override
-        T deserialize(final ForeignDataNode<?> foreignData) {
-            // Streaming cannot support anything but DOMSource-based AnyxmlNodes.
-            verify(foreignData instanceof DOMSourceAnyxmlNode, "Variable node %s not supported yet", foreignData);
-            return super.deserialize(foreignData);
-        }
-    }
-
-    static final class Anydata<T extends OpaqueObject<T>> extends OpaqueNodeCodecContext<T> {
-        Anydata(final AnydataSchemaNode schema, final String getterName, final Class<T> bindingClass,
-                final BindingClassLoader loader) {
-            super(schema, getterName, bindingClass, loader);
-        }
-
-        @Override
-        AnydataNode<?> serializedData(final OpaqueData<?> opaqueData) {
-            return buildAnydata(opaqueData);
-        }
-
-        private <M> @NonNull AnydataNode<M> buildAnydata(final OpaqueData<M> opaqueData) {
-            return Builders.anydataBuilder(opaqueData.getObjectModel()).withNodeIdentifier(getDomPathArgument())
-                    .withValue(opaqueData.getData()).build();
-        }
-    }
-
+abstract sealed class AbstractOpaqueCodecContext<T extends OpaqueObject<T>> extends ValueNodeCodecContext
+        implements BindingOpaqueObjectCodecTreeNode<T> permits AnydataCodecContext, AnyxmlCodecContext {
     private static final MethodType CTOR_LOOKUP_TYPE = MethodType.methodType(void.class, OpaqueData.class);
     private static final MethodType CTOR_INVOKE_TYPE = MethodType.methodType(OpaqueObject.class, OpaqueData.class);
     @SuppressWarnings("rawtypes")
@@ -95,14 +50,14 @@ abstract sealed class OpaqueNodeCodecContext<T extends OpaqueObject<T>> extends
         @Override
         protected Object deserializeImpl(final Object input) {
             checkArgument(input instanceof NormalizedNode, "Unexpected input %s", input);
-            return OpaqueNodeCodecContext.this.deserializeObject((NormalizedNode) input);
+            return deserializeObject((NormalizedNode) input);
         }
     };
 
     private final MethodHandle proxyConstructor;
     private final @NonNull Class<T> bindingClass;
 
-    OpaqueNodeCodecContext(final DataSchemaNode schema, final String getterName, final Class<T> bindingClass,
+    AbstractOpaqueCodecContext(final DataSchemaNode schema, final String getterName, final Class<T> bindingClass,
             final BindingClassLoader loader) {
         super(schema, getterName, null);
         this.bindingClass = requireNonNull(bindingClass);
diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/AnydataCodecContext.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/AnydataCodecContext.java
new file mode 100644 (file)
index 0000000..397e6e3
--- /dev/null
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2019 PANTHEON.tech, s.r.o. 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 org.eclipse.jdt.annotation.NonNull;
+import org.opendaylight.mdsal.binding.loader.BindingClassLoader;
+import org.opendaylight.yangtools.yang.binding.OpaqueData;
+import org.opendaylight.yangtools.yang.binding.OpaqueObject;
+import org.opendaylight.yangtools.yang.data.api.schema.AnydataNode;
+import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
+import org.opendaylight.yangtools.yang.model.api.AnydataSchemaNode;
+
+final class AnydataCodecContext<T extends OpaqueObject<T>> extends AbstractOpaqueCodecContext<T> {
+    AnydataCodecContext(final AnydataSchemaNode schema, final String getterName, final Class<T> bindingClass,
+            final BindingClassLoader loader) {
+        super(schema, getterName, bindingClass, loader);
+    }
+
+    @Override
+    AnydataNode<?> serializedData(final OpaqueData<?> opaqueData) {
+        return buildAnydata(opaqueData);
+    }
+
+    private <M> @NonNull AnydataNode<M> buildAnydata(final OpaqueData<M> opaqueData) {
+        return Builders.anydataBuilder(opaqueData.getObjectModel())
+            .withNodeIdentifier(getDomPathArgument())
+            .withValue(opaqueData.getData())
+            .build();
+    }
+}
\ No newline at end of file
diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/AnyxmlCodecContext.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/AnyxmlCodecContext.java
new file mode 100644 (file)
index 0000000..b762b0f
--- /dev/null
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2019 PANTHEON.tech, s.r.o. 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 com.google.common.base.Verify.verify;
+
+import javax.xml.transform.dom.DOMSource;
+import org.opendaylight.mdsal.binding.loader.BindingClassLoader;
+import org.opendaylight.yangtools.yang.binding.OpaqueData;
+import org.opendaylight.yangtools.yang.binding.OpaqueObject;
+import org.opendaylight.yangtools.yang.data.api.schema.AnyxmlNode;
+import org.opendaylight.yangtools.yang.data.api.schema.DOMSourceAnyxmlNode;
+import org.opendaylight.yangtools.yang.data.api.schema.ForeignDataNode;
+import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
+import org.opendaylight.yangtools.yang.model.api.AnyxmlSchemaNode;
+
+final class AnyxmlCodecContext<T extends OpaqueObject<T>> extends AbstractOpaqueCodecContext<T> {
+    AnyxmlCodecContext(final AnyxmlSchemaNode schema, final String getterName, final Class<T> bindingClass,
+            final BindingClassLoader loader) {
+        super(schema, getterName, bindingClass, loader);
+    }
+
+    @Override
+    AnyxmlNode<?> serializedData(final OpaqueData<?> opaqueData) {
+        final Class<?> model = opaqueData.getObjectModel();
+        verify(DOMSource.class.isAssignableFrom(model), "Cannot just yet support object model %s", model);
+        return Builders.anyXmlBuilder()
+            .withNodeIdentifier(getDomPathArgument())
+            .withValue((DOMSource) opaqueData.getData())
+            .build();
+    }
+
+    @Override
+    T deserialize(final ForeignDataNode<?> foreignData) {
+        // Streaming cannot support anything but DOMSource-based AnyxmlNodes.
+        verify(foreignData instanceof DOMSourceAnyxmlNode, "Variable node %s not supported yet", foreignData);
+        return super.deserialize(foreignData);
+    }
+}
\ No newline at end of file
index f851596df865c9530be6d34d0e139a207a757fcb..b1c52f73067b5ccf02d2461cb40eea1ab0094120 100644 (file)
@@ -405,11 +405,11 @@ public final class BindingCodecContext extends AbstractBindingNormalizedNodeSeri
                     final ValueCodec<Object, Object> codec = getCodec(valueType, leafListSchema.getType());
                     valueNode = new LeafSetNodeCodecContext(leafListSchema, codec, method.getName());
                 } else if (schema instanceof AnyxmlSchemaNode anyxmlSchema) {
-                    valueNode = new OpaqueNodeCodecContext.Anyxml<>(anyxmlSchema, method.getName(),
-                            opaqueReturnType(method), loader);
+                    valueNode = new AnyxmlCodecContext<>(anyxmlSchema, method.getName(), opaqueReturnType(method),
+                        loader);
                 } else if (schema instanceof AnydataSchemaNode anydataSchema) {
-                    valueNode = new OpaqueNodeCodecContext.Anydata<>(anydataSchema, method.getName(),
-                            opaqueReturnType(method), loader);
+                    valueNode = new AnydataCodecContext<>(anydataSchema, method.getName(), opaqueReturnType(method),
+                        loader);
                 } else {
                     verify(schema == null, "Unhandled schema %s for method %s", schema, method);
                     // We do not have schema for leaf, so we will ignore it (e.g. getClass).
index a55f10ae3293013cd30b6eea8e1c74a6e2f7177d..2a9c53326666ee607f0aae5d4c8c93e480302c99 100644 (file)
@@ -18,7 +18,7 @@ import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
  * as LeafNodes and LeafSetNodes.
  */
 abstract sealed class ValueNodeCodecContext extends CodecContext implements CodecContextSupplier
-        permits OpaqueNodeCodecContext, ValueNodeCodecContext.WithCodec {
+        permits AbstractOpaqueCodecContext, ValueNodeCodecContext.WithCodec {
     abstract static sealed class WithCodec extends ValueNodeCodecContext
             permits LeafNodeCodecContext, LeafSetNodeCodecContext {
         private final @NonNull ValueCodec<Object, Object> valueCodec;