You are viewing a plain text version of this content. The canonical link for it is here.
Posted to site-commits@maven.apache.org by cs...@apache.org on 2024/10/19 18:22:24 UTC
svn commit: r1921426 [7/20] - in /maven/website/components/ref/4-LATEST: ./ apache-maven/ api/ api/maven-api-cli/ api/maven-api-core/ api/maven-api-di/ api/maven-api-meta/ api/maven-api-metadata/ api/maven-api-model/ api/maven-api-plugin/ api/maven-api...
Modified: maven/website/components/ref/4-LATEST/maven-api-impl/xref/org/apache/maven/internal/impl/model/DefaultModelBuilder.html
==============================================================================
--- maven/website/components/ref/4-LATEST/maven-api-impl/xref/org/apache/maven/internal/impl/model/DefaultModelBuilder.html (original)
+++ maven/website/components/ref/4-LATEST/maven-api-impl/xref/org/apache/maven/internal/impl/model/DefaultModelBuilder.html Sat Oct 19 18:22:18 2024
@@ -572,1371 +572,1378 @@
<a class="jxr_linenumber" name="L564" href="#L564">564</a> <em class="jxr_comment">// Infer inner reactor dependencies version</em>
<a class="jxr_linenumber" name="L565" href="#L565">565</a> <em class="jxr_comment">//</em>
<a class="jxr_linenumber" name="L566" href="#L566">566</a> Model transformFileToRaw(Model model) {
-<a class="jxr_linenumber" name="L567" href="#L567">567</a> List<Dependency> newDeps = <strong class="jxr_keyword">new</strong> ArrayList<>();
-<a class="jxr_linenumber" name="L568" href="#L568">568</a> <strong class="jxr_keyword">boolean</strong> modified = false;
-<a class="jxr_linenumber" name="L569" href="#L569">569</a> <strong class="jxr_keyword">for</strong> (Dependency dep : model.getDependencies()) {
-<a class="jxr_linenumber" name="L570" href="#L570">570</a> <strong class="jxr_keyword">if</strong> (dep.getVersion() == <strong class="jxr_keyword">null</strong>) {
-<a class="jxr_linenumber" name="L571" href="#L571">571</a> Dependency.Builder depBuilder = <strong class="jxr_keyword">null</strong>;
-<a class="jxr_linenumber" name="L572" href="#L572">572</a> Model depModel = getRawModel(model.getPomFile(), dep.getGroupId(), dep.getArtifactId());
-<a class="jxr_linenumber" name="L573" href="#L573">573</a> <strong class="jxr_keyword">if</strong> (depModel != <strong class="jxr_keyword">null</strong>) {
-<a class="jxr_linenumber" name="L574" href="#L574">574</a> String version = depModel.getVersion();
-<a class="jxr_linenumber" name="L575" href="#L575">575</a> InputLocation versionLocation = depModel.getLocation(<span class="jxr_string">"version"</span>);
-<a class="jxr_linenumber" name="L576" href="#L576">576</a> <strong class="jxr_keyword">if</strong> (version == <strong class="jxr_keyword">null</strong> && depModel.getParent() != <strong class="jxr_keyword">null</strong>) {
-<a class="jxr_linenumber" name="L577" href="#L577">577</a> version = depModel.getParent().getVersion();
-<a class="jxr_linenumber" name="L578" href="#L578">578</a> versionLocation = depModel.getParent().getLocation(<span class="jxr_string">"version"</span>);
-<a class="jxr_linenumber" name="L579" href="#L579">579</a> }
-<a class="jxr_linenumber" name="L580" href="#L580">580</a> depBuilder = Dependency.newBuilder(dep);
-<a class="jxr_linenumber" name="L581" href="#L581">581</a> depBuilder.version(version).location(<span class="jxr_string">"version"</span>, versionLocation);
-<a class="jxr_linenumber" name="L582" href="#L582">582</a> <strong class="jxr_keyword">if</strong> (dep.getGroupId() == <strong class="jxr_keyword">null</strong>) {
-<a class="jxr_linenumber" name="L583" href="#L583">583</a> String depGroupId = depModel.getGroupId();
-<a class="jxr_linenumber" name="L584" href="#L584">584</a> InputLocation groupIdLocation = depModel.getLocation(<span class="jxr_string">"groupId"</span>);
-<a class="jxr_linenumber" name="L585" href="#L585">585</a> <strong class="jxr_keyword">if</strong> (depGroupId == <strong class="jxr_keyword">null</strong> && depModel.getParent() != <strong class="jxr_keyword">null</strong>) {
-<a class="jxr_linenumber" name="L586" href="#L586">586</a> depGroupId = depModel.getParent().getGroupId();
-<a class="jxr_linenumber" name="L587" href="#L587">587</a> groupIdLocation = depModel.getParent().getLocation(<span class="jxr_string">"groupId"</span>);
-<a class="jxr_linenumber" name="L588" href="#L588">588</a> }
-<a class="jxr_linenumber" name="L589" href="#L589">589</a> depBuilder.groupId(depGroupId).location(<span class="jxr_string">"groupId"</span>, groupIdLocation);
-<a class="jxr_linenumber" name="L590" href="#L590">590</a> }
-<a class="jxr_linenumber" name="L591" href="#L591">591</a> }
-<a class="jxr_linenumber" name="L592" href="#L592">592</a> <strong class="jxr_keyword">if</strong> (depBuilder != <strong class="jxr_keyword">null</strong>) {
-<a class="jxr_linenumber" name="L593" href="#L593">593</a> newDeps.add(depBuilder.build());
-<a class="jxr_linenumber" name="L594" href="#L594">594</a> modified = <strong class="jxr_keyword">true</strong>;
-<a class="jxr_linenumber" name="L595" href="#L595">595</a> } <strong class="jxr_keyword">else</strong> {
-<a class="jxr_linenumber" name="L596" href="#L596">596</a> newDeps.add(dep);
-<a class="jxr_linenumber" name="L597" href="#L597">597</a> }
-<a class="jxr_linenumber" name="L598" href="#L598">598</a> }
-<a class="jxr_linenumber" name="L599" href="#L599">599</a> }
-<a class="jxr_linenumber" name="L600" href="#L600">600</a> <strong class="jxr_keyword">return</strong> modified ? model.withDependencies(newDeps) : model;
-<a class="jxr_linenumber" name="L601" href="#L601">601</a> }
-<a class="jxr_linenumber" name="L602" href="#L602">602</a>
-<a class="jxr_linenumber" name="L603" href="#L603">603</a> String replaceCiFriendlyVersion(Map<String, String> properties, String version) {
-<a class="jxr_linenumber" name="L604" href="#L604">604</a> <em class="jxr_comment">// TODO: we're using a simple regex here, but we should probably use</em>
-<a class="jxr_linenumber" name="L605" href="#L605">605</a> <em class="jxr_comment">// a proper interpolation service to do the replacements</em>
-<a class="jxr_linenumber" name="L606" href="#L606">606</a> <em class="jxr_comment">// once one is available in maven-api-impl</em>
-<a class="jxr_linenumber" name="L607" href="#L607">607</a> <em class="jxr_comment">// https://issues.apache.org/jira/browse/MNG-8262</em>
-<a class="jxr_linenumber" name="L608" href="#L608">608</a> <strong class="jxr_keyword">if</strong> (version != <strong class="jxr_keyword">null</strong>) {
-<a class="jxr_linenumber" name="L609" href="#L609">609</a> Matcher matcher = REGEX.matcher(version);
-<a class="jxr_linenumber" name="L610" href="#L610">610</a> <strong class="jxr_keyword">if</strong> (matcher.find()) {
-<a class="jxr_linenumber" name="L611" href="#L611">611</a> StringBuilder result = <strong class="jxr_keyword">new</strong> StringBuilder();
-<a class="jxr_linenumber" name="L612" href="#L612">612</a> <strong class="jxr_keyword">do</strong> {
-<a class="jxr_linenumber" name="L613" href="#L613">613</a> <em class="jxr_comment">// extract the key inside ${}</em>
-<a class="jxr_linenumber" name="L614" href="#L614">614</a> String key = matcher.group(1);
-<a class="jxr_linenumber" name="L615" href="#L615">615</a> <em class="jxr_comment">// get replacement from the map, or use the original ${xy} if not found</em>
-<a class="jxr_linenumber" name="L616" href="#L616">616</a> String replacement = properties.getOrDefault(key, <span class="jxr_string">"\\"</span> + matcher.group(0));
-<a class="jxr_linenumber" name="L617" href="#L617">617</a> matcher.appendReplacement(result, replacement);
-<a class="jxr_linenumber" name="L618" href="#L618">618</a> } <strong class="jxr_keyword">while</strong> (matcher.find());
-<a class="jxr_linenumber" name="L619" href="#L619">619</a> matcher.appendTail(result); <em class="jxr_comment">// Append the remaining part of the string</em>
-<a class="jxr_linenumber" name="L620" href="#L620">620</a> <strong class="jxr_keyword">return</strong> result.toString();
-<a class="jxr_linenumber" name="L621" href="#L621">621</a> }
-<a class="jxr_linenumber" name="L622" href="#L622">622</a> }
-<a class="jxr_linenumber" name="L623" href="#L623">623</a> <strong class="jxr_keyword">return</strong> version;
-<a class="jxr_linenumber" name="L624" href="#L624">624</a> }
-<a class="jxr_linenumber" name="L625" href="#L625">625</a>
-<a class="jxr_linenumber" name="L626" href="#L626">626</a> <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">void</strong> buildBuildPom() <strong class="jxr_keyword">throws</strong> ModelBuilderException {
-<a class="jxr_linenumber" name="L627" href="#L627">627</a> <em class="jxr_comment">// Retrieve and normalize the source path, ensuring it's non-null and in absolute form</em>
-<a class="jxr_linenumber" name="L628" href="#L628">628</a> Path top = request.getSource().getPath();
-<a class="jxr_linenumber" name="L629" href="#L629">629</a> <strong class="jxr_keyword">if</strong> (top == <strong class="jxr_keyword">null</strong>) {
-<a class="jxr_linenumber" name="L630" href="#L630">630</a> <strong class="jxr_keyword">throw</strong> <strong class="jxr_keyword">new</strong> IllegalStateException(<span class="jxr_string">"Recursive build requested but source has no path"</span>);
-<a class="jxr_linenumber" name="L631" href="#L631">631</a> }
-<a class="jxr_linenumber" name="L632" href="#L632">632</a> top = top.toAbsolutePath().normalize();
-<a class="jxr_linenumber" name="L633" href="#L633">633</a>
-<a class="jxr_linenumber" name="L634" href="#L634">634</a> <em class="jxr_comment">// Obtain the root directory, resolving it if necessary</em>
-<a class="jxr_linenumber" name="L635" href="#L635">635</a> Path rootDirectory;
-<a class="jxr_linenumber" name="L636" href="#L636">636</a> <strong class="jxr_keyword">try</strong> {
-<a class="jxr_linenumber" name="L637" href="#L637">637</a> rootDirectory = session.getRootDirectory();
-<a class="jxr_linenumber" name="L638" href="#L638">638</a> } <strong class="jxr_keyword">catch</strong> (IllegalStateException e) {
-<a class="jxr_linenumber" name="L639" href="#L639">639</a> rootDirectory = session.getService(RootLocator.<strong class="jxr_keyword">class</strong>).findMandatoryRoot(top);
-<a class="jxr_linenumber" name="L640" href="#L640">640</a> }
-<a class="jxr_linenumber" name="L641" href="#L641">641</a>
-<a class="jxr_linenumber" name="L642" href="#L642">642</a> <em class="jxr_comment">// Locate and normalize the root POM if it exists, fallback to top otherwise</em>
-<a class="jxr_linenumber" name="L643" href="#L643">643</a> Path root = modelProcessor.locateExistingPom(rootDirectory);
-<a class="jxr_linenumber" name="L644" href="#L644">644</a> <strong class="jxr_keyword">if</strong> (root != <strong class="jxr_keyword">null</strong>) {
-<a class="jxr_linenumber" name="L645" href="#L645">645</a> root = root.toAbsolutePath().normalize();
-<a class="jxr_linenumber" name="L646" href="#L646">646</a> } <strong class="jxr_keyword">else</strong> {
-<a class="jxr_linenumber" name="L647" href="#L647">647</a> root = top;
-<a class="jxr_linenumber" name="L648" href="#L648">648</a> }
-<a class="jxr_linenumber" name="L649" href="#L649">649</a>
-<a class="jxr_linenumber" name="L650" href="#L650">650</a> <em class="jxr_comment">// Load all models starting from the root</em>
-<a class="jxr_linenumber" name="L651" href="#L651">651</a> loadFromRoot(root, top);
-<a class="jxr_linenumber" name="L652" href="#L652">652</a>
-<a class="jxr_linenumber" name="L653" href="#L653">653</a> <em class="jxr_comment">// Check for errors after loading models</em>
-<a class="jxr_linenumber" name="L654" href="#L654">654</a> <strong class="jxr_keyword">if</strong> (hasErrors()) {
-<a class="jxr_linenumber" name="L655" href="#L655">655</a> <strong class="jxr_keyword">throw</strong> newModelBuilderException();
-<a class="jxr_linenumber" name="L656" href="#L656">656</a> }
-<a class="jxr_linenumber" name="L657" href="#L657">657</a>
-<a class="jxr_linenumber" name="L658" href="#L658">658</a> <em class="jxr_comment">// For the top model and all its children, build the effective model.</em>
-<a class="jxr_linenumber" name="L659" href="#L659">659</a> <em class="jxr_comment">// This is done through the phased executor</em>
-<a class="jxr_linenumber" name="L660" href="#L660">660</a> <strong class="jxr_keyword">var</strong> allResults = results(result).toList();
-<a class="jxr_linenumber" name="L661" href="#L661">661</a> List<RuntimeException> exceptions = <strong class="jxr_keyword">new</strong> CopyOnWriteArrayList<>();
-<a class="jxr_linenumber" name="L662" href="#L662">662</a> <strong class="jxr_keyword">try</strong> (<a name="PhasingExecutor" href="../../../../../../org/apache/maven/internal/impl/util/PhasingExecutor.html#PhasingExecutor">PhasingExecutor</a> executor = createExecutor()) {
-<a class="jxr_linenumber" name="L663" href="#L663">663</a> <strong class="jxr_keyword">for</strong> (<a name="DefaultModelBuilderResult" href="../../../../../../org/apache/maven/internal/impl/model/DefaultModelBuilderResult.html#DefaultModelBuilderResult">DefaultModelBuilderResult</a> r : allResults) {
-<a class="jxr_linenumber" name="L664" href="#L664">664</a> executor.execute(() -> {
-<a class="jxr_linenumber" name="L665" href="#L665">665</a> DefaultModelBuilderSession mbs = derive(r.getSource(), r);
-<a class="jxr_linenumber" name="L666" href="#L666">666</a> <strong class="jxr_keyword">try</strong> {
-<a class="jxr_linenumber" name="L667" href="#L667">667</a> mbs.buildEffectiveModel(<strong class="jxr_keyword">new</strong> LinkedHashSet<>());
-<a class="jxr_linenumber" name="L668" href="#L668">668</a> } <strong class="jxr_keyword">catch</strong> (ModelBuilderException e) {
-<a class="jxr_linenumber" name="L669" href="#L669">669</a> <em class="jxr_comment">// gathered with problem collector</em>
-<a class="jxr_linenumber" name="L670" href="#L670">670</a> } <strong class="jxr_keyword">catch</strong> (RuntimeException t) {
-<a class="jxr_linenumber" name="L671" href="#L671">671</a> exceptions.add(t);
-<a class="jxr_linenumber" name="L672" href="#L672">672</a> }
-<a class="jxr_linenumber" name="L673" href="#L673">673</a> });
-<a class="jxr_linenumber" name="L674" href="#L674">674</a> }
-<a class="jxr_linenumber" name="L675" href="#L675">675</a> }
-<a class="jxr_linenumber" name="L676" href="#L676">676</a>
-<a class="jxr_linenumber" name="L677" href="#L677">677</a> <em class="jxr_comment">// Check for errors again after execution</em>
-<a class="jxr_linenumber" name="L678" href="#L678">678</a> <strong class="jxr_keyword">if</strong> (exceptions.size() == 1) {
-<a class="jxr_linenumber" name="L679" href="#L679">679</a> <strong class="jxr_keyword">throw</strong> exceptions.get(0);
-<a class="jxr_linenumber" name="L680" href="#L680">680</a> } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (exceptions.size() > 1) {
-<a class="jxr_linenumber" name="L681" href="#L681">681</a> MavenException fatalException = <strong class="jxr_keyword">new</strong> MavenException(<span class="jxr_string">"Multiple fatal exceptions occurred"</span>);
-<a class="jxr_linenumber" name="L682" href="#L682">682</a> exceptions.forEach(fatalException::addSuppressed);
-<a class="jxr_linenumber" name="L683" href="#L683">683</a> <strong class="jxr_keyword">throw</strong> fatalException;
-<a class="jxr_linenumber" name="L684" href="#L684">684</a> } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (hasErrors()) {
-<a class="jxr_linenumber" name="L685" href="#L685">685</a> <strong class="jxr_keyword">throw</strong> newModelBuilderException();
-<a class="jxr_linenumber" name="L686" href="#L686">686</a> }
-<a class="jxr_linenumber" name="L687" href="#L687">687</a> }
-<a class="jxr_linenumber" name="L688" href="#L688">688</a>
-<a class="jxr_linenumber" name="L689" href="#L689">689</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L690" href="#L690">690</a> <em class="jxr_javadoccomment"> * Generates a stream of DefaultModelBuilderResult objects, starting with the provided</em>
-<a class="jxr_linenumber" name="L691" href="#L691">691</a> <em class="jxr_javadoccomment"> * result and recursively including all its child results.</em>
-<a class="jxr_linenumber" name="L692" href="#L692">692</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L693" href="#L693">693</a> <em class="jxr_javadoccomment"> * @param r The initial DefaultModelBuilderResult object from which to generate the stream.</em>
-<a class="jxr_linenumber" name="L694" href="#L694">694</a> <em class="jxr_javadoccomment"> * @return A Stream of DefaultModelBuilderResult objects, starting with the provided result</em>
-<a class="jxr_linenumber" name="L695" href="#L695">695</a> <em class="jxr_javadoccomment"> * and including all its child results.</em>
-<a class="jxr_linenumber" name="L696" href="#L696">696</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L697" href="#L697">697</a> Stream<DefaultModelBuilderResult> results(<a name="DefaultModelBuilderResult" href="../../../../../../org/apache/maven/internal/impl/model/DefaultModelBuilderResult.html#DefaultModelBuilderResult">DefaultModelBuilderResult</a> r) {
-<a class="jxr_linenumber" name="L698" href="#L698">698</a> <strong class="jxr_keyword">return</strong> Stream.concat(Stream.of(r), r.getChildren().stream().flatMap(<strong class="jxr_keyword">this</strong>::results));
-<a class="jxr_linenumber" name="L699" href="#L699">699</a> }
-<a class="jxr_linenumber" name="L700" href="#L700">700</a>
-<a class="jxr_linenumber" name="L701" href="#L701">701</a> <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">void</strong> loadFromRoot(Path root, Path top) {
-<a class="jxr_linenumber" name="L702" href="#L702">702</a> <strong class="jxr_keyword">try</strong> (<a name="PhasingExecutor" href="../../../../../../org/apache/maven/internal/impl/util/PhasingExecutor.html#PhasingExecutor">PhasingExecutor</a> executor = createExecutor()) {
-<a class="jxr_linenumber" name="L703" href="#L703">703</a> <a name="DefaultModelBuilderResult" href="../../../../../../org/apache/maven/internal/impl/model/DefaultModelBuilderResult.html#DefaultModelBuilderResult">DefaultModelBuilderResult</a> r = Objects.equals(top, root) ? result : <strong class="jxr_keyword">new</strong> <a name="DefaultModelBuilderResult" href="../../../../../../org/apache/maven/internal/impl/model/DefaultModelBuilderResult.html#DefaultModelBuilderResult">DefaultModelBuilderResult</a>();
-<a class="jxr_linenumber" name="L704" href="#L704">704</a> loadFilePom(executor, top, root, Set.of(), r);
-<a class="jxr_linenumber" name="L705" href="#L705">705</a> }
-<a class="jxr_linenumber" name="L706" href="#L706">706</a> <strong class="jxr_keyword">if</strong> (result.getFileModel() == <strong class="jxr_keyword">null</strong> && !Objects.equals(top, root)) {
-<a class="jxr_linenumber" name="L707" href="#L707">707</a> logger.warn(
-<a class="jxr_linenumber" name="L708" href="#L708">708</a> <span class="jxr_string">"The top project ({}) cannot be found in the reactor from root project ({}). "</span>
-<a class="jxr_linenumber" name="L709" href="#L709">709</a> + <span class="jxr_string">"Make sure the root directory is correct (a missing '.mvn' directory in the root "</span>
-<a class="jxr_linenumber" name="L710" href="#L710">710</a> + <span class="jxr_string">"project is the most common cause) and the project is correctly included "</span>
-<a class="jxr_linenumber" name="L711" href="#L711">711</a> + <span class="jxr_string">"in the reactor (missing activated profiles, command line options, etc.). For this "</span>
-<a class="jxr_linenumber" name="L712" href="#L712">712</a> + <span class="jxr_string">"build, the top project will be used as the root project."</span>,
-<a class="jxr_linenumber" name="L713" href="#L713">713</a> top,
-<a class="jxr_linenumber" name="L714" href="#L714">714</a> root);
-<a class="jxr_linenumber" name="L715" href="#L715">715</a> cache.clear();
-<a class="jxr_linenumber" name="L716" href="#L716">716</a> mappedSources.clear();
-<a class="jxr_linenumber" name="L717" href="#L717">717</a> loadFromRoot(top, top);
-<a class="jxr_linenumber" name="L718" href="#L718">718</a> }
-<a class="jxr_linenumber" name="L719" href="#L719">719</a> }
-<a class="jxr_linenumber" name="L720" href="#L720">720</a>
-<a class="jxr_linenumber" name="L721" href="#L721">721</a> <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">void</strong> loadFilePom(
-<a class="jxr_linenumber" name="L722" href="#L722">722</a> Executor executor, Path top, Path pom, Set<Path> parents, <a name="DefaultModelBuilderResult" href="../../../../../../org/apache/maven/internal/impl/model/DefaultModelBuilderResult.html#DefaultModelBuilderResult">DefaultModelBuilderResult</a> r) {
-<a class="jxr_linenumber" name="L723" href="#L723">723</a> <strong class="jxr_keyword">try</strong> {
-<a class="jxr_linenumber" name="L724" href="#L724">724</a> Path pomDirectory = Files.isDirectory(pom) ? pom : pom.getParent();
-<a class="jxr_linenumber" name="L725" href="#L725">725</a> ModelSource src = ModelSource.fromPath(pom);
-<a class="jxr_linenumber" name="L726" href="#L726">726</a> Model model = derive(src, r).readFileModel();
-<a class="jxr_linenumber" name="L727" href="#L727">727</a> <em class="jxr_comment">// keep all loaded file models in memory, those will be needed</em>
-<a class="jxr_linenumber" name="L728" href="#L728">728</a> <em class="jxr_comment">// during the raw to build transformation</em>
-<a class="jxr_linenumber" name="L729" href="#L729">729</a> putSource(getGroupId(model), model.getArtifactId(), src);
-<a class="jxr_linenumber" name="L730" href="#L730">730</a> Model activated = activateFileModel(model);
-<a class="jxr_linenumber" name="L731" href="#L731">731</a> <strong class="jxr_keyword">for</strong> (String subproject : getSubprojects(activated)) {
-<a class="jxr_linenumber" name="L732" href="#L732">732</a> <strong class="jxr_keyword">if</strong> (subproject == <strong class="jxr_keyword">null</strong> || subproject.isEmpty()) {
-<a class="jxr_linenumber" name="L733" href="#L733">733</a> <strong class="jxr_keyword">continue</strong>;
-<a class="jxr_linenumber" name="L734" href="#L734">734</a> }
-<a class="jxr_linenumber" name="L735" href="#L735">735</a>
-<a class="jxr_linenumber" name="L736" href="#L736">736</a> subproject = subproject.replace('\\', File.separatorChar).replace('/', File.separatorChar);
-<a class="jxr_linenumber" name="L737" href="#L737">737</a>
-<a class="jxr_linenumber" name="L738" href="#L738">738</a> Path rawSubprojectFile = modelProcessor.locateExistingPom(pomDirectory.resolve(subproject));
-<a class="jxr_linenumber" name="L739" href="#L739">739</a>
-<a class="jxr_linenumber" name="L740" href="#L740">740</a> <strong class="jxr_keyword">if</strong> (rawSubprojectFile == <strong class="jxr_keyword">null</strong>) {
-<a class="jxr_linenumber" name="L741" href="#L741">741</a> ModelProblem problem = <strong class="jxr_keyword">new</strong> <a name="DefaultModelProblem" href="../../../../../../org/apache/maven/internal/impl/model/DefaultModelProblem.html#DefaultModelProblem">DefaultModelProblem</a>(
-<a class="jxr_linenumber" name="L742" href="#L742">742</a> <span class="jxr_string">"Child subproject "</span> + subproject + <span class="jxr_string">" of "</span> + pomDirectory + <span class="jxr_string">" does not exist"</span>,
-<a class="jxr_linenumber" name="L743" href="#L743">743</a> Severity.ERROR,
-<a class="jxr_linenumber" name="L744" href="#L744">744</a> Version.BASE,
-<a class="jxr_linenumber" name="L745" href="#L745">745</a> model,
-<a class="jxr_linenumber" name="L746" href="#L746">746</a> -1,
-<a class="jxr_linenumber" name="L747" href="#L747">747</a> -1,
-<a class="jxr_linenumber" name="L748" href="#L748">748</a> <strong class="jxr_keyword">null</strong>);
-<a class="jxr_linenumber" name="L749" href="#L749">749</a> r.addProblem(problem);
-<a class="jxr_linenumber" name="L750" href="#L750">750</a> <strong class="jxr_keyword">continue</strong>;
-<a class="jxr_linenumber" name="L751" href="#L751">751</a> }
-<a class="jxr_linenumber" name="L752" href="#L752">752</a>
-<a class="jxr_linenumber" name="L753" href="#L753">753</a> Path subprojectFile = rawSubprojectFile.toAbsolutePath().normalize();
-<a class="jxr_linenumber" name="L754" href="#L754">754</a>
-<a class="jxr_linenumber" name="L755" href="#L755">755</a> <strong class="jxr_keyword">if</strong> (parents.contains(subprojectFile)) {
-<a class="jxr_linenumber" name="L756" href="#L756">756</a> StringBuilder buffer = <strong class="jxr_keyword">new</strong> StringBuilder(256);
-<a class="jxr_linenumber" name="L757" href="#L757">757</a> <strong class="jxr_keyword">for</strong> (Path aggregatorFile : parents) {
-<a class="jxr_linenumber" name="L758" href="#L758">758</a> buffer.append(aggregatorFile).append(<span class="jxr_string">" -> "</span>);
-<a class="jxr_linenumber" name="L759" href="#L759">759</a> }
-<a class="jxr_linenumber" name="L760" href="#L760">760</a> buffer.append(subprojectFile);
+<a class="jxr_linenumber" name="L567" href="#L567">567</a> <strong class="jxr_keyword">if</strong> (model.getDependencies().isEmpty()) {
+<a class="jxr_linenumber" name="L568" href="#L568">568</a> <strong class="jxr_keyword">return</strong> model;
+<a class="jxr_linenumber" name="L569" href="#L569">569</a> }
+<a class="jxr_linenumber" name="L570" href="#L570">570</a> List<Dependency> newDeps = <strong class="jxr_keyword">new</strong> ArrayList<>(model.getDependencies().size());
+<a class="jxr_linenumber" name="L571" href="#L571">571</a> <strong class="jxr_keyword">boolean</strong> changed = false;
+<a class="jxr_linenumber" name="L572" href="#L572">572</a> <strong class="jxr_keyword">for</strong> (Dependency dep : model.getDependencies()) {
+<a class="jxr_linenumber" name="L573" href="#L573">573</a> Dependency newDep = <strong class="jxr_keyword">null</strong>;
+<a class="jxr_linenumber" name="L574" href="#L574">574</a> <strong class="jxr_keyword">if</strong> (dep.getVersion() == <strong class="jxr_keyword">null</strong>) {
+<a class="jxr_linenumber" name="L575" href="#L575">575</a> newDep = inferDependencyVersion(model, dep);
+<a class="jxr_linenumber" name="L576" href="#L576">576</a> <strong class="jxr_keyword">if</strong> (newDep != <strong class="jxr_keyword">null</strong>) {
+<a class="jxr_linenumber" name="L577" href="#L577">577</a> changed = <strong class="jxr_keyword">true</strong>;
+<a class="jxr_linenumber" name="L578" href="#L578">578</a> }
+<a class="jxr_linenumber" name="L579" href="#L579">579</a> }
+<a class="jxr_linenumber" name="L580" href="#L580">580</a> newDeps.add(newDep == <strong class="jxr_keyword">null</strong> ? dep : newDep);
+<a class="jxr_linenumber" name="L581" href="#L581">581</a> }
+<a class="jxr_linenumber" name="L582" href="#L582">582</a> <strong class="jxr_keyword">return</strong> changed ? model.withDependencies(newDeps) : model;
+<a class="jxr_linenumber" name="L583" href="#L583">583</a> }
+<a class="jxr_linenumber" name="L584" href="#L584">584</a>
+<a class="jxr_linenumber" name="L585" href="#L585">585</a> <strong class="jxr_keyword">private</strong> Dependency inferDependencyVersion(Model model, Dependency dep) {
+<a class="jxr_linenumber" name="L586" href="#L586">586</a> Model depModel = getRawModel(model.getPomFile(), dep.getGroupId(), dep.getArtifactId());
+<a class="jxr_linenumber" name="L587" href="#L587">587</a> <strong class="jxr_keyword">if</strong> (depModel == <strong class="jxr_keyword">null</strong>) {
+<a class="jxr_linenumber" name="L588" href="#L588">588</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">null</strong>;
+<a class="jxr_linenumber" name="L589" href="#L589">589</a> }
+<a class="jxr_linenumber" name="L590" href="#L590">590</a> Dependency.Builder depBuilder = Dependency.newBuilder(dep);
+<a class="jxr_linenumber" name="L591" href="#L591">591</a> String version = depModel.getVersion();
+<a class="jxr_linenumber" name="L592" href="#L592">592</a> InputLocation versionLocation = depModel.getLocation(<span class="jxr_string">"version"</span>);
+<a class="jxr_linenumber" name="L593" href="#L593">593</a> <strong class="jxr_keyword">if</strong> (version == <strong class="jxr_keyword">null</strong> && depModel.getParent() != <strong class="jxr_keyword">null</strong>) {
+<a class="jxr_linenumber" name="L594" href="#L594">594</a> version = depModel.getParent().getVersion();
+<a class="jxr_linenumber" name="L595" href="#L595">595</a> versionLocation = depModel.getParent().getLocation(<span class="jxr_string">"version"</span>);
+<a class="jxr_linenumber" name="L596" href="#L596">596</a> }
+<a class="jxr_linenumber" name="L597" href="#L597">597</a> depBuilder.version(version).location(<span class="jxr_string">"version"</span>, versionLocation);
+<a class="jxr_linenumber" name="L598" href="#L598">598</a> <strong class="jxr_keyword">if</strong> (dep.getGroupId() == <strong class="jxr_keyword">null</strong>) {
+<a class="jxr_linenumber" name="L599" href="#L599">599</a> String depGroupId = depModel.getGroupId();
+<a class="jxr_linenumber" name="L600" href="#L600">600</a> InputLocation groupIdLocation = depModel.getLocation(<span class="jxr_string">"groupId"</span>);
+<a class="jxr_linenumber" name="L601" href="#L601">601</a> <strong class="jxr_keyword">if</strong> (depGroupId == <strong class="jxr_keyword">null</strong> && depModel.getParent() != <strong class="jxr_keyword">null</strong>) {
+<a class="jxr_linenumber" name="L602" href="#L602">602</a> depGroupId = depModel.getParent().getGroupId();
+<a class="jxr_linenumber" name="L603" href="#L603">603</a> groupIdLocation = depModel.getParent().getLocation(<span class="jxr_string">"groupId"</span>);
+<a class="jxr_linenumber" name="L604" href="#L604">604</a> }
+<a class="jxr_linenumber" name="L605" href="#L605">605</a> depBuilder.groupId(depGroupId).location(<span class="jxr_string">"groupId"</span>, groupIdLocation);
+<a class="jxr_linenumber" name="L606" href="#L606">606</a> }
+<a class="jxr_linenumber" name="L607" href="#L607">607</a> <strong class="jxr_keyword">return</strong> depBuilder.build();
+<a class="jxr_linenumber" name="L608" href="#L608">608</a> }
+<a class="jxr_linenumber" name="L609" href="#L609">609</a>
+<a class="jxr_linenumber" name="L610" href="#L610">610</a> String replaceCiFriendlyVersion(Map<String, String> properties, String version) {
+<a class="jxr_linenumber" name="L611" href="#L611">611</a> <em class="jxr_comment">// TODO: we're using a simple regex here, but we should probably use</em>
+<a class="jxr_linenumber" name="L612" href="#L612">612</a> <em class="jxr_comment">// a proper interpolation service to do the replacements</em>
+<a class="jxr_linenumber" name="L613" href="#L613">613</a> <em class="jxr_comment">// once one is available in maven-api-impl</em>
+<a class="jxr_linenumber" name="L614" href="#L614">614</a> <em class="jxr_comment">// https://issues.apache.org/jira/browse/MNG-8262</em>
+<a class="jxr_linenumber" name="L615" href="#L615">615</a> <strong class="jxr_keyword">if</strong> (version != <strong class="jxr_keyword">null</strong>) {
+<a class="jxr_linenumber" name="L616" href="#L616">616</a> Matcher matcher = REGEX.matcher(version);
+<a class="jxr_linenumber" name="L617" href="#L617">617</a> <strong class="jxr_keyword">if</strong> (matcher.find()) {
+<a class="jxr_linenumber" name="L618" href="#L618">618</a> StringBuilder result = <strong class="jxr_keyword">new</strong> StringBuilder();
+<a class="jxr_linenumber" name="L619" href="#L619">619</a> <strong class="jxr_keyword">do</strong> {
+<a class="jxr_linenumber" name="L620" href="#L620">620</a> <em class="jxr_comment">// extract the key inside ${}</em>
+<a class="jxr_linenumber" name="L621" href="#L621">621</a> String key = matcher.group(1);
+<a class="jxr_linenumber" name="L622" href="#L622">622</a> <em class="jxr_comment">// get replacement from the map, or use the original ${xy} if not found</em>
+<a class="jxr_linenumber" name="L623" href="#L623">623</a> String replacement = properties.getOrDefault(key, <span class="jxr_string">"\\"</span> + matcher.group(0));
+<a class="jxr_linenumber" name="L624" href="#L624">624</a> matcher.appendReplacement(result, replacement);
+<a class="jxr_linenumber" name="L625" href="#L625">625</a> } <strong class="jxr_keyword">while</strong> (matcher.find());
+<a class="jxr_linenumber" name="L626" href="#L626">626</a> matcher.appendTail(result); <em class="jxr_comment">// Append the remaining part of the string</em>
+<a class="jxr_linenumber" name="L627" href="#L627">627</a> <strong class="jxr_keyword">return</strong> result.toString();
+<a class="jxr_linenumber" name="L628" href="#L628">628</a> }
+<a class="jxr_linenumber" name="L629" href="#L629">629</a> }
+<a class="jxr_linenumber" name="L630" href="#L630">630</a> <strong class="jxr_keyword">return</strong> version;
+<a class="jxr_linenumber" name="L631" href="#L631">631</a> }
+<a class="jxr_linenumber" name="L632" href="#L632">632</a>
+<a class="jxr_linenumber" name="L633" href="#L633">633</a> <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">void</strong> buildBuildPom() <strong class="jxr_keyword">throws</strong> ModelBuilderException {
+<a class="jxr_linenumber" name="L634" href="#L634">634</a> <em class="jxr_comment">// Retrieve and normalize the source path, ensuring it's non-null and in absolute form</em>
+<a class="jxr_linenumber" name="L635" href="#L635">635</a> Path top = request.getSource().getPath();
+<a class="jxr_linenumber" name="L636" href="#L636">636</a> <strong class="jxr_keyword">if</strong> (top == <strong class="jxr_keyword">null</strong>) {
+<a class="jxr_linenumber" name="L637" href="#L637">637</a> <strong class="jxr_keyword">throw</strong> <strong class="jxr_keyword">new</strong> IllegalStateException(<span class="jxr_string">"Recursive build requested but source has no path"</span>);
+<a class="jxr_linenumber" name="L638" href="#L638">638</a> }
+<a class="jxr_linenumber" name="L639" href="#L639">639</a> top = top.toAbsolutePath().normalize();
+<a class="jxr_linenumber" name="L640" href="#L640">640</a>
+<a class="jxr_linenumber" name="L641" href="#L641">641</a> <em class="jxr_comment">// Obtain the root directory, resolving it if necessary</em>
+<a class="jxr_linenumber" name="L642" href="#L642">642</a> Path rootDirectory;
+<a class="jxr_linenumber" name="L643" href="#L643">643</a> <strong class="jxr_keyword">try</strong> {
+<a class="jxr_linenumber" name="L644" href="#L644">644</a> rootDirectory = session.getRootDirectory();
+<a class="jxr_linenumber" name="L645" href="#L645">645</a> } <strong class="jxr_keyword">catch</strong> (IllegalStateException e) {
+<a class="jxr_linenumber" name="L646" href="#L646">646</a> rootDirectory = session.getService(RootLocator.<strong class="jxr_keyword">class</strong>).findMandatoryRoot(top);
+<a class="jxr_linenumber" name="L647" href="#L647">647</a> }
+<a class="jxr_linenumber" name="L648" href="#L648">648</a>
+<a class="jxr_linenumber" name="L649" href="#L649">649</a> <em class="jxr_comment">// Locate and normalize the root POM if it exists, fallback to top otherwise</em>
+<a class="jxr_linenumber" name="L650" href="#L650">650</a> Path root = modelProcessor.locateExistingPom(rootDirectory);
+<a class="jxr_linenumber" name="L651" href="#L651">651</a> <strong class="jxr_keyword">if</strong> (root != <strong class="jxr_keyword">null</strong>) {
+<a class="jxr_linenumber" name="L652" href="#L652">652</a> root = root.toAbsolutePath().normalize();
+<a class="jxr_linenumber" name="L653" href="#L653">653</a> } <strong class="jxr_keyword">else</strong> {
+<a class="jxr_linenumber" name="L654" href="#L654">654</a> root = top;
+<a class="jxr_linenumber" name="L655" href="#L655">655</a> }
+<a class="jxr_linenumber" name="L656" href="#L656">656</a>
+<a class="jxr_linenumber" name="L657" href="#L657">657</a> <em class="jxr_comment">// Load all models starting from the root</em>
+<a class="jxr_linenumber" name="L658" href="#L658">658</a> loadFromRoot(root, top);
+<a class="jxr_linenumber" name="L659" href="#L659">659</a>
+<a class="jxr_linenumber" name="L660" href="#L660">660</a> <em class="jxr_comment">// Check for errors after loading models</em>
+<a class="jxr_linenumber" name="L661" href="#L661">661</a> <strong class="jxr_keyword">if</strong> (hasErrors()) {
+<a class="jxr_linenumber" name="L662" href="#L662">662</a> <strong class="jxr_keyword">throw</strong> newModelBuilderException();
+<a class="jxr_linenumber" name="L663" href="#L663">663</a> }
+<a class="jxr_linenumber" name="L664" href="#L664">664</a>
+<a class="jxr_linenumber" name="L665" href="#L665">665</a> <em class="jxr_comment">// For the top model and all its children, build the effective model.</em>
+<a class="jxr_linenumber" name="L666" href="#L666">666</a> <em class="jxr_comment">// This is done through the phased executor</em>
+<a class="jxr_linenumber" name="L667" href="#L667">667</a> <strong class="jxr_keyword">var</strong> allResults = results(result).toList();
+<a class="jxr_linenumber" name="L668" href="#L668">668</a> List<RuntimeException> exceptions = <strong class="jxr_keyword">new</strong> CopyOnWriteArrayList<>();
+<a class="jxr_linenumber" name="L669" href="#L669">669</a> <strong class="jxr_keyword">try</strong> (<a name="PhasingExecutor" href="../../../../../../org/apache/maven/internal/impl/util/PhasingExecutor.html#PhasingExecutor">PhasingExecutor</a> executor = createExecutor()) {
+<a class="jxr_linenumber" name="L670" href="#L670">670</a> <strong class="jxr_keyword">for</strong> (<a name="DefaultModelBuilderResult" href="../../../../../../org/apache/maven/internal/impl/model/DefaultModelBuilderResult.html#DefaultModelBuilderResult">DefaultModelBuilderResult</a> r : allResults) {
+<a class="jxr_linenumber" name="L671" href="#L671">671</a> executor.execute(() -> {
+<a class="jxr_linenumber" name="L672" href="#L672">672</a> DefaultModelBuilderSession mbs = derive(r.getSource(), r);
+<a class="jxr_linenumber" name="L673" href="#L673">673</a> <strong class="jxr_keyword">try</strong> {
+<a class="jxr_linenumber" name="L674" href="#L674">674</a> mbs.buildEffectiveModel(<strong class="jxr_keyword">new</strong> LinkedHashSet<>());
+<a class="jxr_linenumber" name="L675" href="#L675">675</a> } <strong class="jxr_keyword">catch</strong> (ModelBuilderException e) {
+<a class="jxr_linenumber" name="L676" href="#L676">676</a> <em class="jxr_comment">// gathered with problem collector</em>
+<a class="jxr_linenumber" name="L677" href="#L677">677</a> } <strong class="jxr_keyword">catch</strong> (RuntimeException t) {
+<a class="jxr_linenumber" name="L678" href="#L678">678</a> exceptions.add(t);
+<a class="jxr_linenumber" name="L679" href="#L679">679</a> }
+<a class="jxr_linenumber" name="L680" href="#L680">680</a> });
+<a class="jxr_linenumber" name="L681" href="#L681">681</a> }
+<a class="jxr_linenumber" name="L682" href="#L682">682</a> }
+<a class="jxr_linenumber" name="L683" href="#L683">683</a>
+<a class="jxr_linenumber" name="L684" href="#L684">684</a> <em class="jxr_comment">// Check for errors again after execution</em>
+<a class="jxr_linenumber" name="L685" href="#L685">685</a> <strong class="jxr_keyword">if</strong> (exceptions.size() == 1) {
+<a class="jxr_linenumber" name="L686" href="#L686">686</a> <strong class="jxr_keyword">throw</strong> exceptions.get(0);
+<a class="jxr_linenumber" name="L687" href="#L687">687</a> } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (exceptions.size() > 1) {
+<a class="jxr_linenumber" name="L688" href="#L688">688</a> MavenException fatalException = <strong class="jxr_keyword">new</strong> MavenException(<span class="jxr_string">"Multiple fatal exceptions occurred"</span>);
+<a class="jxr_linenumber" name="L689" href="#L689">689</a> exceptions.forEach(fatalException::addSuppressed);
+<a class="jxr_linenumber" name="L690" href="#L690">690</a> <strong class="jxr_keyword">throw</strong> fatalException;
+<a class="jxr_linenumber" name="L691" href="#L691">691</a> } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (hasErrors()) {
+<a class="jxr_linenumber" name="L692" href="#L692">692</a> <strong class="jxr_keyword">throw</strong> newModelBuilderException();
+<a class="jxr_linenumber" name="L693" href="#L693">693</a> }
+<a class="jxr_linenumber" name="L694" href="#L694">694</a> }
+<a class="jxr_linenumber" name="L695" href="#L695">695</a>
+<a class="jxr_linenumber" name="L696" href="#L696">696</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L697" href="#L697">697</a> <em class="jxr_javadoccomment"> * Generates a stream of DefaultModelBuilderResult objects, starting with the provided</em>
+<a class="jxr_linenumber" name="L698" href="#L698">698</a> <em class="jxr_javadoccomment"> * result and recursively including all its child results.</em>
+<a class="jxr_linenumber" name="L699" href="#L699">699</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L700" href="#L700">700</a> <em class="jxr_javadoccomment"> * @param r The initial DefaultModelBuilderResult object from which to generate the stream.</em>
+<a class="jxr_linenumber" name="L701" href="#L701">701</a> <em class="jxr_javadoccomment"> * @return A Stream of DefaultModelBuilderResult objects, starting with the provided result</em>
+<a class="jxr_linenumber" name="L702" href="#L702">702</a> <em class="jxr_javadoccomment"> * and including all its child results.</em>
+<a class="jxr_linenumber" name="L703" href="#L703">703</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L704" href="#L704">704</a> Stream<DefaultModelBuilderResult> results(<a name="DefaultModelBuilderResult" href="../../../../../../org/apache/maven/internal/impl/model/DefaultModelBuilderResult.html#DefaultModelBuilderResult">DefaultModelBuilderResult</a> r) {
+<a class="jxr_linenumber" name="L705" href="#L705">705</a> <strong class="jxr_keyword">return</strong> Stream.concat(Stream.of(r), r.getChildren().stream().flatMap(<strong class="jxr_keyword">this</strong>::results));
+<a class="jxr_linenumber" name="L706" href="#L706">706</a> }
+<a class="jxr_linenumber" name="L707" href="#L707">707</a>
+<a class="jxr_linenumber" name="L708" href="#L708">708</a> <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">void</strong> loadFromRoot(Path root, Path top) {
+<a class="jxr_linenumber" name="L709" href="#L709">709</a> <strong class="jxr_keyword">try</strong> (<a name="PhasingExecutor" href="../../../../../../org/apache/maven/internal/impl/util/PhasingExecutor.html#PhasingExecutor">PhasingExecutor</a> executor = createExecutor()) {
+<a class="jxr_linenumber" name="L710" href="#L710">710</a> <a name="DefaultModelBuilderResult" href="../../../../../../org/apache/maven/internal/impl/model/DefaultModelBuilderResult.html#DefaultModelBuilderResult">DefaultModelBuilderResult</a> r = Objects.equals(top, root) ? result : <strong class="jxr_keyword">new</strong> <a name="DefaultModelBuilderResult" href="../../../../../../org/apache/maven/internal/impl/model/DefaultModelBuilderResult.html#DefaultModelBuilderResult">DefaultModelBuilderResult</a>();
+<a class="jxr_linenumber" name="L711" href="#L711">711</a> loadFilePom(executor, top, root, Set.of(), r);
+<a class="jxr_linenumber" name="L712" href="#L712">712</a> }
+<a class="jxr_linenumber" name="L713" href="#L713">713</a> <strong class="jxr_keyword">if</strong> (result.getFileModel() == <strong class="jxr_keyword">null</strong> && !Objects.equals(top, root)) {
+<a class="jxr_linenumber" name="L714" href="#L714">714</a> logger.warn(
+<a class="jxr_linenumber" name="L715" href="#L715">715</a> <span class="jxr_string">"The top project ({}) cannot be found in the reactor from root project ({}). "</span>
+<a class="jxr_linenumber" name="L716" href="#L716">716</a> + <span class="jxr_string">"Make sure the root directory is correct (a missing '.mvn' directory in the root "</span>
+<a class="jxr_linenumber" name="L717" href="#L717">717</a> + <span class="jxr_string">"project is the most common cause) and the project is correctly included "</span>
+<a class="jxr_linenumber" name="L718" href="#L718">718</a> + <span class="jxr_string">"in the reactor (missing activated profiles, command line options, etc.). For this "</span>
+<a class="jxr_linenumber" name="L719" href="#L719">719</a> + <span class="jxr_string">"build, the top project will be used as the root project."</span>,
+<a class="jxr_linenumber" name="L720" href="#L720">720</a> top,
+<a class="jxr_linenumber" name="L721" href="#L721">721</a> root);
+<a class="jxr_linenumber" name="L722" href="#L722">722</a> cache.clear();
+<a class="jxr_linenumber" name="L723" href="#L723">723</a> mappedSources.clear();
+<a class="jxr_linenumber" name="L724" href="#L724">724</a> loadFromRoot(top, top);
+<a class="jxr_linenumber" name="L725" href="#L725">725</a> }
+<a class="jxr_linenumber" name="L726" href="#L726">726</a> }
+<a class="jxr_linenumber" name="L727" href="#L727">727</a>
+<a class="jxr_linenumber" name="L728" href="#L728">728</a> <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">void</strong> loadFilePom(
+<a class="jxr_linenumber" name="L729" href="#L729">729</a> Executor executor, Path top, Path pom, Set<Path> parents, <a name="DefaultModelBuilderResult" href="../../../../../../org/apache/maven/internal/impl/model/DefaultModelBuilderResult.html#DefaultModelBuilderResult">DefaultModelBuilderResult</a> r) {
+<a class="jxr_linenumber" name="L730" href="#L730">730</a> <strong class="jxr_keyword">try</strong> {
+<a class="jxr_linenumber" name="L731" href="#L731">731</a> Path pomDirectory = Files.isDirectory(pom) ? pom : pom.getParent();
+<a class="jxr_linenumber" name="L732" href="#L732">732</a> ModelSource src = ModelSource.fromPath(pom);
+<a class="jxr_linenumber" name="L733" href="#L733">733</a> Model model = derive(src, r).readFileModel();
+<a class="jxr_linenumber" name="L734" href="#L734">734</a> <em class="jxr_comment">// keep all loaded file models in memory, those will be needed</em>
+<a class="jxr_linenumber" name="L735" href="#L735">735</a> <em class="jxr_comment">// during the raw to build transformation</em>
+<a class="jxr_linenumber" name="L736" href="#L736">736</a> putSource(getGroupId(model), model.getArtifactId(), src);
+<a class="jxr_linenumber" name="L737" href="#L737">737</a> Model activated = activateFileModel(model);
+<a class="jxr_linenumber" name="L738" href="#L738">738</a> <strong class="jxr_keyword">for</strong> (String subproject : getSubprojects(activated)) {
+<a class="jxr_linenumber" name="L739" href="#L739">739</a> <strong class="jxr_keyword">if</strong> (subproject == <strong class="jxr_keyword">null</strong> || subproject.isEmpty()) {
+<a class="jxr_linenumber" name="L740" href="#L740">740</a> <strong class="jxr_keyword">continue</strong>;
+<a class="jxr_linenumber" name="L741" href="#L741">741</a> }
+<a class="jxr_linenumber" name="L742" href="#L742">742</a>
+<a class="jxr_linenumber" name="L743" href="#L743">743</a> subproject = subproject.replace('\\', File.separatorChar).replace('/', File.separatorChar);
+<a class="jxr_linenumber" name="L744" href="#L744">744</a>
+<a class="jxr_linenumber" name="L745" href="#L745">745</a> Path rawSubprojectFile = modelProcessor.locateExistingPom(pomDirectory.resolve(subproject));
+<a class="jxr_linenumber" name="L746" href="#L746">746</a>
+<a class="jxr_linenumber" name="L747" href="#L747">747</a> <strong class="jxr_keyword">if</strong> (rawSubprojectFile == <strong class="jxr_keyword">null</strong>) {
+<a class="jxr_linenumber" name="L748" href="#L748">748</a> ModelProblem problem = <strong class="jxr_keyword">new</strong> <a name="DefaultModelProblem" href="../../../../../../org/apache/maven/internal/impl/model/DefaultModelProblem.html#DefaultModelProblem">DefaultModelProblem</a>(
+<a class="jxr_linenumber" name="L749" href="#L749">749</a> <span class="jxr_string">"Child subproject "</span> + subproject + <span class="jxr_string">" of "</span> + pomDirectory + <span class="jxr_string">" does not exist"</span>,
+<a class="jxr_linenumber" name="L750" href="#L750">750</a> Severity.ERROR,
+<a class="jxr_linenumber" name="L751" href="#L751">751</a> Version.BASE,
+<a class="jxr_linenumber" name="L752" href="#L752">752</a> model,
+<a class="jxr_linenumber" name="L753" href="#L753">753</a> -1,
+<a class="jxr_linenumber" name="L754" href="#L754">754</a> -1,
+<a class="jxr_linenumber" name="L755" href="#L755">755</a> <strong class="jxr_keyword">null</strong>);
+<a class="jxr_linenumber" name="L756" href="#L756">756</a> r.addProblem(problem);
+<a class="jxr_linenumber" name="L757" href="#L757">757</a> <strong class="jxr_keyword">continue</strong>;
+<a class="jxr_linenumber" name="L758" href="#L758">758</a> }
+<a class="jxr_linenumber" name="L759" href="#L759">759</a>
+<a class="jxr_linenumber" name="L760" href="#L760">760</a> Path subprojectFile = rawSubprojectFile.toAbsolutePath().normalize();
<a class="jxr_linenumber" name="L761" href="#L761">761</a>
-<a class="jxr_linenumber" name="L762" href="#L762">762</a> ModelProblem problem = <strong class="jxr_keyword">new</strong> <a name="DefaultModelProblem" href="../../../../../../org/apache/maven/internal/impl/model/DefaultModelProblem.html#DefaultModelProblem">DefaultModelProblem</a>(
-<a class="jxr_linenumber" name="L763" href="#L763">763</a> <span class="jxr_string">"Child subproject "</span> + subprojectFile + <span class="jxr_string">" of "</span> + pom + <span class="jxr_string">" forms aggregation cycle "</span>
-<a class="jxr_linenumber" name="L764" href="#L764">764</a> + buffer,
-<a class="jxr_linenumber" name="L765" href="#L765">765</a> Severity.ERROR,
-<a class="jxr_linenumber" name="L766" href="#L766">766</a> Version.BASE,
-<a class="jxr_linenumber" name="L767" href="#L767">767</a> model,
-<a class="jxr_linenumber" name="L768" href="#L768">768</a> -1,
-<a class="jxr_linenumber" name="L769" href="#L769">769</a> -1,
-<a class="jxr_linenumber" name="L770" href="#L770">770</a> <strong class="jxr_keyword">null</strong>);
-<a class="jxr_linenumber" name="L771" href="#L771">771</a> r.addProblem(problem);
-<a class="jxr_linenumber" name="L772" href="#L772">772</a> <strong class="jxr_keyword">continue</strong>;
-<a class="jxr_linenumber" name="L773" href="#L773">773</a> }
-<a class="jxr_linenumber" name="L774" href="#L774">774</a>
-<a class="jxr_linenumber" name="L775" href="#L775">775</a> <a name="DefaultModelBuilderResult" href="../../../../../../org/apache/maven/internal/impl/model/DefaultModelBuilderResult.html#DefaultModelBuilderResult">DefaultModelBuilderResult</a> cr =
-<a class="jxr_linenumber" name="L776" href="#L776">776</a> Objects.equals(top, subprojectFile) ? result : <strong class="jxr_keyword">new</strong> <a name="DefaultModelBuilderResult" href="../../../../../../org/apache/maven/internal/impl/model/DefaultModelBuilderResult.html#DefaultModelBuilderResult">DefaultModelBuilderResult</a>(r);
-<a class="jxr_linenumber" name="L777" href="#L777">777</a> <strong class="jxr_keyword">if</strong> (request.isRecursive()) {
-<a class="jxr_linenumber" name="L778" href="#L778">778</a> r.getChildren().add(cr);
-<a class="jxr_linenumber" name="L779" href="#L779">779</a> }
-<a class="jxr_linenumber" name="L780" href="#L780">780</a>
-<a class="jxr_linenumber" name="L781" href="#L781">781</a> executor.execute(() -> loadFilePom(executor, top, subprojectFile, concat(parents, pom), cr));
-<a class="jxr_linenumber" name="L782" href="#L782">782</a> }
-<a class="jxr_linenumber" name="L783" href="#L783">783</a> } <strong class="jxr_keyword">catch</strong> (ModelBuilderException e) {
-<a class="jxr_linenumber" name="L784" href="#L784">784</a> <em class="jxr_comment">// gathered with problem collector</em>
-<a class="jxr_linenumber" name="L785" href="#L785">785</a> add(Severity.ERROR, Version.V40, <span class="jxr_string">"Failed to load project "</span> + pom, e);
-<a class="jxr_linenumber" name="L786" href="#L786">786</a> }
-<a class="jxr_linenumber" name="L787" href="#L787">787</a> <strong class="jxr_keyword">if</strong> (r != result) {
-<a class="jxr_linenumber" name="L788" href="#L788">788</a> r.getProblems().forEach(result::addProblem);
-<a class="jxr_linenumber" name="L789" href="#L789">789</a> }
-<a class="jxr_linenumber" name="L790" href="#L790">790</a> }
-<a class="jxr_linenumber" name="L791" href="#L791">791</a>
-<a class="jxr_linenumber" name="L792" href="#L792">792</a> <strong class="jxr_keyword">static</strong> <T> Set<T> concat(Set<T> a, T b) {
-<a class="jxr_linenumber" name="L793" href="#L793">793</a> Set<T> result = <strong class="jxr_keyword">new</strong> HashSet<>(a);
-<a class="jxr_linenumber" name="L794" href="#L794">794</a> result.add(b);
-<a class="jxr_linenumber" name="L795" href="#L795">795</a> <strong class="jxr_keyword">return</strong> Set.copyOf(result);
-<a class="jxr_linenumber" name="L796" href="#L796">796</a> }
-<a class="jxr_linenumber" name="L797" href="#L797">797</a>
-<a class="jxr_linenumber" name="L798" href="#L798">798</a> <strong class="jxr_keyword">void</strong> buildEffectiveModel(Collection<String> importIds) <strong class="jxr_keyword">throws</strong> ModelBuilderException {
-<a class="jxr_linenumber" name="L799" href="#L799">799</a> Model resultModel = readEffectiveModel();
-<a class="jxr_linenumber" name="L800" href="#L800">800</a> setSource(resultModel);
-<a class="jxr_linenumber" name="L801" href="#L801">801</a> setRootModel(resultModel);
-<a class="jxr_linenumber" name="L802" href="#L802">802</a>
-<a class="jxr_linenumber" name="L803" href="#L803">803</a> <em class="jxr_comment">// model path translation</em>
-<a class="jxr_linenumber" name="L804" href="#L804">804</a> resultModel =
-<a class="jxr_linenumber" name="L805" href="#L805">805</a> modelPathTranslator.alignToBaseDirectory(resultModel, resultModel.getProjectDirectory(), request);
-<a class="jxr_linenumber" name="L806" href="#L806">806</a>
-<a class="jxr_linenumber" name="L807" href="#L807">807</a> <em class="jxr_comment">// plugin management injection</em>
-<a class="jxr_linenumber" name="L808" href="#L808">808</a> resultModel = pluginManagementInjector.injectManagement(resultModel, request, <strong class="jxr_keyword">this</strong>);
+<a class="jxr_linenumber" name="L762" href="#L762">762</a> <strong class="jxr_keyword">if</strong> (parents.contains(subprojectFile)) {
+<a class="jxr_linenumber" name="L763" href="#L763">763</a> StringBuilder buffer = <strong class="jxr_keyword">new</strong> StringBuilder(256);
+<a class="jxr_linenumber" name="L764" href="#L764">764</a> <strong class="jxr_keyword">for</strong> (Path aggregatorFile : parents) {
+<a class="jxr_linenumber" name="L765" href="#L765">765</a> buffer.append(aggregatorFile).append(<span class="jxr_string">" -> "</span>);
+<a class="jxr_linenumber" name="L766" href="#L766">766</a> }
+<a class="jxr_linenumber" name="L767" href="#L767">767</a> buffer.append(subprojectFile);
+<a class="jxr_linenumber" name="L768" href="#L768">768</a>
+<a class="jxr_linenumber" name="L769" href="#L769">769</a> ModelProblem problem = <strong class="jxr_keyword">new</strong> <a name="DefaultModelProblem" href="../../../../../../org/apache/maven/internal/impl/model/DefaultModelProblem.html#DefaultModelProblem">DefaultModelProblem</a>(
+<a class="jxr_linenumber" name="L770" href="#L770">770</a> <span class="jxr_string">"Child subproject "</span> + subprojectFile + <span class="jxr_string">" of "</span> + pom + <span class="jxr_string">" forms aggregation cycle "</span>
+<a class="jxr_linenumber" name="L771" href="#L771">771</a> + buffer,
+<a class="jxr_linenumber" name="L772" href="#L772">772</a> Severity.ERROR,
+<a class="jxr_linenumber" name="L773" href="#L773">773</a> Version.BASE,
+<a class="jxr_linenumber" name="L774" href="#L774">774</a> model,
+<a class="jxr_linenumber" name="L775" href="#L775">775</a> -1,
+<a class="jxr_linenumber" name="L776" href="#L776">776</a> -1,
+<a class="jxr_linenumber" name="L777" href="#L777">777</a> <strong class="jxr_keyword">null</strong>);
+<a class="jxr_linenumber" name="L778" href="#L778">778</a> r.addProblem(problem);
+<a class="jxr_linenumber" name="L779" href="#L779">779</a> <strong class="jxr_keyword">continue</strong>;
+<a class="jxr_linenumber" name="L780" href="#L780">780</a> }
+<a class="jxr_linenumber" name="L781" href="#L781">781</a>
+<a class="jxr_linenumber" name="L782" href="#L782">782</a> <a name="DefaultModelBuilderResult" href="../../../../../../org/apache/maven/internal/impl/model/DefaultModelBuilderResult.html#DefaultModelBuilderResult">DefaultModelBuilderResult</a> cr =
+<a class="jxr_linenumber" name="L783" href="#L783">783</a> Objects.equals(top, subprojectFile) ? result : <strong class="jxr_keyword">new</strong> <a name="DefaultModelBuilderResult" href="../../../../../../org/apache/maven/internal/impl/model/DefaultModelBuilderResult.html#DefaultModelBuilderResult">DefaultModelBuilderResult</a>(r);
+<a class="jxr_linenumber" name="L784" href="#L784">784</a> <strong class="jxr_keyword">if</strong> (request.isRecursive()) {
+<a class="jxr_linenumber" name="L785" href="#L785">785</a> r.getChildren().add(cr);
+<a class="jxr_linenumber" name="L786" href="#L786">786</a> }
+<a class="jxr_linenumber" name="L787" href="#L787">787</a>
+<a class="jxr_linenumber" name="L788" href="#L788">788</a> executor.execute(() -> loadFilePom(executor, top, subprojectFile, concat(parents, pom), cr));
+<a class="jxr_linenumber" name="L789" href="#L789">789</a> }
+<a class="jxr_linenumber" name="L790" href="#L790">790</a> } <strong class="jxr_keyword">catch</strong> (ModelBuilderException e) {
+<a class="jxr_linenumber" name="L791" href="#L791">791</a> <em class="jxr_comment">// gathered with problem collector</em>
+<a class="jxr_linenumber" name="L792" href="#L792">792</a> add(Severity.ERROR, Version.V40, <span class="jxr_string">"Failed to load project "</span> + pom, e);
+<a class="jxr_linenumber" name="L793" href="#L793">793</a> }
+<a class="jxr_linenumber" name="L794" href="#L794">794</a> <strong class="jxr_keyword">if</strong> (r != result) {
+<a class="jxr_linenumber" name="L795" href="#L795">795</a> r.getProblems().forEach(result::addProblem);
+<a class="jxr_linenumber" name="L796" href="#L796">796</a> }
+<a class="jxr_linenumber" name="L797" href="#L797">797</a> }
+<a class="jxr_linenumber" name="L798" href="#L798">798</a>
+<a class="jxr_linenumber" name="L799" href="#L799">799</a> <strong class="jxr_keyword">static</strong> <T> Set<T> concat(Set<T> a, T b) {
+<a class="jxr_linenumber" name="L800" href="#L800">800</a> Set<T> result = <strong class="jxr_keyword">new</strong> HashSet<>(a);
+<a class="jxr_linenumber" name="L801" href="#L801">801</a> result.add(b);
+<a class="jxr_linenumber" name="L802" href="#L802">802</a> <strong class="jxr_keyword">return</strong> Set.copyOf(result);
+<a class="jxr_linenumber" name="L803" href="#L803">803</a> }
+<a class="jxr_linenumber" name="L804" href="#L804">804</a>
+<a class="jxr_linenumber" name="L805" href="#L805">805</a> <strong class="jxr_keyword">void</strong> buildEffectiveModel(Collection<String> importIds) <strong class="jxr_keyword">throws</strong> ModelBuilderException {
+<a class="jxr_linenumber" name="L806" href="#L806">806</a> Model resultModel = readEffectiveModel();
+<a class="jxr_linenumber" name="L807" href="#L807">807</a> setSource(resultModel);
+<a class="jxr_linenumber" name="L808" href="#L808">808</a> setRootModel(resultModel);
<a class="jxr_linenumber" name="L809" href="#L809">809</a>
-<a class="jxr_linenumber" name="L810" href="#L810">810</a> <em class="jxr_comment">// lifecycle bindings injection</em>
-<a class="jxr_linenumber" name="L811" href="#L811">811</a> <strong class="jxr_keyword">if</strong> (request.getRequestType() != ModelBuilderRequest.RequestType.DEPENDENCY) {
-<a class="jxr_linenumber" name="L812" href="#L812">812</a> org.apache.maven.api.services.ModelTransformer lifecycleBindingsInjector =
-<a class="jxr_linenumber" name="L813" href="#L813">813</a> request.getLifecycleBindingsInjector();
-<a class="jxr_linenumber" name="L814" href="#L814">814</a> <strong class="jxr_keyword">if</strong> (lifecycleBindingsInjector != <strong class="jxr_keyword">null</strong>) {
-<a class="jxr_linenumber" name="L815" href="#L815">815</a> resultModel = lifecycleBindingsInjector.transform(resultModel, request, <strong class="jxr_keyword">this</strong>);
-<a class="jxr_linenumber" name="L816" href="#L816">816</a> }
-<a class="jxr_linenumber" name="L817" href="#L817">817</a> }
-<a class="jxr_linenumber" name="L818" href="#L818">818</a>
-<a class="jxr_linenumber" name="L819" href="#L819">819</a> <em class="jxr_comment">// dependency management import</em>
-<a class="jxr_linenumber" name="L820" href="#L820">820</a> resultModel = importDependencyManagement(resultModel, importIds);
-<a class="jxr_linenumber" name="L821" href="#L821">821</a>
-<a class="jxr_linenumber" name="L822" href="#L822">822</a> <em class="jxr_comment">// dependency management injection</em>
-<a class="jxr_linenumber" name="L823" href="#L823">823</a> resultModel = dependencyManagementInjector.injectManagement(resultModel, request, <strong class="jxr_keyword">this</strong>);
-<a class="jxr_linenumber" name="L824" href="#L824">824</a>
-<a class="jxr_linenumber" name="L825" href="#L825">825</a> resultModel = modelNormalizer.injectDefaultValues(resultModel, request, <strong class="jxr_keyword">this</strong>);
-<a class="jxr_linenumber" name="L826" href="#L826">826</a>
-<a class="jxr_linenumber" name="L827" href="#L827">827</a> <strong class="jxr_keyword">if</strong> (request.getRequestType() != ModelBuilderRequest.RequestType.DEPENDENCY) {
-<a class="jxr_linenumber" name="L828" href="#L828">828</a> <em class="jxr_comment">// plugins configuration</em>
-<a class="jxr_linenumber" name="L829" href="#L829">829</a> resultModel = pluginConfigurationExpander.expandPluginConfiguration(resultModel, request, <strong class="jxr_keyword">this</strong>);
-<a class="jxr_linenumber" name="L830" href="#L830">830</a> }
+<a class="jxr_linenumber" name="L810" href="#L810">810</a> <em class="jxr_comment">// model path translation</em>
+<a class="jxr_linenumber" name="L811" href="#L811">811</a> resultModel =
+<a class="jxr_linenumber" name="L812" href="#L812">812</a> modelPathTranslator.alignToBaseDirectory(resultModel, resultModel.getProjectDirectory(), request);
+<a class="jxr_linenumber" name="L813" href="#L813">813</a>
+<a class="jxr_linenumber" name="L814" href="#L814">814</a> <em class="jxr_comment">// plugin management injection</em>
+<a class="jxr_linenumber" name="L815" href="#L815">815</a> resultModel = pluginManagementInjector.injectManagement(resultModel, request, <strong class="jxr_keyword">this</strong>);
+<a class="jxr_linenumber" name="L816" href="#L816">816</a>
+<a class="jxr_linenumber" name="L817" href="#L817">817</a> <em class="jxr_comment">// lifecycle bindings injection</em>
+<a class="jxr_linenumber" name="L818" href="#L818">818</a> <strong class="jxr_keyword">if</strong> (request.getRequestType() != ModelBuilderRequest.RequestType.DEPENDENCY) {
+<a class="jxr_linenumber" name="L819" href="#L819">819</a> org.apache.maven.api.services.ModelTransformer lifecycleBindingsInjector =
+<a class="jxr_linenumber" name="L820" href="#L820">820</a> request.getLifecycleBindingsInjector();
+<a class="jxr_linenumber" name="L821" href="#L821">821</a> <strong class="jxr_keyword">if</strong> (lifecycleBindingsInjector != <strong class="jxr_keyword">null</strong>) {
+<a class="jxr_linenumber" name="L822" href="#L822">822</a> resultModel = lifecycleBindingsInjector.transform(resultModel, request, <strong class="jxr_keyword">this</strong>);
+<a class="jxr_linenumber" name="L823" href="#L823">823</a> }
+<a class="jxr_linenumber" name="L824" href="#L824">824</a> }
+<a class="jxr_linenumber" name="L825" href="#L825">825</a>
+<a class="jxr_linenumber" name="L826" href="#L826">826</a> <em class="jxr_comment">// dependency management import</em>
+<a class="jxr_linenumber" name="L827" href="#L827">827</a> resultModel = importDependencyManagement(resultModel, importIds);
+<a class="jxr_linenumber" name="L828" href="#L828">828</a>
+<a class="jxr_linenumber" name="L829" href="#L829">829</a> <em class="jxr_comment">// dependency management injection</em>
+<a class="jxr_linenumber" name="L830" href="#L830">830</a> resultModel = dependencyManagementInjector.injectManagement(resultModel, request, <strong class="jxr_keyword">this</strong>);
<a class="jxr_linenumber" name="L831" href="#L831">831</a>
-<a class="jxr_linenumber" name="L832" href="#L832">832</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> transformer : transformers) {
-<a class="jxr_linenumber" name="L833" href="#L833">833</a> resultModel = transformer.transformEffectiveModel(resultModel);
-<a class="jxr_linenumber" name="L834" href="#L834">834</a> }
-<a class="jxr_linenumber" name="L835" href="#L835">835</a>
-<a class="jxr_linenumber" name="L836" href="#L836">836</a> result.setEffectiveModel(resultModel);
-<a class="jxr_linenumber" name="L837" href="#L837">837</a> <em class="jxr_comment">// Set the default relative path for the parent in the file model</em>
-<a class="jxr_linenumber" name="L838" href="#L838">838</a> <strong class="jxr_keyword">if</strong> (result.getFileModel().getParent() != <strong class="jxr_keyword">null</strong>
-<a class="jxr_linenumber" name="L839" href="#L839">839</a> && result.getFileModel().getParent().getRelativePath() == <strong class="jxr_keyword">null</strong>) {
-<a class="jxr_linenumber" name="L840" href="#L840">840</a> result.setFileModel(result.getFileModel()
-<a class="jxr_linenumber" name="L841" href="#L841">841</a> .withParent(result.getFileModel()
-<a class="jxr_linenumber" name="L842" href="#L842">842</a> .getParent()
-<a class="jxr_linenumber" name="L843" href="#L843">843</a> .withRelativePath(resultModel.getParent().getRelativePath())));
-<a class="jxr_linenumber" name="L844" href="#L844">844</a> }
-<a class="jxr_linenumber" name="L845" href="#L845">845</a>
-<a class="jxr_linenumber" name="L846" href="#L846">846</a> <em class="jxr_comment">// effective model validation</em>
-<a class="jxr_linenumber" name="L847" href="#L847">847</a> modelValidator.validateEffectiveModel(
-<a class="jxr_linenumber" name="L848" href="#L848">848</a> resultModel,
-<a class="jxr_linenumber" name="L849" href="#L849">849</a> request.getRequestType() == ModelBuilderRequest.RequestType.BUILD_POM
-<a class="jxr_linenumber" name="L850" href="#L850">850</a> ? ModelValidator.VALIDATION_LEVEL_STRICT
-<a class="jxr_linenumber" name="L851" href="#L851">851</a> : ModelValidator.VALIDATION_LEVEL_MINIMAL,
-<a class="jxr_linenumber" name="L852" href="#L852">852</a> request,
-<a class="jxr_linenumber" name="L853" href="#L853">853</a> <strong class="jxr_keyword">this</strong>);
-<a class="jxr_linenumber" name="L854" href="#L854">854</a>
-<a class="jxr_linenumber" name="L855" href="#L855">855</a> <strong class="jxr_keyword">if</strong> (hasErrors()) {
-<a class="jxr_linenumber" name="L856" href="#L856">856</a> <strong class="jxr_keyword">throw</strong> newModelBuilderException();
-<a class="jxr_linenumber" name="L857" href="#L857">857</a> }
-<a class="jxr_linenumber" name="L858" href="#L858">858</a> }
-<a class="jxr_linenumber" name="L859" href="#L859">859</a>
-<a class="jxr_linenumber" name="L860" href="#L860">860</a> Model readParent(Model childModel) <strong class="jxr_keyword">throws</strong> ModelBuilderException {
-<a class="jxr_linenumber" name="L861" href="#L861">861</a> Model parentModel;
-<a class="jxr_linenumber" name="L862" href="#L862">862</a>
-<a class="jxr_linenumber" name="L863" href="#L863">863</a> Parent parent = childModel.getParent();
-<a class="jxr_linenumber" name="L864" href="#L864">864</a> <strong class="jxr_keyword">if</strong> (parent != <strong class="jxr_keyword">null</strong>) {
-<a class="jxr_linenumber" name="L865" href="#L865">865</a> parentModel = resolveParent(childModel);
+<a class="jxr_linenumber" name="L832" href="#L832">832</a> resultModel = modelNormalizer.injectDefaultValues(resultModel, request, <strong class="jxr_keyword">this</strong>);
+<a class="jxr_linenumber" name="L833" href="#L833">833</a>
+<a class="jxr_linenumber" name="L834" href="#L834">834</a> <strong class="jxr_keyword">if</strong> (request.getRequestType() != ModelBuilderRequest.RequestType.DEPENDENCY) {
+<a class="jxr_linenumber" name="L835" href="#L835">835</a> <em class="jxr_comment">// plugins configuration</em>
+<a class="jxr_linenumber" name="L836" href="#L836">836</a> resultModel = pluginConfigurationExpander.expandPluginConfiguration(resultModel, request, <strong class="jxr_keyword">this</strong>);
+<a class="jxr_linenumber" name="L837" href="#L837">837</a> }
+<a class="jxr_linenumber" name="L838" href="#L838">838</a>
+<a class="jxr_linenumber" name="L839" href="#L839">839</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> transformer : transformers) {
+<a class="jxr_linenumber" name="L840" href="#L840">840</a> resultModel = transformer.transformEffectiveModel(resultModel);
+<a class="jxr_linenumber" name="L841" href="#L841">841</a> }
+<a class="jxr_linenumber" name="L842" href="#L842">842</a>
+<a class="jxr_linenumber" name="L843" href="#L843">843</a> result.setEffectiveModel(resultModel);
+<a class="jxr_linenumber" name="L844" href="#L844">844</a> <em class="jxr_comment">// Set the default relative path for the parent in the file model</em>
+<a class="jxr_linenumber" name="L845" href="#L845">845</a> <strong class="jxr_keyword">if</strong> (result.getFileModel().getParent() != <strong class="jxr_keyword">null</strong>
+<a class="jxr_linenumber" name="L846" href="#L846">846</a> && result.getFileModel().getParent().getRelativePath() == <strong class="jxr_keyword">null</strong>) {
+<a class="jxr_linenumber" name="L847" href="#L847">847</a> result.setFileModel(result.getFileModel()
+<a class="jxr_linenumber" name="L848" href="#L848">848</a> .withParent(result.getFileModel()
+<a class="jxr_linenumber" name="L849" href="#L849">849</a> .getParent()
+<a class="jxr_linenumber" name="L850" href="#L850">850</a> .withRelativePath(resultModel.getParent().getRelativePath())));
+<a class="jxr_linenumber" name="L851" href="#L851">851</a> }
+<a class="jxr_linenumber" name="L852" href="#L852">852</a>
+<a class="jxr_linenumber" name="L853" href="#L853">853</a> <em class="jxr_comment">// effective model validation</em>
+<a class="jxr_linenumber" name="L854" href="#L854">854</a> modelValidator.validateEffectiveModel(
+<a class="jxr_linenumber" name="L855" href="#L855">855</a> resultModel,
+<a class="jxr_linenumber" name="L856" href="#L856">856</a> request.getRequestType() == ModelBuilderRequest.RequestType.BUILD_POM
+<a class="jxr_linenumber" name="L857" href="#L857">857</a> ? ModelValidator.VALIDATION_LEVEL_STRICT
+<a class="jxr_linenumber" name="L858" href="#L858">858</a> : ModelValidator.VALIDATION_LEVEL_MINIMAL,
+<a class="jxr_linenumber" name="L859" href="#L859">859</a> request,
+<a class="jxr_linenumber" name="L860" href="#L860">860</a> <strong class="jxr_keyword">this</strong>);
+<a class="jxr_linenumber" name="L861" href="#L861">861</a>
+<a class="jxr_linenumber" name="L862" href="#L862">862</a> <strong class="jxr_keyword">if</strong> (hasErrors()) {
+<a class="jxr_linenumber" name="L863" href="#L863">863</a> <strong class="jxr_keyword">throw</strong> newModelBuilderException();
+<a class="jxr_linenumber" name="L864" href="#L864">864</a> }
+<a class="jxr_linenumber" name="L865" href="#L865">865</a> }
<a class="jxr_linenumber" name="L866" href="#L866">866</a>
-<a class="jxr_linenumber" name="L867" href="#L867">867</a> <strong class="jxr_keyword">if</strong> (!<span class="jxr_string">"pom"</span>.equals(parentModel.getPackaging())) {
-<a class="jxr_linenumber" name="L868" href="#L868">868</a> add(
-<a class="jxr_linenumber" name="L869" href="#L869">869</a> Severity.ERROR,
-<a class="jxr_linenumber" name="L870" href="#L870">870</a> Version.BASE,
-<a class="jxr_linenumber" name="L871" href="#L871">871</a> <span class="jxr_string">"Invalid packaging for parent POM "</span> + ModelProblemUtils.toSourceHint(parentModel)
-<a class="jxr_linenumber" name="L872" href="#L872">872</a> + <span class="jxr_string">", must be \"pom\" but is \""</span> + parentModel.getPackaging() + <span class="jxr_string">"\""</span>,
-<a class="jxr_linenumber" name="L873" href="#L873">873</a> parentModel.getLocation(<span class="jxr_string">"packaging"</span>));
-<a class="jxr_linenumber" name="L874" href="#L874">874</a> }
-<a class="jxr_linenumber" name="L875" href="#L875">875</a> result.setParentModel(parentModel);
-<a class="jxr_linenumber" name="L876" href="#L876">876</a> } <strong class="jxr_keyword">else</strong> {
-<a class="jxr_linenumber" name="L877" href="#L877">877</a> String superModelVersion = childModel.getModelVersion();
-<a class="jxr_linenumber" name="L878" href="#L878">878</a> <strong class="jxr_keyword">if</strong> (superModelVersion == <strong class="jxr_keyword">null</strong> || !VALID_MODEL_VERSIONS.contains(superModelVersion)) {
-<a class="jxr_linenumber" name="L879" href="#L879">879</a> <em class="jxr_comment">// Maven 3.x is always using 4.0.0 version to load the supermodel, so</em>
-<a class="jxr_linenumber" name="L880" href="#L880">880</a> <em class="jxr_comment">// do the same when loading a dependency. The model validator will also</em>
-<a class="jxr_linenumber" name="L881" href="#L881">881</a> <em class="jxr_comment">// check that field later.</em>
-<a class="jxr_linenumber" name="L882" href="#L882">882</a> superModelVersion = MODEL_VERSION_4_0_0;
-<a class="jxr_linenumber" name="L883" href="#L883">883</a> }
-<a class="jxr_linenumber" name="L884" href="#L884">884</a> parentModel = getSuperModel(superModelVersion);
-<a class="jxr_linenumber" name="L885" href="#L885">885</a> }
-<a class="jxr_linenumber" name="L886" href="#L886">886</a>
-<a class="jxr_linenumber" name="L887" href="#L887">887</a> <strong class="jxr_keyword">return</strong> parentModel;
-<a class="jxr_linenumber" name="L888" href="#L888">888</a> }
-<a class="jxr_linenumber" name="L889" href="#L889">889</a>
-<a class="jxr_linenumber" name="L890" href="#L890">890</a> <strong class="jxr_keyword">private</strong> Model resolveParent(Model childModel) {
-<a class="jxr_linenumber" name="L891" href="#L891">891</a> Model parentModel = <strong class="jxr_keyword">null</strong>;
-<a class="jxr_linenumber" name="L892" href="#L892">892</a> <strong class="jxr_keyword">if</strong> (request.getRequestType() == ModelBuilderRequest.RequestType.BUILD_POM
-<a class="jxr_linenumber" name="L893" href="#L893">893</a> || request.getRequestType() == ModelBuilderRequest.RequestType.CONSUMER_POM) {
-<a class="jxr_linenumber" name="L894" href="#L894">894</a> parentModel = readParentLocally(childModel);
-<a class="jxr_linenumber" name="L895" href="#L895">895</a> }
-<a class="jxr_linenumber" name="L896" href="#L896">896</a> <strong class="jxr_keyword">if</strong> (parentModel == <strong class="jxr_keyword">null</strong>) {
-<a class="jxr_linenumber" name="L897" href="#L897">897</a> parentModel = resolveAndReadParentExternally(childModel);
-<a class="jxr_linenumber" name="L898" href="#L898">898</a> }
-<a class="jxr_linenumber" name="L899" href="#L899">899</a> <strong class="jxr_keyword">return</strong> parentModel;
-<a class="jxr_linenumber" name="L900" href="#L900">900</a> }
-<a class="jxr_linenumber" name="L901" href="#L901">901</a>
-<a class="jxr_linenumber" name="L902" href="#L902">902</a> <strong class="jxr_keyword">private</strong> Model readParentLocally(Model childModel) <strong class="jxr_keyword">throws</strong> ModelBuilderException {
-<a class="jxr_linenumber" name="L903" href="#L903">903</a> ModelSource candidateSource = <strong class="jxr_keyword">null</strong>;
-<a class="jxr_linenumber" name="L904" href="#L904">904</a>
-<a class="jxr_linenumber" name="L905" href="#L905">905</a> Parent parent = childModel.getParent();
-<a class="jxr_linenumber" name="L906" href="#L906">906</a> String parentPath = parent.getRelativePath();
-<a class="jxr_linenumber" name="L907" href="#L907">907</a> <strong class="jxr_keyword">if</strong> (parentPath != <strong class="jxr_keyword">null</strong> && !parentPath.isEmpty()) {
-<a class="jxr_linenumber" name="L908" href="#L908">908</a> candidateSource = request.getSource().resolve(modelProcessor::locateExistingPom, parentPath);
-<a class="jxr_linenumber" name="L909" href="#L909">909</a> <strong class="jxr_keyword">if</strong> (candidateSource == <strong class="jxr_keyword">null</strong>) {
-<a class="jxr_linenumber" name="L910" href="#L910">910</a> wrongParentRelativePath(childModel);
-<a class="jxr_linenumber" name="L911" href="#L911">911</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">null</strong>;
-<a class="jxr_linenumber" name="L912" href="#L912">912</a> }
-<a class="jxr_linenumber" name="L913" href="#L913">913</a> }
-<a class="jxr_linenumber" name="L914" href="#L914">914</a> <strong class="jxr_keyword">if</strong> (candidateSource == <strong class="jxr_keyword">null</strong>) {
-<a class="jxr_linenumber" name="L915" href="#L915">915</a> candidateSource = resolveReactorModel(parent.getGroupId(), parent.getArtifactId(), parent.getVersion());
-<a class="jxr_linenumber" name="L916" href="#L916">916</a> }
-<a class="jxr_linenumber" name="L917" href="#L917">917</a> <strong class="jxr_keyword">if</strong> (candidateSource == <strong class="jxr_keyword">null</strong>) {
-<a class="jxr_linenumber" name="L918" href="#L918">918</a> candidateSource = request.getSource().resolve(modelProcessor::locateExistingPom, <span class="jxr_string">".."</span>);
-<a class="jxr_linenumber" name="L919" href="#L919">919</a> }
-<a class="jxr_linenumber" name="L920" href="#L920">920</a>
+<a class="jxr_linenumber" name="L867" href="#L867">867</a> Model readParent(Model childModel) <strong class="jxr_keyword">throws</strong> ModelBuilderException {
+<a class="jxr_linenumber" name="L868" href="#L868">868</a> Model parentModel;
+<a class="jxr_linenumber" name="L869" href="#L869">869</a>
+<a class="jxr_linenumber" name="L870" href="#L870">870</a> Parent parent = childModel.getParent();
+<a class="jxr_linenumber" name="L871" href="#L871">871</a> <strong class="jxr_keyword">if</strong> (parent != <strong class="jxr_keyword">null</strong>) {
+<a class="jxr_linenumber" name="L872" href="#L872">872</a> parentModel = resolveParent(childModel);
+<a class="jxr_linenumber" name="L873" href="#L873">873</a>
+<a class="jxr_linenumber" name="L874" href="#L874">874</a> <strong class="jxr_keyword">if</strong> (!<span class="jxr_string">"pom"</span>.equals(parentModel.getPackaging())) {
+<a class="jxr_linenumber" name="L875" href="#L875">875</a> add(
+<a class="jxr_linenumber" name="L876" href="#L876">876</a> Severity.ERROR,
+<a class="jxr_linenumber" name="L877" href="#L877">877</a> Version.BASE,
+<a class="jxr_linenumber" name="L878" href="#L878">878</a> <span class="jxr_string">"Invalid packaging for parent POM "</span> + ModelProblemUtils.toSourceHint(parentModel)
+<a class="jxr_linenumber" name="L879" href="#L879">879</a> + <span class="jxr_string">", must be \"pom\" but is \""</span> + parentModel.getPackaging() + <span class="jxr_string">"\""</span>,
[... 2043 lines stripped ...]