1   /*
2    * SPDX-FileCopyrightText: none
3    * SPDX-License-Identifier: CC0-1.0
4    */
5   
6   package dev.metaschema.databind.model;
7   
8   import dev.metaschema.core.model.IBoundObject;
9   import dev.metaschema.core.model.INamedModelInstanceGrouped;
10  import dev.metaschema.core.model.JsonGroupAsBehavior;
11  import dev.metaschema.core.model.util.ModuleUtils;
12  import dev.metaschema.core.util.ObjectUtils;
13  import dev.metaschema.databind.io.BindingException;
14  import dev.metaschema.databind.model.info.IFeatureComplexItemValueHandler;
15  import edu.umd.cs.findbugs.annotations.Nullable;
16  
17  /**
18   * Represents a model instance that is a member of a choice group instance.
19   */
20  public interface IBoundInstanceModelGroupedNamed
21      extends INamedModelInstanceGrouped, IFeatureComplexItemValueHandler {
22    @Override
23    IBoundInstanceModelChoiceGroup getParentContainer();
24  
25    @Override
26    IBoundDefinitionModelComplex getDefinition();
27  
28    @Override
29    @Nullable
30    default IBoundInstanceFlag getEffectiveJsonKey() {
31      return JsonGroupAsBehavior.KEYED.equals(getParentContainer().getJsonGroupAsBehavior())
32          ? getJsonKey()
33          : null;
34    }
35  
36    @Override
37    default IBoundInstanceFlag getJsonKey() {
38      String name = getParentContainer().getJsonKeyFlagInstanceName();
39      return name == null
40          ? null
41          : ObjectUtils.requireNonNull(
42              getDefinition().getFlagInstanceByName(
43                  ModuleUtils.parseFlagName(getContainingModule(), name).getIndexPosition()));
44    }
45  
46    @Override
47    default IBoundDefinitionModelAssembly getContainingDefinition() {
48      return getParentContainer().getContainingDefinition();
49    }
50  
51    @Override
52    default String getName() {
53      return getDefinition().getName();
54    }
55  
56    @Override
57    default IBoundObject deepCopyItem(IBoundObject item, IBoundObject parentInstance) throws BindingException {
58      return getDefinition().deepCopyItem(item, parentInstance);
59    }
60  
61    @Override
62    default void callBeforeDeserialize(IBoundObject targetObject, IBoundObject parentObject) throws BindingException {
63      getDefinition().callBeforeDeserialize(targetObject, parentObject);
64    }
65  
66    @Override
67    default void callAfterDeserialize(IBoundObject targetObject, IBoundObject parentObject) throws BindingException {
68      getDefinition().callAfterDeserialize(targetObject, parentObject);
69    }
70  }