3939import org .apache .maven .api .spi .ModelParser ;
4040import org .apache .maven .api .spi .ModelParserException ;
4141
42- import static org .apache .maven .api .spi .ModelParser .STRICT ;
43-
4442/**
4543 *
4644 * Note: uses @Typed to limit the types it is available for injection to just ModelProcessor.
47- * <p>
45+ *
4846 * This is because the ModelProcessor interface extends ModelLocator and ModelReader. If we
4947 * made this component available under all its interfaces then it could end up being injected
5048 * into itself leading to a stack overflow.
51- * <p>
49+ *
5250 * A side effect of using @Typed is that it translates to explicit bindings in the container.
5351 * So instead of binding the component under a 'wildcard' key it is now bound with an explicit
5452 * key. Since this is a default component; this will be a plain binding of ModelProcessor to
5553 * this implementation type; that is, no hint/name.
56- * <p>
54+ *
5755 * This leads to a second side effect in that any @Inject request for just ModelProcessor in
5856 * the same injector is immediately matched to this explicit binding, which means extensions
5957 * cannot override this binding. This is because the lookup is always short-circuited in this
6058 * specific situation (plain @Inject request, and plain explicit binding for the same type.)
61- * <p>
59+ *
6260 * The simplest solution is to use a custom @Named here so it isn't bound under the plain key.
6361 * This is only necessary for default components using @Typed that want to support overriding.
64- * <p>
62+ *
6563 * As a non-default component this now gets a negative priority relative to other implementations
6664 * of the same interface. Since we want to allow overriding this doesn't matter in this case.
6765 * (if it did we could add @Priority of 0 to match the priority given to default components.)
@@ -79,19 +77,17 @@ public DefaultModelProcessor(ModelXmlFactory modelXmlFactory, @Nullable List<Mod
7977 this .modelParsers = modelParsers ;
8078 }
8179
82- /**
83- * @implNote
84- * The ModelProcessor#locatePom never returns null while the ModelParser#locatePom needs to return an existing path!
85- */
8680 @ Override
8781 public Path locateExistingPom (Path projectDirectory ) {
82+ // Note that the ModelProcessor#locatePom never returns null
83+ // while the ModelParser#locatePom needs to return an existing path!
8884 Path pom = modelParsers .stream ()
8985 .map (m -> m .locate (projectDirectory )
9086 .map (org .apache .maven .api .services .Source ::getPath )
9187 .orElse (null ))
9288 .filter (Objects ::nonNull )
9389 .findFirst ()
94- .orElseGet (() -> locateExistingPomWithUserDirDefault (projectDirectory ));
90+ .orElseGet (() -> doLocateExistingPom (projectDirectory ));
9591 if (pom != null && !pom .equals (projectDirectory ) && !pom .getParent ().equals (projectDirectory )) {
9692 throw new IllegalArgumentException ("The POM found does not belong to the given directory: " + pom );
9793 }
@@ -101,50 +97,47 @@ public Path locateExistingPom(Path projectDirectory) {
10197 @ Override
10298 public Model read (XmlReaderRequest request ) throws IOException {
10399 Objects .requireNonNull (request , "source cannot be null" );
104- return readOnSelfOrParent (request , request .getPath ());
105- }
106-
107- private Model readOnSelfOrParent (XmlReaderRequest request , Path pomFile ) throws IOException {
100+ Path pomFile = request .getPath ();
108101 if (pomFile != null ) {
102+ Path projectDirectory = pomFile .getParent ();
109103 List <ModelParserException > exceptions = new ArrayList <>();
110104 for (ModelParser parser : modelParsers ) {
111105 try {
112- Optional <Model > parent = readParent (request , pomFile , parser );
113- if (parent .isPresent ()) {
114- return parent .get ().withPomFile (pomFile );
106+ Optional <Model > model =
107+ parser .locateAndParse (projectDirectory , Map .of (ModelParser .STRICT , request .isStrict ()));
108+ if (model .isPresent ()) {
109+ return model .get ().withPomFile (pomFile );
115110 }
116111 } catch (ModelParserException e ) {
117112 exceptions .add (e );
118113 }
119114 }
120115 try {
121- return readOnSelf (request );
116+ return doRead (request );
122117 } catch (IOException e ) {
123118 exceptions .forEach (e ::addSuppressed );
124119 throw e ;
125120 }
126121 } else {
127- return readOnSelf (request );
122+ return doRead (request );
128123 }
129124 }
130125
131- private static Optional <Model > readParent (XmlReaderRequest request , Path pomFile , ModelParser parser ) {
132- return parser .locateAndParse (pomFile .getParent (), Map .of (STRICT , request .isStrict ()));
133- }
134-
135- private Path locateExistingPomWithUserDirDefault (Path project ) {
136- return locateExistingPomInDirOrFile (project != null ? project : Paths .get (System .getProperty ("user.dir" )));
137- }
138-
139- private static Path locateExistingPomInDirOrFile (Path project ) {
126+ private Path doLocateExistingPom (Path project ) {
127+ if (project == null ) {
128+ project = Paths .get (System .getProperty ("user.dir" ));
129+ }
140130 if (Files .isDirectory (project )) {
141131 Path pom = project .resolve ("pom.xml" );
142132 return Files .isRegularFile (pom ) ? pom : null ;
133+ } else if (Files .isRegularFile (project )) {
134+ return project ;
135+ } else {
136+ return null ;
143137 }
144- return project ;
145138 }
146139
147- private Model readOnSelf (XmlReaderRequest request ) throws IOException {
140+ private Model doRead (XmlReaderRequest request ) throws IOException {
148141 return modelXmlFactory .read (request );
149142 }
150143}
0 commit comments