blob: 9499eeee734eee780b07c96ab9ef9161590c93f7 [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.mae.project.session;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.Logger;
import org.apache.maven.artifact.InvalidRepositoryException;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.repository.MavenArtifactRepository;
import org.apache.maven.mae.MAEException;
import org.apache.maven.mae.boot.embed.MAEEmbedder;
import org.apache.maven.mae.project.ProjectToolsException;
import org.apache.maven.model.Repository;
import org.apache.maven.project.DefaultProjectBuildingRequest;
import org.apache.maven.project.ProjectBuildingRequest;
import org.apache.maven.repository.RepositorySystem;
import org.codehaus.plexus.component.annotations.Component;
import org.codehaus.plexus.component.annotations.Requirement;
import org.sonatype.aether.RepositorySystemSession;
import org.sonatype.aether.impl.internal.EnhancedLocalRepositoryManager;
import org.sonatype.aether.repository.AuthenticationSelector;
import org.sonatype.aether.repository.ProxySelector;
import org.sonatype.aether.repository.RemoteRepository;
import org.sonatype.aether.util.DefaultRepositorySystemSession;
@Component( role = SessionInjector.class )
public class DefaultSessionInjector
implements SessionInjector
{
private static final Logger LOGGER = Logger.getLogger( DefaultSessionInjector.class );
@Requirement
private MAEEmbedder embedder;
@Requirement
private RepositorySystem mavenRepositorySystem;
@Override
public synchronized ProjectBuildingRequest getProjectBuildingRequest( final ProjectToolsSession session )
throws ProjectToolsException
{
getRemoteRepositories( session );
ProjectBuildingRequest pbr = session.getProjectBuildingRequest();
try
{
if ( pbr == null )
{
pbr =
embedder.serviceManager().createProjectBuildingRequest( session.getTemplateProjectBuildingRequest() );
pbr.setValidationLevel( session.getPomValidationLevel() );
pbr.setProcessPlugins( session.isProcessPomPlugins() );
pbr.setResolveDependencies( false );
pbr.setSystemProperties( System.getProperties() );
pbr.setInactiveProfileIds( new ArrayList<String>() );
pbr.setRepositoryMerging( ProjectBuildingRequest.RepositoryMerging.REQUEST_DOMINANT );
final RepositorySystemSession rss = getRepositorySystemSession( session );
pbr.setRepositorySession( rss );
pbr.setLocalRepository( mavenRepositorySystem.createLocalRepository( rss.getLocalRepository().getBasedir() ) );
pbr.setRemoteRepositories( getArtifactRepositories( session ) );
session.setProjectBuildingRequest( pbr );
}
else
{
pbr = new DefaultProjectBuildingRequest( pbr );
pbr.setRepositorySession( getRepositorySystemSession( session ) );
}
}
catch ( final MAEException e )
{
throw new ProjectToolsException( "Failed to create project-building request: %s", e, e.getMessage() );
}
catch ( final InvalidRepositoryException e )
{
throw new ProjectToolsException( "Failed to create local-repository instance. Reason: %s", e,
e.getMessage() );
}
return pbr;
}
@Override
public RepositorySystemSession getRepositorySystemSession( final ProjectToolsSession session )
throws MAEException
{
final File localRepo = session.getLocalRepositoryDirectory();
RepositorySystemSession sess = session.getRepositorySystemSession();
if ( sess == null )
{
final DefaultRepositorySystemSession rss =
new DefaultRepositorySystemSession(
embedder.serviceManager().createAetherRepositorySystemSession( session.getExecutionRequest() ) );
// session.setWorkspaceReader( new ImportWorkspaceReader( workspace ) );
rss.setConfigProperty( ProjectToolsSession.SESSION_KEY, session );
if ( localRepo != null )
{
localRepo.mkdirs();
rss.setLocalRepositoryManager( new EnhancedLocalRepositoryManager( localRepo ) );
}
rss.setWorkspaceReader( new SessionWorkspaceReader( session ) );
sess = rss;
session.setRepositorySystemSession( sess );
}
sess.getData().set( ProjectToolsSession.SESSION_KEY, session );
return sess;
}
@Override
public synchronized List<RemoteRepository> getRemoteRepositories( final ProjectToolsSession session )
throws ProjectToolsException
{
List<RemoteRepository> result = session.getRemoteRepositories();
if ( result == null )
{
result = new ArrayList<RemoteRepository>();
boolean selectorsEnabled = false;
AuthenticationSelector authSelector = null;
ProxySelector proxySelector = null;
if ( session.getRepositorySystemSession() != null )
{
selectorsEnabled = true;
authSelector = session.getRepositorySystemSession().getAuthenticationSelector();
proxySelector = session.getRepositorySystemSession().getProxySelector();
}
else
{
LOGGER.warn( "Cannot set proxy or authentication information on new RemoteRepositories; "
+ "RepositorySystemSession is not available in ProjectToolsSession instance." );
}
for ( final ArtifactRepository repo : getArtifactRepositories( session ) )
{
RemoteRepository r = null;
if ( repo instanceof RemoteRepository )
{
r = (RemoteRepository) repo;
}
else if ( repo instanceof MavenArtifactRepository )
{
r = new RemoteRepository( repo.getId(), "default", repo.getUrl() );
}
if ( r != null )
{
if ( selectorsEnabled )
{
r.setAuthentication( authSelector.getAuthentication( r ) );
r.setProxy( proxySelector.getProxy( r ) );
}
result.add( r );
}
}
session.setRemoteRepositories( result );
}
return result;
}
@Override
public synchronized List<ArtifactRepository> getArtifactRepositories( final ProjectToolsSession session )
throws ProjectToolsException
{
List<ArtifactRepository> repos = session.getRemoteArtifactRepositories();
if ( repos == null )
{
final Repository[] remoteRepositories = session.getResolveRepositories();
repos = new ArrayList<ArtifactRepository>( remoteRepositories == null ? 0 : remoteRepositories.length );
if ( remoteRepositories != null )
{
for ( final Repository repo : remoteRepositories )
{
try
{
repos.add( mavenRepositorySystem.buildArtifactRepository( repo ) );
}
catch ( final InvalidRepositoryException e )
{
throw new ProjectToolsException(
"Failed to create remote artifact repository instance from: %s\nReason: %s",
e, repo, e.getMessage() );
}
}
}
try
{
repos.add( mavenRepositorySystem.createDefaultRemoteRepository() );
}
catch ( final InvalidRepositoryException e )
{
throw new ProjectToolsException( "Failed to create default (central) repository instance: %s", e,
e.getMessage() );
}
session.setRemoteArtifactRepositories( repos );
}
return repos;
}
}