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.sonatype.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 @Deprecated 188 public RepositoryCache getRepositoryCache() 189 { 190 return null; 191 } 192 193 public ArtifactRepository getLocalRepository() 194 { 195 return request.getLocalRepository(); 196 } 197 198 public List<String> getGoals() 199 { 200 return request.getGoals(); 201 } 202 203 /** 204 * Gets the user properties to use for interpolation and profile activation. The user properties have been 205 * configured directly by the user on his discretion, e.g. via the {@code -Dkey=value} parameter on the command 206 * line. 207 * 208 * @return The user properties, never {@code null}. 209 */ 210 public Properties getUserProperties() 211 { 212 return request.getUserProperties(); 213 } 214 215 /** 216 * Gets the system properties to use for interpolation and profile activation. The system properties are collected 217 * from the runtime environment like {@link System#getProperties()} and environment variables. 218 * 219 * @return The system properties, never {@code null}. 220 */ 221 public Properties getSystemProperties() 222 { 223 return request.getSystemProperties(); 224 } 225 226 /** 227 * @deprecated Use either {@link #getUserProperties()} or {@link #getSystemProperties()}. 228 */ 229 @Deprecated 230 public Properties getExecutionProperties() 231 { 232 if ( executionProperties == null ) 233 { 234 executionProperties = new Properties(); 235 executionProperties.putAll( request.getSystemProperties() ); 236 executionProperties.putAll( request.getUserProperties() ); 237 } 238 239 return executionProperties; 240 } 241 242 public Settings getSettings() 243 { 244 return settings; 245 } 246 247 public List<MavenProject> getProjects() 248 { 249 return projects; 250 } 251 252 @Deprecated 253 public List<MavenProject> getSortedProjects() 254 { 255 return getProjects(); 256 } 257 258 public String getExecutionRootDirectory() 259 { 260 return request.getBaseDirectory(); 261 } 262 263 public boolean isUsingPOMsFromFilesystem() 264 { 265 return request.isProjectPresent(); 266 } 267 268 public MavenExecutionRequest getRequest() 269 { 270 return request; 271 } 272 273 public void setCurrentProject( MavenProject currentProject ) 274 { 275 this.currentProject = currentProject; 276 } 277 278 public MavenProject getCurrentProject() 279 { 280 return currentProject; 281 } 282 283 public ProjectBuildingRequest getProjectBuildingRequest() 284 { 285 return request.getProjectBuildingRequest().setRepositorySession( getRepositorySession() ); 286 } 287 288 public List<String> getPluginGroups() 289 { 290 return request.getPluginGroups(); 291 } 292 293 public boolean isOffline() 294 { 295 return request.isOffline(); 296 } 297 298 public MavenProject getTopLevelProject() 299 { 300 return topLevelProject; 301 } 302 303 public MavenExecutionResult getResult() 304 { 305 return result; 306 } 307 308 // Backward compat 309 310 public Map<String, Object> getPluginContext( PluginDescriptor plugin, MavenProject project ) 311 { 312 String projectKey = project.getId(); 313 314 Map<String, Map<String, Object>> pluginContextsByKey = pluginContextsByProjectAndPluginKey.get( projectKey ); 315 316 if ( pluginContextsByKey == null ) 317 { 318 pluginContextsByKey = new ConcurrentHashMap<String, Map<String, Object>>(); 319 320 pluginContextsByProjectAndPluginKey.put( projectKey, pluginContextsByKey ); 321 } 322 323 String pluginKey = plugin.getPluginLookupKey(); 324 325 Map<String, Object> pluginContext = pluginContextsByKey.get( pluginKey ); 326 327 if ( pluginContext == null ) 328 { 329 pluginContext = new ConcurrentHashMap<String, Object>(); 330 331 pluginContextsByKey.put( pluginKey, pluginContext ); 332 } 333 334 return pluginContext; 335 } 336 337 public ProjectDependencyGraph getProjectDependencyGraph() 338 { 339 return projectDependencyGraph; 340 } 341 342 public void setProjectDependencyGraph( ProjectDependencyGraph projectDependencyGraph ) 343 { 344 this.projectDependencyGraph = projectDependencyGraph; 345 } 346 347 public String getReactorFailureBehavior() 348 { 349 return request.getReactorFailureBehavior(); 350 } 351 352 @Override 353 public MavenSession clone() 354 { 355 try 356 { 357 return (MavenSession) super.clone(); 358 } 359 catch ( CloneNotSupportedException e ) 360 { 361 throw new RuntimeException( "Bug", e ); 362 } 363 } 364 365 private String getId( MavenProject project ) 366 { 367 return project.getGroupId() + ':' + project.getArtifactId() + ':' + project.getVersion(); 368 } 369 370 @Deprecated 371 public EventDispatcher getEventDispatcher() 372 { 373 return null; 374 } 375 376 public Date getStartTime() 377 { 378 return request.getStartTime(); 379 } 380 381 public boolean isParallel() 382 { 383 return parallel; 384 } 385 386 public void setParallel( boolean parallel ) 387 { 388 this.parallel = parallel; 389 } 390 391 public RepositorySystemSession getRepositorySession() 392 { 393 return repositorySession; 394 } 395 396 }