1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 package gov.nist.secauto.metaschema.core.metapath;
28
29 import gov.nist.secauto.metaschema.core.metapath.antlr.metapath10Lexer;
30 import gov.nist.secauto.metaschema.core.metapath.item.ItemUtils;
31 import gov.nist.secauto.metaschema.core.metapath.item.node.INodeItem;
32 import gov.nist.secauto.metaschema.core.util.CollectionUtil;
33 import gov.nist.secauto.metaschema.core.util.ObjectUtils;
34
35 import java.util.List;
36 import java.util.function.Function;
37 import java.util.stream.Stream;
38
39 import edu.umd.cs.findbugs.annotations.NonNull;
40
41 @SuppressWarnings("PMD.ShortClassName")
42 public enum Axis implements IExpression {
43 SELF(metapath10Lexer.KW_SELF, focus -> Stream.of(focus)),
44 PARENT(metapath10Lexer.KW_PARENT, focus -> Stream.ofNullable(focus.getParentNodeItem())),
45 ANCESTOR(metapath10Lexer.KW_ANCESTOR, INodeItem::ancestor),
46 ANCESTOR_OR_SELF(metapath10Lexer.KW_ANCESTOR_OR_SELF, INodeItem::ancestorOrSelf),
47 CHILDREN(metapath10Lexer.KW_CHILD, INodeItem::modelItems),
48 DESCENDANT(metapath10Lexer.KW_DESCENDANT, INodeItem::descendant),
49 DESCENDANT_OR_SELF(metapath10Lexer.KW_DESCENDANT_OR_SELF, INodeItem::descendantOrSelf);
50
51 private final int keywordIndex;
52 @NonNull
53 private final Function<INodeItem, Stream<? extends INodeItem>> action;
54
55 Axis(int keywordIndex, @NonNull Function<INodeItem, Stream<? extends INodeItem>> action) {
56 this.keywordIndex = keywordIndex;
57 this.action = action;
58 }
59
60
61
62
63
64
65 public int getKeywordIndex() {
66 return keywordIndex;
67 }
68
69
70
71
72
73
74
75
76 @NonNull
77 public Stream<? extends INodeItem> execute(@NonNull INodeItem focus) {
78 return ObjectUtils.notNull(action.apply(focus));
79 }
80
81 @Override
82 public List<? extends IExpression> getChildren() {
83 return CollectionUtil.emptyList();
84 }
85
86 @Override
87 public Class<INodeItem> getBaseResultType() {
88 return INodeItem.class;
89 }
90
91 @Override
92 public Class<INodeItem> getStaticResultType() {
93 return getBaseResultType();
94 }
95
96 @Override
97 public <RESULT, CONTEXT> RESULT accept(IExpressionVisitor<RESULT, CONTEXT> visitor, CONTEXT context) {
98 return visitor.visitAxis(this, context);
99 }
100
101 @Override
102 public ISequence<? extends INodeItem> accept(
103 DynamicContext dynamicContext,
104 ISequence<?> outerFocus) {
105 ISequence<? extends INodeItem> retval;
106 if (outerFocus.isEmpty()) {
107 retval = ISequence.empty();
108 } else {
109 retval = ISequence.of(outerFocus.asStream()
110 .map(item -> ItemUtils.checkItemIsNodeItemForStep(item))
111 .flatMap(item -> {
112 assert item != null;
113 return execute(item);
114 }).distinct());
115 }
116 return retval;
117 }
118 }