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.StaticContext;
8   import dev.metaschema.core.metapath.format.IPathFormatter;
9   import dev.metaschema.core.metapath.item.ICollectionValue;
10  import dev.metaschema.core.metapath.type.IAtomicOrUnionType;
11  import dev.metaschema.core.metapath.type.IItemType;
12  import dev.metaschema.core.metapath.type.IKindTest;
13  import dev.metaschema.core.model.IFieldDefinition;
14  import dev.metaschema.core.model.IFieldInstance;
15  import edu.umd.cs.findbugs.annotations.NonNull;
16  import edu.umd.cs.findbugs.annotations.Nullable;
17  
18  /**
19   * A Metapath node valued item representing a Metaschema module field.
20   */
21  public interface IFieldNodeItem
22      extends IModelNodeItem<IFieldDefinition, IFieldInstance>,
23      IAtomicValuedNodeItem {
24    /**
25     * Get the static type information of the node item.
26     *
27     * @return the item type
28     */
29    @NonNull
30    static IItemType type() {
31      return IItemType.field();
32    }
33  
34    @Override
35    default NodeItemKind getNodeItemKind() {
36      return NodeItemKind.FIELD;
37    }
38  
39    @Override
40    default NodeType getNodeType() {
41      return NodeType.FIELD;
42    }
43  
44    @Override
45    default IFieldNodeItem getNodeItem() {
46      return this;
47    }
48  
49    @Override
50    default IKindTest<IFieldNodeItem> getType() {
51      StaticContext staticContext = getStaticContext();
52      return IItemType.field(
53          getQName(),
54          getDefinition().getDefinitionQName().toEQName(staticContext),
55          staticContext);
56    }
57  
58    @Override
59    default IAtomicOrUnionType<?> getValueItemType() {
60      return getDefinition().getJavaTypeAdapter().getItemType();
61    }
62  
63    @Override
64    @Nullable
65    default URI getBaseUri() {
66      INodeItem parent = getParentNodeItem();
67      return parent == null ? null : parent.getBaseUri();
68    }
69  
70    @Override
71    @NonNull
72    default String format(@NonNull IPathFormatter formatter) {
73      return formatter.formatField(this);
74    }
75  
76    @Override
77    default <CONTEXT, RESULT> RESULT accept(@NonNull INodeItemVisitor<CONTEXT, RESULT> visitor, CONTEXT context) {
78      return visitor.visitField(this, context);
79    }
80  
81    @Override
82    default boolean deepEquals(ICollectionValue other, DynamicContext dynamicContext) {
83      return other instanceof IFieldNodeItem
84          && NodeComparators.compareNodeItem(this, (IFieldNodeItem) other, dynamicContext);
85    }
86  }