[ 
https://issues.apache.org/jira/browse/MNG-7836?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Guillaume Nodet updated MNG-7836:
---------------------------------
    Description: 
While the syntax for the 4.0.0 consumer POM is set in stone for accessing 
central repository, the build POM should be able to evolve.  In particular, 
allowing the use of alternate syntaxes would bring some freedom to users.

This issue provides support for a ModelParser SPI interface which can be 
implemented as a core extension and allow the usage of a different file as the 
POM and allow a custom syntax.
An example of such an extension to support Hooch POMs can be found [in the 
integration 
tests|https://github.com/apache/maven-integration-testing/tree/master/core-it-suite/src/test/resources/mng-7836-alternative-pom-syntax].

{code}
/**
 * The {@code ModelParser} interface is used to locate and read {@link Model}s 
from the file system.
 * This allows plugging in additional syntaxes for the main model read by Maven 
when building a project.
 */
@Experimental
public interface ModelParser {

    /**
     * Locates the pom in the given directory.
     *
     * @param dir the directory to locate the pom for, never {@code null}
     * @return a {@code Source} pointing to the located pom or an empty {@code 
Optional} if none was found by this parser
     */
    @Nonnull
    Optional<Source> locate(@Nonnull Path dir);

    /**
     * Parse the model obtained previously by a previous call to {@link 
#locate(Path)}.
     *
     * @param source the source to parse, never {@code null}
     * @param options possible parsing options, may be {@code null}
     * @return the parsed {@link Model}, never {@code null}
     * @throws ModelParserException if the model cannot be parsed
     */
    @Nonnull
    Model parse(@Nonnull Source source, @Nullable Map<String, ?> options) 
throws ModelParserException;

    /**
     * Locate and parse the model in the specified directory.
     * This is equivalent to {@code locate(dir).map(s -> parse(s, options))}.
     *
     * @param dir the directory to locate the pom for, never {@code null}
     * @param options possible parsing options, may be {@code null}
     * @return an optional parsed {@link Model} or {@code null} if none could 
be found
     * @throws ModelParserException if the located model cannot be parsed
     */
    default Optional<Model> locateAndParse(@Nonnull Path dir, @Nullable 
Map<String, ?> options)
            throws ModelParserException {
        return locate(dir).map(s -> parse(s, options));
    }
}
{code} 

> Support alternative syntaxes for POMs
> -------------------------------------
>
>                 Key: MNG-7836
>                 URL: https://issues.apache.org/jira/browse/MNG-7836
>             Project: Maven
>          Issue Type: New Feature
>            Reporter: Guillaume Nodet
>            Assignee: Guillaume Nodet
>            Priority: Major
>             Fix For: 4.0.0-alpha-8, 4.0.0
>
>
> While the syntax for the 4.0.0 consumer POM is set in stone for accessing 
> central repository, the build POM should be able to evolve.  In particular, 
> allowing the use of alternate syntaxes would bring some freedom to users.
> This issue provides support for a ModelParser SPI interface which can be 
> implemented as a core extension and allow the usage of a different file as 
> the POM and allow a custom syntax.
> An example of such an extension to support Hooch POMs can be found [in the 
> integration 
> tests|https://github.com/apache/maven-integration-testing/tree/master/core-it-suite/src/test/resources/mng-7836-alternative-pom-syntax].
> {code}
> /**
>  * The {@code ModelParser} interface is used to locate and read {@link 
> Model}s from the file system.
>  * This allows plugging in additional syntaxes for the main model read by 
> Maven when building a project.
>  */
> @Experimental
> public interface ModelParser {
>     /**
>      * Locates the pom in the given directory.
>      *
>      * @param dir the directory to locate the pom for, never {@code null}
>      * @return a {@code Source} pointing to the located pom or an empty 
> {@code Optional} if none was found by this parser
>      */
>     @Nonnull
>     Optional<Source> locate(@Nonnull Path dir);
>     /**
>      * Parse the model obtained previously by a previous call to {@link 
> #locate(Path)}.
>      *
>      * @param source the source to parse, never {@code null}
>      * @param options possible parsing options, may be {@code null}
>      * @return the parsed {@link Model}, never {@code null}
>      * @throws ModelParserException if the model cannot be parsed
>      */
>     @Nonnull
>     Model parse(@Nonnull Source source, @Nullable Map<String, ?> options) 
> throws ModelParserException;
>     /**
>      * Locate and parse the model in the specified directory.
>      * This is equivalent to {@code locate(dir).map(s -> parse(s, options))}.
>      *
>      * @param dir the directory to locate the pom for, never {@code null}
>      * @param options possible parsing options, may be {@code null}
>      * @return an optional parsed {@link Model} or {@code null} if none could 
> be found
>      * @throws ModelParserException if the located model cannot be parsed
>      */
>     default Optional<Model> locateAndParse(@Nonnull Path dir, @Nullable 
> Map<String, ?> options)
>             throws ModelParserException {
>         return locate(dir).map(s -> parse(s, options));
>     }
> }
> {code} 



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to