001/*
002 * SPDX-FileCopyrightText: none
003 * SPDX-License-Identifier: CC0-1.0
004 */
005
006package dev.metaschema.databind.model;
007
008import java.io.IOException;
009import java.util.Map;
010import java.util.function.Function;
011import java.util.function.Predicate;
012import java.util.stream.Collectors;
013import java.util.stream.Stream;
014
015import dev.metaschema.core.model.IAssemblyDefinition;
016import dev.metaschema.core.model.IBoundObject;
017import dev.metaschema.core.model.IChoiceInstance;
018import dev.metaschema.core.model.IFeatureContainerModelAssembly;
019import dev.metaschema.core.qname.IEnhancedQName;
020import dev.metaschema.core.util.ObjectUtils;
021import dev.metaschema.databind.model.info.IItemReadHandler;
022import dev.metaschema.databind.model.info.IItemWriteHandler;
023import edu.umd.cs.findbugs.annotations.NonNull;
024import edu.umd.cs.findbugs.annotations.Nullable;
025
026/**
027 * Represents an assembly definition bound to a Java class.
028 */
029public interface IBoundDefinitionModelAssembly
030    extends IBoundDefinitionModelComplex, IAssemblyDefinition,
031    IFeatureContainerModelAssembly<
032        IBoundInstanceModel<?>,
033        IBoundInstanceModelNamed<?>,
034        IBoundInstanceModelField<?>,
035        IBoundInstanceModelAssembly,
036        IChoiceInstance,
037        IBoundInstanceModelChoiceGroup> { // , IBoundContainerModelAssembly
038
039  // Assembly Definition Features
040  // ============================
041  @Override
042  @NonNull
043  default IBoundDefinitionModelAssembly getOwningDefinition() {
044    return this;
045  }
046
047  @Override
048  @NonNull
049  default IBoundDefinitionModelAssembly getDefinition() {
050    return this;
051  }
052
053  @Override
054  @Nullable
055  default IBoundInstanceModelAssembly getInlineInstance() {
056    // never inline
057    return null;
058  }
059
060  @Override
061  @NonNull
062  default Map<String, IBoundProperty<?>> getJsonProperties(@Nullable Predicate<IBoundInstanceFlag> flagFilter) {
063    Stream<? extends IBoundInstanceFlag> flagStream = getFlagInstances().stream();
064
065    if (flagFilter != null) {
066      flagStream = flagStream.filter(flagFilter);
067    }
068
069    return ObjectUtils.notNull(Stream.concat(flagStream, getModelInstances().stream())
070        .collect(Collectors.toUnmodifiableMap(IBoundProperty::getJsonName, Function.identity())));
071  }
072
073  @Override
074  @NonNull
075  default IBoundObject readItem(@Nullable IBoundObject parent, @NonNull IItemReadHandler handler) throws IOException {
076    return handler.readItemAssembly(parent, this);
077  }
078
079  @Override
080  default void writeItem(IBoundObject item, IItemWriteHandler handler) throws IOException {
081    handler.writeItemAssembly(item, this);
082  }
083
084  @Override
085  default boolean canHandleXmlQName(@NonNull IEnhancedQName qname) {
086    return qname.equals(getRootQName());
087  }
088}