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}