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