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.component.annotations.Component;
059 import org.codehaus.plexus.component.annotations.Requirement;
060 import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
061
062 /**
063 * @author Benjamin Bentmann
064 */
065 @Component( role = PluginManager.class )
066 public 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 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 e )
252 {
253 throw new PluginManagerException( plugin, e.getMessage(), e );
254 }
255 catch ( InvalidPluginDescriptorException e )
256 {
257 throw new PluginManagerException( plugin, e.getMessage(), e );
258 }
259 }
260
261 }