/*
* Copyright 2015 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*
* 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.kie.scanner;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
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.MavenArtifactRepository;
import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout;
import org.apache.maven.artifact.repository.layout.DefaultRepositoryLayout;
import org.apache.maven.settings.Mirror;
import org.apache.maven.settings.Profile;
import org.apache.maven.settings.Proxy;
import org.apache.maven.settings.Repository;
import org.apache.maven.settings.RepositoryPolicy;
import org.apache.maven.settings.Server;
import org.apache.maven.settings.Settings;
import org.eclipse.aether.repository.RemoteRepository;
import org.eclipse.aether.util.repository.AuthenticationBuilder;
public class MavenRepositoryConfiguration {
private final Settings settings;
private final Collection<RemoteRepository> extraRepositories;
private final Collection<RemoteRepository> remoteRepositoriesForRequest;
private final Collection<ArtifactRepository> artifactRepositoriesForRequest;
public MavenRepositoryConfiguration( Settings settings ) {
this.settings = settings;
this.extraRepositories = initExtraRepositories();
this.remoteRepositoriesForRequest = initRemoteRepositoriesForRequest();
this.artifactRepositoriesForRequest = initArtifactRepositories();
}
protected String getLocalRepository() {
return settings.getLocalRepository();
}
public List<Proxy> getProxies() {
return settings.getProxies();
}
public Collection<RemoteRepository> getExtraRepositories() {
return extraRepositories;
}
public Collection<RemoteRepository> getRemoteRepositoriesForRequest() {
return remoteRepositoriesForRequest;
}
public Collection<ArtifactRepository> getArtifactRepositoriesForRequest() {
return artifactRepositoriesForRequest;
}
private Collection<RemoteRepository> initExtraRepositories() {
Collection<RemoteRepository> extraRepositories = new HashSet<RemoteRepository>();
for ( Profile profile : settings.getProfiles() ) {
if ( isProfileActive( profile ) ) {
for ( Repository repository : profile.getRepositories() ) {
extraRepositories.add( toRemoteRepositoryBuilder( settings,
repository ).build() );
}
for ( Repository repository : profile.getPluginRepositories() ) {
extraRepositories.add( toRemoteRepositoryBuilder( settings,
repository ).build() );
}
}
}
return extraRepositories;
}
private Collection<RemoteRepository> initRemoteRepositoriesForRequest() {
Collection<RemoteRepository> remoteRepos = new HashSet<RemoteRepository>();
for ( RemoteRepository repo : extraRepositories ) {
remoteRepos.add( resolveMirroredRepo( repo ) );
}
return remoteRepos;
}
private Collection<ArtifactRepository> initArtifactRepositories() {
Collection<ArtifactRepository> artifactRepos = new HashSet<ArtifactRepository>();
for ( RemoteRepository remoteRepository : remoteRepositoriesForRequest ) {
artifactRepos.add( toArtifactRepository( remoteRepository ) );
}
return artifactRepos;
}
public RemoteRepository resolveMirroredRepo( RemoteRepository repo ) {
for ( Mirror mirror : settings.getMirrors() ) {
if ( isMirror( repo, mirror.getMirrorOf() ) ) {
return toRemoteRepositoryBuilder( settings,
mirror.getId(),
mirror.getLayout(),
mirror.getUrl() ).build();
}
}
return repo;
}
private boolean isMirror( RemoteRepository repo,
String mirrorOf ) {
return mirrorOf.equals( "*" ) ||
( mirrorOf.equals( "external:*" ) && !repo.getUrl().startsWith( "file:" ) ) ||
( mirrorOf.contains( "external:*" ) && !repo.getUrl().startsWith( "file:" ) && !mirrorOf.contains( "!" + repo.getId() ) ) ||
( mirrorOf.startsWith( "*" ) && !mirrorOf.contains( "!" + repo.getId() ) ) ||
( !mirrorOf.startsWith( "*" ) && !mirrorOf.contains( "external:*" ) && mirrorOf.contains( repo.getId() ) );
}
private boolean isProfileActive( Profile profile ) {
return settings.getActiveProfiles().contains( profile.getId() ) ||
( profile.getActivation() != null && profile.getActivation().isActiveByDefault() );
}
private static RemoteRepository.Builder toRemoteRepositoryBuilder( Settings settings,
Repository repository ) {
RemoteRepository.Builder remoteBuilder = toRemoteRepositoryBuilder( settings,
repository.getId(),
repository.getLayout(),
repository.getUrl() );
setPolicy( remoteBuilder, repository.getSnapshots(),
true );
setPolicy( remoteBuilder, repository.getReleases(),
false );
return remoteBuilder;
}
private static RemoteRepository.Builder toRemoteRepositoryBuilder( Settings settings,
String id,
String layout,
String url ) {
RemoteRepository.Builder remoteBuilder = new RemoteRepository.Builder( id,
layout,
url );
Server server = settings.getServer( id );
if ( server != null ) {
remoteBuilder.setAuthentication( new AuthenticationBuilder().addUsername( server.getUsername() )
.addPassword( server.getPassword() )
.build() );
}
return remoteBuilder;
}
private static void setPolicy( RemoteRepository.Builder builder,
RepositoryPolicy policy,
boolean snapshot ) {
if ( policy != null ) {
org.eclipse.aether.repository.RepositoryPolicy repoPolicy =
new org.eclipse.aether.repository.RepositoryPolicy( policy.isEnabled(),
policy.getUpdatePolicy(),
policy.getChecksumPolicy() );
if ( snapshot ) {
builder.setSnapshotPolicy( repoPolicy );
} else {
builder.setReleasePolicy( repoPolicy );
}
}
}
private ArtifactRepository toArtifactRepository( RemoteRepository remoteRepository ) {
final String id = remoteRepository.getId();
final String url = remoteRepository.getUrl();
final ArtifactRepositoryLayout layout = new DefaultRepositoryLayout();
ArtifactRepositoryPolicy snapshots = new ArtifactRepositoryPolicy();
ArtifactRepositoryPolicy releases = new ArtifactRepositoryPolicy();
if ( remoteRepository.getPolicy( true ) != null ) {
snapshots = new ArtifactRepositoryPolicy( remoteRepository.getPolicy( true ).isEnabled(),
remoteRepository.getPolicy( true ).getUpdatePolicy(),
remoteRepository.getPolicy( true ).getChecksumPolicy() );
}
if ( remoteRepository.getPolicy( false ) != null ) {
releases = new ArtifactRepositoryPolicy( remoteRepository.getPolicy( false ).isEnabled(),
remoteRepository.getPolicy( false ).getUpdatePolicy(),
remoteRepository.getPolicy( false ).getChecksumPolicy() );
}
final ArtifactRepository artifactRepository = new MavenArtifactRepository( id,
url,
layout,
snapshots,
releases );
final Server server = settings.getServer( id );
if ( server != null ) {
artifactRepository.setAuthentication( new Authentication( server.getUsername(),
server.getPassword() ) );
}
return artifactRepository;
}
}