1   /*
2    * SPDX-FileCopyrightText: none
3    * SPDX-License-Identifier: CC0-1.0
4    */
5   
6   package dev.metaschema.oscal.lib.profile.resolver;
7   
8   import java.nio.file.Paths;
9   import java.util.Map;
10  import java.util.UUID;
11  import java.util.concurrent.ConcurrentHashMap;
12  
13  import dev.metaschema.core.metapath.item.node.IDocumentNodeItem;
14  import dev.metaschema.core.metapath.item.node.INodeItemFactory;
15  import dev.metaschema.core.util.ObjectUtils;
16  import dev.metaschema.databind.model.IBoundDefinitionModelAssembly;
17  import dev.metaschema.oscal.lib.OscalBindingContext;
18  import dev.metaschema.oscal.lib.model.Catalog;
19  import dev.metaschema.oscal.lib.model.control.AbstractParameter;
20  import dev.metaschema.oscal.lib.model.control.AbstractPart;
21  import dev.metaschema.oscal.lib.model.control.catalog.AbstractCatalogGroup;
22  import dev.metaschema.oscal.lib.model.control.catalog.AbstractControl;
23  import dev.metaschema.oscal.lib.model.metadata.AbstractProperty;
24  import dev.metaschema.oscal.lib.model.metadata.IProperty;
25  import dev.metaschema.oscal.lib.profile.resolver.support.IIdentifierMapper;
26  import edu.umd.cs.findbugs.annotations.NonNull;
27  
28  public final class TestUtil {
29  
30    @NonNull
31    public static final IIdentifierMapper UUID_CONCAT_ID_MAPPER = new IIdentifierMapper() {
32      private final Map<String, String> idToReassignmentMap = new ConcurrentHashMap<>();
33  
34      @NonNull
35      private String reassign(@NonNull String identifier) {
36        String retval = idToReassignmentMap.get(identifier);
37        if (retval == null) {
38          retval = identifier + "-" + UUID.randomUUID().toString();
39          idToReassignmentMap.put(identifier, retval);
40        }
41        return retval;
42      }
43  
44      @Override
45      public String mapRoleIdentifier(@NonNull String identifier) {
46        return reassign(identifier);
47      }
48  
49      @Override
50      public String mapControlIdentifier(@NonNull String identifier) {
51        return reassign(identifier);
52      }
53  
54      @Override
55      public String mapGroupIdentifier(@NonNull String identifier) {
56        return reassign(identifier);
57      }
58  
59      @Override
60      public String mapParameterIdentifier(@NonNull String identifier) {
61        return reassign(identifier);
62      }
63  
64      @Override
65      public @NonNull
66      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(System.getProperty("user.dir")).toUri()),
165         importedCatalog);
166   }
167 }