Simplify CompositeValueCodec instantiation
[mdsal.git] / binding / mdsal-binding-dom-codec / src / main / java / org / opendaylight / mdsal / binding / dom / codec / impl / BindingCodecContext.java
index ff51f42affe92ae5766aebbcce5f6a8f92047d33..5c03da48c655cba6974272ee4929aa9bf3c530f2 100644 (file)
@@ -34,7 +34,6 @@ import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Optional;
 import java.util.ServiceLoader;
-import java.util.concurrent.Callable;
 import java.util.concurrent.ExecutionException;
 import javax.inject.Inject;
 import javax.inject.Singleton;
@@ -59,6 +58,7 @@ import org.opendaylight.yangtools.concepts.IllegalArgumentCodec;
 import org.opendaylight.yangtools.concepts.Immutable;
 import org.opendaylight.yangtools.util.ClassLoaderUtils;
 import org.opendaylight.yangtools.yang.binding.Action;
+import org.opendaylight.yangtools.yang.binding.BaseNotification;
 import org.opendaylight.yangtools.yang.binding.DataContainer;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.Identifiable;
@@ -434,7 +434,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")
@@ -442,15 +442,13 @@ public final class BindingCodecContext extends AbstractBindingNormalizedNodeSeri
     private IllegalArgumentCodec<Object, Object> getCodecForBindingClass(final Class<?> valueType,
             final TypeDefinition<?> typeDef) {
         if (typeDef instanceof IdentityrefTypeDefinition) {
-            return ValueTypeCodec.encapsulatedValueCodecFor(valueType, typeDef, identityCodec);
+            return new CompositeValueCodec(valueType, identityCodec);
         } else if (typeDef instanceof InstanceIdentifierTypeDefinition) {
-            return ValueTypeCodec.encapsulatedValueCodecFor(valueType, typeDef, instanceIdentifierCodec);
+            return new CompositeValueCodec(valueType, instanceIdentifierCodec);
         } else if (typeDef instanceof UnionTypeDefinition) {
-            final Callable<UnionTypeCodec> unionLoader = UnionTypeCodec.loader(valueType, (UnionTypeDefinition) typeDef,
-                this);
             try {
-                return unionLoader.call();
-            } catch (final Exception e) {
+                return UnionTypeCodec.of(valueType, (UnionTypeDefinition) typeDef, this);
+            } catch (Exception e) {
                 throw new IllegalStateException("Unable to load codec for " + valueType, e);
             }
         } else if (typeDef instanceof LeafrefTypeDefinition) {
@@ -466,7 +464,7 @@ public final class BindingCodecContext extends AbstractBindingNormalizedNodeSeri
             }
             return getCodec(valueType, def);
         }
-        return ValueTypeCodec.getCodecFor(valueType, typeDef);
+        return SchemaUnawareCodec.of(valueType, typeDef);
     }
 
     @Override
@@ -484,8 +482,13 @@ public final class BindingCodecContext extends AbstractBindingNormalizedNodeSeri
         return IdentifiableItemCodec.of(type.statement(), identifier, listClz, valueCtx);
     }
 
-    @SuppressWarnings("unchecked")
     @Override
+    public <E extends DataObject> BindingDataObjectCodecTreeNode<E> streamChild(final Class<E> childClass) {
+        return root.streamChild(childClass);
+    }
+
+    @Override
+    @SuppressWarnings("unchecked")
     public <T extends DataObject> BindingDataObjectCodecTreeNode<T> getSubtreeCodec(final InstanceIdentifier<T> path) {
         // TODO Do we need defensive check here?
         return (BindingDataObjectCodecTreeNode<T>) getCodecContextNode(path, null);
@@ -550,21 +553,20 @@ public final class BindingCodecContext extends AbstractBindingNormalizedNodeSeri
         }
 
         final DataObject lazyObj = codec.deserialize(data);
-        final InstanceIdentifier<?> bindingPath = InstanceIdentifier.create(builder);
+        final InstanceIdentifier<?> bindingPath = InstanceIdentifier.unsafeOf(builder);
         return Map.entry(bindingPath, lazyObj);
     }
 
     @Override
-    public Notification<?> fromNormalizedNodeNotification(final Absolute path, final ContainerNode data) {
+    public BaseNotification fromNormalizedNodeNotification(final Absolute path, final ContainerNode data) {
         return getNotificationContext(path).deserialize(data);
     }
 
     @Override
-    public Notification<?> fromNormalizedNodeNotification(final Absolute path, final ContainerNode data,
+    public BaseNotification fromNormalizedNodeNotification(final Absolute path, final ContainerNode data,
             final Instant eventInstant) {
         return eventInstant == null ? fromNormalizedNodeNotification(path, data)
                 : getNotificationContext(path).deserialize(data, eventInstant);
-
     }
 
     @Override
@@ -586,13 +588,24 @@ public final class BindingCodecContext extends AbstractBindingNormalizedNodeSeri
 
     @Override
     @SuppressFBWarnings("BC_UNCONFIRMED_CAST")
-    public ContainerNode toNormalizedNodeNotification(@NonNull final Notification<?> data) {
+    public ContainerNode toNormalizedNodeNotification(final Notification<?> data) {
         // FIXME: Should the cast to DataObject be necessary?
         return serializeDataObject((DataObject) data,
             (ctx, iface, domWriter) -> ctx.newNotificationWriter(
                 (Class<? extends Notification<?>>) iface.asSubclass(Notification.class), domWriter));
     }
 
+    @Override
+    public ContainerNode toNormalizedNodeNotification(final Absolute path, final BaseNotification data) {
+        checkArgument(data instanceof DataObject, "Unexpected data %s", data);
+        @SuppressWarnings("rawtypes")
+        final NotificationCodecContext notifContext = getNotificationContext(path);
+        @SuppressWarnings("unchecked")
+        final var result = notifContext.serialize((DataObject) data);
+        verify(result instanceof ContainerNode, "Unexpected result %s from %s", result, data);
+        return (ContainerNode) result;
+    }
+
     @Override
     @SuppressFBWarnings("BC_UNCONFIRMED_CAST")
     public ContainerNode toNormalizedNodeRpcData(final DataContainer data) {