1
2
3
4
5
6 package gov.nist.secauto.metaschema.core.metapath.item;
7
8 import gov.nist.secauto.metaschema.core.metapath.DynamicContext;
9 import gov.nist.secauto.metaschema.core.metapath.InvalidTreatTypeDynamicMetapathException;
10 import gov.nist.secauto.metaschema.core.metapath.cst.path.Axis;
11 import gov.nist.secauto.metaschema.core.metapath.item.node.IDocumentBasedNodeItem;
12 import gov.nist.secauto.metaschema.core.metapath.item.node.IDocumentNodeItem;
13 import gov.nist.secauto.metaschema.core.metapath.item.node.INodeItem;
14 import gov.nist.secauto.metaschema.core.metapath.type.InvalidTypeMetapathException;
15 import gov.nist.secauto.metaschema.core.metapath.type.TypeMetapathException;
16 import gov.nist.secauto.metaschema.core.util.ObjectUtils;
17
18 import edu.umd.cs.findbugs.annotations.NonNull;
19 import edu.umd.cs.findbugs.annotations.Nullable;
20
21
22
23
24 public final class ItemUtils {
25
26 private ItemUtils() {
27
28 }
29
30
31
32
33
34
35
36
37
38
39
40
41
42 @NonNull
43 public static INodeItem checkItemIsNodeItem(
44 @NonNull DynamicContext dynamicContext,
45 @Nullable IItem item) {
46 return checkItemIsType(dynamicContext, item, INodeItem.class);
47 }
48
49
50
51
52
53
54
55
56
57
58
59
60 @NonNull
61 public static IDocumentBasedNodeItem checkItemIsDocumentNodeItem(
62 @NonNull DynamicContext dynamicContext,
63 @Nullable IItem item) {
64 return checkItemIsType(dynamicContext, item, IDocumentBasedNodeItem.class);
65 }
66
67 @NonNull
68 private static <T extends IItem> T checkItemIsType(
69 @NonNull DynamicContext dynamicContext,
70 @Nullable IItem item,
71 @NonNull Class<T> itemClass) {
72 if (itemClass.isInstance(item)) {
73 return ObjectUtils.notNull(itemClass.cast(item));
74 }
75 if (item == null) {
76 throw new TypeMetapathException(TypeMetapathException.NOT_A_NODE_ITEM_FOR_STEP, "Item is null.")
77 .registerEvaluationContext(dynamicContext);
78 }
79 throw new TypeMetapathException(
80 TypeMetapathException.NOT_A_NODE_ITEM_FOR_STEP,
81 String.format("The item of type '%s' is not of the type '%s'.",
82 item.getClass().getName(),
83 itemClass.getName()))
84 .registerEvaluationContext(dynamicContext);
85 }
86
87
88
89
90
91
92
93
94
95
96
97
98
99 @NonNull
100 public static ISequence<IDocumentBasedNodeItem> getDocumentNodeItems(
101 @NonNull DynamicContext dynamicContext,
102 @NonNull ISequence<?> items) {
103 return ISequence.of(ObjectUtils.notNull(items.stream()
104
105 .map(item -> checkItemIsNodeItem(dynamicContext, item))
106 .map(item -> Axis.ANCESTOR_OR_SELF.execute(ObjectUtils.notNull(item))
107 .findFirst().stream()
108 .filter(IDocumentBasedNodeItem.class::isInstance)
109 .map(firstItem -> checkItemIsDocumentNodeItem(dynamicContext, firstItem))
110 .findFirst().orElseThrow(() -> new InvalidTreatTypeDynamicMetapathException(
111 dynamicContext.getExecutionStack(),
112 String.format("The node '%s' is not the descendant of a document node.",
113 item.getMetapath()))))));
114 }
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131 @SuppressWarnings("unchecked")
132 @NonNull
133 public static <TYPE> TYPE checkItemType(@NonNull IItem item, @NonNull Class<TYPE> clazz) {
134 if (clazz.isInstance(item)) {
135 return (TYPE) item;
136 }
137 throw new InvalidTypeMetapathException(
138 item,
139 String.format(
140 "The item of type '%s' is not the required type '%s'.",
141 item.getClass().getName(),
142 clazz.getName()));
143 }
144 }