This is an automated email from the ASF dual-hosted git repository.

cstamas pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/maven-resolver.git


The following commit(s) were added to refs/heads/master by this push:
     new 1acec9ba [MRESOLVER-373] Partially undo MRESOLVER-346 (#302)
1acec9ba is described below

commit 1acec9baf6fcb8eb010d64e8009778a13a88d38e
Author: Tamas Cservenak <[email protected]>
AuthorDate: Tue Jun 20 14:52:09 2023 +0200

    [MRESOLVER-373] Partially undo MRESOLVER-346 (#302)
    
    In change 4c5e9ea98f8815c6df8bf26baa9032c8d9cd5f2d we introduced code that 
in some case tries illegal "lock upgrade", that due lack of MRESOLVER-220 went 
unnoticed.
    
    This change merely undoes the changes for DefaultArtifactResolver and 
DefaultMetadataResolver (will as before, use exclusive SyncContext immediately, 
not be "optimistic"), while change for DefaultDeploy is still correct.
    
    ---
    
    https://issues.apache.org/jira/browse/MRESOLVER-373
---
 .../internal/impl/DefaultArtifactResolver.java     | 334 ++++++++++----------
 .../internal/impl/DefaultMetadataResolver.java     | 346 ++++++++++-----------
 2 files changed, 325 insertions(+), 355 deletions(-)

diff --git 
a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultArtifactResolver.java
 
b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultArtifactResolver.java
index a77ab906..252e1821 100644
--- 
a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultArtifactResolver.java
+++ 
b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultArtifactResolver.java
@@ -247,8 +247,7 @@ public class DefaultArtifactResolver implements 
ArtifactResolver, Service {
             throws ArtifactResolutionException {
         requireNonNull(session, "session cannot be null");
         requireNonNull(requests, "requests cannot be null");
-        try (SyncContext shared = syncContextFactory.newInstance(session, 
true);
-                SyncContext exclusive = 
syncContextFactory.newInstance(session, false)) {
+        try (SyncContext exclusive = syncContextFactory.newInstance(session, 
false)) {
             Collection<Artifact> artifacts = new ArrayList<>(requests.size());
             for (ArtifactRequest request : requests) {
                 if 
(request.getArtifact().getProperty(ArtifactProperties.LOCAL_PATH, null) != 
null) {
@@ -257,225 +256,212 @@ public class DefaultArtifactResolver implements 
ArtifactResolver, Service {
                 artifacts.add(request.getArtifact());
             }
 
-            return resolve(shared, exclusive, artifacts, session, requests);
+            return resolve(exclusive, artifacts, session, requests);
         }
     }
 
     @SuppressWarnings("checkstyle:methodlength")
     private List<ArtifactResult> resolve(
-            SyncContext shared,
-            SyncContext exclusive,
+            SyncContext syncContext,
             Collection<Artifact> subjects,
             RepositorySystemSession session,
             Collection<? extends ArtifactRequest> requests)
             throws ArtifactResolutionException {
-        SyncContext current = shared;
         try {
-            while (true) {
-                current.acquire(subjects, null);
-
-                boolean failures = false;
-                final List<ArtifactResult> results = new 
ArrayList<>(requests.size());
-                final boolean simpleLrmInterop = 
ConfigUtils.getBoolean(session, false, CONFIG_PROP_SIMPLE_LRM_INTEROP);
-                final LocalRepositoryManager lrm = 
session.getLocalRepositoryManager();
-                final WorkspaceReader workspace = session.getWorkspaceReader();
-                final List<ResolutionGroup> groups = new ArrayList<>();
-                // filter != null: means "filtering applied", if null no 
filtering applied (behave as before)
-                final RemoteRepositoryFilter filter = 
remoteRepositoryFilterManager.getRemoteRepositoryFilter(session);
-
-                for (ArtifactRequest request : requests) {
-                    RequestTrace trace = 
RequestTrace.newChild(request.getTrace(), request);
+            syncContext.acquire(subjects, null);
+
+            boolean failures = false;
+            final List<ArtifactResult> results = new 
ArrayList<>(requests.size());
+            final boolean simpleLrmInterop = ConfigUtils.getBoolean(session, 
false, CONFIG_PROP_SIMPLE_LRM_INTEROP);
+            final LocalRepositoryManager lrm = 
session.getLocalRepositoryManager();
+            final WorkspaceReader workspace = session.getWorkspaceReader();
+            final List<ResolutionGroup> groups = new ArrayList<>();
+            // filter != null: means "filtering applied", if null no filtering 
applied (behave as before)
+            final RemoteRepositoryFilter filter = 
remoteRepositoryFilterManager.getRemoteRepositoryFilter(session);
+
+            for (ArtifactRequest request : requests) {
+                RequestTrace trace = RequestTrace.newChild(request.getTrace(), 
request);
 
-                    ArtifactResult result = new ArtifactResult(request);
-                    results.add(result);
+                ArtifactResult result = new ArtifactResult(request);
+                results.add(result);
 
-                    Artifact artifact = request.getArtifact();
+                Artifact artifact = request.getArtifact();
 
-                    if (current == shared) {
-                        artifactResolving(session, trace, artifact);
+                artifactResolving(session, trace, artifact);
+
+                String localPath = 
artifact.getProperty(ArtifactProperties.LOCAL_PATH, null);
+                if (localPath != null) {
+                    // unhosted artifact, just validate file
+                    File file = new File(localPath);
+                    if (!file.isFile()) {
+                        failures = true;
+                        result.addException(new 
ArtifactNotFoundException(artifact, null));
+                    } else {
+                        artifact = artifact.setFile(file);
+                        result.setArtifact(artifact);
+                        artifactResolved(session, trace, artifact, null, 
result.getExceptions());
                     }
+                    continue;
+                }
 
-                    String localPath = 
artifact.getProperty(ArtifactProperties.LOCAL_PATH, null);
-                    if (localPath != null) {
-                        // unhosted artifact, just validate file
-                        File file = new File(localPath);
-                        if (!file.isFile()) {
-                            failures = true;
-                            result.addException(new 
ArtifactNotFoundException(artifact, null));
-                        } else {
-                            artifact = artifact.setFile(file);
-                            result.setArtifact(artifact);
-                            artifactResolved(session, trace, artifact, null, 
result.getExceptions());
+                List<RemoteRepository> remoteRepositories = 
request.getRepositories();
+                List<RemoteRepository> filteredRemoteRepositories = new 
ArrayList<>(remoteRepositories);
+                if (filter != null) {
+                    for (RemoteRepository repository : remoteRepositories) {
+                        RemoteRepositoryFilter.Result filterResult = 
filter.acceptArtifact(repository, artifact);
+                        if (!filterResult.isAccepted()) {
+                            result.addException(
+                                    new ArtifactFilteredOutException(artifact, 
repository, filterResult.reasoning()));
+                            filteredRemoteRepositories.remove(repository);
                         }
-                        continue;
                     }
+                }
 
-                    List<RemoteRepository> remoteRepositories = 
request.getRepositories();
-                    List<RemoteRepository> filteredRemoteRepositories = new 
ArrayList<>(remoteRepositories);
-                    if (filter != null) {
-                        for (RemoteRepository repository : remoteRepositories) 
{
-                            RemoteRepositoryFilter.Result filterResult = 
filter.acceptArtifact(repository, artifact);
-                            if (!filterResult.isAccepted()) {
-                                result.addException(new 
ArtifactFilteredOutException(
-                                        artifact, repository, 
filterResult.reasoning()));
-                                filteredRemoteRepositories.remove(repository);
-                            }
-                        }
+                VersionResult versionResult;
+                try {
+                    VersionRequest versionRequest =
+                            new VersionRequest(artifact, 
filteredRemoteRepositories, request.getRequestContext());
+                    versionRequest.setTrace(trace);
+                    versionResult = versionResolver.resolveVersion(session, 
versionRequest);
+                } catch (VersionResolutionException e) {
+                    result.addException(e);
+                    continue;
+                }
+
+                artifact = artifact.setVersion(versionResult.getVersion());
+
+                if (versionResult.getRepository() != null) {
+                    if (versionResult.getRepository() instanceof 
RemoteRepository) {
+                        filteredRemoteRepositories =
+                                Collections.singletonList((RemoteRepository) 
versionResult.getRepository());
+                    } else {
+                        filteredRemoteRepositories = Collections.emptyList();
                     }
+                }
 
-                    VersionResult versionResult;
-                    try {
-                        VersionRequest versionRequest =
-                                new VersionRequest(artifact, 
filteredRemoteRepositories, request.getRequestContext());
-                        versionRequest.setTrace(trace);
-                        versionResult = 
versionResolver.resolveVersion(session, versionRequest);
-                    } catch (VersionResolutionException e) {
-                        result.addException(e);
+                if (workspace != null) {
+                    File file = workspace.findArtifact(artifact);
+                    if (file != null) {
+                        artifact = artifact.setFile(file);
+                        result.setArtifact(artifact);
+                        result.setRepository(workspace.getRepository());
+                        artifactResolved(session, trace, artifact, 
result.getRepository(), null);
                         continue;
                     }
+                }
 
-                    artifact = artifact.setVersion(versionResult.getVersion());
-
-                    if (versionResult.getRepository() != null) {
-                        if (versionResult.getRepository() instanceof 
RemoteRepository) {
-                            filteredRemoteRepositories =
-                                    
Collections.singletonList((RemoteRepository) versionResult.getRepository());
-                        } else {
-                            filteredRemoteRepositories = 
Collections.emptyList();
-                        }
+                LocalArtifactResult local = lrm.find(
+                        session,
+                        new LocalArtifactRequest(artifact, 
filteredRemoteRepositories, request.getRequestContext()));
+                result.setLocalArtifactResult(local);
+                boolean found = (filter != null && local.isAvailable()) || 
isLocallyInstalled(local, versionResult);
+                // with filtering it is availability that drives logic
+                // without filtering it is simply presence of file that drives 
the logic
+                // "interop" logic with simple LRM leads to RRF breakage: 
hence is ignored when filtering in effect
+                if (found) {
+                    if (local.getRepository() != null) {
+                        result.setRepository(local.getRepository());
+                    } else {
+                        result.setRepository(lrm.getRepository());
                     }
 
-                    if (workspace != null) {
-                        File file = workspace.findArtifact(artifact);
-                        if (file != null) {
-                            artifact = artifact.setFile(file);
-                            result.setArtifact(artifact);
-                            result.setRepository(workspace.getRepository());
-                            artifactResolved(session, trace, artifact, 
result.getRepository(), null);
-                            continue;
-                        }
+                    try {
+                        artifact = artifact.setFile(getFile(session, artifact, 
local.getFile()));
+                        result.setArtifact(artifact);
+                        artifactResolved(session, trace, artifact, 
result.getRepository(), null);
+                    } catch (ArtifactTransferException e) {
+                        result.addException(e);
+                    }
+                    if (filter == null && simpleLrmInterop && 
!local.isAvailable()) {
+                        /*
+                         * NOTE: Interop with simple local repository: An 
artifact installed by a simple local repo
+                         * manager will not show up in the repository tracking 
file of the enhanced local repository.
+                         * If however the maven-metadata-local.xml tells us 
the artifact was installed locally, we
+                         * sync the repository tracking file.
+                         */
+                        lrm.add(session, new 
LocalArtifactRegistration(artifact));
                     }
 
-                    LocalArtifactResult local = lrm.find(
-                            session,
-                            new LocalArtifactRequest(
-                                    artifact, filteredRemoteRepositories, 
request.getRequestContext()));
-                    result.setLocalArtifactResult(local);
-                    boolean found = (filter != null && local.isAvailable()) || 
isLocallyInstalled(local, versionResult);
-                    // with filtering it is availability that drives logic
-                    // without filtering it is simply presence of file that 
drives the logic
-                    // "interop" logic with simple LRM leads to RRF breakage: 
hence is ignored when filtering in effect
-                    if (found) {
-                        if (local.getRepository() != null) {
-                            result.setRepository(local.getRepository());
-                        } else {
-                            result.setRepository(lrm.getRepository());
-                        }
+                    continue;
+                }
 
-                        try {
-                            artifact = artifact.setFile(getFile(session, 
artifact, local.getFile()));
-                            result.setArtifact(artifact);
-                            artifactResolved(session, trace, artifact, 
result.getRepository(), null);
-                        } catch (ArtifactTransferException e) {
-                            result.addException(e);
-                        }
-                        if (filter == null && simpleLrmInterop && 
!local.isAvailable()) {
-                            /*
-                             * NOTE: Interop with simple local repository: An 
artifact installed by a simple local repo
-                             * manager will not show up in the repository 
tracking file of the enhanced local repository.
-                             * If however the maven-metadata-local.xml tells 
us the artifact was installed locally, we
-                             * sync the repository tracking file.
-                             */
-                            lrm.add(session, new 
LocalArtifactRegistration(artifact));
-                        }
+                if (local.getFile() != null) {
+                    LOGGER.info(
+                            "Artifact {} is present in the local repository, 
but cached from a remote repository ID that is unavailable in current build 
context, verifying that is downloadable from {}",
+                            artifact,
+                            remoteRepositories);
+                }
 
+                LOGGER.debug("Resolving artifact {} from {}", artifact, 
remoteRepositories);
+                AtomicBoolean resolved = new AtomicBoolean(false);
+                Iterator<ResolutionGroup> groupIt = groups.iterator();
+                for (RemoteRepository repo : filteredRemoteRepositories) {
+                    if (!repo.getPolicy(artifact.isSnapshot()).isEnabled()) {
                         continue;
                     }
 
-                    if (local.getFile() != null) {
-                        LOGGER.info(
-                                "Artifact {} is present in the local 
repository, but cached from a remote repository ID that is unavailable in 
current build context, verifying that is downloadable from {}",
+                    try {
+                        Utils.checkOffline(session, offlineController, repo);
+                    } catch (RepositoryOfflineException e) {
+                        Exception exception = new ArtifactNotFoundException(
                                 artifact,
-                                remoteRepositories);
+                                repo,
+                                "Cannot access " + repo.getId() + " ("
+                                        + repo.getUrl() + ") in offline mode 
and the artifact " + artifact
+                                        + " has not been downloaded from it 
before.",
+                                e);
+                        result.addException(exception);
+                        continue;
                     }
 
-                    LOGGER.debug("Resolving artifact {} from {}", artifact, 
remoteRepositories);
-                    AtomicBoolean resolved = new AtomicBoolean(false);
-                    Iterator<ResolutionGroup> groupIt = groups.iterator();
-                    for (RemoteRepository repo : filteredRemoteRepositories) {
-                        if 
(!repo.getPolicy(artifact.isSnapshot()).isEnabled()) {
-                            continue;
+                    ResolutionGroup group = null;
+                    while (groupIt.hasNext()) {
+                        ResolutionGroup t = groupIt.next();
+                        if (t.matches(repo)) {
+                            group = t;
+                            break;
                         }
-
-                        try {
-                            Utils.checkOffline(session, offlineController, 
repo);
-                        } catch (RepositoryOfflineException e) {
-                            Exception exception = new 
ArtifactNotFoundException(
-                                    artifact,
-                                    repo,
-                                    "Cannot access " + repo.getId() + " ("
-                                            + repo.getUrl() + ") in offline 
mode and the artifact " + artifact
-                                            + " has not been downloaded from 
it before.",
-                                    e);
-                            result.addException(exception);
-                            continue;
-                        }
-
-                        ResolutionGroup group = null;
-                        while (groupIt.hasNext()) {
-                            ResolutionGroup t = groupIt.next();
-                            if (t.matches(repo)) {
-                                group = t;
-                                break;
-                            }
-                        }
-                        if (group == null) {
-                            group = new ResolutionGroup(repo);
-                            groups.add(group);
-                            groupIt = Collections.emptyIterator();
-                        }
-                        group.items.add(new ResolutionItem(trace, artifact, 
resolved, result, local, repo));
                     }
+                    if (group == null) {
+                        group = new ResolutionGroup(repo);
+                        groups.add(group);
+                        groupIt = Collections.emptyIterator();
+                    }
+                    group.items.add(new ResolutionItem(trace, artifact, 
resolved, result, local, repo));
                 }
+            }
 
-                if (!groups.isEmpty() && current == shared) {
-                    current.close();
-                    current = exclusive;
-                    continue;
-                }
-
-                for (ResolutionGroup group : groups) {
-                    performDownloads(session, group);
-                }
+            for (ResolutionGroup group : groups) {
+                performDownloads(session, group);
+            }
 
-                for (ArtifactResolverPostProcessor 
artifactResolverPostProcessor :
-                        artifactResolverPostProcessors.values()) {
-                    artifactResolverPostProcessor.postProcess(session, 
results);
-                }
+            for (ArtifactResolverPostProcessor artifactResolverPostProcessor :
+                    artifactResolverPostProcessors.values()) {
+                artifactResolverPostProcessor.postProcess(session, results);
+            }
 
-                for (ArtifactResult result : results) {
-                    ArtifactRequest request = result.getRequest();
+            for (ArtifactResult result : results) {
+                ArtifactRequest request = result.getRequest();
 
-                    Artifact artifact = result.getArtifact();
-                    if (artifact == null || artifact.getFile() == null) {
-                        failures = true;
-                        if (result.getExceptions().isEmpty()) {
-                            Exception exception = new 
ArtifactNotFoundException(request.getArtifact(), null);
-                            result.addException(exception);
-                        }
-                        RequestTrace trace = 
RequestTrace.newChild(request.getTrace(), request);
-                        artifactResolved(session, trace, 
request.getArtifact(), null, result.getExceptions());
+                Artifact artifact = result.getArtifact();
+                if (artifact == null || artifact.getFile() == null) {
+                    failures = true;
+                    if (result.getExceptions().isEmpty()) {
+                        Exception exception = new 
ArtifactNotFoundException(request.getArtifact(), null);
+                        result.addException(exception);
                     }
+                    RequestTrace trace = 
RequestTrace.newChild(request.getTrace(), request);
+                    artifactResolved(session, trace, request.getArtifact(), 
null, result.getExceptions());
                 }
+            }
 
-                if (failures) {
-                    throw new ArtifactResolutionException(results);
-                }
-
-                return results;
+            if (failures) {
+                throw new ArtifactResolutionException(results);
             }
+
+            return results;
         } finally {
-            current.close();
+            syncContext.close();
         }
     }
 
diff --git 
a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultMetadataResolver.java
 
b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultMetadataResolver.java
index a077d7ac..1d938b94 100644
--- 
a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultMetadataResolver.java
+++ 
b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultMetadataResolver.java
@@ -169,241 +169,225 @@ public class DefaultMetadataResolver implements 
MetadataResolver, Service {
             RepositorySystemSession session, Collection<? extends 
MetadataRequest> requests) {
         requireNonNull(session, "session cannot be null");
         requireNonNull(requests, "requests cannot be null");
-        try (SyncContext shared = syncContextFactory.newInstance(session, 
true);
-                SyncContext exclusive = 
syncContextFactory.newInstance(session, false)) {
+        try (SyncContext exclusive = syncContextFactory.newInstance(session, 
false)) {
             Collection<Metadata> metadata = new ArrayList<>(requests.size());
             for (MetadataRequest request : requests) {
                 metadata.add(request.getMetadata());
             }
 
-            return resolve(shared, exclusive, metadata, session, requests);
+            return resolve(exclusive, metadata, session, requests);
         }
     }
 
     @SuppressWarnings("checkstyle:methodlength")
     private List<MetadataResult> resolve(
-            SyncContext shared,
-            SyncContext exclusive,
+            SyncContext syncContext,
             Collection<Metadata> subjects,
             RepositorySystemSession session,
             Collection<? extends MetadataRequest> requests) {
-        SyncContext current = shared;
         try {
-            while (true) {
-                current.acquire(null, subjects);
+            syncContext.acquire(null, subjects);
 
-                final List<MetadataResult> results = new 
ArrayList<>(requests.size());
-                final List<ResolveTask> tasks = new 
ArrayList<>(requests.size());
-                final Map<File, Long> localLastUpdates = new HashMap<>();
-                final RemoteRepositoryFilter remoteRepositoryFilter =
-                        
remoteRepositoryFilterManager.getRemoteRepositoryFilter(session);
+            final List<MetadataResult> results = new 
ArrayList<>(requests.size());
+            final List<ResolveTask> tasks = new ArrayList<>(requests.size());
+            final Map<File, Long> localLastUpdates = new HashMap<>();
+            final RemoteRepositoryFilter remoteRepositoryFilter =
+                    
remoteRepositoryFilterManager.getRemoteRepositoryFilter(session);
 
-                for (MetadataRequest request : requests) {
-                    RequestTrace trace = 
RequestTrace.newChild(request.getTrace(), request);
-
-                    MetadataResult result = new MetadataResult(request);
-                    results.add(result);
-
-                    Metadata metadata = request.getMetadata();
-                    RemoteRepository repository = request.getRepository();
+            for (MetadataRequest request : requests) {
+                RequestTrace trace = RequestTrace.newChild(request.getTrace(), 
request);
 
-                    if (repository == null) {
-                        LocalRepository localRepo =
-                                
session.getLocalRepositoryManager().getRepository();
+                MetadataResult result = new MetadataResult(request);
+                results.add(result);
 
-                        metadataResolving(session, trace, metadata, localRepo);
+                Metadata metadata = request.getMetadata();
+                RemoteRepository repository = request.getRepository();
 
-                        File localFile = getLocalFile(session, metadata);
+                if (repository == null) {
+                    LocalRepository localRepo =
+                            
session.getLocalRepositoryManager().getRepository();
 
-                        if (localFile != null) {
-                            metadata = metadata.setFile(localFile);
-                            result.setMetadata(metadata);
-                        } else {
-                            result.setException(new 
MetadataNotFoundException(metadata, localRepo));
-                        }
+                    metadataResolving(session, trace, metadata, localRepo);
 
-                        metadataResolved(session, trace, metadata, localRepo, 
result.getException());
-                        continue;
-                    }
+                    File localFile = getLocalFile(session, metadata);
 
-                    if (remoteRepositoryFilter != null) {
-                        RemoteRepositoryFilter.Result filterResult =
-                                
remoteRepositoryFilter.acceptMetadata(repository, metadata);
-                        if (!filterResult.isAccepted()) {
-                            result.setException(
-                                    new MetadataNotFoundException(metadata, 
repository, filterResult.reasoning()));
-                            continue;
-                        }
+                    if (localFile != null) {
+                        metadata = metadata.setFile(localFile);
+                        result.setMetadata(metadata);
+                    } else {
+                        result.setException(new 
MetadataNotFoundException(metadata, localRepo));
                     }
 
-                    List<RemoteRepository> repositories =
-                            getEnabledSourceRepositories(repository, 
metadata.getNature());
+                    metadataResolved(session, trace, metadata, localRepo, 
result.getException());
+                    continue;
+                }
 
-                    if (repositories.isEmpty()) {
+                if (remoteRepositoryFilter != null) {
+                    RemoteRepositoryFilter.Result filterResult =
+                            remoteRepositoryFilter.acceptMetadata(repository, 
metadata);
+                    if (!filterResult.isAccepted()) {
+                        result.setException(
+                                new MetadataNotFoundException(metadata, 
repository, filterResult.reasoning()));
                         continue;
                     }
+                }
 
-                    metadataResolving(session, trace, metadata, repository);
-                    LocalRepositoryManager lrm = 
session.getLocalRepositoryManager();
-                    LocalMetadataRequest localRequest =
-                            new LocalMetadataRequest(metadata, repository, 
request.getRequestContext());
-                    LocalMetadataResult lrmResult = lrm.find(session, 
localRequest);
-
-                    File metadataFile = lrmResult.getFile();
-
-                    try {
-                        Utils.checkOffline(session, offlineController, 
repository);
-                    } catch (RepositoryOfflineException e) {
-                        if (metadataFile != null) {
-                            metadata = metadata.setFile(metadataFile);
-                            result.setMetadata(metadata);
-                        } else {
-                            String msg = "Cannot access " + repository.getId() 
+ " (" + repository.getUrl()
-                                    + ") in offline mode and the metadata " + 
metadata
-                                    + " has not been downloaded from it 
before";
-                            result.setException(new 
MetadataNotFoundException(metadata, repository, msg, e));
-                        }
+                List<RemoteRepository> repositories = 
getEnabledSourceRepositories(repository, metadata.getNature());
 
-                        metadataResolved(session, trace, metadata, repository, 
result.getException());
-                        continue;
-                    }
+                if (repositories.isEmpty()) {
+                    continue;
+                }
 
-                    Long localLastUpdate = null;
-                    if (request.isFavorLocalRepository()) {
-                        File localFile = getLocalFile(session, metadata);
-                        localLastUpdate = localLastUpdates.get(localFile);
-                        if (localLastUpdate == null) {
-                            localLastUpdate = localFile != null ? 
localFile.lastModified() : 0;
-                            localLastUpdates.put(localFile, localLastUpdate);
-                        }
-                    }
+                metadataResolving(session, trace, metadata, repository);
+                LocalRepositoryManager lrm = 
session.getLocalRepositoryManager();
+                LocalMetadataRequest localRequest =
+                        new LocalMetadataRequest(metadata, repository, 
request.getRequestContext());
+                LocalMetadataResult lrmResult = lrm.find(session, 
localRequest);
 
-                    List<UpdateCheck<Metadata, MetadataTransferException>> 
checks = new ArrayList<>();
-                    Exception exception = null;
-                    for (RemoteRepository repo : repositories) {
-                        UpdateCheck<Metadata, MetadataTransferException> check 
= new UpdateCheck<>();
-                        check.setLocalLastUpdated((localLastUpdate != null) ? 
localLastUpdate : 0);
-                        check.setItem(metadata);
-
-                        // use 'main' installation file for the check (-> use 
requested repository)
-                        File checkFile = new File(
-                                session.getLocalRepository().getBasedir(),
-                                session.getLocalRepositoryManager()
-                                        .getPathForRemoteMetadata(metadata, 
repository, request.getRequestContext()));
-                        check.setFile(checkFile);
-                        check.setRepository(repository);
-                        check.setAuthoritativeRepository(repo);
-                        check.setPolicy(
-                                getPolicy(session, repo, 
metadata.getNature()).getUpdatePolicy());
-
-                        if (lrmResult.isStale()) {
-                            checks.add(check);
-                        } else {
-                            updateCheckManager.checkMetadata(session, check);
-                            if (check.isRequired()) {
-                                checks.add(check);
-                            } else if (exception == null) {
-                                exception = check.getException();
-                            }
-                        }
+                File metadataFile = lrmResult.getFile();
+
+                try {
+                    Utils.checkOffline(session, offlineController, repository);
+                } catch (RepositoryOfflineException e) {
+                    if (metadataFile != null) {
+                        metadata = metadata.setFile(metadataFile);
+                        result.setMetadata(metadata);
+                    } else {
+                        String msg = "Cannot access " + repository.getId() + " 
(" + repository.getUrl()
+                                + ") in offline mode and the metadata " + 
metadata
+                                + " has not been downloaded from it before";
+                        result.setException(new 
MetadataNotFoundException(metadata, repository, msg, e));
                     }
 
-                    if (!checks.isEmpty()) {
-                        RepositoryPolicy policy = getPolicy(session, 
repository, metadata.getNature());
+                    metadataResolved(session, trace, metadata, repository, 
result.getException());
+                    continue;
+                }
 
-                        // install path may be different from lookup path
-                        File installFile = new File(
-                                session.getLocalRepository().getBasedir(),
-                                session.getLocalRepositoryManager()
-                                        .getPathForRemoteMetadata(
-                                                metadata, 
request.getRepository(), request.getRequestContext()));
+                Long localLastUpdate = null;
+                if (request.isFavorLocalRepository()) {
+                    File localFile = getLocalFile(session, metadata);
+                    localLastUpdate = localLastUpdates.get(localFile);
+                    if (localLastUpdate == null) {
+                        localLastUpdate = localFile != null ? 
localFile.lastModified() : 0;
+                        localLastUpdates.put(localFile, localLastUpdate);
+                    }
+                }
 
-                        ResolveTask task = new ResolveTask(
-                                session, trace, result, installFile, checks, 
policy.getChecksumPolicy());
-                        tasks.add(task);
+                List<UpdateCheck<Metadata, MetadataTransferException>> checks 
= new ArrayList<>();
+                Exception exception = null;
+                for (RemoteRepository repo : repositories) {
+                    UpdateCheck<Metadata, MetadataTransferException> check = 
new UpdateCheck<>();
+                    check.setLocalLastUpdated((localLastUpdate != null) ? 
localLastUpdate : 0);
+                    check.setItem(metadata);
+
+                    // use 'main' installation file for the check (-> use 
requested repository)
+                    File checkFile = new File(
+                            session.getLocalRepository().getBasedir(),
+                            session.getLocalRepositoryManager()
+                                    .getPathForRemoteMetadata(metadata, 
repository, request.getRequestContext()));
+                    check.setFile(checkFile);
+                    check.setRepository(repository);
+                    check.setAuthoritativeRepository(repo);
+                    check.setPolicy(
+                            getPolicy(session, repo, 
metadata.getNature()).getUpdatePolicy());
+
+                    if (lrmResult.isStale()) {
+                        checks.add(check);
                     } else {
-                        result.setException(exception);
-                        if (metadataFile != null) {
-                            metadata = metadata.setFile(metadataFile);
-                            result.setMetadata(metadata);
+                        updateCheckManager.checkMetadata(session, check);
+                        if (check.isRequired()) {
+                            checks.add(check);
+                        } else if (exception == null) {
+                            exception = check.getException();
                         }
-                        metadataResolved(session, trace, metadata, repository, 
result.getException());
                     }
                 }
 
-                if (!tasks.isEmpty() && current == shared) {
-                    current.close();
-                    current = exclusive;
-                    continue;
+                if (!checks.isEmpty()) {
+                    RepositoryPolicy policy = getPolicy(session, repository, 
metadata.getNature());
+
+                    // install path may be different from lookup path
+                    File installFile = new File(
+                            session.getLocalRepository().getBasedir(),
+                            session.getLocalRepositoryManager()
+                                    .getPathForRemoteMetadata(
+                                            metadata, request.getRepository(), 
request.getRequestContext()));
+
+                    ResolveTask task =
+                            new ResolveTask(session, trace, result, 
installFile, checks, policy.getChecksumPolicy());
+                    tasks.add(task);
+                } else {
+                    result.setException(exception);
+                    if (metadataFile != null) {
+                        metadata = metadata.setFile(metadataFile);
+                        result.setMetadata(metadata);
+                    }
+                    metadataResolved(session, trace, metadata, repository, 
result.getException());
                 }
+            }
 
-                if (!tasks.isEmpty()) {
-                    int threads = ExecutorUtils.threadCount(session, 4, 
CONFIG_PROP_THREADS);
-                    Executor executor = ExecutorUtils.executor(
-                            Math.min(tasks.size(), threads), 
getClass().getSimpleName() + '-');
-                    try {
-                        RunnableErrorForwarder errorForwarder = new 
RunnableErrorForwarder();
-
-                        for (ResolveTask task : tasks) {
-                            metadataDownloading(
-                                    task.session, task.trace, 
task.request.getMetadata(), task.request.getRepository());
+            if (!tasks.isEmpty()) {
+                int threads = ExecutorUtils.threadCount(session, 4, 
CONFIG_PROP_THREADS);
+                Executor executor = ExecutorUtils.executor(
+                        Math.min(tasks.size(), threads), 
getClass().getSimpleName() + '-');
+                try {
+                    RunnableErrorForwarder errorForwarder = new 
RunnableErrorForwarder();
 
-                            executor.execute(errorForwarder.wrap(task));
-                        }
+                    for (ResolveTask task : tasks) {
+                        metadataDownloading(
+                                task.session, task.trace, 
task.request.getMetadata(), task.request.getRepository());
 
-                        errorForwarder.await();
-
-                        for (ResolveTask task : tasks) {
-                            /*
-                             * NOTE: Touch after registration with local repo 
to ensure concurrent resolution is not
-                             * rejected with "already updated" via session 
data when actual update to local repo is
-                             * still pending.
-                             */
-                            for (UpdateCheck<Metadata, 
MetadataTransferException> check : task.checks) {
-                                updateCheckManager.touchMetadata(task.session, 
check.setException(task.exception));
-                            }
-
-                            metadataDownloaded(
-                                    session,
-                                    task.trace,
-                                    task.request.getMetadata(),
-                                    task.request.getRepository(),
-                                    task.metadataFile,
-                                    task.exception);
-
-                            task.result.setException(task.exception);
-                        }
-                    } finally {
-                        ExecutorUtils.shutdown(executor);
+                        executor.execute(errorForwarder.wrap(task));
                     }
+
+                    errorForwarder.await();
+
                     for (ResolveTask task : tasks) {
-                        Metadata metadata = task.request.getMetadata();
-                        // re-lookup metadata for resolve
-                        LocalMetadataRequest localRequest = new 
LocalMetadataRequest(
-                                metadata, task.request.getRepository(), 
task.request.getRequestContext());
-                        File metadataFile = session.getLocalRepositoryManager()
-                                .find(session, localRequest)
-                                .getFile();
-                        if (metadataFile != null) {
-                            metadata = metadata.setFile(metadataFile);
-                            task.result.setMetadata(metadata);
+                        /*
+                         * NOTE: Touch after registration with local repo to 
ensure concurrent resolution is not
+                         * rejected with "already updated" via session data 
when actual update to local repo is
+                         * still pending.
+                         */
+                        for (UpdateCheck<Metadata, MetadataTransferException> 
check : task.checks) {
+                            updateCheckManager.touchMetadata(task.session, 
check.setException(task.exception));
                         }
-                        if (task.result.getException() == null) {
-                            task.result.setUpdated(true);
-                        }
-                        metadataResolved(
+
+                        metadataDownloaded(
                                 session,
                                 task.trace,
-                                metadata,
+                                task.request.getMetadata(),
                                 task.request.getRepository(),
-                                task.result.getException());
+                                task.metadataFile,
+                                task.exception);
+
+                        task.result.setException(task.exception);
                     }
+                } finally {
+                    ExecutorUtils.shutdown(executor);
+                }
+                for (ResolveTask task : tasks) {
+                    Metadata metadata = task.request.getMetadata();
+                    // re-lookup metadata for resolve
+                    LocalMetadataRequest localRequest = new 
LocalMetadataRequest(
+                            metadata, task.request.getRepository(), 
task.request.getRequestContext());
+                    File metadataFile = session.getLocalRepositoryManager()
+                            .find(session, localRequest)
+                            .getFile();
+                    if (metadataFile != null) {
+                        metadata = metadata.setFile(metadataFile);
+                        task.result.setMetadata(metadata);
+                    }
+                    if (task.result.getException() == null) {
+                        task.result.setUpdated(true);
+                    }
+                    metadataResolved(
+                            session, task.trace, metadata, 
task.request.getRepository(), task.result.getException());
                 }
-
-                return results;
             }
+
+            return results;
         } finally {
-            current.close();
+            syncContext.close();
         }
     }
 


Reply via email to