001/* 002 * SPDX-FileCopyrightText: none 003 * SPDX-License-Identifier: CC0-1.0 004 */ 005 006package dev.metaschema.oscal.tools.cli.core; 007 008import java.util.LinkedHashMap; 009import java.util.Map; 010 011import dev.metaschema.cli.processor.CLIProcessor; 012import dev.metaschema.cli.processor.ExitStatus; 013import dev.metaschema.cli.processor.command.CommandService; 014import dev.metaschema.core.MetaschemaJavaVersion; 015import dev.metaschema.core.model.MetaschemaVersion; 016import dev.metaschema.core.util.CollectionUtil; 017import dev.metaschema.core.util.IVersionInfo; 018import dev.metaschema.oscal.lib.LibOscalVersion; 019import dev.metaschema.oscal.lib.OscalVersion; 020import dev.metaschema.oscal.tools.cli.core.commands.ConvertCommand; 021import dev.metaschema.oscal.tools.cli.core.commands.ListAllowedValuesCommand; 022import dev.metaschema.oscal.tools.cli.core.commands.ResolveCommand; 023import dev.metaschema.oscal.tools.cli.core.commands.ValidateCommand; 024import dev.metaschema.oscal.tools.cli.core.commands.assessmentplan.AssessmentPlanCommand; 025import dev.metaschema.oscal.tools.cli.core.commands.assessmentresults.AssessmentResultsCommand; 026import dev.metaschema.oscal.tools.cli.core.commands.catalog.CatalogCommand; 027import dev.metaschema.oscal.tools.cli.core.commands.componentdefinition.ComponentDefinitionCommand; 028import dev.metaschema.oscal.tools.cli.core.commands.metaschema.MetaschemaCommand; 029import dev.metaschema.oscal.tools.cli.core.commands.poam.PlanOfActionsAndMilestonesCommand; 030import dev.metaschema.oscal.tools.cli.core.commands.profile.ProfileCommand; 031import dev.metaschema.oscal.tools.cli.core.commands.ssp.SystemSecurityPlanCommand; 032import edu.umd.cs.findbugs.annotations.NonNull; 033 034/** 035 * Provides the main entry point for executing the command line interface. 036 */ 037@SuppressWarnings("PMD.ShortClassName") 038public final class CLI { 039 /** 040 * Executes the CLI and handled the exit code. 041 * 042 * @param args 043 * the CLI arguments 044 */ 045 public static void main(String[] args) { 046 System.setProperty("java.util.logging.manager", "org.apache.logging.log4j.jul.LogManager"); 047 048 ExitStatus status = runCli(args); 049 int exitCode = status.getExitCode().getStatusCode(); 050 System.exit(exitCode); 051 } 052 053 /** 054 * Executes the CLI. 055 * 056 * @param args 057 * the CLI arguments 058 * @return the result of executing the CLI 059 */ 060 @NonNull 061 public static ExitStatus runCli(String... args) { 062 @SuppressWarnings("PMD.UseConcurrentHashMap") 063 Map<String, IVersionInfo> versions = new LinkedHashMap<>(); 064 versions.put(CLIProcessor.COMMAND_VERSION, new OscalCliVersion()); 065 versions.put("https://github.com/usnistgov/liboscal-java", new LibOscalVersion()); 066 versions.put("https://github.com/usnistgov/OSCAL", new OscalVersion()); 067 versions.put("https://github.com/usnistgov/metaschema-java", new MetaschemaJavaVersion()); 068 versions.put("https://github.com/usnistgov/metaschema", new MetaschemaVersion()); 069 070 CLIProcessor processor = new CLIProcessor("oscal-cli", CollectionUtil.unmodifiableMap(versions)); 071 processor.addCommandHandler(new CatalogCommand()); 072 processor.addCommandHandler(new ProfileCommand()); 073 processor.addCommandHandler(new ComponentDefinitionCommand()); 074 processor.addCommandHandler(new SystemSecurityPlanCommand()); 075 processor.addCommandHandler(new AssessmentPlanCommand()); 076 processor.addCommandHandler(new AssessmentResultsCommand()); 077 processor.addCommandHandler(new PlanOfActionsAndMilestonesCommand()); 078 processor.addCommandHandler(new MetaschemaCommand()); 079 processor.addCommandHandler(new ValidateCommand()); 080 processor.addCommandHandler(new ConvertCommand()); 081 processor.addCommandHandler(new ResolveCommand()); 082 processor.addCommandHandler(new ListAllowedValuesCommand()); 083 084 // Register SPI-discovered commands (e.g., shell-completion) 085 CommandService.getInstance().getCommands().forEach(processor::addCommandHandler); 086 087 return processor.process(args); 088 } 089 090 private CLI() { 091 // disable construction 092 } 093}