Abstract

Propose changing the structure of maven-plugin-tools to accommodate multiple plugin languages and their needs during the descriptor, etc. generation process. Details below.

Refactor Details

  1. Move the existing project (maven-plugin-tools) to maven-plugin-tools/maven-plugin-tools-java. Adjust dependencies on this library accordingly within maven-components.
  2. Create other plugin-tools libraries to accommodate generation needs for other languages, as needed.

    The first use-case of this is the descriptor generator for marmalade-based mojos. Since we don't want the "normal" plugin tools to depend on marmalade, etc. we need to make the concept of plugin-tools abstract, and provide a concrete implementation for the java language, as well as marmalade.

  3. Create plugin-tools root pom if needed for inheriting common values...

    I don't anticipate needing this initially, but if there is some question of consistency wrt this, we can certainly provide one.

  4. Create common API for use in all generator libraries. This will define the interface for a mojo descriptor (and other) generator. Therefore, it will require splitting the responsibility of the old PluginDescriptorGenerator from what is to be the maven-plugin-tools-java library into two pieces:

    - Section covered by the AbstractGenerator code will be the complete new generator for java. It will probably be further abstracted as an interface for other language implementations to follow, and then itself made into a concrete, instantiable implementation. The interface will define the new Reader/Source role of this class, used to produce MojoDescriptor instances from the project source files.

    - Specifics handled by the PluginDescriptorGenerator (and others) will be factored into the common API, and generalized as a Writer/Sink role, used to generate one or more derivative files from the MojoDescriptors discovered by the set of Reader/Sources.

Once this split is accomplished, an additional class will be created to act as a managing component for all generators registered in plexus. It will require a mapping of Source-language->Source-instance where each Source is a plexus component. Unless/until we have some smarter way of specifying a plugin language as a means of singling out one Source for the project, this manager component will simply iterate through all Source instances, collect the MojoDescriptors from each, wrap them in MavenMojoDescriptors with the component-factory specified == to the Source language, and aggregate the resulting MavenMojoDescriptors in some Collection.

Finally, the Source manager returns the aggregated result of all Sources to the calling mojo. The mojo will be responsible for digesting the MavenMojoDescriptors into the requisite files.