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}