Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
import java.util.Set;
import java.util.TreeSet;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.atomic.AtomicBoolean;

import org.eclipse.aether.MultiRuntimeException;
Expand Down Expand Up @@ -85,19 +86,27 @@ public final class GroupIdRemoteRepositoryFilterSource extends RemoteRepositoryF

private final RepositorySystemLifecycle repositorySystemLifecycle;

private final ConcurrentHashMap<Path, Set<String>> rules;

private final ConcurrentHashMap<Path, Boolean> changedRules;

private final AtomicBoolean onShutdownHandlerRegistered;

@Inject
public GroupIdRemoteRepositoryFilterSource(RepositorySystemLifecycle repositorySystemLifecycle) {
super(NAME);
this.repositorySystemLifecycle = requireNonNull(repositorySystemLifecycle);
this.rules = new ConcurrentHashMap<>();
this.changedRules = new ConcurrentHashMap<>();
this.onShutdownHandlerRegistered = new AtomicBoolean(false);
}

@SuppressWarnings("unchecked")
private ConcurrentMap<Path, Set<String>> rules(RepositorySystemSession session) {
return (ConcurrentMap<Path, Set<String>>)
session.getData().computeIfAbsent(getClass().getName() + ".rules", ConcurrentHashMap::new);
}

@SuppressWarnings("unchecked")
private ConcurrentMap<Path, Boolean> changedRules(RepositorySystemSession session) {
return (ConcurrentMap<Path, Boolean>)
session.getData().computeIfAbsent(getClass().getName() + ".changedRules", ConcurrentHashMap::new);
}

private AtomicBoolean onShutdownHandlerRegistered(RepositorySystemSession session) {
return (AtomicBoolean) session.getData()
.computeIfAbsent(getClass().getName() + ".onShutdownHandlerRegistered", AtomicBoolean::new);
}

@Override
Expand All @@ -111,19 +120,19 @@ public RemoteRepositoryFilter getRemoteRepositoryFilter(RepositorySystemSession
@Override
public void postProcess(RepositorySystemSession session, List<ArtifactResult> artifactResults) {
if (isEnabled(session) && isRecord(session)) {
if (onShutdownHandlerRegistered.compareAndSet(false, true)) {
repositorySystemLifecycle.addOnSystemEndedHandler(this::saveRecordedLines);
if (onShutdownHandlerRegistered(session).compareAndSet(false, true)) {
repositorySystemLifecycle.addOnSystemEndedHandler(() -> saveRecordedLines(session));
}
for (ArtifactResult artifactResult : artifactResults) {
if (artifactResult.isResolved() && artifactResult.getRepository() instanceof RemoteRepository) {
Path filePath = filePath(
getBasedir(session, false),
artifactResult.getRepository().getId());
boolean newGroupId = rules.computeIfAbsent(
filePath, f -> Collections.synchronizedSet(new TreeSet<>()))
boolean newGroupId = rules(session)
.computeIfAbsent(filePath, f -> Collections.synchronizedSet(new TreeSet<>()))
.add(artifactResult.getArtifact().getGroupId());
if (newGroupId) {
changedRules.put(filePath, Boolean.TRUE);
changedRules(session).put(filePath, Boolean.TRUE);
}
}
}
Expand All @@ -139,7 +148,7 @@ private Path filePath(Path basedir, String remoteRepositoryId) {

private Set<String> cacheRules(RepositorySystemSession session, RemoteRepository remoteRepository) {
Path filePath = filePath(getBasedir(session, false), remoteRepository.getId());
return rules.computeIfAbsent(filePath, r -> {
return rules(session).computeIfAbsent(filePath, r -> {
Set<String> rules = loadRepositoryRules(filePath);
if (rules != NOT_PRESENT) {
LOGGER.info("Loaded {} groupId for remote repository {}", rules.size(), remoteRepository.getId());
Expand Down Expand Up @@ -212,15 +221,15 @@ private boolean isRecord(RepositorySystemSession session) {
/**
* On-close handler that saves recorded rules, if any.
*/
private void saveRecordedLines() {
if (changedRules.isEmpty()) {
private void saveRecordedLines(RepositorySystemSession session) {
if (changedRules(session).isEmpty()) {
return;
}

ArrayList<Exception> exceptions = new ArrayList<>();
for (Map.Entry<Path, Set<String>> entry : rules.entrySet()) {
for (Map.Entry<Path, Set<String>> entry : rules(session).entrySet()) {
Path filePath = entry.getKey();
if (changedRules.get(filePath) != Boolean.TRUE) {
if (changedRules(session).get(filePath) != Boolean.TRUE) {
continue;
}
Set<String> recordedLines = entry.getValue();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.UncheckedIOException;
import java.net.URI;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
Expand All @@ -34,11 +35,13 @@
import java.util.HashMap;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;

import org.eclipse.aether.RepositorySystemSession;
import org.eclipse.aether.artifact.Artifact;
import org.eclipse.aether.metadata.Metadata;
import org.eclipse.aether.repository.RemoteRepository;
import org.eclipse.aether.spi.connector.checksum.ChecksumAlgorithmFactory;
import org.eclipse.aether.spi.connector.filter.RemoteRepositoryFilter;
import org.eclipse.aether.spi.connector.layout.RepositoryLayout;
import org.eclipse.aether.spi.connector.layout.RepositoryLayoutProvider;
Expand Down Expand Up @@ -85,16 +88,22 @@ public final class PrefixesRemoteRepositoryFilterSource extends RemoteRepository

private final RepositoryLayoutProvider repositoryLayoutProvider;

private final ConcurrentHashMap<RemoteRepository, Node> prefixes;

private final ConcurrentHashMap<RemoteRepository, RepositoryLayout> layouts;

@Inject
public PrefixesRemoteRepositoryFilterSource(RepositoryLayoutProvider repositoryLayoutProvider) {
super(NAME);
this.repositoryLayoutProvider = requireNonNull(repositoryLayoutProvider);
this.prefixes = new ConcurrentHashMap<>();
this.layouts = new ConcurrentHashMap<>();
}

@SuppressWarnings("unchecked")
private ConcurrentMap<RemoteRepository, Node> prefixes(RepositorySystemSession session) {
return (ConcurrentMap<RemoteRepository, Node>)
session.getData().computeIfAbsent(getClass().getName() + ".prefixes", ConcurrentHashMap::new);
}

@SuppressWarnings("unchecked")
private ConcurrentMap<RemoteRepository, RepositoryLayout> layouts(RepositorySystemSession session) {
return (ConcurrentMap<RemoteRepository, RepositoryLayout>)
session.getData().computeIfAbsent(getClass().getName() + ".layouts", ConcurrentHashMap::new);
}

@Override
Expand All @@ -106,25 +115,26 @@ public RemoteRepositoryFilter getRemoteRepositoryFilter(RepositorySystemSession
}

/**
* Caches layout instances for remote repository. In case of unknown layout it returns {@code null}.
* Caches layout instances for remote repository. In case of unknown layout it returns {@link #NOT_SUPPORTED}.
*
* @return the layout instance of {@code null} if layout not supported.
* @return the layout instance of {@link #NOT_SUPPORTED} if layout not supported.
*/
private RepositoryLayout cacheLayout(RepositorySystemSession session, RemoteRepository remoteRepository) {
return layouts.computeIfAbsent(remoteRepository, r -> {
return layouts(session).computeIfAbsent(remoteRepository, r -> {
try {
return repositoryLayoutProvider.newRepositoryLayout(session, remoteRepository);
} catch (NoRepositoryLayoutException e) {
return null;
return NOT_SUPPORTED;
}
});
}

/**
* Caches prefixes instances for remote repository.
*/
private Node cacheNode(Path basedir, RemoteRepository remoteRepository) {
return prefixes.computeIfAbsent(remoteRepository, r -> loadRepositoryPrefixes(basedir, remoteRepository));
private Node cacheNode(RepositorySystemSession session, Path basedir, RemoteRepository remoteRepository) {
return prefixes(session)
.computeIfAbsent(remoteRepository, r -> loadRepositoryPrefixes(basedir, remoteRepository));
}

/**
Expand Down Expand Up @@ -173,7 +183,7 @@ private PrefixesFilter(RepositorySystemSession session, Path basedir) {
@Override
public Result acceptArtifact(RemoteRepository remoteRepository, Artifact artifact) {
RepositoryLayout repositoryLayout = cacheLayout(session, remoteRepository);
if (repositoryLayout == null) {
if (repositoryLayout == NOT_SUPPORTED) {
return new SimpleResult(true, "Unsupported layout: " + remoteRepository);
}
return acceptPrefix(
Expand All @@ -184,7 +194,7 @@ public Result acceptArtifact(RemoteRepository remoteRepository, Artifact artifac
@Override
public Result acceptMetadata(RemoteRepository remoteRepository, Metadata metadata) {
RepositoryLayout repositoryLayout = cacheLayout(session, remoteRepository);
if (repositoryLayout == null) {
if (repositoryLayout == NOT_SUPPORTED) {
return new SimpleResult(true, "Unsupported layout: " + remoteRepository);
}
return acceptPrefix(
Expand All @@ -193,7 +203,7 @@ public Result acceptMetadata(RemoteRepository remoteRepository, Metadata metadat
}

private Result acceptPrefix(RemoteRepository remoteRepository, String path) {
Node root = cacheNode(basedir, remoteRepository);
Node root = cacheNode(session, basedir, remoteRepository);
if (NOT_PRESENT_NODE == root) {
return NOT_PRESENT_RESULT;
}
Expand Down Expand Up @@ -222,6 +232,38 @@ private Result acceptPrefix(RemoteRepository remoteRepository, String path) {
private static final RemoteRepositoryFilter.Result NOT_PRESENT_RESULT =
new SimpleResult(true, "Prefix file not present");

private static final RepositoryLayout NOT_SUPPORTED = new RepositoryLayout() {
@Override
public List<ChecksumAlgorithmFactory> getChecksumAlgorithmFactories() {
throw new UnsupportedOperationException();
}

@Override
public boolean hasChecksums(Artifact artifact) {
throw new UnsupportedOperationException();
}

@Override
public URI getLocation(Artifact artifact, boolean upload) {
throw new UnsupportedOperationException();
}

@Override
public URI getLocation(Metadata metadata, boolean upload) {
throw new UnsupportedOperationException();
}

@Override
public List<ChecksumLocation> getChecksumLocations(Artifact artifact, boolean upload, URI location) {
throw new UnsupportedOperationException();
}

@Override
public List<ChecksumLocation> getChecksumLocations(Metadata metadata, boolean upload, URI location) {
throw new UnsupportedOperationException();
}
};

private static class Node {
private final String name;

Expand Down