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.profile.resolver.policy;
28
29 import com.vladsch.flexmark.util.sequence.BasedSequence;
30
31 import gov.nist.secauto.metaschema.model.common.datatype.markup.flexmark.InsertAnchorExtension.InsertAnchorNode;
32 import gov.nist.secauto.metaschema.model.common.metapath.format.IPathFormatter;
33 import gov.nist.secauto.metaschema.model.common.metapath.item.IRequiredValueModelNodeItem;
34 import gov.nist.secauto.metaschema.model.common.util.CollectionUtil;
35 import gov.nist.secauto.metaschema.model.common.util.CustomCollectors;
36 import gov.nist.secauto.metaschema.model.common.util.ObjectUtils;
37 import gov.nist.secauto.oscal.lib.profile.resolver.support.IEntityItem;
38
39 import org.apache.logging.log4j.LogManager;
40 import org.apache.logging.log4j.Logger;
41
42 import java.util.List;
43 import java.util.Locale;
44
45 import edu.umd.cs.findbugs.annotations.NonNull;
46
47 public class InsertReferencePolicy
48 extends AbstractCustomReferencePolicy<InsertAnchorNode> {
49 private static final Logger LOGGER = LogManager.getLogger(InsertReferencePolicy.class);
50
51 public InsertReferencePolicy() {
52 super(IIdentifierParser.IDENTITY_PARSER);
53 }
54
55 @Override
56 protected List<IEntityItem.ItemType> getEntityItemTypes(@NonNull InsertAnchorNode insert) {
57 String type = insert.getType().toString();
58
59 List<IEntityItem.ItemType> itemTypes;
60 if ("param".equals(type)) {
61 itemTypes = CollectionUtil.singletonList(IEntityItem.ItemType.PARAMETER);
62 } else {
63 throw new UnsupportedOperationException("unrecognized insert type: " + type);
64 }
65 return itemTypes;
66 }
67
68 @Override
69 public String getReferenceText(@NonNull InsertAnchorNode insert) {
70 return insert.getIdReference().toString();
71 }
72
73 @Override
74 public void setReferenceText(@NonNull InsertAnchorNode insert, @NonNull String newReference) {
75 insert.setIdReference(ObjectUtils.notNull(BasedSequence.of(newReference)));
76 }
77
78 @Override
79 protected boolean handleIndexMiss(
80 @NonNull IRequiredValueModelNodeItem contextItem,
81 @NonNull InsertAnchorNode insert,
82 @NonNull List<IEntityItem.ItemType> itemTypes,
83 @NonNull String identifier,
84 @NonNull ReferenceCountingVisitor.Context visitorContext) {
85 if (LOGGER.isErrorEnabled()) {
86 LOGGER.atError().log(
87 "The '{}' insert at '{}' should reference a '{}' identified by '{}'."
88 + " The index did not contain the identifier.",
89 insert.getType().toString(),
90 contextItem.toPath(IPathFormatter.METAPATH_PATH_FORMATER),
91 itemTypes.stream()
92 .map(type -> type.name().toLowerCase(Locale.ROOT))
93 .collect(CustomCollectors.joiningWithOxfordComma("or")),
94 identifier);
95 }
96 return true;
97 }
98
99 }