1   /*
2    * SPDX-FileCopyrightText: none
3    * SPDX-License-Identifier: CC0-1.0
4    */
5   
6   package gov.nist.secauto.oscal.lib;
7   
8   import gov.nist.secauto.metaschema.core.metapath.StaticContext;
9   import gov.nist.secauto.metaschema.core.model.IModuleLoader;
10  import gov.nist.secauto.metaschema.databind.DefaultBindingContext;
11  import gov.nist.secauto.oscal.lib.model.AssessmentPlan;
12  import gov.nist.secauto.oscal.lib.model.AssessmentResults;
13  import gov.nist.secauto.oscal.lib.model.Catalog;
14  import gov.nist.secauto.oscal.lib.model.ComponentDefinition;
15  import gov.nist.secauto.oscal.lib.model.PlanOfActionAndMilestones;
16  import gov.nist.secauto.oscal.lib.model.Profile;
17  import gov.nist.secauto.oscal.lib.model.SystemSecurityPlan;
18  
19  import java.io.File;
20  import java.io.IOException;
21  import java.net.URISyntaxException;
22  import java.net.URL;
23  import java.nio.file.Path;
24  import java.util.List;
25  
26  import edu.umd.cs.findbugs.annotations.NonNull;
27  import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
28  
29  public class OscalBindingContext
30      extends DefaultBindingContext {
31    @NonNull
32    public static final StaticContext OSCAL_STATIC_METAPATH_CONTEXT = StaticContext.builder()
33        .defaultModelNamespace(OscalModelConstants.NS_URI_OSCAL)
34        .build();
35    @NonNull
36    private static final OscalBindingContext SINGLETON = new OscalBindingContext();
37  
38    @NonNull
39    @SuppressFBWarnings(value = "SING_SINGLETON_GETTER_NOT_SYNCHRONIZED", justification = "class initialization")
40    public static OscalBindingContext instance() {
41      return SINGLETON;
42    }
43  
44    /**
45     * Construct a new OSCAL-flavored binding context with custom constraints.
46     *
47     * @param modulePostProcessors
48     *          a list of module post processors to call after loading a module
49     */
50    @SuppressFBWarnings(value = "SING_SINGLETON_HAS_NONPRIVATE_CONSTRUCTOR",
51        justification = "public constructor allows customized use in specialized usecases")
52    public OscalBindingContext(@NonNull List<IModuleLoader.IModulePostProcessor> modulePostProcessors) {
53      super(modulePostProcessors);
54      registerBindingMatcher(Catalog.class);
55      registerBindingMatcher(Profile.class);
56      registerBindingMatcher(SystemSecurityPlan.class);
57      registerBindingMatcher(ComponentDefinition.class);
58      registerBindingMatcher(AssessmentPlan.class);
59      registerBindingMatcher(AssessmentResults.class);
60      registerBindingMatcher(PlanOfActionAndMilestones.class);
61    }
62  
63    /**
64     * Construct a new OSCAL-flavored binding context.
65     */
66    protected OscalBindingContext() {
67      registerBindingMatcher(Catalog.class);
68      registerBindingMatcher(Profile.class);
69      registerBindingMatcher(SystemSecurityPlan.class);
70      registerBindingMatcher(ComponentDefinition.class);
71      registerBindingMatcher(AssessmentPlan.class);
72      registerBindingMatcher(AssessmentResults.class);
73      registerBindingMatcher(PlanOfActionAndMilestones.class);
74    }
75  
76    @NonNull
77    public Catalog loadCatalog(@NonNull URL url) throws IOException, URISyntaxException {
78      return newBoundLoader().load(Catalog.class, url);
79    }
80  
81    @NonNull
82    public Catalog loadCatalog(@NonNull Path path) throws IOException {
83      return newBoundLoader().load(Catalog.class, path);
84    }
85  
86    @NonNull
87    public Catalog loadCatalog(@NonNull File file) throws IOException {
88      return newBoundLoader().load(Catalog.class, file);
89    }
90  
91    @NonNull
92    public Profile loadProfile(@NonNull URL url) throws IOException, URISyntaxException {
93      return newBoundLoader().load(Profile.class, url);
94    }
95  
96    @NonNull
97    public Profile loadProfile(@NonNull Path path) throws IOException {
98      return newBoundLoader().load(Profile.class, path);
99    }
100 
101   @NonNull
102   public Profile loadProfile(@NonNull File file) throws IOException {
103     return newBoundLoader().load(Profile.class, file);
104   }
105 
106   @NonNull
107   public SystemSecurityPlan loadSystemSecurityPlan(@NonNull URL url) throws IOException, URISyntaxException {
108     return newBoundLoader().load(SystemSecurityPlan.class, url);
109   }
110 
111   @NonNull
112   public SystemSecurityPlan loadSystemSecurityPlan(@NonNull Path path) throws IOException {
113     return newBoundLoader().load(SystemSecurityPlan.class, path);
114   }
115 
116   @NonNull
117   public SystemSecurityPlan loadSystemSecurityPlan(@NonNull File file) throws IOException {
118     return newBoundLoader().load(SystemSecurityPlan.class, file);
119   }
120 
121   @NonNull
122   public ComponentDefinition loadComponentDefinition(@NonNull URL url) throws IOException, URISyntaxException {
123     return newBoundLoader().load(ComponentDefinition.class, url);
124   }
125 
126   @NonNull
127   public ComponentDefinition loadComponentDefinition(@NonNull Path path) throws IOException {
128     return newBoundLoader().load(ComponentDefinition.class, path);
129   }
130 
131   @NonNull
132   public ComponentDefinition loadComponentDefinition(@NonNull File file) throws IOException {
133     return newBoundLoader().load(ComponentDefinition.class, file);
134   }
135 
136   @NonNull
137   public AssessmentPlan loadAssessmentPlan(@NonNull URL url) throws IOException, URISyntaxException {
138     return newBoundLoader().load(AssessmentPlan.class, url);
139   }
140 
141   @NonNull
142   public AssessmentPlan loadAssessmentPlan(@NonNull Path path) throws IOException {
143     return newBoundLoader().load(AssessmentPlan.class, path);
144   }
145 
146   @NonNull
147   public AssessmentPlan loadAssessmentPlan(@NonNull File file) throws IOException {
148     return newBoundLoader().load(AssessmentPlan.class, file);
149   }
150 
151   @NonNull
152   public AssessmentResults loadAssessmentResults(@NonNull URL url) throws IOException, URISyntaxException {
153     return newBoundLoader().load(AssessmentResults.class, url);
154   }
155 
156   @NonNull
157   public AssessmentResults loadAssessmentResults(@NonNull Path path) throws IOException {
158     return newBoundLoader().load(AssessmentResults.class, path);
159   }
160 
161   @NonNull
162   public AssessmentResults loadAssessmentResults(@NonNull File file) throws IOException {
163     return newBoundLoader().load(AssessmentResults.class, file);
164   }
165 
166   @NonNull
167   public PlanOfActionAndMilestones loadPlanOfActionAndMilestones(@NonNull URL url)
168       throws IOException, URISyntaxException {
169     return newBoundLoader().load(PlanOfActionAndMilestones.class, url);
170   }
171 
172   @NonNull
173   public PlanOfActionAndMilestones loadPlanOfActionAndMilestones(@NonNull Path path) throws IOException {
174     return newBoundLoader().load(PlanOfActionAndMilestones.class, path);
175   }
176 
177   @NonNull
178   public PlanOfActionAndMilestones loadPlanOfActionAndMilestones(@NonNull File file) throws IOException {
179     return newBoundLoader().load(PlanOfActionAndMilestones.class, file);
180   }
181 }