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   
10  import dev.metaschema.core.model.IBoundObject;
11  import dev.metaschema.core.util.ObjectUtils;
12  import dev.metaschema.databind.io.BindingException;
13  import dev.metaschema.databind.model.info.IFeatureComplexItemValueHandler;
14  import dev.metaschema.databind.model.info.IItemReadHandler;
15  import dev.metaschema.databind.model.info.IItemWriteHandler;
16  
17  /**
18   * Represents a bound field instance that contains complex (non-scalar) data,
19   * such as an object with flags and a value.
20   */
21  public interface IBoundInstanceModelFieldComplex
22      extends IBoundInstanceModelField<IBoundObject>, IFeatureComplexItemValueHandler {
23  
24    @Override
25    IBoundDefinitionModelFieldComplex getDefinition();
26  
27    @Override
28    default boolean isEffectiveValueWrappedInXml() {
29      // always wrapped
30      return true;
31    }
32  
33    @Override
34    default IBoundObject readItem(IBoundObject parent, IItemReadHandler handler) throws IOException {
35      return handler.readItemField(ObjectUtils.requireNonNull(parent, "parent"), this);
36    }
37  
38    @Override
39    default void writeItem(IBoundObject item, IItemWriteHandler handler) throws IOException {
40      handler.writeItemField(item, this);
41    }
42  
43    @Override
44    default IBoundObject deepCopyItem(IBoundObject item, IBoundObject parentInstance) throws BindingException {
45      return getDefinition().deepCopyItem(item, parentInstance);
46    }
47  
48    @Override
49    default Class<? extends IBoundObject> getBoundClass() {
50      return getDefinition().getBoundClass();
51    }
52  
53    @Override
54    default void callBeforeDeserialize(IBoundObject targetObject, IBoundObject parentObject) throws BindingException {
55      getDefinition().callBeforeDeserialize(targetObject, parentObject);
56    }
57  
58    @Override
59    default void callAfterDeserialize(IBoundObject targetObject, IBoundObject parentObject) throws BindingException {
60      getDefinition().callAfterDeserialize(targetObject, parentObject);
61    }
62  }