- private static final MethodType CONSTRUCTOR_TYPE = MethodType.methodType(void.class, DataObjectCodecContext.class,
- NormalizedNodeContainer.class);
- private static final MethodType DATAOBJECT_TYPE = MethodType.methodType(DataObject.class,
- DataObjectCodecContext.class, NormalizedNodeContainer.class);
- private static final Comparator<Method> METHOD_BY_ALPHABET = Comparator.comparing(Method::getName);
- private static final Augmentations EMPTY_AUGMENTATIONS = new Augmentations(ImmutableMap.of(), ImmutableMap.of());
- private static final CtClass SUPERCLASS = StaticClassPool.findClass(CodecDataObject.class);
- private static final CtClass AUGMENTABLE_SUPERCLASS = StaticClassPool.findClass(
- AugmentableCodecDataObject.class);
-
- private final ImmutableMap<String, ValueNodeCodecContext> leafChild;
- private final ImmutableMap<YangInstanceIdentifier.PathArgument, NodeContextSupplier> byYang;
- private final ImmutableMap<String, NodeContextSupplier> byMethod;
- private final ImmutableMap<Class<?>, DataContainerCodecPrototype<?>> byStreamClass;
- private final ImmutableMap<Class<?>, DataContainerCodecPrototype<?>> byBindingArgClass;
- private final ImmutableMap<AugmentationIdentifier, Type> possibleAugmentations;
- private final MethodHandle proxyConstructor;
-
- @SuppressWarnings("rawtypes")
- private static final AtomicReferenceFieldUpdater<DataObjectCodecContext, Augmentations>
- AUGMENTATIONS_UPDATER = AtomicReferenceFieldUpdater.newUpdater(DataObjectCodecContext.class,
- Augmentations.class, "augmentations");
- private volatile Augmentations augmentations = EMPTY_AUGMENTATIONS;
-
- private volatile ImmutableMap<Class<?>, DataContainerCodecPrototype<?>> mismatchedAugmented = ImmutableMap.of();
-
- DataObjectCodecContext(final DataContainerCodecPrototype<T> prototype, final Method... additionalMethods) {
- super(prototype);
-
- final Class<D> bindingClass = getBindingClass();
- this.leafChild = factory().getLeafNodes(bindingClass, getSchema());
-
- final Map<Class<?>, Method> clsToMethod = BindingReflections.getChildrenClassToMethod(bindingClass);
-
- final Map<YangInstanceIdentifier.PathArgument, NodeContextSupplier> byYangBuilder = new HashMap<>();
- final Map<Method, NodeContextSupplier> tmpMethodToSupplier = new HashMap<>();
- final Map<Class<?>, DataContainerCodecPrototype<?>> byStreamClassBuilder = new HashMap<>();
- final Map<Class<?>, DataContainerCodecPrototype<?>> byBindingArgClassBuilder = new HashMap<>();
-
- // Adds leaves to mapping
- for (final ValueNodeCodecContext leaf : leafChild.values()) {
- tmpMethodToSupplier.put(leaf.getGetter(), leaf);
- byYangBuilder.put(leaf.getDomPathArgument(), leaf);
- }
-
- for (final Entry<Class<?>, Method> childDataObj : clsToMethod.entrySet()) {
- final Method method = childDataObj.getValue();
- verify(!method.isDefault(), "Unexpected default method %s in %s", method, bindingClass);
-
- final Class<?> retClass = childDataObj.getKey();
- if (OpaqueObject.class.isAssignableFrom(retClass)) {
- // Filter OpaqueObjects, they are not containers
- continue;
- }
-
- final DataContainerCodecPrototype<?> childProto = loadChildPrototype(retClass);
- tmpMethodToSupplier.put(method, childProto);
- byStreamClassBuilder.put(childProto.getBindingClass(), childProto);
- byYangBuilder.put(childProto.getYangArg(), childProto);
- if (childProto.isChoice()) {
- final ChoiceNodeCodecContext<?> choice = (ChoiceNodeCodecContext<?>) childProto.get();
- for (final Class<?> cazeChild : choice.getCaseChildrenClasses()) {
- byBindingArgClassBuilder.put(cazeChild, childProto);
- }
- }
- }
-
- final int methodCount = tmpMethodToSupplier.size();
- final Builder<String, NodeContextSupplier> byMethodBuilder = ImmutableMap.builderWithExpectedSize(methodCount);
-