001/* 002 * SPDX-FileCopyrightText: none 003 * SPDX-License-Identifier: CC0-1.0 004 */ 005 006package dev.metaschema.oscal.tools.cli.core.commands; 007 008import org.apache.commons.cli.CommandLine; 009 010import java.io.IOException; 011import java.io.InputStream; 012import java.util.LinkedList; 013import java.util.List; 014 015import javax.xml.transform.Source; 016 017import dev.metaschema.cli.processor.CallingContext; 018import dev.metaschema.cli.processor.command.ICommandExecutor; 019import dev.metaschema.core.model.util.JsonUtil; 020import dev.metaschema.core.model.util.XmlUtil; 021import dev.metaschema.core.model.validation.JsonSchemaContentValidator; 022import dev.metaschema.core.model.validation.XmlSchemaContentValidator; 023import dev.metaschema.core.util.CollectionUtil; 024import dev.metaschema.core.util.ObjectUtils; 025import dev.metaschema.oscal.lib.OscalBindingContext; 026import edu.umd.cs.findbugs.annotations.NonNull; 027 028/** 029 * A CLI command that supports validating that an OSCAL instance is valid. 030 */ 031public class ValidateCommand 032 extends AbstractOscalValidationCommand { 033 @Override 034 public String getDescription() { 035 return "Check that the specified OSCAL instance is well-formed and valid to an OSCAL model."; 036 } 037 038 @Override 039 public ICommandExecutor newExecutor(CallingContext callingContext, CommandLine commandLine) { 040 return new AbstractOscalValidationCommand.OscalValidationCommandExecutor(callingContext, commandLine); 041 } 042 043 @Override 044 @NonNull 045 public XmlSchemaContentValidator getOscalXmlSchemas() throws IOException { 046 List<Source> retval = new LinkedList<>(); 047 retval.add( 048 XmlUtil.getStreamSource(ObjectUtils.requireNonNull( 049 OscalBindingContext.class.getResource("/schema/xml/oscal-complete_schema.xsd")))); 050 return new XmlSchemaContentValidator(CollectionUtil.unmodifiableList(retval)); 051 } 052 053 @Override 054 @NonNull 055 public JsonSchemaContentValidator getOscalJsonSchema() throws IOException { 056 try (InputStream is = ObjectUtils.requireNonNull( 057 OscalBindingContext.class.getResourceAsStream("/schema/json/oscal-complete_schema.json"))) { 058 return new JsonSchemaContentValidator(JsonUtil.toJsonObject(is)); 059 } 060 } 061}