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}