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}