001/*
002 * SPDX-FileCopyrightText: none
003 * SPDX-License-Identifier: CC0-1.0
004 */
005
006package dev.metaschema.core.model;
007
008import dev.metaschema.core.model.AbstractGlobalDefinition.NameInitializer;
009import dev.metaschema.core.qname.IEnhancedQName;
010import dev.metaschema.core.util.ObjectUtils;
011import edu.umd.cs.findbugs.annotations.NonNull;
012import nl.talsmasoftware.lazy4j.Lazy;
013
014/**
015 * Base implementation of {@link INamedInstance} providing qualified name
016 * management.
017 * <p>
018 * This class lazily computes and caches both the instance's effective qualified
019 * name and its referenced definition qualified name.
020 *
021 * @param <PARENT>
022 *          the Java type of the parent container
023 */
024public abstract class AbstractNamedInstance<
025    PARENT extends IContainer>
026    extends AbstractInstance<PARENT>
027    implements INamedInstance {
028  @NonNull
029  private final Lazy<IEnhancedQName> qname;
030  @NonNull
031  private final Lazy<IEnhancedQName> definitionQName;
032
033  /**
034   * Construct a new instance.
035   *
036   * @param parent
037   *          the parent containing the instance
038   * @param initializer
039   *          used to generate the instance qualified name
040   */
041  protected AbstractNamedInstance(@NonNull PARENT parent, @NonNull NameInitializer initializer) {
042    super(parent);
043    this.qname = ObjectUtils.notNull(Lazy.of(() -> initializer.apply(getEffectiveName())));
044    this.definitionQName = ObjectUtils.notNull(Lazy.of(() -> initializer.apply(getName())));
045  }
046
047  @SuppressWarnings("null")
048  @Override
049  public final IEnhancedQName getQName() {
050    return qname.get();
051  }
052
053  @SuppressWarnings("null")
054  @Override
055  public final IEnhancedQName getReferencedDefinitionQName() {
056    return definitionQName.get();
057  }
058}