1   /*
2    * SPDX-FileCopyrightText: none
3    * SPDX-License-Identifier: CC0-1.0
4    */
5   
6   package dev.metaschema.databind.model;
7   
8   import java.io.IOException;
9   import java.lang.reflect.Field;
10  
11  import dev.metaschema.core.model.IAssemblyInstanceGrouped;
12  import dev.metaschema.core.model.IBoundObject;
13  import dev.metaschema.core.util.ObjectUtils;
14  import dev.metaschema.databind.IBindingContext;
15  import dev.metaschema.databind.model.annotations.BoundGroupedAssembly;
16  import dev.metaschema.databind.model.impl.InstanceModelGroupedAssembly;
17  import dev.metaschema.databind.model.info.IItemReadHandler;
18  import dev.metaschema.databind.model.info.IItemWriteHandler;
19  import edu.umd.cs.findbugs.annotations.NonNull;
20  
21  /**
22   * Represents an assembly model instance that is a member of a choice group
23   * instance.
24   */
25  public interface IBoundInstanceModelGroupedAssembly
26      extends IBoundInstanceModelGroupedNamed, IAssemblyInstanceGrouped {
27  
28    /**
29     * Create a new assembly model instance instance that is a member of a choice
30     * group instance.
31     *
32     * @param annotation
33     *          the Java annotation the instance is bound to
34     * @param container
35     *          the choice group instance containing the instance
36     * @return the new instance
37     */
38    static IBoundInstanceModelGroupedAssembly newInstance(
39        @NonNull BoundGroupedAssembly annotation,
40        @NonNull IBoundInstanceModelChoiceGroup container) {
41      Class<? extends IBoundObject> clazz = annotation.binding();
42      IBindingContext bindingContext = container.getContainingDefinition().getBindingContext();
43      IBoundDefinitionModel<?> definition = bindingContext.getBoundDefinitionForClass(clazz);
44      if (definition instanceof IBoundDefinitionModelAssembly) {
45        return new InstanceModelGroupedAssembly(annotation, (IBoundDefinitionModelAssembly) definition, container);
46      }
47  
48      Field field = container.getField();
49      throw new IllegalStateException(String.format(
50          "The '%s' annotation, bound to '%s', on field '%s' on class '%s' is not bound to a Metaschema assembly",
51          annotation.getClass(),
52          annotation.binding().getName(),
53          field.toString(),
54          field.getDeclaringClass().getName()));
55    }
56  
57    @Override
58    IBoundDefinitionModelAssembly getDefinition();
59  
60    @Override
61    default IBoundObject readItem(IBoundObject parent, @NonNull IItemReadHandler handler) throws IOException {
62      return handler.readItemAssembly(ObjectUtils.requireNonNull(parent, "parent"), this);
63    }
64  
65    @Override
66    default void writeItem(IBoundObject item, IItemWriteHandler handler) throws IOException {
67      handler.writeItemAssembly(item, this);
68    }
69  }