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