001    package 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    
022    import java.io.File;
023    import java.util.Arrays;
024    import java.util.Date;
025    import java.util.List;
026    import java.util.Map;
027    import java.util.Properties;
028    import java.util.concurrent.ConcurrentHashMap;
029    
030    import org.apache.maven.artifact.repository.ArtifactRepository;
031    import org.apache.maven.artifact.repository.RepositoryCache;
032    import org.apache.maven.monitor.event.EventDispatcher;
033    import org.apache.maven.plugin.descriptor.PluginDescriptor;
034    import org.apache.maven.project.MavenProject;
035    import org.apache.maven.project.ProjectBuildingRequest;
036    import org.apache.maven.settings.Settings;
037    import org.codehaus.plexus.PlexusContainer;
038    import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
039    import org.eclipse.aether.RepositorySystemSession;
040    
041    /**
042     * @author Jason van Zyl
043     */
044    public class MavenSession
045        implements Cloneable
046    {
047        private PlexusContainer container;
048    
049        private MavenExecutionRequest request;
050    
051        private MavenExecutionResult result;
052    
053        private RepositorySystemSession repositorySession;
054    
055        private final Settings settings;
056    
057        private Properties executionProperties;
058    
059        private MavenProject currentProject;
060    
061        /**
062         * These projects have already been topologically sorted in the {@link org.apache.maven.Maven} component before
063         * being passed into the session.
064         */
065        private List<MavenProject> projects;
066    
067        private MavenProject topLevelProject;
068    
069        private ProjectDependencyGraph projectDependencyGraph;
070    
071        private boolean parallel;
072    
073        private final Map<String, Map<String, Map<String, Object>>> pluginContextsByProjectAndPluginKey =
074            new ConcurrentHashMap<String, Map<String, Map<String, Object>>>();
075    
076        @Deprecated
077        public MavenSession( PlexusContainer container, MavenExecutionRequest request, MavenExecutionResult result,
078                             MavenProject project )
079        {
080            this( container, request, result, Arrays.asList( new MavenProject[]{project} ) );
081        }
082    
083        @Deprecated
084        public MavenSession( PlexusContainer container, Settings settings, ArtifactRepository localRepository,
085                             EventDispatcher eventDispatcher, ReactorManager unused, List<String> goals,
086                             String executionRootDir, Properties executionProperties, Date startTime )
087        {
088            this( container, settings, localRepository, eventDispatcher, unused, goals, executionRootDir,
089                  executionProperties, null, startTime );
090        }
091    
092        @Deprecated
093        public MavenSession( PlexusContainer container, Settings settings, ArtifactRepository localRepository,
094                             EventDispatcher eventDispatcher, ReactorManager unused, List<String> goals,
095                             String executionRootDir, Properties executionProperties, Properties userProperties,
096                             Date startTime )
097        {
098            this.container = container;
099            this.settings = settings;
100            this.executionProperties = executionProperties;
101            this.request = new DefaultMavenExecutionRequest();
102            this.request.setUserProperties( userProperties );
103            this.request.setLocalRepository( localRepository );
104            this.request.setGoals( goals );
105            this.request.setBaseDirectory( ( executionRootDir != null ) ? new File( executionRootDir ) : null );
106            this.request.setStartTime( startTime );
107        }
108    
109        @Deprecated
110        public MavenSession( PlexusContainer container, MavenExecutionRequest request, MavenExecutionResult result,
111                             List<MavenProject> projects )
112        {
113            this.container = container;
114            this.request = request;
115            this.result = result;
116            this.settings = new SettingsAdapter( request );
117            setProjects( projects );
118        }
119    
120        public MavenSession( PlexusContainer container, RepositorySystemSession repositorySession, MavenExecutionRequest request,
121                             MavenExecutionResult result )
122        {
123            this.container = container;
124            this.request = request;
125            this.result = result;
126            this.settings = new SettingsAdapter( request );
127            this.repositorySession = repositorySession;
128        }
129    
130        public void setProjects( List<MavenProject> projects )
131        {
132            if ( !projects.isEmpty() )
133            {
134                this.currentProject = projects.get( 0 );
135                this.topLevelProject = currentProject;
136                for ( MavenProject project : projects )
137                {
138                    if ( project.isExecutionRoot() )
139                    {
140                        topLevelProject = project;
141                        break;
142                    }
143                }
144            }
145            else
146            {
147                this.currentProject = null;
148                this.topLevelProject = null;
149            }
150            this.projects = projects;
151        }
152    
153        @Deprecated
154        public PlexusContainer getContainer()
155        {
156            return container;
157        }
158    
159        @Deprecated
160        public Object lookup( String role )
161            throws ComponentLookupException
162        {
163            return container.lookup( role );
164        }
165    
166        @Deprecated
167        public Object lookup( String role, String roleHint )
168            throws ComponentLookupException
169        {
170            return container.lookup( role, roleHint );
171        }
172    
173        @Deprecated
174        public List<Object> lookupList( String role )
175            throws ComponentLookupException
176        {
177            return container.lookupList( role );
178        }
179    
180        @Deprecated
181        public Map<String, Object> lookupMap( String role )
182            throws ComponentLookupException
183        {
184            return container.lookupMap( role );
185        }
186    
187        public ArtifactRepository getLocalRepository()
188        {
189            return request.getLocalRepository();
190        }
191    
192        public List<String> getGoals()
193        {
194            return request.getGoals();
195        }
196    
197        /**
198         * Gets the user properties to use for interpolation and profile activation. The user properties have been
199         * configured directly by the user on his discretion, e.g. via the {@code -Dkey=value} parameter on the command
200         * line.
201         *
202         * @return The user properties, never {@code null}.
203         */
204        public Properties getUserProperties()
205        {
206            return request.getUserProperties();
207        }
208    
209        /**
210         * Gets the system properties to use for interpolation and profile activation. The system properties are collected
211         * from the runtime environment like {@link System#getProperties()} and environment variables.
212         *
213         * @return The system properties, never {@code null}.
214         */
215        public Properties getSystemProperties()
216        {
217            return request.getSystemProperties();
218        }
219    
220        /**
221         * @deprecated Use either {@link #getUserProperties()} or {@link #getSystemProperties()}.
222         */
223        @Deprecated
224        public Properties getExecutionProperties()
225        {
226            if ( executionProperties == null )
227            {
228                executionProperties = new Properties();
229                executionProperties.putAll( request.getSystemProperties() );
230                executionProperties.putAll( request.getUserProperties() );
231            }
232    
233            return executionProperties;
234        }
235    
236        public Settings getSettings()
237        {
238            return settings;
239        }
240    
241        public List<MavenProject> getProjects()
242        {
243            return projects;
244        }
245    
246        @Deprecated
247        public List<MavenProject> getSortedProjects()
248        {
249            return getProjects();
250        }
251    
252        public String getExecutionRootDirectory()
253        {
254            return request.getBaseDirectory();
255        }
256    
257        public boolean isUsingPOMsFromFilesystem()
258        {
259            return request.isProjectPresent();
260        }
261    
262        public MavenExecutionRequest getRequest()
263        {
264            return request;
265        }
266    
267        public void setCurrentProject( MavenProject currentProject )
268        {
269            this.currentProject = currentProject;
270        }
271    
272        public MavenProject getCurrentProject()
273        {
274            return currentProject;
275        }
276    
277        public ProjectBuildingRequest getProjectBuildingRequest()
278        {
279            return request.getProjectBuildingRequest().setRepositorySession( getRepositorySession() );
280        }
281    
282        public List<String> getPluginGroups()
283        {
284            return request.getPluginGroups();
285        }
286    
287        public boolean isOffline()
288        {
289            return request.isOffline();
290        }
291    
292        public MavenProject getTopLevelProject()
293        {
294            return topLevelProject;
295        }
296    
297        public MavenExecutionResult getResult()
298        {
299            return result;
300        }
301    
302        // Backward compat
303    
304        public Map<String, Object> getPluginContext( PluginDescriptor plugin, MavenProject project )
305        {
306            String projectKey = project.getId();
307    
308            Map<String, Map<String, Object>> pluginContextsByKey = pluginContextsByProjectAndPluginKey.get( projectKey );
309    
310            if ( pluginContextsByKey == null )
311            {
312                pluginContextsByKey = new ConcurrentHashMap<String, Map<String, Object>>();
313    
314                pluginContextsByProjectAndPluginKey.put( projectKey, pluginContextsByKey );
315            }
316    
317            String pluginKey = plugin.getPluginLookupKey();
318    
319            Map<String, Object> pluginContext = pluginContextsByKey.get( pluginKey );
320    
321            if ( pluginContext == null )
322            {
323                pluginContext = new ConcurrentHashMap<String, Object>();
324    
325                pluginContextsByKey.put( pluginKey, pluginContext );
326            }
327    
328            return pluginContext;
329        }
330    
331        public ProjectDependencyGraph getProjectDependencyGraph()
332        {
333            return projectDependencyGraph;
334        }
335    
336        public void setProjectDependencyGraph( ProjectDependencyGraph projectDependencyGraph )
337        {
338            this.projectDependencyGraph = projectDependencyGraph;
339        }
340    
341        public String getReactorFailureBehavior()
342        {
343            return request.getReactorFailureBehavior();
344        }
345    
346        @Override
347        public MavenSession clone()
348        {
349            try
350            {
351                return (MavenSession) super.clone();
352            }
353            catch ( CloneNotSupportedException e )
354            {
355                throw new RuntimeException( "Bug", e );
356            }
357        }
358    
359        @Deprecated
360        public EventDispatcher getEventDispatcher()
361        {
362            return null;
363        }
364    
365        public Date getStartTime()
366        {
367            return request.getStartTime();
368        }
369    
370        public boolean isParallel()
371        {
372            return parallel;
373        }
374    
375        public void setParallel( boolean parallel )
376        {
377            this.parallel = parallel;
378        }
379    
380        public RepositorySystemSession getRepositorySession()
381        {
382            return repositorySession;
383        }
384    
385        @Deprecated
386        //
387        // Used by Tycho and will break users and force them to upgrade to Maven 3.1 so we should really leave
388        // this here, possibly indefinitely.
389        //
390        public RepositoryCache getRepositoryCache()
391        {
392            return null;
393        }
394    
395    }