1   
2   package dev.metaschema.core.metapath.item.node;
3   
4   import java.net.URI;
5   import java.util.Collection;
6   import java.util.Collections;
7   import java.util.List;
8   import java.util.stream.Stream;
9   
10  import dev.metaschema.core.metapath.DynamicContext;
11  import dev.metaschema.core.metapath.StaticContext;
12  import dev.metaschema.core.metapath.format.IPathFormatter;
13  import dev.metaschema.core.metapath.item.ICollectionValue;
14  import dev.metaschema.core.metapath.type.IAtomicOrUnionType;
15  import dev.metaschema.core.metapath.type.IItemType;
16  import dev.metaschema.core.metapath.type.IKindTest;
17  import dev.metaschema.core.model.IFlagDefinition;
18  import dev.metaschema.core.model.IFlagInstance;
19  import dev.metaschema.core.qname.IEnhancedQName;
20  import edu.umd.cs.findbugs.annotations.NonNull;
21  import edu.umd.cs.findbugs.annotations.Nullable;
22  
23  /**
24   * A Metapath node valued item representing a Metaschema module flag.
25   */
26  
27  public interface IFlagNodeItem
28      extends IDefinitionNodeItem<IFlagDefinition, IFlagInstance>, IAtomicValuedNodeItem {
29    /**
30     * Get the static type information of the node item.
31     *
32     * @return the item type
33     */
34    @NonNull
35    static IItemType type() {
36      return IItemType.flag();
37    }
38  
39    @Override
40    default NodeItemKind getNodeItemKind() {
41      return NodeItemKind.FLAG;
42    }
43  
44    @Override
45    default NodeType getNodeType() {
46      return NodeType.FLAG;
47    }
48  
49    @Override
50    default IFlagNodeItem getNodeItem() {
51      return this;
52    }
53  
54    @Override
55    IFlagDefinition getDefinition();
56  
57    @Override
58    IFlagInstance getInstance();
59  
60    @Override
61    default IKindTest<IFlagNodeItem> getType() {
62      StaticContext staticContext = getStaticContext();
63      return IItemType.flag(
64          getQName(),
65          getDefinition().getDefinitionQName().toEQName(staticContext),
66          staticContext);
67    }
68  
69    @Override
70    default IAtomicOrUnionType<?> getValueItemType() {
71      return getDefinition().getJavaTypeAdapter().getItemType();
72    }
73  
74    @Override
75    @Nullable
76    default URI getBaseUri() {
77      INodeItem parent = getParentNodeItem();
78      return parent == null ? null : parent.getBaseUri();
79    }
80  
81    /**
82     * FlagContainer do not have flag items. This call should return an empty
83     * collection.
84     */
85    @SuppressWarnings("null")
86    @Override
87    default Collection<? extends IFlagNodeItem> getFlags() {
88      // a flag does not have flags
89      return Collections.emptyList();
90    }
91  
92    /**
93     * FlagContainer do not have flag items. This call should return {@code null}.
94     */
95    @Override
96    default IFlagNodeItem getFlagByName(@NonNull IEnhancedQName name) {
97      // a flag does not have flags
98      return null;
99    }
100 
101   /**
102    * FlagContainer do not have flag items. This call should return an empty
103    * stream.
104    */
105   @SuppressWarnings("null")
106   @Override
107   @NonNull
108   default Stream<? extends IFlagNodeItem> flags() {
109     // a flag does not have flags
110     return Stream.empty();
111   }
112 
113   /**
114    * FlagContainer do not have model items. This call should return an empty
115    * collection.
116    */
117   @SuppressWarnings("null")
118   @Override
119   @NonNull
120   default Collection<? extends List<? extends IModelNodeItem<?, ?>>> getModelItems() {
121     // a flag does not have model items
122     return Collections.emptyList();
123   }
124 
125   /**
126    * FlagContainer do not have model items. This call should return an empty list.
127    */
128   @SuppressWarnings("null")
129   @Override
130   default List<? extends IModelNodeItem<?, ?>> getModelItemsByName(IEnhancedQName name) {
131     // a flag does not have model items
132     return Collections.emptyList();
133   }
134 
135   /**
136    * FlagContainer do not have model items. This call should return an empty
137    * stream.
138    */
139   @SuppressWarnings("null")
140   @NonNull
141   @Override
142   default Stream<? extends IModelNodeItem<?, ?>> modelItems() {
143     // a flag does not have model items
144     return Stream.empty();
145   }
146 
147   @Override
148   @NonNull
149   default String format(@NonNull IPathFormatter formatter) {
150     return formatter.formatFlag(this);
151   }
152 
153   @Override
154   default <CONTEXT, RESULT> RESULT accept(@NonNull INodeItemVisitor<CONTEXT, RESULT> visitor, CONTEXT context) {
155     return visitor.visitFlag(this, context);
156   }
157 
158   @Override
159   default boolean deepEquals(ICollectionValue other, DynamicContext dynamicContext) {
160     return other instanceof IFlagNodeItem
161         && NodeComparators.compareAsFlag(this, (IFlagNodeItem) other, dynamicContext);
162   }
163 }