001/*
002 * SPDX-FileCopyrightText: none
003 * SPDX-License-Identifier: CC0-1.0
004 */
005
006package dev.metaschema.databind.model;
007
008import java.io.IOException;
009
010import dev.metaschema.core.model.IBoundObject;
011import dev.metaschema.core.util.ObjectUtils;
012import dev.metaschema.databind.io.BindingException;
013import dev.metaschema.databind.model.info.IFeatureComplexItemValueHandler;
014import dev.metaschema.databind.model.info.IItemReadHandler;
015import dev.metaschema.databind.model.info.IItemWriteHandler;
016
017/**
018 * Represents a bound field instance that contains complex (non-scalar) data,
019 * such as an object with flags and a value.
020 */
021public interface IBoundInstanceModelFieldComplex
022    extends IBoundInstanceModelField<IBoundObject>, IFeatureComplexItemValueHandler {
023
024  @Override
025  IBoundDefinitionModelFieldComplex getDefinition();
026
027  @Override
028  default boolean isEffectiveValueWrappedInXml() {
029    // always wrapped
030    return true;
031  }
032
033  @Override
034  default IBoundObject readItem(IBoundObject parent, IItemReadHandler handler) throws IOException {
035    return handler.readItemField(ObjectUtils.requireNonNull(parent, "parent"), this);
036  }
037
038  @Override
039  default void writeItem(IBoundObject item, IItemWriteHandler handler) throws IOException {
040    handler.writeItemField(item, this);
041  }
042
043  @Override
044  default IBoundObject deepCopyItem(IBoundObject item, IBoundObject parentInstance) throws BindingException {
045    return getDefinition().deepCopyItem(item, parentInstance);
046  }
047
048  @Override
049  default Class<? extends IBoundObject> getBoundClass() {
050    return getDefinition().getBoundClass();
051  }
052
053  @Override
054  default void callBeforeDeserialize(IBoundObject targetObject, IBoundObject parentObject) throws BindingException {
055    getDefinition().callBeforeDeserialize(targetObject, parentObject);
056  }
057
058  @Override
059  default void callAfterDeserialize(IBoundObject targetObject, IBoundObject parentObject) throws BindingException {
060    getDefinition().callAfterDeserialize(targetObject, parentObject);
061  }
062}