1   /*
2    * SPDX-FileCopyrightText: none
3    * SPDX-License-Identifier: CC0-1.0
4    */
5   
6   package gov.nist.secauto.oscal.tools.cli.core;
7   
8   import gov.nist.secauto.metaschema.cli.processor.CLIProcessor;
9   import gov.nist.secauto.metaschema.cli.processor.ExitStatus;
10  import gov.nist.secauto.metaschema.core.MetaschemaJavaVersion;
11  import gov.nist.secauto.metaschema.core.model.MetaschemaVersion;
12  import gov.nist.secauto.metaschema.core.util.CollectionUtil;
13  import gov.nist.secauto.metaschema.core.util.IVersionInfo;
14  import gov.nist.secauto.oscal.lib.LibOscalVersion;
15  import gov.nist.secauto.oscal.lib.OscalVersion;
16  import gov.nist.secauto.oscal.tools.cli.core.commands.ConvertCommand;
17  import gov.nist.secauto.oscal.tools.cli.core.commands.ListAllowedValuesCommand;
18  import gov.nist.secauto.oscal.tools.cli.core.commands.ResolveCommand;
19  import gov.nist.secauto.oscal.tools.cli.core.commands.ValidateCommand;
20  import gov.nist.secauto.oscal.tools.cli.core.commands.assessmentplan.AssessmentPlanCommand;
21  import gov.nist.secauto.oscal.tools.cli.core.commands.assessmentresults.AssessmentResultsCommand;
22  import gov.nist.secauto.oscal.tools.cli.core.commands.catalog.CatalogCommand;
23  import gov.nist.secauto.oscal.tools.cli.core.commands.componentdefinition.ComponentDefinitionCommand;
24  import gov.nist.secauto.oscal.tools.cli.core.commands.metaschema.MetaschemaCommand;
25  import gov.nist.secauto.oscal.tools.cli.core.commands.poam.PlanOfActionsAndMilestonesCommand;
26  import gov.nist.secauto.oscal.tools.cli.core.commands.profile.ProfileCommand;
27  import gov.nist.secauto.oscal.tools.cli.core.commands.ssp.SystemSecurityPlanCommand;
28  
29  import java.util.LinkedHashMap;
30  import java.util.Map;
31  
32  import edu.umd.cs.findbugs.annotations.NonNull;
33  
34  /**
35   * Provides the main entry point for executing the command line interface.
36   */
37  @SuppressWarnings("PMD.ShortClassName")
38  public final class CLI {
39    /**
40     * Executes the CLI and handled the exit code.
41     *
42     * @param args
43     *          the CLI arguments
44     */
45    public static void main(String[] args) {
46      System.setProperty("java.util.logging.manager", "org.apache.logging.log4j.jul.LogManager");
47  
48      ExitStatus status = runCli(args);
49      int exitCode = status.getExitCode().getStatusCode();
50      System.exit(exitCode);
51    }
52  
53    /**
54     * Executes the CLI.
55     *
56     * @param args
57     *          the CLI arguments
58     * @return the result of executing the CLI
59     */
60    @NonNull
61    public static ExitStatus runCli(String... args) {
62      @SuppressWarnings("PMD.UseConcurrentHashMap")
63      Map<String, IVersionInfo> versions = new LinkedHashMap<>();
64      versions.put(CLIProcessor.COMMAND_VERSION, new OscalCliVersion());
65      versions.put("https://github.com/usnistgov/liboscal-java", new LibOscalVersion());
66      versions.put("https://github.com/usnistgov/OSCAL", new OscalVersion());
67      versions.put("https://github.com/usnistgov/metaschema-java", new MetaschemaJavaVersion());
68      versions.put("https://github.com/usnistgov/metaschema", new MetaschemaVersion());
69  
70      CLIProcessor processor = new CLIProcessor("oscal-cli", CollectionUtil.unmodifiableMap(versions));
71      processor.addCommandHandler(new CatalogCommand());
72      processor.addCommandHandler(new ProfileCommand());
73      processor.addCommandHandler(new ComponentDefinitionCommand());
74      processor.addCommandHandler(new SystemSecurityPlanCommand());
75      processor.addCommandHandler(new AssessmentPlanCommand());
76      processor.addCommandHandler(new AssessmentResultsCommand());
77      processor.addCommandHandler(new PlanOfActionsAndMilestonesCommand());
78      processor.addCommandHandler(new MetaschemaCommand());
79      processor.addCommandHandler(new ValidateCommand());
80      processor.addCommandHandler(new ConvertCommand());
81      processor.addCommandHandler(new ResolveCommand());
82      processor.addCommandHandler(new ListAllowedValuesCommand());
83      return processor.process(args);
84    }
85  
86    private CLI() {
87      // disable construction
88    }
89  }