blob: fac3efb39800af715559c18d79d1ac08c5a6fbea [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.maven.repository.legacy;
import javax.inject.Inject;
import javax.inject.Named;
import javax.inject.Singleton;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.apache.maven.RepositoryUtils;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.InvalidRepositoryException;
import org.apache.maven.artifact.factory.ArtifactFactory;
import org.apache.maven.artifact.metadata.ArtifactMetadata;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.repository.ArtifactRepositoryPolicy;
import org.apache.maven.artifact.repository.Authentication;
import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout;
import org.apache.maven.artifact.resolver.ArtifactResolutionRequest;
import org.apache.maven.artifact.resolver.ArtifactResolutionResult;
import org.apache.maven.artifact.resolver.ArtifactResolver;
import org.apache.maven.artifact.resolver.filter.ExcludesArtifactFilter;
import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
import org.apache.maven.artifact.versioning.VersionRange;
import org.apache.maven.model.Dependency;
import org.apache.maven.model.Exclusion;
import org.apache.maven.model.Plugin;
import org.apache.maven.model.Repository;
import org.apache.maven.model.RepositoryPolicy;
import org.apache.maven.repository.ArtifactDoesNotExistException;
import org.apache.maven.repository.ArtifactTransferFailedException;
import org.apache.maven.repository.ArtifactTransferListener;
import org.apache.maven.repository.DelegatingLocalArtifactRepository;
import org.apache.maven.repository.LocalArtifactRepository;
import org.apache.maven.repository.MirrorSelector;
import org.apache.maven.repository.Proxy;
import org.apache.maven.repository.RepositorySystem;
import org.apache.maven.repository.legacy.repository.ArtifactRepositoryFactory;
import org.apache.maven.settings.Mirror;
import org.apache.maven.settings.Server;
import org.apache.maven.settings.building.SettingsProblem;
import org.apache.maven.settings.crypto.DefaultSettingsDecryptionRequest;
import org.apache.maven.settings.crypto.SettingsDecrypter;
import org.apache.maven.settings.crypto.SettingsDecryptionRequest;
import org.apache.maven.settings.crypto.SettingsDecryptionResult;
import org.apache.maven.wagon.proxy.ProxyInfo;
import org.apache.maven.wagon.proxy.ProxyUtils;
import org.codehaus.plexus.PlexusContainer;
import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
import org.codehaus.plexus.logging.Logger;
import org.eclipse.aether.RepositorySystemSession;
import org.eclipse.aether.repository.AuthenticationContext;
import org.eclipse.aether.repository.AuthenticationSelector;
import org.eclipse.aether.repository.ProxySelector;
import org.eclipse.aether.repository.RemoteRepository;
/**
*/
@Named("default")
@Singleton
@Deprecated
public class LegacyRepositorySystem implements RepositorySystem {
@Inject
private Logger logger;
@Inject
private ArtifactFactory artifactFactory;
@Inject
private ArtifactResolver artifactResolver;
@Inject
private ArtifactRepositoryFactory artifactRepositoryFactory;
@Inject
private Map<String, ArtifactRepositoryLayout> layouts;
@Inject
private WagonManager wagonManager;
@Inject
private PlexusContainer plexus;
@Inject
private MirrorSelector mirrorSelector;
@Inject
private SettingsDecrypter settingsDecrypter;
public Artifact createArtifact(String groupId, String artifactId, String version, String scope, String type) {
return artifactFactory.createArtifact(groupId, artifactId, version, scope, type);
}
public Artifact createArtifact(String groupId, String artifactId, String version, String packaging) {
return artifactFactory.createBuildArtifact(groupId, artifactId, version, packaging);
}
public Artifact createArtifactWithClassifier(
String groupId, String artifactId, String version, String type, String classifier) {
return artifactFactory.createArtifactWithClassifier(groupId, artifactId, version, type, classifier);
}
public Artifact createProjectArtifact(String groupId, String artifactId, String metaVersionId) {
return artifactFactory.createProjectArtifact(groupId, artifactId, metaVersionId);
}
public Artifact createDependencyArtifact(Dependency d) {
VersionRange versionRange;
try {
versionRange = VersionRange.createFromVersionSpec(d.getVersion());
} catch (InvalidVersionSpecificationException e) {
// MNG-5368: Log a message instead of returning 'null' silently.
this.logger.error(
String.format(
"Invalid version specification '%s' creating dependency artifact '%s'.", d.getVersion(), d),
e);
return null;
}
Artifact artifact = artifactFactory.createDependencyArtifact(
d.getGroupId(),
d.getArtifactId(),
versionRange,
d.getType(),
d.getClassifier(),
d.getScope(),
d.isOptional());
if (Artifact.SCOPE_SYSTEM.equals(d.getScope()) && d.getSystemPath() != null) {
artifact.setFile(new File(d.getSystemPath()));
}
if (!d.getExclusions().isEmpty()) {
List<String> exclusions = new ArrayList<>();
for (Exclusion exclusion : d.getExclusions()) {
exclusions.add(exclusion.getGroupId() + ':' + exclusion.getArtifactId());
}
artifact.setDependencyFilter(new ExcludesArtifactFilter(exclusions));
}
return artifact;
}
public Artifact createExtensionArtifact(String groupId, String artifactId, String version) {
VersionRange versionRange;
try {
versionRange = VersionRange.createFromVersionSpec(version);
} catch (InvalidVersionSpecificationException e) {
// MNG-5368: Log a message instead of returning 'null' silently.
this.logger.error(
String.format(
"Invalid version specification '%s' creating extension artifact '%s:%s:%s'.",
version, groupId, artifactId, version),
e);
return null;
}
return artifactFactory.createExtensionArtifact(groupId, artifactId, versionRange);
}
public Artifact createParentArtifact(String groupId, String artifactId, String version) {
return artifactFactory.createParentArtifact(groupId, artifactId, version);
}
public Artifact createPluginArtifact(Plugin plugin) {
String version = plugin.getVersion();
if (version == null || version.isEmpty()) {
version = "RELEASE";
}
VersionRange versionRange;
try {
versionRange = VersionRange.createFromVersionSpec(version);
} catch (InvalidVersionSpecificationException e) {
// MNG-5368: Log a message instead of returning 'null' silently.
this.logger.error(
String.format("Invalid version specification '%s' creating plugin artifact '%s'.", version, plugin),
e);
return null;
}
return artifactFactory.createPluginArtifact(plugin.getGroupId(), plugin.getArtifactId(), versionRange);
}
public ArtifactRepositoryPolicy buildArtifactRepositoryPolicy(RepositoryPolicy policy) {
boolean enabled = true;
String updatePolicy = null;
String checksumPolicy = null;
if (policy != null) {
enabled = policy.isEnabled();
if (policy.getUpdatePolicy() != null) {
updatePolicy = policy.getUpdatePolicy();
}
if (policy.getChecksumPolicy() != null) {
checksumPolicy = policy.getChecksumPolicy();
}
}
return new ArtifactRepositoryPolicy(enabled, updatePolicy, checksumPolicy);
}
public ArtifactRepository createDefaultLocalRepository() throws InvalidRepositoryException {
return createLocalRepository(RepositorySystem.defaultUserLocalRepository);
}
public ArtifactRepository createLocalRepository(File localRepository) throws InvalidRepositoryException {
return createRepository(
"file://" + localRepository.toURI().getRawPath(),
RepositorySystem.DEFAULT_LOCAL_REPO_ID,
true,
ArtifactRepositoryPolicy.UPDATE_POLICY_ALWAYS,
true,
ArtifactRepositoryPolicy.UPDATE_POLICY_ALWAYS,
ArtifactRepositoryPolicy.CHECKSUM_POLICY_IGNORE);
}
public ArtifactRepository createDefaultRemoteRepository() throws InvalidRepositoryException {
return createRepository(
RepositorySystem.DEFAULT_REMOTE_REPO_URL,
RepositorySystem.DEFAULT_REMOTE_REPO_ID,
true,
ArtifactRepositoryPolicy.UPDATE_POLICY_DAILY,
false,
ArtifactRepositoryPolicy.UPDATE_POLICY_DAILY,
ArtifactRepositoryPolicy.CHECKSUM_POLICY_WARN);
}
public ArtifactRepository createLocalRepository(String url, String repositoryId) throws IOException {
return createRepository(
canonicalFileUrl(url),
repositoryId,
true,
ArtifactRepositoryPolicy.UPDATE_POLICY_ALWAYS,
true,
ArtifactRepositoryPolicy.UPDATE_POLICY_ALWAYS,
ArtifactRepositoryPolicy.CHECKSUM_POLICY_IGNORE);
}
private String canonicalFileUrl(String url) throws IOException {
if (!url.startsWith("file:")) {
url = "file://" + url;
} else if (url.startsWith("file:") && !url.startsWith("file://")) {
url = "file://" + url.substring("file:".length());
}
// So now we have an url of the form file://<path>
// We want to eliminate any relative path nonsense and lock down the path so we
// need to fully resolve it before any submodules use the path. This can happen
// when you are using a custom settings.xml that contains a relative path entry
// for the local repository setting.
File localRepository = new File(url.substring("file://".length()));
if (!localRepository.isAbsolute()) {
url = "file://" + localRepository.getCanonicalPath();
}
return url;
}
public ArtifactResolutionResult resolve(ArtifactResolutionRequest request) {
/*
* Probably is not worth it, but here I make sure I restore request
* to its original state.
*/
try {
LocalArtifactRepository ideWorkspace =
plexus.lookup(LocalArtifactRepository.class, LocalArtifactRepository.IDE_WORKSPACE);
if (request.getLocalRepository() instanceof DelegatingLocalArtifactRepository) {
DelegatingLocalArtifactRepository delegatingLocalRepository =
(DelegatingLocalArtifactRepository) request.getLocalRepository();
LocalArtifactRepository orig = delegatingLocalRepository.getIdeWorkspace();
delegatingLocalRepository.setIdeWorkspace(ideWorkspace);
try {
return artifactResolver.resolve(request);
} finally {
delegatingLocalRepository.setIdeWorkspace(orig);
}
} else {
ArtifactRepository localRepository = request.getLocalRepository();
DelegatingLocalArtifactRepository delegatingLocalRepository =
new DelegatingLocalArtifactRepository(localRepository);
delegatingLocalRepository.setIdeWorkspace(ideWorkspace);
request.setLocalRepository(delegatingLocalRepository);
try {
return artifactResolver.resolve(request);
} finally {
request.setLocalRepository(localRepository);
}
}
} catch (ComponentLookupException e) {
// no ide workspace artifact resolution
}
return artifactResolver.resolve(request);
}
// public void addProxy( String protocol, String host, int port, String username, String password,
// String nonProxyHosts )
// {
// ProxyInfo proxyInfo = new ProxyInfo();
// proxyInfo.setHost( host );
// proxyInfo.setType( protocol );
// proxyInfo.setPort( port );
// proxyInfo.setNonProxyHosts( nonProxyHosts );
// proxyInfo.setUserName( username );
// proxyInfo.setPassword( password );
//
// proxies.put( protocol, proxyInfo );
//
// wagonManager.addProxy( protocol, host, port, username, password, nonProxyHosts );
// }
public List<ArtifactRepository> getEffectiveRepositories(List<ArtifactRepository> repositories) {
if (repositories == null) {
return null;
}
Map<String, List<ArtifactRepository>> reposByKey = new LinkedHashMap<>();
for (ArtifactRepository repository : repositories) {
String key = repository.getId();
List<ArtifactRepository> aliasedRepos = reposByKey.computeIfAbsent(key, k -> new ArrayList<>());
aliasedRepos.add(repository);
}
List<ArtifactRepository> effectiveRepositories = new ArrayList<>();
for (List<ArtifactRepository> aliasedRepos : reposByKey.values()) {
List<ArtifactRepository> mirroredRepos = new ArrayList<>();
List<ArtifactRepositoryPolicy> releasePolicies = new ArrayList<>(aliasedRepos.size());
for (ArtifactRepository aliasedRepo : aliasedRepos) {
releasePolicies.add(aliasedRepo.getReleases());
mirroredRepos.addAll(aliasedRepo.getMirroredRepositories());
}
ArtifactRepositoryPolicy releasePolicy = getEffectivePolicy(releasePolicies);
List<ArtifactRepositoryPolicy> snapshotPolicies = new ArrayList<>(aliasedRepos.size());
for (ArtifactRepository aliasedRepo : aliasedRepos) {
snapshotPolicies.add(aliasedRepo.getSnapshots());
}
ArtifactRepositoryPolicy snapshotPolicy = getEffectivePolicy(snapshotPolicies);
ArtifactRepository aliasedRepo = aliasedRepos.get(0);
ArtifactRepository effectiveRepository = createArtifactRepository(
aliasedRepo.getId(), aliasedRepo.getUrl(), aliasedRepo.getLayout(), snapshotPolicy, releasePolicy);
effectiveRepository.setAuthentication(aliasedRepo.getAuthentication());
effectiveRepository.setProxy(aliasedRepo.getProxy());
effectiveRepository.setMirroredRepositories(mirroredRepos);
effectiveRepository.setBlocked(aliasedRepo.isBlocked());
effectiveRepositories.add(effectiveRepository);
}
return effectiveRepositories;
}
private ArtifactRepositoryPolicy getEffectivePolicy(Collection<ArtifactRepositoryPolicy> policies) {
ArtifactRepositoryPolicy effectivePolicy = null;
for (ArtifactRepositoryPolicy policy : policies) {
if (effectivePolicy == null) {
effectivePolicy = new ArtifactRepositoryPolicy(policy);
} else {
effectivePolicy.merge(policy);
}
}
return effectivePolicy;
}
public Mirror getMirror(ArtifactRepository repository, List<Mirror> mirrors) {
return mirrorSelector.getMirror(repository, mirrors);
}
public void injectMirror(List<ArtifactRepository> repositories, List<Mirror> mirrors) {
if (repositories != null && mirrors != null) {
for (ArtifactRepository repository : repositories) {
Mirror mirror = getMirror(repository, mirrors);
injectMirror(repository, mirror);
}
}
}
private Mirror getMirror(RepositorySystemSession session, ArtifactRepository repository) {
if (session != null) {
org.eclipse.aether.repository.MirrorSelector selector = session.getMirrorSelector();
if (selector != null) {
RemoteRepository repo = selector.getMirror(RepositoryUtils.toRepo(repository));
if (repo != null) {
Mirror mirror = new Mirror();
mirror.setId(repo.getId());
mirror.setUrl(repo.getUrl());
mirror.setLayout(repo.getContentType());
mirror.setBlocked(repo.isBlocked());
return mirror;
}
}
}
return null;
}
public void injectMirror(RepositorySystemSession session, List<ArtifactRepository> repositories) {
if (repositories != null && session != null) {
for (ArtifactRepository repository : repositories) {
Mirror mirror = getMirror(session, repository);
injectMirror(repository, mirror);
}
}
}
private void injectMirror(ArtifactRepository repository, Mirror mirror) {
if (mirror != null) {
ArtifactRepository original = createArtifactRepository(
repository.getId(),
repository.getUrl(),
repository.getLayout(),
repository.getSnapshots(),
repository.getReleases());
repository.setMirroredRepositories(Collections.singletonList(original));
repository.setId(mirror.getId());
repository.setUrl(mirror.getUrl());
if (mirror.getLayout() != null && !mirror.getLayout().isEmpty()) {
repository.setLayout(getLayout(mirror.getLayout()));
}
repository.setBlocked(mirror.isBlocked());
}
}
public void injectAuthentication(List<ArtifactRepository> repositories, List<Server> servers) {
if (repositories != null) {
Map<String, Server> serversById = new HashMap<>();
if (servers != null) {
for (Server server : servers) {
if (!serversById.containsKey(server.getId())) {
serversById.put(server.getId(), server);
}
}
}
for (ArtifactRepository repository : repositories) {
Server server = serversById.get(repository.getId());
if (server != null) {
SettingsDecryptionRequest request = new DefaultSettingsDecryptionRequest(server);
SettingsDecryptionResult result = settingsDecrypter.decrypt(request);
server = result.getServer();
if (logger.isDebugEnabled()) {
for (SettingsProblem problem : result.getProblems()) {
logger.debug(problem.getMessage(), problem.getException());
}
}
Authentication authentication = new Authentication(server.getUsername(), server.getPassword());
authentication.setPrivateKey(server.getPrivateKey());
authentication.setPassphrase(server.getPassphrase());
repository.setAuthentication(authentication);
} else {
repository.setAuthentication(null);
}
}
}
}
private Authentication getAuthentication(RepositorySystemSession session, ArtifactRepository repository) {
if (session != null) {
AuthenticationSelector selector = session.getAuthenticationSelector();
if (selector != null) {
RemoteRepository repo = RepositoryUtils.toRepo(repository);
org.eclipse.aether.repository.Authentication auth = selector.getAuthentication(repo);
if (auth != null) {
repo = new RemoteRepository.Builder(repo)
.setAuthentication(auth)
.build();
AuthenticationContext authCtx = AuthenticationContext.forRepository(session, repo);
Authentication result = new Authentication(
authCtx.get(AuthenticationContext.USERNAME), authCtx.get(AuthenticationContext.PASSWORD));
result.setPrivateKey(authCtx.get(AuthenticationContext.PRIVATE_KEY_PATH));
result.setPassphrase(authCtx.get(AuthenticationContext.PRIVATE_KEY_PASSPHRASE));
authCtx.close();
return result;
}
}
}
return null;
}
public void injectAuthentication(RepositorySystemSession session, List<ArtifactRepository> repositories) {
if (repositories != null && session != null) {
for (ArtifactRepository repository : repositories) {
repository.setAuthentication(getAuthentication(session, repository));
}
}
}
private org.apache.maven.settings.Proxy getProxy(
ArtifactRepository repository, List<org.apache.maven.settings.Proxy> proxies) {
if (proxies != null && repository.getProtocol() != null) {
for (org.apache.maven.settings.Proxy proxy : proxies) {
if (proxy.isActive() && repository.getProtocol().equalsIgnoreCase(proxy.getProtocol())) {
if (proxy.getNonProxyHosts() != null
&& !proxy.getNonProxyHosts().isEmpty()) {
ProxyInfo pi = new ProxyInfo();
pi.setNonProxyHosts(proxy.getNonProxyHosts());
org.apache.maven.wagon.repository.Repository repo =
new org.apache.maven.wagon.repository.Repository(
repository.getId(), repository.getUrl());
if (!ProxyUtils.validateNonProxyHosts(pi, repo.getHost())) {
return proxy;
}
} else {
return proxy;
}
}
}
}
return null;
}
public void injectProxy(List<ArtifactRepository> repositories, List<org.apache.maven.settings.Proxy> proxies) {
if (repositories != null) {
for (ArtifactRepository repository : repositories) {
org.apache.maven.settings.Proxy proxy = getProxy(repository, proxies);
if (proxy != null) {
SettingsDecryptionRequest request = new DefaultSettingsDecryptionRequest(proxy);
SettingsDecryptionResult result = settingsDecrypter.decrypt(request);
proxy = result.getProxy();
if (logger.isDebugEnabled()) {
for (SettingsProblem problem : result.getProblems()) {
logger.debug(problem.getMessage(), problem.getException());
}
}
Proxy p = new Proxy();
p.setHost(proxy.getHost());
p.setProtocol(proxy.getProtocol());
p.setPort(proxy.getPort());
p.setNonProxyHosts(proxy.getNonProxyHosts());
p.setUserName(proxy.getUsername());
p.setPassword(proxy.getPassword());
repository.setProxy(p);
} else {
repository.setProxy(null);
}
}
}
}
private Proxy getProxy(RepositorySystemSession session, ArtifactRepository repository) {
if (session != null) {
ProxySelector selector = session.getProxySelector();
if (selector != null) {
RemoteRepository repo = RepositoryUtils.toRepo(repository);
org.eclipse.aether.repository.Proxy proxy = selector.getProxy(repo);
if (proxy != null) {
Proxy p = new Proxy();
p.setHost(proxy.getHost());
p.setProtocol(proxy.getType());
p.setPort(proxy.getPort());
if (proxy.getAuthentication() != null) {
repo = new RemoteRepository.Builder(repo)
.setProxy(proxy)
.build();
AuthenticationContext authCtx = AuthenticationContext.forProxy(session, repo);
p.setUserName(authCtx.get(AuthenticationContext.USERNAME));
p.setPassword(authCtx.get(AuthenticationContext.PASSWORD));
p.setNtlmDomain(authCtx.get(AuthenticationContext.NTLM_DOMAIN));
p.setNtlmHost(authCtx.get(AuthenticationContext.NTLM_WORKSTATION));
authCtx.close();
}
return p;
}
}
}
return null;
}
public void injectProxy(RepositorySystemSession session, List<ArtifactRepository> repositories) {
if (repositories != null && session != null) {
for (ArtifactRepository repository : repositories) {
repository.setProxy(getProxy(session, repository));
}
}
}
public void retrieve(
ArtifactRepository repository,
File destination,
String remotePath,
ArtifactTransferListener transferListener)
throws ArtifactTransferFailedException, ArtifactDoesNotExistException {
try {
wagonManager.getRemoteFile(
repository,
destination,
remotePath,
TransferListenerAdapter.newAdapter(transferListener),
ArtifactRepositoryPolicy.CHECKSUM_POLICY_WARN,
true);
} catch (org.apache.maven.wagon.TransferFailedException e) {
throw new ArtifactTransferFailedException(getMessage(e, "Error transferring artifact."), e);
} catch (org.apache.maven.wagon.ResourceDoesNotExistException e) {
throw new ArtifactDoesNotExistException(getMessage(e, "Requested artifact does not exist."), e);
}
}
public void publish(
ArtifactRepository repository, File source, String remotePath, ArtifactTransferListener transferListener)
throws ArtifactTransferFailedException {
try {
wagonManager.putRemoteFile(
repository, source, remotePath, TransferListenerAdapter.newAdapter(transferListener));
} catch (org.apache.maven.wagon.TransferFailedException e) {
throw new ArtifactTransferFailedException(getMessage(e, "Error transferring artifact."), e);
}
}
//
// Artifact Repository Creation
//
public ArtifactRepository buildArtifactRepository(Repository repo) throws InvalidRepositoryException {
if (repo != null) {
String id = repo.getId();
if (id == null || id.isEmpty()) {
throw new InvalidRepositoryException("Repository identifier missing", "");
}
String url = repo.getUrl();
if (url == null || url.isEmpty()) {
throw new InvalidRepositoryException("URL missing for repository " + id, id);
}
ArtifactRepositoryPolicy snapshots = buildArtifactRepositoryPolicy(repo.getSnapshots());
ArtifactRepositoryPolicy releases = buildArtifactRepositoryPolicy(repo.getReleases());
return createArtifactRepository(id, url, getLayout(repo.getLayout()), snapshots, releases);
} else {
return null;
}
}
private ArtifactRepository createRepository(
String url,
String repositoryId,
boolean releases,
String releaseUpdates,
boolean snapshots,
String snapshotUpdates,
String checksumPolicy) {
ArtifactRepositoryPolicy snapshotsPolicy =
new ArtifactRepositoryPolicy(snapshots, snapshotUpdates, checksumPolicy);
ArtifactRepositoryPolicy releasesPolicy =
new ArtifactRepositoryPolicy(releases, releaseUpdates, checksumPolicy);
return createArtifactRepository(repositoryId, url, null, snapshotsPolicy, releasesPolicy);
}
public ArtifactRepository createArtifactRepository(
String repositoryId,
String url,
ArtifactRepositoryLayout repositoryLayout,
ArtifactRepositoryPolicy snapshots,
ArtifactRepositoryPolicy releases) {
if (repositoryLayout == null) {
repositoryLayout = layouts.get("default");
}
return artifactRepositoryFactory.createArtifactRepository(
repositoryId, url, repositoryLayout, snapshots, releases);
}
private static String getMessage(Throwable error, String def) {
if (error == null) {
return def;
}
String msg = error.getMessage();
if (msg != null && !msg.isEmpty()) {
return msg;
}
return getMessage(error.getCause(), def);
}
private ArtifactRepositoryLayout getLayout(String id) {
ArtifactRepositoryLayout layout = layouts.get(id);
if (layout == null) {
layout = new UnknownRepositoryLayout(id, layouts.get("default"));
}
return layout;
}
/**
* In the future, the legacy system might encounter repository types for which no layout components exists because
* the actual communication with the repository happens via a repository connector. As a minimum, the legacy system
* needs to retain the id of this layout so that the content type of the remote repository can still be accurately
* described.
*/
static class UnknownRepositoryLayout implements ArtifactRepositoryLayout {
private final String id;
private final ArtifactRepositoryLayout fallback;
UnknownRepositoryLayout(String id, ArtifactRepositoryLayout fallback) {
this.id = id;
this.fallback = fallback;
}
public String getId() {
return id;
}
public String pathOf(Artifact artifact) {
return fallback.pathOf(artifact);
}
public String pathOfLocalRepositoryMetadata(ArtifactMetadata metadata, ArtifactRepository repository) {
return fallback.pathOfLocalRepositoryMetadata(metadata, repository);
}
public String pathOfRemoteRepositoryMetadata(ArtifactMetadata metadata) {
return fallback.pathOfRemoteRepositoryMetadata(metadata);
}
@Override
public String toString() {
return getId();
}
}
}