1   /*
2    * SPDX-FileCopyrightText: none
3    * SPDX-License-Identifier: CC0-1.0
4    */
5   
6   package gov.nist.secauto.oscal.tools.cli.core.commands;
7   
8   import gov.nist.secauto.metaschema.cli.processor.CLIProcessor.CallingContext;
9   import gov.nist.secauto.metaschema.cli.processor.command.ICommandExecutor;
10  import gov.nist.secauto.metaschema.core.model.util.JsonUtil;
11  import gov.nist.secauto.metaschema.core.model.util.XmlUtil;
12  import gov.nist.secauto.metaschema.core.model.validation.JsonSchemaContentValidator;
13  import gov.nist.secauto.metaschema.core.model.validation.XmlSchemaContentValidator;
14  import gov.nist.secauto.metaschema.core.util.CollectionUtil;
15  import gov.nist.secauto.metaschema.core.util.ObjectUtils;
16  import gov.nist.secauto.oscal.lib.OscalBindingContext;
17  
18  import org.apache.commons.cli.CommandLine;
19  
20  import java.io.IOException;
21  import java.io.InputStream;
22  import java.util.LinkedList;
23  import java.util.List;
24  
25  import javax.xml.transform.Source;
26  
27  import edu.umd.cs.findbugs.annotations.NonNull;
28  
29  /**
30   * A CLI command that supports validating that an OSCAL instance is valid.
31   */
32  public class ValidateCommand
33      extends AbstractOscalValidationCommand {
34    @Override
35    public String getDescription() {
36      return "Check that the specified OSCAL instance is well-formed and valid to an OSCAL model.";
37    }
38  
39    @Override
40    public ICommandExecutor newExecutor(CallingContext callingContext, CommandLine commandLine) {
41      return new AbstractOscalValidationCommand.OscalValidationCommandExecutor(callingContext, commandLine);
42    }
43  
44    @Override
45    @NonNull
46    public XmlSchemaContentValidator getOscalXmlSchemas() throws IOException {
47      List<Source> retval = new LinkedList<>();
48      retval.add(
49          XmlUtil.getStreamSource(ObjectUtils.requireNonNull(
50              OscalBindingContext.class.getResource("/schema/xml/oscal-complete_schema.xsd"))));
51      return new XmlSchemaContentValidator(CollectionUtil.unmodifiableList(retval));
52    }
53  
54    @Override
55    @NonNull
56    public JsonSchemaContentValidator getOscalJsonSchema() throws IOException {
57      try (InputStream is = ObjectUtils.requireNonNull(
58          OscalBindingContext.class.getResourceAsStream("/schema/json/oscal-complete_schema.json"))) {
59        return new JsonSchemaContentValidator(JsonUtil.toJsonObject(is));
60      }
61    }
62  }