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}