1   /*
2    * SPDX-FileCopyrightText: none
3    * SPDX-License-Identifier: CC0-1.0
4    */
5   
6   package gov.nist.secauto.oscal.lib.profile.resolver;
7   
8   import gov.nist.secauto.metaschema.core.metapath.item.node.IDocumentNodeItem;
9   import gov.nist.secauto.metaschema.core.metapath.item.node.INodeItemFactory;
10  import gov.nist.secauto.metaschema.core.util.ObjectUtils;
11  import gov.nist.secauto.metaschema.databind.model.IBoundDefinitionModelAssembly;
12  import gov.nist.secauto.oscal.lib.OscalBindingContext;
13  import gov.nist.secauto.oscal.lib.model.Catalog;
14  import gov.nist.secauto.oscal.lib.model.control.AbstractParameter;
15  import gov.nist.secauto.oscal.lib.model.control.AbstractPart;
16  import gov.nist.secauto.oscal.lib.model.control.catalog.AbstractCatalogGroup;
17  import gov.nist.secauto.oscal.lib.model.control.catalog.AbstractControl;
18  import gov.nist.secauto.oscal.lib.model.metadata.AbstractProperty;
19  import gov.nist.secauto.oscal.lib.model.metadata.IProperty;
20  import gov.nist.secauto.oscal.lib.profile.resolver.support.IIdentifierMapper;
21  
22  import java.nio.file.Paths;
23  import java.util.Map;
24  import java.util.UUID;
25  import java.util.concurrent.ConcurrentHashMap;
26  
27  import edu.umd.cs.findbugs.annotations.NonNull;
28  
29  public final class TestUtil {
30  
31    @NonNull
32    public static final IIdentifierMapper UUID_CONCAT_ID_MAPPER = new IIdentifierMapper() {
33      private final Map<String, String> idToReassignmentMap = new ConcurrentHashMap<>();
34  
35      @NonNull
36      private String reassign(@NonNull String identifier) {
37        String retval = idToReassignmentMap.get(identifier);
38        if (retval == null) {
39          retval = identifier + "-" + UUID.randomUUID().toString();
40          idToReassignmentMap.put(identifier, retval);
41        }
42        return retval;
43      }
44  
45      @Override
46      public String mapRoleIdentifier(@NonNull String identifier) {
47        return reassign(identifier);
48      }
49  
50      @Override
51      public String mapControlIdentifier(@NonNull String identifier) {
52        return reassign(identifier);
53      }
54  
55      @Override
56      public String mapGroupIdentifier(@NonNull String identifier) {
57        return reassign(identifier);
58      }
59  
60      @Override
61      public String mapParameterIdentifier(@NonNull String identifier) {
62        return reassign(identifier);
63      }
64  
65      @Override
66      public @NonNull String mapPartIdentifier(@NonNull String identifier) {
67        return reassign(identifier);
68      }
69    };
70  
71    private TestUtil() {
72      // disable construction
73    }
74  
75    @NonNull
76    public static IDocumentNodeItem newImportedCatalog() {
77  
78      // setup the imported catalog
79      Catalog importedCatalog = new Catalog();
80      importedCatalog.setUuid(UUID.randomUUID());
81  
82      importedCatalog.addParam(AbstractParameter.builder("param1")
83          .build());
84  
85      importedCatalog.addGroup(AbstractCatalogGroup.builder("group1")
86          .title("Group 1")
87          .part(AbstractPart.builder("statement")
88              .prose("group 1 part 1")
89              .build())
90          .param(AbstractParameter.builder("param2")
91              .build())
92          .control(AbstractControl.builder("control1")
93              .title("Control 1")
94              .param(AbstractParameter.builder("param3")
95                  .build())
96              .part(AbstractPart.builder("statement")
97                  .prose("A {{ insert: param, param1}} reference.")
98                  .build())
99              .part(AbstractPart.builder("statement")
100                 .prose("group 1 control 1 part 1")
101                 .part(AbstractPart.builder("statement")
102                     .prose("group 1 control 1 part 1.a")
103                     .build())
104                 .part(AbstractPart.builder("statement")
105                     .prose("group 1 control 1 part 1.b")
106                     .build())
107                 .build())
108             .part(AbstractPart.builder("statement")
109                 .prose("group 1 control 1 part 2")
110                 .build())
111             .build())
112         // to be filtered
113         .control(AbstractControl.builder("control2")
114             .title("Control 2")
115             .part(AbstractPart.builder("statement")
116                 .prose("A {{ insert: param, param2}} reference.")
117                 .build())
118             .build())
119         .build());
120     importedCatalog.addGroup(AbstractCatalogGroup.builder("group2")
121         .title("Group 2")
122         .param(AbstractParameter.builder("param4")
123             .prop(AbstractProperty.builder("aggregates")
124                 .namespace(IProperty.RMF_NAMESPACE)
125                 .value("param2")
126                 .build())
127             .build())
128         .control(AbstractControl.builder("control3")
129             .title("Control 3")
130             .build())
131         .control(AbstractControl.builder("control4")
132             .title("Control 4")
133             .build())
134         .group(AbstractCatalogGroup.builder("group3")
135             .title("Group 3")
136             // to be filtered
137             .control(AbstractControl.builder("control5")
138                 .title("Control 5")
139                 .build())
140             .build())
141         .control(AbstractControl.builder("control6")
142             .title("Control 6")
143             .part(AbstractPart.builder("statement")
144                 .prose("A {{ insert: param, param4}} reference.")
145                 .build())
146             .build())
147         // to be filtered
148         .control(AbstractControl.builder("control7")
149             .title("Control 7")
150             .param(AbstractParameter.builder("param5")
151                 .build())
152             .control(AbstractControl.builder("control8")
153                 .title("Control 8")
154                 .part(AbstractPart.builder("statement")
155                     .prose("A {{ insert: param, param5}} reference.")
156                     .build())
157                 .build())
158             .build())
159         .build());
160 
161     return INodeItemFactory.instance().newDocumentNodeItem(
162         ObjectUtils.requireNonNull(
163             (IBoundDefinitionModelAssembly) OscalBindingContext.instance().getBoundDefinitionForClass(Catalog.class)),
164         ObjectUtils.notNull(Paths.get("").toUri()),
165         importedCatalog);
166   }
167 }