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}