- java.lang.Object
-
- com.github.rvesse.airline.model.MetadataLoader
-
public class MetadataLoader extends java.lang.ObjectHelper for loading meta-data
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description private static classMetadataLoader.InjectionMetadata
-
Field Summary
Fields Modifier and Type Field Description static java.lang.StringAIRLINE_MODULEConstant for theAirlineModuleannotation classstatic java.lang.StringCOM_GOOGLE_INJECT_INJECTConstant for thecom.google.inject.Injectannotation classprivate static java.util.Map<java.lang.String,java.lang.Class<? extends java.lang.annotation.Annotation>>dynamicAnnotationCachestatic java.lang.StringJAKARTA_INJECT_INJECTConstant for thejakarta.inject.Injectannotation classstatic java.lang.StringJAVAX_INJECT_INJECTConstant for thejavax.inject.Injectannotation class
-
Constructor Summary
Constructors Constructor Description MetadataLoader()
-
Method Summary
All Methods Static Methods Concrete Methods Modifier and Type Method Description protected static voidbuildGroupsHierarchy(java.util.List<CommandGroupMetadata> commandGroups, java.util.Map<java.lang.String,CommandGroupMetadata> subGroups)private static voidcheckForInjectionAnnotation(MetadataLoader.InjectionMetadata injectionMetadata, java.lang.reflect.Field field, java.util.List<java.lang.reflect.Field> path, java.lang.String annotationClass, ParserMetadata<?> parserConfig)private static voidcollectPartial(java.util.Map<java.lang.Class<? extends java.lang.annotation.Annotation>,java.util.Set<java.lang.Integer>> partials, Partial partial)private static voidcreateGroupsFromAnnotations(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 CommandMetadataloadCommand(java.lang.Class<?> commandType, ParserMetadata<?> parserConfig)Loads command meta-datastatic CommandMetadataloadCommand(java.lang.Class<?> commandType, java.util.Map<java.lang.String,HelpSection> baseHelpSections, ParserMetadata<?> parserConfig)Loads command meta-datastatic CommandGroupMetadataloadCommandGroup(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 voidloadCommandsIntoGroupsByAnnotation(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 voidloadInjectionMetadata(java.lang.Class<?> type, MetadataLoader.InjectionMetadata injectionMetadata, java.util.List<java.lang.reflect.Field> fields, ParserMetadata<?> parserConfig)Loads injection meta-datastatic MetadataLoader.InjectionMetadataloadInjectionMetadata(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 SuggesterMetadataloadSuggester(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 voidtryOverrideOptions(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 theAirlineModuleannotation class- See Also:
- Constant Field Values
-
JAVAX_INJECT_INJECT
public static final java.lang.String JAVAX_INJECT_INJECT
Constant for thejavax.inject.Injectannotation class- See Also:
- Constant Field Values
-
JAKARTA_INJECT_INJECT
public static final java.lang.String JAKARTA_INJECT_INJECT
Constant for thejakarta.inject.Injectannotation 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.Injectannotation 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 theCliannotationparserConfigOverride- 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,Argumentsin 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.Injectannotation, but with the move of mostjavaxpackages (Java EE) to the stewardship of the Eclipse Foundation those packages are gradually being migrated into thejakartanamespace. 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 ownAirlineModuleannotation and any other composition annotation e.g.jakarta.inject.InjectMUST 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)
-
-