Loosen BindingDataContainerCodecTreeNode.getBindingClass()
[mdsal.git] / binding / mdsal-binding-dom-codec / src / main / java / org / opendaylight / mdsal / binding / dom / codec / impl / CommonDataObjectCodecPrototype.java
index be16e7d32af69306617acd0f680712966b997e94..49b863b0061b43ca258ba98311c0a6cb065ccaf0 100644 (file)
@@ -9,49 +9,29 @@ package org.opendaylight.mdsal.binding.dom.codec.impl;
 
 import static java.util.Objects.requireNonNull;
 
-import java.lang.invoke.MethodHandles;
-import java.lang.invoke.VarHandle;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.mdsal.binding.runtime.api.CompositeRuntimeType;
+import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.Item;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
 
-abstract sealed class CommonDataObjectCodecPrototype<T extends CompositeRuntimeType> implements CodecContextSupplier
+/**
+ * Common superclass for {@link DataObjectCodecPrototype} and {@link AugmentationCodecPrototype}.
+ *
+ * @param <R> {@link CompositeRuntimeType} type
+ */
+abstract sealed class CommonDataObjectCodecPrototype<R extends CompositeRuntimeType>
+        extends DataContainerPrototype<CommonDataObjectCodecContext<?, R>, R>
         permits AugmentationCodecPrototype, DataObjectCodecPrototype {
-    private static final VarHandle INSTANCE;
-
-    static {
-        try {
-            INSTANCE = MethodHandles.lookup().findVarHandle(CommonDataObjectCodecPrototype.class,
-                "instance", CommonDataObjectCodecContext.class);
-        } catch (NoSuchFieldException | IllegalAccessException e) {
-            throw new ExceptionInInitializerError(e);
-        }
-    }
-
-    private final @NonNull T type;
-    private final @NonNull CodecContextFactory factory;
     private final @NonNull Item<?> bindingArg;
 
-    // Accessed via INSTANCE
-    @SuppressWarnings("unused")
-    private volatile CommonDataObjectCodecContext<?, T> instance;
-
-    CommonDataObjectCodecPrototype(final Item<?> bindingArg, final T type, final CodecContextFactory factory) {
+    CommonDataObjectCodecPrototype(final Item<?> bindingArg, final R runtimeType, final CodecContextFactory factory) {
+        super(factory, runtimeType);
         this.bindingArg = requireNonNull(bindingArg);
-        this.type = requireNonNull(type);
-        this.factory = requireNonNull(factory);
-    }
-
-    final @NonNull T getType() {
-        return type;
     }
 
-    final @NonNull CodecContextFactory getFactory() {
-        return factory;
-    }
-
-    final @NonNull Class<?> getBindingClass() {
+    @Override
+    final Class<? extends DataObject> javaClass() {
         return bindingArg.getType();
     }
 
@@ -60,19 +40,4 @@ abstract sealed class CommonDataObjectCodecPrototype<T extends CompositeRuntimeT
     }
 
     abstract @NonNull NodeIdentifier getYangArg();
-
-    @Override
-    public final CommonDataObjectCodecContext<?, T> get() {
-        final var existing = (CommonDataObjectCodecContext<?, T>) INSTANCE.getAcquire(this);
-        return existing != null ? existing : loadInstance();
-    }
-
-    private @NonNull CommonDataObjectCodecContext<?, T> loadInstance() {
-        final var tmp = createInstance();
-        final var witness = (CommonDataObjectCodecContext<?, T>) INSTANCE.compareAndExchangeRelease(this, null, tmp);
-        return witness == null ? tmp : witness;
-    }
-
-    // This method must allow concurrent loading, i.e. nothing in it may have effects outside of the loaded object
-    abstract @NonNull CommonDataObjectCodecContext<?, T> createInstance();
 }