001/*
002 * SPDX-FileCopyrightText: none
003 * SPDX-License-Identifier: CC0-1.0
004 */
005
006package gov.nist.secauto.oscal.tools.cli.core.commands;
007
008import gov.nist.secauto.metaschema.cli.commands.AbstractConvertSubcommand;
009import gov.nist.secauto.metaschema.cli.processor.CLIProcessor.CallingContext;
010import gov.nist.secauto.metaschema.cli.processor.ExitStatus;
011import gov.nist.secauto.metaschema.cli.processor.command.ICommandExecutor;
012import gov.nist.secauto.metaschema.core.model.IBoundObject;
013import gov.nist.secauto.metaschema.databind.IBindingContext;
014import gov.nist.secauto.metaschema.databind.io.Format;
015import gov.nist.secauto.metaschema.databind.io.IBoundLoader;
016import gov.nist.secauto.oscal.lib.OscalBindingContext;
017
018import org.apache.commons.cli.CommandLine;
019import org.apache.logging.log4j.LogManager;
020import org.apache.logging.log4j.Logger;
021
022import java.io.FileNotFoundException;
023import java.io.IOException;
024import java.io.Writer;
025import java.net.URI;
026
027import edu.umd.cs.findbugs.annotations.NonNull;
028
029public abstract class AbstractOscalConvertCommand
030    extends AbstractConvertSubcommand {
031  private static final Logger LOGGER = LogManager.getLogger(AbstractOscalConvertCommand.class);
032
033  @NonNull
034  public abstract Class<? extends IBoundObject> getOscalClass();
035
036  @Override
037  public ICommandExecutor newExecutor(CallingContext callingContext, CommandLine commandLine) {
038    return new OscalCommandExecutor(callingContext, commandLine);
039  }
040
041  private final class OscalCommandExecutor
042      extends AbstractConversionCommandExecutor {
043
044    private OscalCommandExecutor(
045        @NonNull CallingContext callingContext,
046        @NonNull CommandLine commandLine) {
047      super(callingContext, commandLine);
048    }
049
050    @Override
051    protected IBindingContext getBindingContext() {
052      return OscalBindingContext.instance();
053    }
054
055    @Override
056    public ExitStatus execute() {
057      LOGGER.atWarn().log("This command path is deprecated. Please use 'convert'.");
058
059      return super.execute();
060    }
061
062    @Override
063    protected void handleConversion(URI source, Format toFormat, Writer writer, IBoundLoader loader)
064        throws FileNotFoundException, IOException {
065      Class<? extends IBoundObject> clazz = getOscalClass();
066      loader.convert(source, writer, toFormat, clazz);
067    }
068  }
069}