1   
2   package dev.metaschema.core.metapath.item.node;
3   
4   import java.net.URI;
5   
6   import dev.metaschema.core.metapath.DynamicContext;
7   import dev.metaschema.core.metapath.format.IPathFormatter;
8   import dev.metaschema.core.metapath.item.ICollectionValue;
9   import dev.metaschema.core.metapath.type.IItemType;
10  import dev.metaschema.core.metapath.type.IKindTest;
11  import edu.umd.cs.findbugs.annotations.NonNull;
12  
13  /**
14   * A node item that represents the root of a tree of nodes associated with a
15   * document resource.
16   */
17  public interface IDocumentNodeItem extends IDocumentBasedNodeItem {
18    /**
19     * The node item's type.
20     *
21     * @return the type
22     */
23    @NonNull
24    static IItemType type() {
25      return IItemType.document();
26    }
27  
28    @Override
29    default IKindTest<IDocumentNodeItem> getType() {
30      return IItemType.document(
31          getRootAssemblyNodeItem().getType());
32    }
33  
34    @Override
35    default NodeItemKind getNodeItemKind() {
36      return NodeItemKind.DOCUMENT;
37    }
38  
39    @Override
40    default NodeType getNodeType() {
41      return NodeType.DOCUMENT;
42    }
43  
44    @Override
45    default IDocumentNodeItem getNodeItem() {
46      return this;
47    }
48  
49    @Override
50    @NonNull
51    URI getDocumentUri();
52  
53    /**
54     * Get the node item for the document root element.
55     *
56     * @return the root node item
57     */
58    @NonNull
59    IRootAssemblyNodeItem getRootAssemblyNodeItem();
60  
61    @Override
62    default String format(@NonNull IPathFormatter formatter) {
63      return formatter.formatDocument(this);
64    }
65  
66    @Override
67    default <CONTEXT, RESULT> RESULT accept(@NonNull INodeItemVisitor<CONTEXT, RESULT> visitor, CONTEXT context) {
68      return visitor.visitDocument(this, context);
69    }
70  
71    @Override
72    default boolean deepEquals(ICollectionValue other, DynamicContext dynamicContext) {
73      return other instanceof IDocumentNodeItem
74          && NodeComparators.compareNodeItem(this, (IDocumentNodeItem) other, dynamicContext);
75    }
76  }