public ResolutionGroup retrieve()

in compat/maven-compat/src/main/java/org/apache/maven/project/artifact/MavenMetadataSource.java [153:286]


    public ResolutionGroup retrieve(MetadataResolutionRequest request) throws ArtifactMetadataRetrievalException {
        Artifact artifact = request.getArtifact();

        //
        // If we have a system scoped artifact, then we do not want any searching in local or remote repositories,
        // and we want artifact resolution to only return the system scoped artifact itself.
        //
        if (artifact.getScope() != null && artifact.getScope().equals(Artifact.SCOPE_SYSTEM)) {
            return new ResolutionGroup(null, null, null);
        }

        ResolutionGroup cached = cache.get(
                artifact,
                request.isResolveManagedVersions(),
                request.getLocalRepository(),
                request.getRemoteRepositories());

        if (cached != null
                // if the POM has no file, we cached a missing artifact, only return the cached data if no update forced
                && (!request.isForceUpdate() || hasFile(cached.getPomArtifact()))) {
            return cached;
        }

        List<Dependency> dependencies;

        List<Dependency> managedDependencies = null;

        List<ArtifactRepository> pomRepositories = null;

        Artifact pomArtifact;

        Artifact relocatedArtifact = null;

        // TODO hack: don't rebuild model if it was already loaded during reactor resolution
        RepositorySystemSession repositorySession = legacySupport.getRepositorySession();
        final WorkspaceReader workspace = repositorySession.getWorkspaceReader();
        Model model;
        if (workspace instanceof MavenWorkspaceReader mavenWorkspaceReader) {
            model = mavenWorkspaceReader.findModel(RepositoryUtils.toArtifact(artifact));
        } else {
            model = null;
        }

        if (model != null) {
            pomArtifact = artifact;
            dependencies = model.getDependencies();
            DependencyManagement dependencyManagement = model.getDependencyManagement();
            managedDependencies = dependencyManagement == null ? null : dependencyManagement.getDependencies();
            MavenSession session = legacySupport.getSession();
            if (session != null) {
                if (session.getProjects() != null) {
                    pomRepositories = session.getProjects().stream()
                            .filter(p -> artifact.equals(p.getArtifact()))
                            .map(MavenProject::getRemoteArtifactRepositories)
                            .findFirst()
                            .orElseGet(() -> getRepositoriesFromModel(repositorySession, model));
                } else {
                    pomRepositories = getRepositoriesFromModel(repositorySession, model);
                }
            } else {
                pomRepositories = new ArrayList<>();
            }
        } else if (artifact instanceof ArtifactWithDependencies artifactWithDependencies) {
            pomArtifact = artifact;

            dependencies = artifactWithDependencies.getDependencies();

            managedDependencies = artifactWithDependencies.getManagedDependencies();
        } else {
            ProjectRelocation rel = retrieveRelocatedProject(artifact, request);

            if (rel == null) {
                return null;
            }

            pomArtifact = rel.pomArtifact;

            relocatedArtifact = rel.relocatedArtifact;

            if (rel.project == null) {
                // When this happens we have a Maven 1.x POM, or some invalid POM.
                // It should have never found its way into Maven 2.x repository, but it did.
                dependencies = Collections.emptyList();
            } else {
                dependencies = rel.project.getModel().getDependencies();

                DependencyManagement depMgmt = rel.project.getModel().getDependencyManagement();
                managedDependencies = (depMgmt != null) ? depMgmt.getDependencies() : null;

                pomRepositories = rel.project.getRemoteArtifactRepositories();
            }
        }

        Set<Artifact> artifacts = Collections.emptySet();

        if (!artifact.getArtifactHandler().isIncludesDependencies()) {
            artifacts = new LinkedHashSet<>();

            for (Dependency dependency : dependencies) {
                Artifact dependencyArtifact = createDependencyArtifact(dependency, artifact, pomArtifact);

                if (dependencyArtifact != null) {
                    artifacts.add(dependencyArtifact);
                }
            }
        }

        Map<String, Artifact> managedVersions = null;

        if (managedDependencies != null && request.isResolveManagedVersions()) {
            managedVersions = new HashMap<>();

            for (Dependency managedDependency : managedDependencies) {
                Artifact managedArtifact = createDependencyArtifact(managedDependency, null, pomArtifact);

                managedVersions.put(managedDependency.getManagementKey(), managedArtifact);
            }
        }

        List<ArtifactRepository> aggregatedRepositories =
                aggregateRepositories(request.getRemoteRepositories(), pomRepositories);

        ResolutionGroup result =
                new ResolutionGroup(pomArtifact, relocatedArtifact, artifacts, managedVersions, aggregatedRepositories);

        cache.put(
                artifact,
                request.isResolveManagedVersions(),
                request.getLocalRepository(),
                request.getRemoteRepositories(),
                result);

        return result;
    }