001package org.apache.maven.plugin.internal; 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 org.apache.maven.artifact.repository.ArtifactRepository; 023import org.apache.maven.artifact.resolver.ArtifactNotFoundException; 024import org.apache.maven.artifact.resolver.ArtifactResolutionException; 025import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException; 026import org.apache.maven.execution.MavenSession; 027import org.apache.maven.model.Plugin; 028import org.apache.maven.plugin.InvalidPluginDescriptorException; 029import org.apache.maven.plugin.InvalidPluginException; 030import org.apache.maven.plugin.LegacySupport; 031import org.apache.maven.plugin.MavenPluginManager; 032import org.apache.maven.plugin.MojoExecution; 033import org.apache.maven.plugin.MojoExecutionException; 034import org.apache.maven.plugin.MojoFailureException; 035import org.apache.maven.plugin.PluginConfigurationException; 036import org.apache.maven.plugin.PluginDescriptorParsingException; 037import org.apache.maven.plugin.PluginManager; 038import org.apache.maven.plugin.PluginManagerException; 039import org.apache.maven.plugin.PluginNotFoundException; 040import org.apache.maven.plugin.PluginResolutionException; 041import org.apache.maven.plugin.descriptor.PluginDescriptor; 042import org.apache.maven.plugin.prefix.DefaultPluginPrefixRequest; 043import org.apache.maven.plugin.prefix.NoPluginFoundForPrefixException; 044import org.apache.maven.plugin.prefix.PluginPrefixRequest; 045import org.apache.maven.plugin.prefix.PluginPrefixResolver; 046import org.apache.maven.plugin.prefix.PluginPrefixResult; 047import org.apache.maven.plugin.version.DefaultPluginVersionRequest; 048import org.apache.maven.plugin.version.PluginVersionNotFoundException; 049import org.apache.maven.plugin.version.PluginVersionRequest; 050import org.apache.maven.plugin.version.PluginVersionResolutionException; 051import org.apache.maven.plugin.version.PluginVersionResolver; 052import org.apache.maven.project.MavenProject; 053import org.apache.maven.project.artifact.InvalidDependencyVersionException; 054import org.apache.maven.settings.Settings; 055import org.codehaus.plexus.PlexusContainer; 056import org.codehaus.plexus.component.annotations.Component; 057import org.codehaus.plexus.component.annotations.Requirement; 058import org.codehaus.plexus.component.repository.exception.ComponentLookupException; 059 060import java.util.Map; 061 062/** 063 * @author Benjamin Bentmann 064 */ 065@Component( role = PluginManager.class ) 066public class DefaultPluginManager 067 implements PluginManager 068{ 069 070 @Requirement 071 private PlexusContainer container; 072 073 @Requirement 074 private MavenPluginManager pluginManager; 075 076 @Requirement 077 private PluginVersionResolver pluginVersionResolver; 078 079 @Requirement 080 private PluginPrefixResolver pluginPrefixResolver; 081 082 @Requirement 083 private LegacySupport legacySupport; 084 085 public void executeMojo( MavenProject project, MojoExecution execution, MavenSession session ) 086 throws MojoExecutionException, ArtifactResolutionException, MojoFailureException, ArtifactNotFoundException, 087 InvalidDependencyVersionException, PluginManagerException, PluginConfigurationException 088 { 089 throw new UnsupportedOperationException(); 090 } 091 092 public Object getPluginComponent( Plugin plugin, String role, String roleHint ) 093 throws PluginManagerException, ComponentLookupException 094 { 095 MavenSession session = legacySupport.getSession(); 096 097 PluginDescriptor pluginDescriptor; 098 try 099 { 100 pluginDescriptor = 101 pluginManager.getPluginDescriptor( plugin, session.getCurrentProject().getRemotePluginRepositories(), 102 session.getRepositorySession() ); 103 104 pluginManager.setupPluginRealm( pluginDescriptor, session, null, null, null ); 105 } 106 catch ( Exception e ) 107 { 108 throw new PluginManagerException( plugin, e.getMessage(), e ); 109 } 110 111 ClassLoader oldClassLoader = Thread.currentThread().getContextClassLoader(); 112 try 113 { 114 Thread.currentThread().setContextClassLoader( pluginDescriptor.getClassRealm() ); 115 116 return container.lookup( role, roleHint ); 117 } 118 finally 119 { 120 Thread.currentThread().setContextClassLoader( oldClassLoader ); 121 } 122 } 123 124 public Map<String, Object> getPluginComponents( Plugin plugin, String role ) 125 throws ComponentLookupException, PluginManagerException 126 { 127 MavenSession session = legacySupport.getSession(); 128 129 PluginDescriptor pluginDescriptor; 130 try 131 { 132 pluginDescriptor = 133 pluginManager.getPluginDescriptor( plugin, session.getCurrentProject().getRemotePluginRepositories(), 134 session.getRepositorySession() ); 135 136 pluginManager.setupPluginRealm( pluginDescriptor, session, null, null, null ); 137 } 138 catch ( Exception e ) 139 { 140 throw new PluginManagerException( plugin, e.getMessage(), e ); 141 } 142 143 ClassLoader oldClassLoader = Thread.currentThread().getContextClassLoader(); 144 try 145 { 146 Thread.currentThread().setContextClassLoader( pluginDescriptor.getClassRealm() ); 147 148 return container.lookupMap( role ); 149 } 150 finally 151 { 152 Thread.currentThread().setContextClassLoader( oldClassLoader ); 153 } 154 } 155 156 public Plugin getPluginDefinitionForPrefix( String prefix, MavenSession session, MavenProject project ) 157 { 158 PluginPrefixRequest request = new DefaultPluginPrefixRequest( prefix, session ); 159 request.setPom( project.getModel() ); 160 161 try 162 { 163 PluginPrefixResult result = pluginPrefixResolver.resolve( request ); 164 165 Plugin plugin = new Plugin(); 166 plugin.setGroupId( result.getGroupId() ); 167 plugin.setArtifactId( result.getArtifactId() ); 168 169 return plugin; 170 } 171 catch ( NoPluginFoundForPrefixException e ) 172 { 173 return null; 174 } 175 } 176 177 public PluginDescriptor getPluginDescriptorForPrefix( String prefix ) 178 { 179 MavenSession session = legacySupport.getSession(); 180 181 PluginPrefixRequest request = new DefaultPluginPrefixRequest( prefix, session ); 182 183 try 184 { 185 PluginPrefixResult result = pluginPrefixResolver.resolve( request ); 186 187 Plugin plugin = new Plugin(); 188 plugin.setGroupId( result.getGroupId() ); 189 plugin.setArtifactId( result.getArtifactId() ); 190 191 return loadPluginDescriptor( plugin, session.getCurrentProject(), session ); 192 } 193 catch ( Exception e ) 194 { 195 return null; 196 } 197 } 198 199 public PluginDescriptor loadPluginDescriptor( Plugin plugin, MavenProject project, MavenSession session ) 200 throws ArtifactResolutionException, PluginVersionResolutionException, ArtifactNotFoundException, 201 InvalidVersionSpecificationException, InvalidPluginException, PluginManagerException, PluginNotFoundException, 202 PluginVersionNotFoundException 203 { 204 return verifyPlugin( plugin, project, session.getSettings(), session.getLocalRepository() ); 205 } 206 207 public PluginDescriptor loadPluginFully( Plugin plugin, MavenProject project, MavenSession session ) 208 throws ArtifactResolutionException, PluginVersionResolutionException, ArtifactNotFoundException, 209 InvalidVersionSpecificationException, InvalidPluginException, PluginManagerException, PluginNotFoundException, 210 PluginVersionNotFoundException 211 { 212 PluginDescriptor pluginDescriptor = loadPluginDescriptor( plugin, project, session ); 213 214 try 215 { 216 pluginManager.setupPluginRealm( pluginDescriptor, session, null, null, null ); 217 } 218 catch ( PluginResolutionException e ) 219 { 220 throw new PluginManagerException( plugin, e.getMessage(), e ); 221 } 222 223 return pluginDescriptor; 224 } 225 226 public PluginDescriptor verifyPlugin( Plugin plugin, MavenProject project, Settings settings, 227 ArtifactRepository localRepository ) 228 throws ArtifactResolutionException, PluginVersionResolutionException, ArtifactNotFoundException, 229 InvalidVersionSpecificationException, InvalidPluginException, PluginManagerException, PluginNotFoundException, 230 PluginVersionNotFoundException 231 { 232 MavenSession session = legacySupport.getSession(); 233 234 if ( plugin.getVersion() == null ) 235 { 236 PluginVersionRequest versionRequest = 237 new DefaultPluginVersionRequest( plugin, session.getRepositorySession(), 238 project.getRemotePluginRepositories() ); 239 plugin.setVersion( pluginVersionResolver.resolve( versionRequest ).getVersion() ); 240 } 241 242 try 243 { 244 return pluginManager.getPluginDescriptor( plugin, project.getRemotePluginRepositories(), 245 session.getRepositorySession() ); 246 } 247 catch ( PluginResolutionException e ) 248 { 249 throw new PluginNotFoundException( plugin, project.getPluginArtifactRepositories() ); 250 } 251 catch ( PluginDescriptorParsingException | InvalidPluginDescriptorException e ) 252 { 253 throw new PluginManagerException( plugin, e.getMessage(), e ); 254 } 255 } 256 257}