001/*
002 * SPDX-FileCopyrightText: none
003 * SPDX-License-Identifier: CC0-1.0
004 */
005
006package dev.metaschema.databind.model.info;
007
008import java.io.IOException;
009import java.util.Collection;
010import java.util.List;
011import java.util.Map;
012
013import dev.metaschema.core.util.ObjectUtils;
014import dev.metaschema.databind.model.IBoundInstanceModel;
015import edu.umd.cs.findbugs.annotations.NonNull;
016
017/**
018 * An abstract base class for writing model instance collections.
019 * <p>
020 * This class provides the framework for writing collections of items during
021 * serialization, with support for different collection types.
022 *
023 * @param <ITEM>
024 *          the Java type of items being written
025 */
026public abstract class AbstractModelInstanceWriteHandler<ITEM>
027    implements IModelInstanceWriteHandler<ITEM> {
028  @NonNull
029  private final IBoundInstanceModel<ITEM> instance;
030
031  /**
032   * Construct a new write handler for the provided model instance.
033   *
034   * @param instance
035   *          the model instance to write
036   */
037  public AbstractModelInstanceWriteHandler(@NonNull IBoundInstanceModel<ITEM> instance) {
038    this.instance = instance;
039  }
040
041  /**
042   * Get the associated instance.
043   *
044   * @return the instance
045   */
046  public IBoundInstanceModel<ITEM> getInstance() {
047    return instance;
048  }
049
050  /**
051   * Get the collection information.
052   *
053   * @return the info
054   */
055  @NonNull
056  public IModelInstanceCollectionInfo<ITEM> getCollectionInfo() {
057    return instance.getCollectionInfo();
058  }
059
060  @Override
061  public void writeList(List<ITEM> items) throws IOException {
062    writeCollection(items);
063  }
064
065  @Override
066  public void writeMap(Map<String, ITEM> items) throws IOException {
067    writeCollection(ObjectUtils.notNull(items.values()));
068  }
069
070  private void writeCollection(@NonNull Collection<ITEM> items) throws IOException {
071    for (ITEM item : items) {
072      writeItem(ObjectUtils.requireNonNull(item));
073    }
074  }
075}