From ad88938fb0d891bb75e45121ca1dd739a257bed1 Mon Sep 17 00:00:00 2001 From: Guillaume Nodet Date: Fri, 6 Sep 2024 18:37:28 +0200 Subject: [PATCH] Cleanup --- .../impl/model/DefaultModelBuilder.java | 415 +++++++----------- 1 file changed, 154 insertions(+), 261 deletions(-) diff --git a/maven-api-impl/src/main/java/org/apache/maven/internal/impl/model/DefaultModelBuilder.java b/maven-api-impl/src/main/java/org/apache/maven/internal/impl/model/DefaultModelBuilder.java index c11fbfc428df..a67f305a92dc 100644 --- a/maven-api-impl/src/main/java/org/apache/maven/internal/impl/model/DefaultModelBuilder.java +++ b/maven-api-impl/src/main/java/org/apache/maven/internal/impl/model/DefaultModelBuilder.java @@ -218,14 +218,15 @@ protected final class ModelBuilderSession implements ModelProblemCollector { final DefaultModelBuilderResult result; final ModelCache cache; final Graph dag; - final Map modelByPath; - final Map modelByGA; final Map> mappedSources; - final RepositoryHolder repositoryHolder; - private String source; - private Model sourceModel; - private Model rootModel; + String source; + Model sourceModel; + Model rootModel; + + List pomRepositories; + List externalRepositories; + List repositories; private Set severities = EnumSet.noneOf(ModelProblem.Severity.class); @@ -250,16 +251,7 @@ protected final class ModelBuilderSession implements ModelProblemCollector { ModelBuilderSession( Session session, ModelBuilderRequest request, DefaultModelBuilderResult result, ModelCache cache) { - this( - session, - request, - result, - cache, - new Graph(), - new ConcurrentHashMap<>(64), - new ConcurrentHashMap<>(64), - new ConcurrentHashMap<>(64), - null); + this(session, request, result, cache, new Graph(), new ConcurrentHashMap<>(64), null, null, null); } @SuppressWarnings("checkstyle:ParameterNumber") @@ -269,37 +261,49 @@ private ModelBuilderSession( DefaultModelBuilderResult result, ModelCache cache, Graph dag, - Map modelByPath, - Map modelByGA, Map> mappedSources, - RepositoryHolder repositoryHolder) { + List pomRepositories, + List externalRepositories, + List repositories) { this.session = session; this.request = request; this.result = result; this.cache = cache; this.dag = dag; - this.modelByPath = modelByPath; - this.modelByGA = modelByGA; this.mappedSources = mappedSources; - this.repositoryHolder = repositoryHolder != null - ? repositoryHolder - : new RepositoryHolder( - request.getRepositories() != null - ? request.getRepositories() - : session.getRemoteRepositories()); + if (pomRepositories == null) { + this.pomRepositories = List.of(); + this.externalRepositories = List.copyOf( + request.getRepositories() != null + ? request.getRepositories() + : session.getRemoteRepositories()); + this.repositories = this.externalRepositories; + } else { + this.pomRepositories = pomRepositories; + this.externalRepositories = externalRepositories; + this.repositories = repositories; + } this.result.getProblems().forEach(p -> severities.add(p.getSeverity())); } + public ModelBuilderSession derive(ModelSource source) { + return derive(ModelBuilderRequest.build(request, source)); + } + public ModelBuilderSession derive(ModelBuilderRequest request) { if (session != request.getSession()) { throw new IllegalArgumentException("Session mismatch"); } return new ModelBuilderSession( - session, request, result, cache, dag, modelByPath, modelByGA, mappedSources, repositoryHolder); - } - - public ModelBuilderSession derive(ModelSource source) { - return derive(ModelBuilderRequest.build(request, source)); + session, + request, + result, + cache, + dag, + mappedSources, + pomRepositories, + externalRepositories, + repositories); } public Session session() { @@ -327,74 +331,7 @@ public String toString() { + cache + ']'; } - static class Holder { - private volatile boolean set; - private volatile Model model; - - Holder(Model model) { - this.model = requireNonNull(model); - this.set = true; - } - - public static Model deref(Holder holder) { - return holder != null ? holder.get() : null; - } - - public Model get() { - if (!set) { - synchronized (this) { - if (!set) { - try { - this.wait(); - } catch (InterruptedException e) { - // Ignore - } - } - } - } - return model; - } - - public Model computeIfAbsent(Supplier supplier) { - if (!set) { - synchronized (this) { - if (!set) { - this.set = true; - this.model = supplier.get(); - this.notifyAll(); - } - } - } - return model; - } - } - - public Model getRawModel(Path from, String gId, String aId) { - Model model = findRawModel(from, gId, aId); - if (model != null) { - modelByGA.put(new GAKey(gId, aId), new Holder(model)); - if (model.getPomFile() != null) { - modelByPath.put(model.getPomFile(), new Holder(model)); - } - } - return model; - } - - public Model getRawModel(Path from, Path path) { - Model model = findRawModel(from, path); - if (model != null) { - String groupId = getGroupId(model); - modelByGA.put(new GAKey(groupId, model.getArtifactId()), new Holder(model)); - modelByPath.put(path, new Holder(model)); - } - return model; - } - - public Path locate(Path path) { - return getModelProcessor().locateExistingPom(path); - } - - private Model findRawModel(Path from, String groupId, String artifactId) { + public Model getRawModel(Path from, String groupId, String artifactId) { ModelSource source = getSource(groupId, artifactId); if (source == null) { // we need to check the whole reactor in case it's a dependency @@ -414,6 +351,21 @@ private Model findRawModel(Path from, String groupId, String artifactId) { return null; } + public Model getRawModel(Path from, Path path) { + if (!Files.isRegularFile(path)) { + throw new IllegalArgumentException("Not a regular file: " + path); + } + if (!addEdge(from, path)) { + return null; + } + try { + return readRawModel(derive(ModelSource.fromPath(path))); + } catch (ModelBuilderException e) { + // gathered with problem collector + } + return null; + } + private void loadFullReactor() { if (!fullReactorLoaded) { synchronized (this) { @@ -458,21 +410,6 @@ private void doLoadFullReactor() { } } - private Model findRawModel(Path from, Path p) { - if (!Files.isRegularFile(p)) { - throw new IllegalArgumentException("Not a regular file: " + p); - } - if (!addEdge(from, p)) { - return null; - } - try { - return readRawModel(derive(ModelSource.fromPath(p))); - } catch (ModelBuilderException e) { - // gathered with problem collector - } - return null; - } - private boolean addEdge(Path from, Path p) { try { dag.addEdge(from.toString(), p.toString()); @@ -647,90 +584,124 @@ public ModelBuilderException newModelBuilderException() { return new ModelBuilderException(result); } - List getRepositories() { - return repositoryHolder.getRepositories(); + public List getRepositories() { + return repositories; } - void mergeRepositories(List repositories, boolean replace) { - repositoryHolder.mergeRepositories(repositories, replace); - } + /** + * TODO: this is not thread safe and the session is mutated + */ + public void mergeRepositories(List toAdd, boolean replace) { + List repos = + toAdd.stream().map(session::createRemoteRepository).toList(); + if (replace) { + Set ids = repos.stream().map(RemoteRepository::getId).collect(Collectors.toSet()); + repositories = repositories.stream() + .filter(r -> !ids.contains(r.getId())) + .toList(); + pomRepositories = pomRepositories.stream() + .filter(r -> !ids.contains(r.getId())) + .toList(); + } else { + Set ids = + pomRepositories.stream().map(RemoteRepository::getId).collect(Collectors.toSet()); + repos = repos.stream().filter(r -> !ids.contains(r.getId())).toList(); + } - class RepositoryHolder { + RepositoryFactory repositoryFactory = session.getService(RepositoryFactory.class); + if (request.getRepositoryMerging() == ModelBuilderRequest.RepositoryMerging.REQUEST_DOMINANT) { + repositories = repositoryFactory.aggregate(session, repositories, repos, true); + pomRepositories = repositories; + } else { + pomRepositories = repositoryFactory.aggregate(session, pomRepositories, repos, true); + repositories = repositoryFactory.aggregate(session, pomRepositories, externalRepositories, false); + } + } - List pomRepositories; - List repositories; - List externalRepositories; + /** + * ModelSourceTransformer for the build pom + * + * @param model + * @param path + */ + public Model transform(Model model, Path path) { + Model.Builder builder = Model.newBuilder(model); + handleParent(model, path, builder); + handleReactorDependencies(model, path, builder); + return builder.build(); + } - RepositoryHolder(List externalRepositories) { - this.pomRepositories = List.of(); - this.externalRepositories = List.copyOf(externalRepositories); - this.repositories = List.copyOf(externalRepositories); - } - - RepositoryHolder(RepositoryHolder holder) { - this.pomRepositories = List.copyOf(holder.pomRepositories); - this.externalRepositories = List.copyOf(holder.externalRepositories); - this.repositories = List.copyOf(holder.repositories); - } - - public void mergeRepositories(List toAdd, boolean replace) { - List repos = - toAdd.stream().map(session::createRemoteRepository).toList(); - if (replace) { - Set ids = - repos.stream().map(RemoteRepository::getId).collect(Collectors.toSet()); - repositories = repositories.stream() - .filter(r -> !ids.contains(r.getId())) - .toList(); - pomRepositories = pomRepositories.stream() - .filter(r -> !ids.contains(r.getId())) - .toList(); - } else { - Set ids = pomRepositories.stream() - .map(RemoteRepository::getId) - .collect(Collectors.toSet()); - repos = repos.stream().filter(r -> !ids.contains(r.getId())).toList(); + // + // Infer parent information + // + void handleParent(Model model, Path pomFile, Model.Builder builder) { + Parent parent = model.getParent(); + if (parent != null) { + String version = parent.getVersion(); + String path = Optional.ofNullable(parent.getRelativePath()).orElse(".."); + if (version == null && !path.isEmpty()) { + Optional resolvedParent = + resolveRelativePath(pomFile, Paths.get(path), parent.getGroupId(), parent.getArtifactId()); + if (resolvedParent.isPresent()) { + version = resolvedParent.get().version(); + } } + builder.parent(parent.withVersion(version)); + } + } - RepositoryFactory repositoryFactory = session.getService(RepositoryFactory.class); - if (request.getRepositoryMerging() == ModelBuilderRequest.RepositoryMerging.REQUEST_DOMINANT) { - repositories = repositoryFactory.aggregate(session, repositories, repos, true); - pomRepositories = repositories; - } else { - pomRepositories = repositoryFactory.aggregate(session, pomRepositories, repos, true); - repositories = repositoryFactory.aggregate(session, pomRepositories, externalRepositories, false); + // + // Infer inner reactor dependencies version + // + void handleReactorDependencies(Model model, Path pomFile, Model.Builder builder) { + List newDeps = new ArrayList<>(); + boolean modified = false; + for (Dependency dep : model.getDependencies()) { + if (dep.getVersion() == null) { + Model depModel = getRawModel(model.getPomFile(), dep.getGroupId(), dep.getArtifactId()); + if (depModel != null) { + String v = depModel.getVersion(); + if (v == null && depModel.getParent() != null) { + v = depModel.getParent().getVersion(); + } + dep = dep.withVersion(v); + modified = true; + } } + newDeps.add(dep); + } + if (modified) { + builder.dependencies(newDeps); } + } - public List getRepositories() { - return repositories; + protected Optional resolveRelativePath( + Path pomFile, Path relativePath, String groupId, String artifactId) { + Path pomPath = pomFile.resolveSibling(relativePath).normalize(); + if (Files.isDirectory(pomPath)) { + pomPath = getModelProcessor().locateExistingPom(pomPath); } - public RepositoryHolder copy() { - return new RepositoryHolder(this); + if (pomPath == null || !Files.isRegularFile(pomPath)) { + return Optional.empty(); } - } - } - DefaultModelProblemCollector newCollector(DefaultModelBuilderResult result) { - return new DefaultModelProblemCollector(result); + Optional mappedProject = Optional.ofNullable(getRawModel(pomFile, pomPath.normalize())) + .map(DefaultModelBuilder::toRelativeProject); + + if (mappedProject.isPresent()) { + RelativeProject project = mappedProject.get(); + + if (Objects.equals(groupId, project.groupId()) && Objects.equals(artifactId, project.artifactId())) { + return mappedProject; + } + } + return Optional.empty(); + } } private static ModelBuilderRequest fillRequestDefaults(ModelBuilderRequest request) { ModelBuilderRequest.ModelBuilderRequestBuilder builder = ModelBuilderRequest.builder(request); - // if (request.getModelCache() == null) { - // builder.modelCache(new DefaultModelCache()); - // } - // if (getModelRepositoryHolder(request) == null) { - // builder.modelRepositoryHolder(new DefaultModelRepositoryHolder( - // request.getSession(), - // request.getRepositoryMerging() != null - // ? request.getRepositoryMerging() - // : ModelBuilderRequest.RepositoryMerging.POM_DOMINANT, - // request.getRepositories() != null - // ? request.getRepositories() - // : request.getSession().getRemoteRepositories())); - // } if (request.getModelResolver() == null) { builder.modelResolver(new DefaultModelResolver()); } @@ -1268,7 +1239,7 @@ private Model doReadFileModel(ModelBuilderSession build) throws ModelBuilderExce request, build); if (hasFatalErrors(build)) { - throw ((ModelProblemCollector) build).newModelBuilderException(); + throw build.newModelBuilderException(); } return model; @@ -1287,7 +1258,7 @@ private Model doReadRawModel(ModelBuilderSession build) throws ModelBuilderExcep Path pomFile = modelSource.getPath(); try { - rawModel = this.transform(build, rawModel, pomFile); + rawModel = build.transform(rawModel, pomFile); } catch (ModelTransformerException e) { build.add(Severity.FATAL, ModelProblem.Version.V40, null, e); } @@ -1964,84 +1935,6 @@ private static ModelResolver getModelResolver(ModelBuilderRequest request) { return request.getModelResolver(); } - /** - * ModelSourceTransformer for the build pom - */ - public Model transform(ModelBuilderSession build, Model model, Path path) { - Model.Builder builder = Model.newBuilder(model); - handleParent(build, model, path, builder); - handleReactorDependencies(build, model, path, builder); - return builder.build(); - } - - // - // Infer parent information - // - void handleParent(ModelBuilderSession build, Model model, Path pomFile, Model.Builder builder) { - Parent parent = model.getParent(); - if (parent != null) { - String version = parent.getVersion(); - String path = Optional.ofNullable(parent.getRelativePath()).orElse(".."); - if (version == null && !path.isEmpty()) { - Optional resolvedParent = resolveRelativePath( - pomFile, build, Paths.get(path), parent.getGroupId(), parent.getArtifactId()); - if (resolvedParent.isPresent()) { - version = resolvedParent.get().version(); - } - } - builder.parent(parent.withVersion(version)); - } - } - - // - // Infer inner reactor dependencies version - // - void handleReactorDependencies(ModelBuilderSession build, Model model, Path pomFile, Model.Builder builder) { - List newDeps = new ArrayList<>(); - boolean modified = false; - for (Dependency dep : model.getDependencies()) { - if (dep.getVersion() == null) { - Model depModel = build.getRawModel(model.getPomFile(), dep.getGroupId(), dep.getArtifactId()); - if (depModel != null) { - String v = depModel.getVersion(); - if (v == null && depModel.getParent() != null) { - v = depModel.getParent().getVersion(); - } - dep = dep.withVersion(v); - modified = true; - } - } - newDeps.add(dep); - } - if (modified) { - builder.dependencies(newDeps); - } - } - - protected Optional resolveRelativePath( - Path pomFile, ModelBuilderSession build, Path relativePath, String groupId, String artifactId) { - Path pomPath = pomFile.resolveSibling(relativePath).normalize(); - if (Files.isDirectory(pomPath)) { - pomPath = build.locate(pomPath); - } - - if (pomPath == null || !Files.isRegularFile(pomPath)) { - return Optional.empty(); - } - - Optional mappedProject = Optional.ofNullable(build.getRawModel(pomFile, pomPath.normalize())) - .map(DefaultModelBuilder::toRelativeProject); - - if (mappedProject.isPresent()) { - RelativeProject project = mappedProject.get(); - - if (Objects.equals(groupId, project.groupId()) && Objects.equals(artifactId, project.artifactId())) { - return mappedProject; - } - } - return Optional.empty(); - } - private static RelativeProject toRelativeProject(final Model m) { String groupId = m.getGroupId(); if (groupId == null && m.getParent() != null) {