001/*
002 * SPDX-FileCopyrightText: none
003 * SPDX-License-Identifier: CC0-1.0
004 */
005
006package gov.nist.secauto.oscal.lib;
007
008import gov.nist.secauto.metaschema.core.metapath.StaticContext;
009import gov.nist.secauto.metaschema.core.model.IModuleLoader;
010import gov.nist.secauto.metaschema.databind.DefaultBindingContext;
011import gov.nist.secauto.oscal.lib.model.AssessmentPlan;
012import gov.nist.secauto.oscal.lib.model.AssessmentResults;
013import gov.nist.secauto.oscal.lib.model.Catalog;
014import gov.nist.secauto.oscal.lib.model.ComponentDefinition;
015import gov.nist.secauto.oscal.lib.model.PlanOfActionAndMilestones;
016import gov.nist.secauto.oscal.lib.model.Profile;
017import gov.nist.secauto.oscal.lib.model.SystemSecurityPlan;
018
019import java.io.File;
020import java.io.IOException;
021import java.net.URISyntaxException;
022import java.net.URL;
023import java.nio.file.Path;
024import java.util.List;
025
026import edu.umd.cs.findbugs.annotations.NonNull;
027import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
028
029public class OscalBindingContext
030    extends DefaultBindingContext {
031  @NonNull
032  public static final StaticContext OSCAL_STATIC_METAPATH_CONTEXT = StaticContext.builder()
033      .defaultModelNamespace(OscalModelConstants.NS_URI_OSCAL)
034      .build();
035  @NonNull
036  private static final OscalBindingContext SINGLETON = new OscalBindingContext();
037
038  @NonNull
039  @SuppressFBWarnings(value = "SING_SINGLETON_GETTER_NOT_SYNCHRONIZED", justification = "class initialization")
040  public static OscalBindingContext instance() {
041    return SINGLETON;
042  }
043
044  /**
045   * Construct a new OSCAL-flavored binding context with custom constraints.
046   *
047   * @param modulePostProcessors
048   *          a list of module post processors to call after loading a module
049   */
050  @SuppressFBWarnings(value = "SING_SINGLETON_HAS_NONPRIVATE_CONSTRUCTOR",
051      justification = "public constructor allows customized use in specialized usecases")
052  public OscalBindingContext(@NonNull List<IModuleLoader.IModulePostProcessor> modulePostProcessors) {
053    super(modulePostProcessors);
054    registerBindingMatcher(Catalog.class);
055    registerBindingMatcher(Profile.class);
056    registerBindingMatcher(SystemSecurityPlan.class);
057    registerBindingMatcher(ComponentDefinition.class);
058    registerBindingMatcher(AssessmentPlan.class);
059    registerBindingMatcher(AssessmentResults.class);
060    registerBindingMatcher(PlanOfActionAndMilestones.class);
061  }
062
063  /**
064   * Construct a new OSCAL-flavored binding context.
065   */
066  protected OscalBindingContext() {
067    registerBindingMatcher(Catalog.class);
068    registerBindingMatcher(Profile.class);
069    registerBindingMatcher(SystemSecurityPlan.class);
070    registerBindingMatcher(ComponentDefinition.class);
071    registerBindingMatcher(AssessmentPlan.class);
072    registerBindingMatcher(AssessmentResults.class);
073    registerBindingMatcher(PlanOfActionAndMilestones.class);
074  }
075
076  @NonNull
077  public Catalog loadCatalog(@NonNull URL url) throws IOException, URISyntaxException {
078    return newBoundLoader().load(Catalog.class, url);
079  }
080
081  @NonNull
082  public Catalog loadCatalog(@NonNull Path path) throws IOException {
083    return newBoundLoader().load(Catalog.class, path);
084  }
085
086  @NonNull
087  public Catalog loadCatalog(@NonNull File file) throws IOException {
088    return newBoundLoader().load(Catalog.class, file);
089  }
090
091  @NonNull
092  public Profile loadProfile(@NonNull URL url) throws IOException, URISyntaxException {
093    return newBoundLoader().load(Profile.class, url);
094  }
095
096  @NonNull
097  public Profile loadProfile(@NonNull Path path) throws IOException {
098    return newBoundLoader().load(Profile.class, path);
099  }
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}