Class MetadataLoader


  • public class MetadataLoader
    extends java.lang.Object
    Helper for loading meta-data
    • Field Detail

      • JAVAX_INJECT_INJECT

        public static final java.lang.String JAVAX_INJECT_INJECT
        Constant for the javax.inject.Inject annotation class
        See Also:
        Constant Field Values
      • JAKARTA_INJECT_INJECT

        public static final java.lang.String JAKARTA_INJECT_INJECT
        Constant for the jakarta.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 the com.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
    • Constructor Detail

      • MetadataLoader

        public MetadataLoader()
    • Method Detail

      • loadParser

        public static <C> ParserMetadata<C> loadParser​(java.lang.Class<?> cliClass)
      • 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 the Cli annotation
        parserConfigOverride - Optional parser configuration, note that the Cli.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 name
        description - CLI description
        defaultCommand - Default Command
        defaultGroupCommands - Default Group Commands
        groups - Command Groups
        parserConfig - Parser Configuration
        restrictions - Restrictions
        baseHelpSections - 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 name
        description - Group description
        hidden - Whether the group is hidden
        defaultCommand - Default command for the group
        commands - 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 Type
        baseHelpSections - 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-data

        Given 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 most javax packages (Java EE) to the stewardship of the Eclipse Foundation those packages are gradually being migrated into the jakarta 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 own AirlineModule annotation and any other composition annotation e.g. jakarta.inject.Inject MUST be explicitly configured.

        Parameters:
        type - Class
        parserConfig - 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 - Class
        injectionMetadata - Injection meta-data
        fields - 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)
      • 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)