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.model.control;
28
29 import gov.nist.secauto.metaschema.model.common.datatype.markup.MarkupLine;
30 import gov.nist.secauto.metaschema.model.common.datatype.markup.MarkupMultiline;
31 import gov.nist.secauto.metaschema.model.common.util.CollectionUtil;
32 import gov.nist.secauto.metaschema.model.common.util.ObjectUtils;
33 import gov.nist.secauto.oscal.lib.model.Link;
34 import gov.nist.secauto.oscal.lib.model.Parameter;
35 import gov.nist.secauto.oscal.lib.model.ParameterConstraint;
36 import gov.nist.secauto.oscal.lib.model.ParameterGuideline;
37 import gov.nist.secauto.oscal.lib.model.ParameterSelection;
38 import gov.nist.secauto.oscal.lib.model.Property;
39 import gov.nist.secauto.oscal.lib.model.metadata.IProperty;
40
41 import java.util.ArrayList;
42 import java.util.Arrays;
43 import java.util.Collection;
44 import java.util.LinkedList;
45 import java.util.List;
46 import java.util.Objects;
47 import java.util.stream.Stream;
48
49 import edu.umd.cs.findbugs.annotations.NonNull;
50
51 public abstract class AbstractParameter implements IParameter {
52
53 @Override
54 public Stream<String> getParameterReferences() {
55
56
57 Stream<String> aggregatesIds = CollectionUtil.listOrEmpty(getProps()).stream()
58 .filter(Objects::nonNull)
59 .filter(prop -> prop.isNamespaceEqual(IProperty.OSCAL_NAMESPACE) && "aggregates".equals(prop.getName()))
60 .map(prop -> prop.getValue());
61
62
63 ParameterSelection selection = getSelect();
64
65 Stream<String> selectInsertIds;
66 if (selection == null) {
67 selectInsertIds = Stream.empty();
68 } else {
69 selectInsertIds = CollectionUtil.listOrEmpty(selection.getChoice()).stream()
70 .filter(Objects::nonNull)
71 .flatMap(choice -> choice.getInserts(insert -> "param".equals(insert.getType().toString())).stream()
72 .map(insert -> insert.getIdReference().toString()));
73 }
74 Stream<String> retval = Stream.concat(aggregatesIds, selectInsertIds)
75 .filter(Objects::nonNull)
76 .distinct();
77 assert retval != null;
78 return retval;
79 }
80
81 @NonNull
82 public static Builder builder(@NonNull String id) {
83 return new Builder(id);
84 }
85
86 public static class Builder {
87 @NonNull
88 private final String id;
89
90 private String clazz;
91 private final List<Property> props = new LinkedList<>();
92 private final List<Link> links = new LinkedList<>();
93 private MarkupLine label;
94 private MarkupMultiline usage;
95 private final List<ParameterConstraint> constraints = new LinkedList<>();
96 private final List<ParameterGuideline> guidelines = new LinkedList<>();
97 private List<String> values = new LinkedList<>();
98 private ParameterSelection selection;
99 private MarkupMultiline remarks;
100
101 public Builder(@NonNull String id) {
102 this.id = ObjectUtils.requireNonNull(id);
103 }
104
105 @NonNull
106 public Builder clazz(@NonNull String value) {
107 this.clazz = ObjectUtils.requireNonNull(value);
108 return this;
109 }
110
111 @NonNull
112 public Builder prop(@NonNull Property value) {
113 this.props.add(ObjectUtils.requireNonNull(value));
114 return this;
115 }
116
117 @NonNull
118 public Builder link(@NonNull Link value) {
119 this.links.add(ObjectUtils.requireNonNull(value));
120 return this;
121 }
122
123 @NonNull
124 public Builder label(@NonNull String markdown) {
125 return label(MarkupLine.fromMarkdown(Objects.requireNonNull(markdown)));
126 }
127
128 @NonNull
129 public Builder label(@NonNull MarkupLine value) {
130 this.label = ObjectUtils.requireNonNull(value);
131 return this;
132 }
133
134 @NonNull
135 public Builder usage(@NonNull String markdown) {
136 return usage(MarkupMultiline.fromMarkdown(ObjectUtils.requireNonNull(markdown)));
137 }
138
139 @NonNull
140 public Builder usage(@NonNull MarkupMultiline value) {
141 this.usage = ObjectUtils.requireNonNull(value);
142 return this;
143 }
144
145 @NonNull
146 public Builder constraint(@NonNull ParameterConstraint value) {
147 this.constraints.add(ObjectUtils.requireNonNull(value));
148 return this;
149 }
150
151 @NonNull
152 public Builder guideline(@NonNull ParameterGuideline value) {
153 this.guidelines.add(ObjectUtils.requireNonNull(value));
154 return this;
155 }
156
157 @SuppressWarnings("null")
158 @NonNull
159 public Builder values(@NonNull String... values) {
160 return values(Arrays.asList(values));
161 }
162
163 @NonNull
164 public Builder values(@NonNull Collection<String> values) {
165 this.values = new ArrayList<>(values);
166 return this;
167 }
168
169 @NonNull
170 public Builder select(@NonNull ParameterSelection value) {
171 this.selection = Objects.requireNonNull(value);
172 return this;
173 }
174
175 @NonNull
176 public Builder remarks(@NonNull MarkupMultiline value) {
177 this.remarks = Objects.requireNonNull(value);
178 return this;
179 }
180
181 @NonNull
182 public Parameter build() {
183 Parameter retval = new Parameter();
184 retval.setId(id);
185
186 if (clazz != null) {
187 retval.setClazz(clazz);
188 }
189 if (!props.isEmpty()) {
190 retval.setProps(props);
191 }
192 if (!links.isEmpty()) {
193 retval.setLinks(links);
194 }
195 if (label != null) {
196 retval.setLabel(label);
197 }
198 if (usage != null) {
199 retval.setUsage(usage);
200 }
201 if (!constraints.isEmpty()) {
202 retval.setConstraints(constraints);
203 }
204 if (!guidelines.isEmpty()) {
205 retval.setGuidelines(guidelines);
206 }
207 if (!values.isEmpty()) {
208 retval.setValues(values);
209 }
210 if (selection != null) {
211 retval.setSelect(selection);
212 }
213 if (remarks != null) {
214 retval.setRemarks(remarks);
215 }
216 return retval;
217 }
218 }
219 }