Cache NodeContextSuppliers in CodecDataObject
[mdsal.git] / binding / mdsal-binding-dom-codec / src / main / java / org / opendaylight / mdsal / binding / dom / codec / impl / KeyedListNodeCodecContext.java
index 2c16d7a49d4111ea614f62fe0dbe04bbf616f8d7..166cad8b44c279d93280a5cc690ae55371502439 100644 (file)
@@ -7,9 +7,11 @@
  */
 package org.opendaylight.mdsal.binding.dom.codec.impl;
 
+import static java.util.Objects.requireNonNull;
 import static org.opendaylight.mdsal.binding.spec.naming.BindingMapping.IDENTIFIABLE_KEY_NAME;
 
 import java.lang.reflect.Method;
+import java.util.AbstractMap.SimpleImmutableEntry;
 import java.util.List;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.Identifiable;
@@ -18,25 +20,30 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.IdentifiableItem;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
-import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
-import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNodeContainer;
 import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
 
 final class KeyedListNodeCodecContext<D extends DataObject & Identifiable<?>> extends ListNodeCodecContext<D> {
     private final IdentifiableItemCodec codec;
 
-    KeyedListNodeCodecContext(final DataContainerCodecPrototype<ListSchemaNode> prototype) {
-        super(prototype, keyMethod(prototype.getBindingClass()));
-        this.codec = factory().getPathArgumentCodec(getBindingClass(), getSchema());
+    private KeyedListNodeCodecContext(final DataContainerCodecPrototype<ListSchemaNode> prototype,
+            final Method keyMethod, final IdentifiableItemCodec codec) {
+        super(prototype, new SimpleImmutableEntry<>(keyMethod, codec));
+        this.codec = requireNonNull(codec);
     }
 
-    private static Method keyMethod(final Class<?> bindingClass) {
+    @SuppressWarnings("rawtypes")
+    static KeyedListNodeCodecContext create(final DataContainerCodecPrototype<ListSchemaNode> prototype) {
+        final Class<?> bindingClass = prototype.getBindingClass();
+        final Method keyMethod;
         try {
-            // This just verifies the method is present
-            return bindingClass.getMethod(IDENTIFIABLE_KEY_NAME);
+            keyMethod = bindingClass.getMethod(IDENTIFIABLE_KEY_NAME);
         } catch (NoSuchMethodException e) {
             throw new IllegalStateException("Required method not available", e);
         }
+
+        final IdentifiableItemCodec codec = prototype.getFactory().getPathArgumentCodec(bindingClass,
+            prototype.getSchema());
+        return new KeyedListNodeCodecContext<>(prototype, keyMethod, codec);
     }
 
     @Override
@@ -59,16 +66,6 @@ final class KeyedListNodeCodecContext<D extends DataObject & Identifiable<?>> ex
         }
     }
 
-    @Override
-    @SuppressWarnings("rawtypes")
-    Object getBindingChildValue(final NormalizedNodeContainer dom, final int offset) {
-        if (offset == CodecDataObjectCustomizer.KEY_OFFSET && dom instanceof MapEntryNode) {
-            NodeIdentifierWithPredicates identifier = ((MapEntryNode) dom).getIdentifier();
-            return codec.deserialize(identifier).getKey();
-        }
-        return super.getBindingChildValue(dom, offset);
-    }
-
     @Override
     protected InstanceIdentifier.PathArgument getBindingPathArgument(final YangInstanceIdentifier.PathArgument domArg) {
         if (domArg instanceof NodeIdentifierWithPredicates) {