1   
2   package dev.metaschema.core.metapath.item.node;
3   
4   import dev.metaschema.core.metapath.format.IPathFormatter;
5   import dev.metaschema.core.model.IAssemblyInstance;
6   import dev.metaschema.core.qname.IEnhancedQName;
7   import dev.metaschema.core.util.ObjectUtils;
8   import edu.umd.cs.findbugs.annotations.NonNull;
9   
10  /**
11   * A marker interface used to expose root node functionality for an assembly
12   * node that has root information.
13   */
14  public interface IRootAssemblyNodeItem extends IAssemblyNodeItem, IFeatureChildNodeItem {
15  
16    /**
17     * Get the name of this node.
18     * <p>
19     * This overrides the default behavior using the root name for the assembly.
20     */
21    @Override
22    default IEnhancedQName getQName() {
23      return ObjectUtils.requireNonNull(getDefinition().getRootQName());
24    }
25  
26    /**
27     * Get the parent document node item for this root.
28     *
29     * @return the parent document item
30     */
31    @NonNull
32    IDocumentNodeItem getDocumentNodeItem();
33  
34    @Override
35    @NonNull
36    default IDocumentNodeItem getParentNodeItem() {
37      return getDocumentNodeItem();
38    }
39  
40    @Override
41    default IAssemblyNodeItem getParentContentNodeItem() {
42      // there is no assembly parent
43      return null;
44    }
45  
46    @Override
47    default IAssemblyInstance getInstance() {
48      // there is no instance
49      return null;
50    }
51  
52    @Override
53    default IRootAssemblyNodeItem getNodeItem() {
54      return this;
55    }
56  
57    @Override
58    default int getPosition() {
59      // a root is always in the first position
60      return 1;
61    }
62  
63    @Override
64    default String format(@NonNull IPathFormatter formatter) {
65      return formatter.formatRootAssembly(this);
66    }
67  }