001package org.apache.maven.execution; 002 003/* 004 * Licensed to the Apache Software Foundation (ASF) under one 005 * or more contributor license agreements. See the NOTICE file 006 * distributed with this work for additional information 007 * regarding copyright ownership. The ASF licenses this file 008 * to you under the Apache License, Version 2.0 (the 009 * "License"); you may not use this file except in compliance 010 * with the License. You may obtain a copy of the License at 011 * 012 * http://www.apache.org/licenses/LICENSE-2.0 013 * 014 * Unless required by applicable law or agreed to in writing, 015 * software distributed under the License is distributed on an 016 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 017 * KIND, either express or implied. See the License for the 018 * specific language governing permissions and limitations 019 * under the License. 020 */ 021 022import java.io.File; 023import java.util.HashSet; 024import java.util.List; 025import java.util.Set; 026 027import org.apache.maven.artifact.InvalidRepositoryException; 028import org.apache.maven.artifact.repository.ArtifactRepository; 029import org.apache.maven.bridge.MavenRepositorySystem; 030import org.apache.maven.repository.RepositorySystem; 031import org.apache.maven.settings.Mirror; 032import org.apache.maven.settings.Proxy; 033import org.apache.maven.settings.Repository; 034import org.apache.maven.settings.Server; 035import org.apache.maven.settings.Settings; 036import org.apache.maven.settings.SettingsUtils; 037import org.codehaus.plexus.component.annotations.Component; 038import org.codehaus.plexus.component.annotations.Requirement; 039import org.codehaus.plexus.util.StringUtils; 040 041@Component( role = MavenExecutionRequestPopulator.class ) 042public class DefaultMavenExecutionRequestPopulator 043 implements MavenExecutionRequestPopulator 044{ 045 046 @Requirement 047 private RepositorySystem repositorySystem; 048 049 public MavenExecutionRequest populateFromSettings( MavenExecutionRequest request, Settings settings ) 050 throws MavenExecutionRequestPopulationException 051 { 052 if ( settings == null ) 053 { 054 return request; 055 } 056 057 request.setOffline( settings.isOffline() ); 058 059 request.setInteractiveMode( settings.isInteractiveMode() ); 060 061 request.setPluginGroups( settings.getPluginGroups() ); 062 063 request.setLocalRepositoryPath( settings.getLocalRepository() ); 064 065 for ( Server server : settings.getServers() ) 066 { 067 server = server.clone(); 068 069 request.addServer( server ); 070 } 071 072 // <proxies> 073 // <proxy> 074 // <active>true</active> 075 // <protocol>http</protocol> 076 // <host>proxy.somewhere.com</host> 077 // <port>8080</port> 078 // <username>proxyuser</username> 079 // <password>somepassword</password> 080 // <nonProxyHosts>www.google.com|*.somewhere.com</nonProxyHosts> 081 // </proxy> 082 // </proxies> 083 084 for ( Proxy proxy : settings.getProxies() ) 085 { 086 if ( !proxy.isActive() ) 087 { 088 continue; 089 } 090 091 proxy = proxy.clone(); 092 093 request.addProxy( proxy ); 094 } 095 096 // <mirrors> 097 // <mirror> 098 // <id>nexus</id> 099 // <mirrorOf>*</mirrorOf> 100 // <url>http://repository.sonatype.org/content/groups/public</url> 101 // </mirror> 102 // </mirrors> 103 104 for ( Mirror mirror : settings.getMirrors() ) 105 { 106 mirror = mirror.clone(); 107 108 request.addMirror( mirror ); 109 } 110 111 request.setActiveProfiles( settings.getActiveProfiles() ); 112 113 for ( org.apache.maven.settings.Profile rawProfile : settings.getProfiles() ) 114 { 115 request.addProfile( SettingsUtils.convertFromSettingsProfile( rawProfile ) ); 116 117 if ( settings.getActiveProfiles().contains( rawProfile.getId() ) ) 118 { 119 List<Repository> remoteRepositories = rawProfile.getRepositories(); 120 for ( Repository remoteRepository : remoteRepositories ) 121 { 122 try 123 { 124 request.addRemoteRepository( MavenRepositorySystem.buildArtifactRepository( remoteRepository ) ); 125 } 126 catch ( InvalidRepositoryException e ) 127 { 128 // do nothing for now 129 } 130 } 131 } 132 } 133 134 return request; 135 } 136 137 private void populateDefaultPluginGroups( MavenExecutionRequest request ) 138 { 139 request.addPluginGroup( "org.apache.maven.plugins" ); 140 request.addPluginGroup( "org.codehaus.mojo" ); 141 } 142 143 private void injectDefaultRepositories( MavenExecutionRequest request ) 144 throws MavenExecutionRequestPopulationException 145 { 146 Set<String> definedRepositories = getRepoIds( request.getRemoteRepositories() ); 147 148 if ( !definedRepositories.contains( RepositorySystem.DEFAULT_REMOTE_REPO_ID ) ) 149 { 150 try 151 { 152 request.addRemoteRepository( repositorySystem.createDefaultRemoteRepository() ); 153 } 154 catch ( InvalidRepositoryException e ) 155 { 156 throw new MavenExecutionRequestPopulationException( "Cannot create default remote repository.", e ); 157 } 158 } 159 } 160 161 private void injectDefaultPluginRepositories( MavenExecutionRequest request ) 162 throws MavenExecutionRequestPopulationException 163 { 164 Set<String> definedRepositories = getRepoIds( request.getPluginArtifactRepositories() ); 165 166 if ( !definedRepositories.contains( RepositorySystem.DEFAULT_REMOTE_REPO_ID ) ) 167 { 168 try 169 { 170 request.addPluginArtifactRepository( repositorySystem.createDefaultRemoteRepository() ); 171 } 172 catch ( InvalidRepositoryException e ) 173 { 174 throw new MavenExecutionRequestPopulationException( "Cannot create default remote repository.", e ); 175 } 176 } 177 } 178 179 private Set<String> getRepoIds( List<ArtifactRepository> repositories ) 180 { 181 Set<String> repoIds = new HashSet<String>(); 182 183 if ( repositories != null ) 184 { 185 for ( ArtifactRepository repository : repositories ) 186 { 187 repoIds.add( repository.getId() ); 188 } 189 } 190 191 return repoIds; 192 } 193 194 private void processRepositoriesInSettings( MavenExecutionRequest request ) 195 throws MavenExecutionRequestPopulationException 196 { 197 repositorySystem.injectMirror( request.getRemoteRepositories(), request.getMirrors() ); 198 repositorySystem.injectProxy( request.getRemoteRepositories(), request.getProxies() ); 199 repositorySystem.injectAuthentication( request.getRemoteRepositories(), request.getServers() ); 200 201 request.setRemoteRepositories( repositorySystem.getEffectiveRepositories( request.getRemoteRepositories() ) ); 202 203 repositorySystem.injectMirror( request.getPluginArtifactRepositories(), request.getMirrors() ); 204 repositorySystem.injectProxy( request.getPluginArtifactRepositories(), request.getProxies() ); 205 repositorySystem.injectAuthentication( request.getPluginArtifactRepositories(), request.getServers() ); 206 207 request.setPluginArtifactRepositories( repositorySystem.getEffectiveRepositories( request.getPluginArtifactRepositories() ) ); 208 } 209 210 private void localRepository( MavenExecutionRequest request ) 211 throws MavenExecutionRequestPopulationException 212 { 213 // ------------------------------------------------------------------------ 214 // Local Repository 215 // 216 // 1. Use a value has been passed in via the configuration 217 // 2. Use value in the resultant settings 218 // 3. Use default value 219 // ------------------------------------------------------------------------ 220 221 if ( request.getLocalRepository() == null ) 222 { 223 request.setLocalRepository( createLocalRepository( request ) ); 224 } 225 226 if ( request.getLocalRepositoryPath() == null ) 227 { 228 request.setLocalRepositoryPath( new File( request.getLocalRepository().getBasedir() ).getAbsoluteFile() ); 229 } 230 } 231 232 // ------------------------------------------------------------------------ 233 // Artifact Transfer Mechanism 234 // ------------------------------------------------------------------------ 235 236 public ArtifactRepository createLocalRepository( MavenExecutionRequest request ) 237 throws MavenExecutionRequestPopulationException 238 { 239 String localRepositoryPath = null; 240 241 if ( request.getLocalRepositoryPath() != null ) 242 { 243 localRepositoryPath = request.getLocalRepositoryPath().getAbsolutePath(); 244 } 245 246 if ( StringUtils.isEmpty( localRepositoryPath ) ) 247 { 248 localRepositoryPath = RepositorySystem.defaultUserLocalRepository.getAbsolutePath(); 249 } 250 251 try 252 { 253 return repositorySystem.createLocalRepository( new File( localRepositoryPath ) ); 254 } 255 catch ( InvalidRepositoryException e ) 256 { 257 throw new MavenExecutionRequestPopulationException( "Cannot create local repository.", e ); 258 } 259 } 260 261 private void baseDirectory( MavenExecutionRequest request ) 262 { 263 if ( request.getBaseDirectory() == null && request.getPom() != null ) 264 { 265 request.setBaseDirectory( request.getPom().getAbsoluteFile().getParentFile() ); 266 } 267 } 268 269 public MavenExecutionRequest populateDefaults( MavenExecutionRequest request ) 270 throws MavenExecutionRequestPopulationException 271 { 272 baseDirectory( request ); 273 274 localRepository( request ); 275 276 populateDefaultPluginGroups( request ); 277 278 injectDefaultRepositories( request ); 279 280 injectDefaultPluginRepositories( request ); 281 282 processRepositoriesInSettings( request ); 283 284 return request; 285 } 286 287}