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