- java.lang.Object
-
- com.github.rvesse.airline.model.MetadataLoader
-
public class MetadataLoader extends java.lang.Object
Helper for loading meta-data
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description private static class
MetadataLoader.InjectionMetadata
-
Field Summary
Fields Modifier and Type Field Description static java.lang.String
AIRLINE_MODULE
Constant for theAirlineModule
annotation classstatic java.lang.String
COM_GOOGLE_INJECT_INJECT
Constant for thecom.google.inject.Inject
annotation classprivate static java.util.Map<java.lang.String,java.lang.Class<? extends java.lang.annotation.Annotation>>
dynamicAnnotationCache
static java.lang.String
JAKARTA_INJECT_INJECT
Constant for thejakarta.inject.Inject
annotation classstatic java.lang.String
JAVAX_INJECT_INJECT
Constant for thejavax.inject.Inject
annotation class
-
Constructor Summary
Constructors Constructor Description MetadataLoader()
-
Method Summary
All Methods Static Methods Concrete Methods Modifier and Type Method Description protected static void
buildGroupsHierarchy(java.util.List<CommandGroupMetadata> commandGroups, java.util.Map<java.lang.String,CommandGroupMetadata> subGroups)
private static void
checkForInjectionAnnotation(MetadataLoader.InjectionMetadata injectionMetadata, java.lang.reflect.Field field, java.util.List<java.lang.reflect.Field> path, java.lang.String annotationClass, ParserMetadata<?> parserConfig)
private static void
collectPartial(java.util.Map<java.lang.Class<? extends java.lang.annotation.Annotation>,java.util.Set<java.lang.Integer>> partials, Partial partial)
private static void
createGroupsFromAnnotations(java.util.List<CommandMetadata> allCommands, java.util.List<CommandMetadata> newCommands, java.util.List<CommandGroupMetadata> commandGroups, java.util.List<CommandMetadata> defaultCommandGroup, java.util.Map<java.lang.String,HelpSection> baseHelpSections, ParserMetadata<?> parserConfig)
static CommandMetadata
loadCommand(java.lang.Class<?> commandType, ParserMetadata<?> parserConfig)
Loads command meta-datastatic CommandMetadata
loadCommand(java.lang.Class<?> commandType, java.util.Map<java.lang.String,HelpSection> baseHelpSections, ParserMetadata<?> parserConfig)
Loads command meta-datastatic CommandGroupMetadata
loadCommandGroup(java.lang.String name, java.lang.String description, boolean hidden, java.lang.Iterable<CommandGroupMetadata> subGroups, CommandMetadata defaultCommand, java.lang.Iterable<CommandMetadata> commands)
Loads command group meta-datastatic <T> java.util.List<CommandMetadata>
loadCommands(java.lang.Iterable<java.lang.Class<? extends T>> defaultCommands, java.util.Map<java.lang.String,HelpSection> baseHelpSections, ParserMetadata<?> parserConfig)
Loads command meta-datastatic void
loadCommandsIntoGroupsByAnnotation(java.util.List<CommandMetadata> allCommands, java.util.List<CommandGroupMetadata> commandGroups, java.util.List<CommandMetadata> defaultCommandGroup, java.util.Map<java.lang.String,HelpSection> baseHelpSections, ParserMetadata<?> parserConfig)
static <C> GlobalMetadata<C>
loadGlobal(java.lang.Class<?> cliClass)
static <C> GlobalMetadata<C>
loadGlobal(java.lang.Class<?> cliClass, ParserMetadata<C> parserConfigOverride)
Loads the metadata for a CLIstatic <C> GlobalMetadata<C>
loadGlobal(java.lang.String name, java.lang.String description, CommandMetadata defaultCommand, java.lang.Iterable<CommandMetadata> defaultGroupCommands, java.lang.Iterable<CommandGroupMetadata> groups, java.lang.Iterable<GlobalRestriction> restrictions, java.lang.Iterable<HelpSection> baseHelpSections, ParserMetadata<C> parserConfig)
Loads global meta-dataprotected static java.util.Map<java.lang.String,HelpSection>
loadHelpSections(java.lang.Class<?> sourceClass, java.util.Map<java.lang.String,HelpSection> baseHelpSections)
static void
loadInjectionMetadata(java.lang.Class<?> type, MetadataLoader.InjectionMetadata injectionMetadata, java.util.List<java.lang.reflect.Field> fields, ParserMetadata<?> parserConfig)
Loads injection meta-datastatic MetadataLoader.InjectionMetadata
loadInjectionMetadata(java.lang.Class<?> type, ParserMetadata<?> parserConfig)
Loads injection meta-dataprivate static <C> ParserMetadata<C>
loadParser(Parser parserConfig)
static <C> ParserMetadata<C>
loadParser(java.lang.Class<?> cliClass)
private static java.util.Map<java.lang.Class<? extends java.lang.annotation.Annotation>,java.util.Set<java.lang.Integer>>
loadPartials(java.lang.reflect.Field field)
static SuggesterMetadata
loadSuggester(java.lang.Class<? extends Suggester> suggesterClass, ParserMetadata<?> parserConfig)
Loads suggester meta-dataprivate static java.util.List<OptionMetadata>
mergeOptionSet(java.util.List<OptionMetadata> options)
private static java.util.List<OptionMetadata>
overrideOptionSet(java.util.List<OptionMetadata> options)
private static void
tryOverrideOptions(java.util.Map<java.util.Set<java.lang.String>,OptionMetadata> optionIndex, java.util.Set<java.lang.String> names, OptionMetadata parent)
-
-
-
Field Detail
-
AIRLINE_MODULE
public static final java.lang.String AIRLINE_MODULE
Constant for theAirlineModule
annotation class- See Also:
- Constant Field Values
-
JAVAX_INJECT_INJECT
public static final java.lang.String JAVAX_INJECT_INJECT
Constant for thejavax.inject.Inject
annotation class- See Also:
- Constant Field Values
-
JAKARTA_INJECT_INJECT
public static final java.lang.String JAKARTA_INJECT_INJECT
Constant for thejakarta.inject.Inject
annotation class- See Also:
- Constant Field Values
-
COM_GOOGLE_INJECT_INJECT
public static final java.lang.String COM_GOOGLE_INJECT_INJECT
Constant for thecom.google.inject.Inject
annotation class- See Also:
- Constant Field Values
-
dynamicAnnotationCache
private static java.util.Map<java.lang.String,java.lang.Class<? extends java.lang.annotation.Annotation>> dynamicAnnotationCache
-
-
Method Detail
-
loadParser
public static <C> ParserMetadata<C> loadParser(java.lang.Class<?> cliClass)
-
loadParser
private static <C> ParserMetadata<C> loadParser(Parser parserConfig)
-
loadGlobal
public static <C> GlobalMetadata<C> loadGlobal(java.lang.Class<?> cliClass)
-
loadGlobal
public static <C> GlobalMetadata<C> loadGlobal(java.lang.Class<?> cliClass, ParserMetadata<C> parserConfigOverride)
Loads the metadata for a CLI- Parameters:
cliClass
- Class that has theCli
annotationparserConfigOverride
- Optional parser configuration, note that theCli.parserConfiguration()
field is normally used to provide a parser configuration via annotation but in some situations this may not be possible, e.g. constructing user alias search paths programmatically, in which case providing a parser configuration here overrides anything specified directly on the annotation- Returns:
- Global metadata
-
loadGlobal
public static <C> GlobalMetadata<C> loadGlobal(java.lang.String name, java.lang.String description, CommandMetadata defaultCommand, java.lang.Iterable<CommandMetadata> defaultGroupCommands, java.lang.Iterable<CommandGroupMetadata> groups, java.lang.Iterable<GlobalRestriction> restrictions, java.lang.Iterable<HelpSection> baseHelpSections, ParserMetadata<C> parserConfig)
Loads global meta-data- Parameters:
name
- CLI namedescription
- CLI descriptiondefaultCommand
- Default CommanddefaultGroupCommands
- Default Group Commandsgroups
- Command GroupsparserConfig
- Parser Configurationrestrictions
- RestrictionsbaseHelpSections
- Base help sections- Returns:
- Global meta-data
-
loadCommandGroup
public static CommandGroupMetadata loadCommandGroup(java.lang.String name, java.lang.String description, boolean hidden, java.lang.Iterable<CommandGroupMetadata> subGroups, CommandMetadata defaultCommand, java.lang.Iterable<CommandMetadata> commands)
Loads command group meta-data- Parameters:
name
- Group namedescription
- Group descriptionhidden
- Whether the group is hiddendefaultCommand
- Default command for the groupcommands
- Commands for the group- Returns:
- Command group meta-data
-
loadCommands
public static <T> java.util.List<CommandMetadata> loadCommands(java.lang.Iterable<java.lang.Class<? extends T>> defaultCommands, java.util.Map<java.lang.String,HelpSection> baseHelpSections, ParserMetadata<?> parserConfig)
Loads command meta-data- Parameters:
defaultCommands
- Default command classes- Returns:
- Command meta-data
-
loadCommand
public static CommandMetadata loadCommand(java.lang.Class<?> commandType, ParserMetadata<?> parserConfig)
Loads command meta-data- Parameters:
commandType
- Command class- Returns:
- Command meta-data
-
loadCommand
public static CommandMetadata loadCommand(java.lang.Class<?> commandType, java.util.Map<java.lang.String,HelpSection> baseHelpSections, ParserMetadata<?> parserConfig)
Loads command meta-data- Parameters:
commandType
- Command TypebaseHelpSections
- Base set of help sections- Returns:
- Command meta-data
-
loadHelpSections
protected static java.util.Map<java.lang.String,HelpSection> loadHelpSections(java.lang.Class<?> sourceClass, java.util.Map<java.lang.String,HelpSection> baseHelpSections)
-
loadSuggester
public static SuggesterMetadata loadSuggester(java.lang.Class<? extends Suggester> suggesterClass, ParserMetadata<?> parserConfig)
Loads suggester meta-data- Parameters:
suggesterClass
- Suggester class- Returns:
- Suggester meta-data
-
loadInjectionMetadata
public static MetadataLoader.InjectionMetadata loadInjectionMetadata(java.lang.Class<?> type, ParserMetadata<?> parserConfig)
Loads injection meta-dataGiven a class that represents a command, searches its fields to find those that are annotated with Airline annotations e.g.
Option
,Arguments
in order to discover all the options and arguments for a command. This also includes walking back up the superclass hierarchy so options and arguments may be defined in shared base classes and still discovered.Additionally options and arguments may be modularised out into separate classes that can be composed into your command classes by defining a field of the appropriate type and annotating it with an injection annotation to tell Airline it also needs to discover options inside that class.
Historically Airline supported only the
javax.inject.Inject
annotation, but with the move of mostjavax
packages (Java EE) to the stewardship of the Eclipse Foundation those packages are gradually being migrated into thejakarta
namespace. As of 2.9.0 Airline makes the choice of annotation fully configurable via the parser configuration. To avoid potential class loading issues these are specified as string class names with the metadata loader dynamically loading the relevant annotation classes if they are present on the runtime classpath. As of 3.10.0 we only look for our ownAirlineModule
annotation and any other composition annotation e.g.jakarta.inject.Inject
MUST be explicitly configured.- Parameters:
type
- ClassparserConfig
- Parser Configuration- Returns:
- Injection meta-data
-
loadInjectionMetadata
public static void loadInjectionMetadata(java.lang.Class<?> type, MetadataLoader.InjectionMetadata injectionMetadata, java.util.List<java.lang.reflect.Field> fields, ParserMetadata<?> parserConfig)
Loads injection meta-data- Parameters:
type
- ClassinjectionMetadata
- Injection meta-datafields
- Fields
-
checkForInjectionAnnotation
private static void checkForInjectionAnnotation(MetadataLoader.InjectionMetadata injectionMetadata, java.lang.reflect.Field field, java.util.List<java.lang.reflect.Field> path, java.lang.String annotationClass, ParserMetadata<?> parserConfig)
-
loadPartials
private static java.util.Map<java.lang.Class<? extends java.lang.annotation.Annotation>,java.util.Set<java.lang.Integer>> loadPartials(java.lang.reflect.Field field)
-
collectPartial
private static void collectPartial(java.util.Map<java.lang.Class<? extends java.lang.annotation.Annotation>,java.util.Set<java.lang.Integer>> partials, Partial partial)
-
mergeOptionSet
private static java.util.List<OptionMetadata> mergeOptionSet(java.util.List<OptionMetadata> options)
-
overrideOptionSet
private static java.util.List<OptionMetadata> overrideOptionSet(java.util.List<OptionMetadata> options)
-
tryOverrideOptions
private static void tryOverrideOptions(java.util.Map<java.util.Set<java.lang.String>,OptionMetadata> optionIndex, java.util.Set<java.lang.String> names, OptionMetadata parent)
-
loadCommandsIntoGroupsByAnnotation
public static void loadCommandsIntoGroupsByAnnotation(java.util.List<CommandMetadata> allCommands, java.util.List<CommandGroupMetadata> commandGroups, java.util.List<CommandMetadata> defaultCommandGroup, java.util.Map<java.lang.String,HelpSection> baseHelpSections, ParserMetadata<?> parserConfig)
-
createGroupsFromAnnotations
private static void createGroupsFromAnnotations(java.util.List<CommandMetadata> allCommands, java.util.List<CommandMetadata> newCommands, java.util.List<CommandGroupMetadata> commandGroups, java.util.List<CommandMetadata> defaultCommandGroup, java.util.Map<java.lang.String,HelpSection> baseHelpSections, ParserMetadata<?> parserConfig)
-
buildGroupsHierarchy
protected static void buildGroupsHierarchy(java.util.List<CommandGroupMetadata> commandGroups, java.util.Map<java.lang.String,CommandGroupMetadata> subGroups)
-
-