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.oscal.lib.metapath.function.library;
28
29 import gov.nist.secauto.metaschema.model.common.metapath.DynamicContext;
30 import gov.nist.secauto.metaschema.model.common.metapath.ISequence;
31 import gov.nist.secauto.metaschema.model.common.metapath.MetapathException;
32 import gov.nist.secauto.metaschema.model.common.metapath.function.FunctionUtils;
33 import gov.nist.secauto.metaschema.model.common.metapath.function.IArgument;
34 import gov.nist.secauto.metaschema.model.common.metapath.function.IFunction;
35 import gov.nist.secauto.metaschema.model.common.metapath.item.IDocumentNodeItem;
36 import gov.nist.secauto.metaschema.model.common.metapath.item.IItem;
37 import gov.nist.secauto.metaschema.model.common.metapath.item.INodeItem;
38 import gov.nist.secauto.metaschema.model.common.util.ObjectUtils;
39 import gov.nist.secauto.oscal.lib.model.Catalog;
40 import gov.nist.secauto.oscal.lib.profile.resolver.ProfileResolutionException;
41 import gov.nist.secauto.oscal.lib.profile.resolver.ProfileResolver;
42
43 import java.io.IOException;
44 import java.util.List;
45
46 import edu.umd.cs.findbugs.annotations.NonNull;
47
48 public final class ResolveProfile {
49
50 @NonNull
51 static final IFunction SIGNATURE_NO_ARG = IFunction.builder()
52 .name("resolve-profile")
53 .returnType(INodeItem.class)
54 .focusDependent()
55 .contextDependent()
56 .deterministic()
57 .returnOne()
58 .functionHandler(ResolveProfile::executeNoArg)
59 .build();
60
61 @NonNull
62 static final IFunction SIGNATURE_ONE_ARG = IFunction.builder()
63 .name("resolve-profile")
64 .argument(IArgument.newBuilder()
65 .name("profile")
66 .type(INodeItem.class)
67 .zeroOrOne()
68 .build())
69 .focusDependent()
70 .contextDependent()
71 .deterministic()
72 .returnType(INodeItem.class)
73 .returnOne()
74 .functionHandler(ResolveProfile::executeOneArg)
75 .build();
76
77 private ResolveProfile() {
78
79 }
80
81 @SuppressWarnings({ "unused",
82 "PMD.OnlyOneReturn"
83 })
84 @NonNull
85 public static ISequence<?> executeNoArg(
86 @NonNull IFunction function,
87 @NonNull List<ISequence<?>> arguments,
88 @NonNull DynamicContext dynamicContext,
89 INodeItem focus) {
90
91 INodeItem item = focus;
92 if (item == null) {
93 return ISequence.empty();
94 }
95 return ISequence.of(resolveProfile(FunctionUtils.asType(item), dynamicContext));
96 }
97
98 @SuppressWarnings({ "unused",
99 "PMD.OnlyOneReturn"
100 })
101 @NonNull
102 public static ISequence<?> executeOneArg(
103 @NonNull IFunction function,
104 @NonNull List<ISequence<?>> arguments,
105 @NonNull DynamicContext dynamicContext,
106 INodeItem focus) {
107 ISequence<? extends IDocumentNodeItem> arg = FunctionUtils.asType(
108 ObjectUtils.notNull(arguments.get(0)));
109
110 IItem item = FunctionUtils.getFirstItem(arg, true);
111 if (item == null) {
112 return ISequence.empty();
113 }
114
115 return ISequence.of(resolveProfile(FunctionUtils.asType(item), dynamicContext));
116 }
117
118 @NonNull
119 public static IDocumentNodeItem resolveProfile(@NonNull IDocumentNodeItem profile,
120 @NonNull DynamicContext dynamicContext) {
121 Object profileObject = profile.getValue();
122
123 IDocumentNodeItem retval;
124 if (profileObject instanceof Catalog) {
125 retval = profile;
126 } else {
127
128 ProfileResolver resolver = new ProfileResolver();
129 resolver.setDynamicContext(dynamicContext);
130 try {
131 retval = resolver.resolve(profile);
132 } catch (IOException | ProfileResolutionException ex) {
133 throw new MetapathException(String.format("Unable to resolve profile '%s'", profile.getBaseUri()), ex);
134 }
135 }
136 return retval;
137 }
138 }