Class MetadataLoader

java.lang.Object
com.github.rvesse.airline.model.MetadataLoader

public class MetadataLoader extends Object
Helper for loading meta-data
  • Field Details

    • AIRLINE_MODULE

      public static final String AIRLINE_MODULE
      Constant for the AirlineModule annotation class
      See Also:
    • JAVAX_INJECT_INJECT

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

      public static final String JAKARTA_INJECT_INJECT
      Constant for the jakarta.inject.Inject annotation class
      See Also:
    • COM_GOOGLE_INJECT_INJECT

      public static final String COM_GOOGLE_INJECT_INJECT
      Constant for the com.google.inject.Inject annotation class
      See Also:
    • dynamicAnnotationCache

      private static Map<String,Class<? extends Annotation>> dynamicAnnotationCache
  • Constructor Details

    • MetadataLoader

      public MetadataLoader()
  • Method Details

    • loadParser

      public static <C> ParserMetadata<C> loadParser(Class<?> cliClass)
    • loadParser

      private static <C> ParserMetadata<C> loadParser(Parser parserConfig)
    • loadGlobal

      public static <C> GlobalMetadata<C> loadGlobal(Class<?> cliClass)
    • loadGlobal

      public static <C> GlobalMetadata<C> loadGlobal(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(String name, String description, CommandMetadata defaultCommand, Iterable<CommandMetadata> defaultGroupCommands, Iterable<CommandGroupMetadata> groups, Iterable<GlobalRestriction> restrictions, 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
      restrictions - Restrictions
      baseHelpSections - Base help sections
      parserConfig - Parser Configuration
      Returns:
      Global meta-data
    • loadCommandGroup

      public static CommandGroupMetadata loadCommandGroup(String name, String description, boolean hidden, Iterable<CommandGroupMetadata> subGroups, CommandMetadata defaultCommand, 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> List<CommandMetadata> loadCommands(Iterable<Class<? extends T>> defaultCommands, Map<String,HelpSection> baseHelpSections, ParserMetadata<?> parserConfig)
      Loads command meta-data
      Parameters:
      defaultCommands - Default command classes
      Returns:
      Command meta-data
    • loadCommand

      public static CommandMetadata loadCommand(Class<?> commandType, ParserMetadata<?> parserConfig)
      Loads command meta-data
      Parameters:
      commandType - Command class
      Returns:
      Command meta-data
    • loadCommand

      public static CommandMetadata loadCommand(Class<?> commandType, Map<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 Map<String,HelpSection> loadHelpSections(Class<?> sourceClass, Map<String,HelpSection> baseHelpSections)
    • loadSuggester

      public static SuggesterMetadata loadSuggester(Class<? extends Suggester> suggesterClass, ParserMetadata<?> parserConfig)
      Loads suggester meta-data
      Parameters:
      suggesterClass - Suggester class
      Returns:
      Suggester meta-data
    • loadInjectionMetadata

      public static MetadataLoader.InjectionMetadata loadInjectionMetadata(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(Class<?> type, MetadataLoader.InjectionMetadata injectionMetadata, List<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, Field field, List<Field> path, String annotationClass, ParserMetadata<?> parserConfig)
    • loadPartials

      private static Map<Class<? extends Annotation>,Set<Integer>> loadPartials(Field field)
    • collectPartial

      private static void collectPartial(Map<Class<? extends Annotation>,Set<Integer>> partials, Partial partial)
    • mergeOptionSet

      private static List<OptionMetadata> mergeOptionSet(List<OptionMetadata> options)
    • overrideOptionSet

      private static List<OptionMetadata> overrideOptionSet(List<OptionMetadata> options)
    • tryOverrideOptions

      private static void tryOverrideOptions(Map<Set<String>,OptionMetadata> optionIndex, Set<String> names, OptionMetadata parent)
    • loadCommandsIntoGroupsByAnnotation

      public static void loadCommandsIntoGroupsByAnnotation(List<CommandMetadata> allCommands, List<CommandGroupMetadata> commandGroups, List<CommandMetadata> defaultCommandGroup, Map<String,HelpSection> baseHelpSections, ParserMetadata<?> parserConfig)
    • createGroupsFromAnnotations

      private static void createGroupsFromAnnotations(List<CommandMetadata> allCommands, List<CommandMetadata> newCommands, List<CommandGroupMetadata> commandGroups, List<CommandMetadata> defaultCommandGroup, Map<String,HelpSection> baseHelpSections, ParserMetadata<?> parserConfig)
    • buildGroupsHierarchy

      protected static void buildGroupsHierarchy(List<CommandGroupMetadata> commandGroups, Map<String,CommandGroupMetadata> subGroups)