1
2
3
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
23
24
25 public interface IBoundInstanceModelGroupedAssembly
26 extends IBoundInstanceModelGroupedNamed, IAssemblyInstanceGrouped {
27
28
29
30
31
32
33
34
35
36
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 }