View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.apache.maven.plugin.internal;
20  
21  import javax.inject.Inject;
22  import javax.inject.Named;
23  import javax.inject.Singleton;
24  
25  import java.util.Map;
26  
27  import org.apache.maven.artifact.repository.ArtifactRepository;
28  import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
29  import org.apache.maven.artifact.resolver.ArtifactResolutionException;
30  import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
31  import org.apache.maven.execution.MavenSession;
32  import org.apache.maven.model.Plugin;
33  import org.apache.maven.plugin.InvalidPluginDescriptorException;
34  import org.apache.maven.plugin.InvalidPluginException;
35  import org.apache.maven.plugin.LegacySupport;
36  import org.apache.maven.plugin.MavenPluginManager;
37  import org.apache.maven.plugin.MojoExecution;
38  import org.apache.maven.plugin.MojoExecutionException;
39  import org.apache.maven.plugin.MojoFailureException;
40  import org.apache.maven.plugin.PluginConfigurationException;
41  import org.apache.maven.plugin.PluginDescriptorParsingException;
42  import org.apache.maven.plugin.PluginManager;
43  import org.apache.maven.plugin.PluginManagerException;
44  import org.apache.maven.plugin.PluginNotFoundException;
45  import org.apache.maven.plugin.PluginResolutionException;
46  import org.apache.maven.plugin.descriptor.PluginDescriptor;
47  import org.apache.maven.plugin.prefix.DefaultPluginPrefixRequest;
48  import org.apache.maven.plugin.prefix.NoPluginFoundForPrefixException;
49  import org.apache.maven.plugin.prefix.PluginPrefixRequest;
50  import org.apache.maven.plugin.prefix.PluginPrefixResolver;
51  import org.apache.maven.plugin.prefix.PluginPrefixResult;
52  import org.apache.maven.plugin.version.DefaultPluginVersionRequest;
53  import org.apache.maven.plugin.version.PluginVersionNotFoundException;
54  import org.apache.maven.plugin.version.PluginVersionRequest;
55  import org.apache.maven.plugin.version.PluginVersionResolutionException;
56  import org.apache.maven.plugin.version.PluginVersionResolver;
57  import org.apache.maven.project.MavenProject;
58  import org.apache.maven.project.artifact.InvalidDependencyVersionException;
59  import org.apache.maven.settings.Settings;
60  import org.codehaus.plexus.PlexusContainer;
61  import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
62  
63  /**
64   * @author Benjamin Bentmann
65   */
66  @Singleton
67  @Named
68  public class DefaultPluginManager implements PluginManager {
69  
70      @Inject
71      private PlexusContainer container;
72  
73      @Inject
74      private MavenPluginManager pluginManager;
75  
76      @Inject
77      private PluginVersionResolver pluginVersionResolver;
78  
79      @Inject
80      private PluginPrefixResolver pluginPrefixResolver;
81  
82      @Inject
83      private LegacySupport legacySupport;
84  
85      public void executeMojo(MavenProject project, MojoExecution execution, MavenSession session)
86              throws MojoExecutionException, ArtifactResolutionException, MojoFailureException, ArtifactNotFoundException,
87                      InvalidDependencyVersionException, PluginManagerException, PluginConfigurationException {
88          throw new UnsupportedOperationException();
89      }
90  
91      public Object getPluginComponent(Plugin plugin, String role, String roleHint)
92              throws PluginManagerException, ComponentLookupException {
93          MavenSession session = legacySupport.getSession();
94  
95          PluginDescriptor pluginDescriptor;
96          try {
97              pluginDescriptor = pluginManager.getPluginDescriptor(
98                      plugin, session.getCurrentProject().getRemotePluginRepositories(), session.getRepositorySession());
99  
100             pluginManager.setupPluginRealm(pluginDescriptor, session, null, null, null);
101         } catch (Exception e) {
102             throw new PluginManagerException(plugin, e.getMessage(), e);
103         }
104 
105         ClassLoader oldClassLoader = Thread.currentThread().getContextClassLoader();
106         try {
107             Thread.currentThread().setContextClassLoader(pluginDescriptor.getClassRealm());
108 
109             return container.lookup(role, roleHint);
110         } finally {
111             Thread.currentThread().setContextClassLoader(oldClassLoader);
112         }
113     }
114 
115     public Map<String, Object> getPluginComponents(Plugin plugin, String role)
116             throws ComponentLookupException, PluginManagerException {
117         MavenSession session = legacySupport.getSession();
118 
119         PluginDescriptor pluginDescriptor;
120         try {
121             pluginDescriptor = pluginManager.getPluginDescriptor(
122                     plugin, session.getCurrentProject().getRemotePluginRepositories(), session.getRepositorySession());
123 
124             pluginManager.setupPluginRealm(pluginDescriptor, session, null, null, null);
125         } catch (Exception e) {
126             throw new PluginManagerException(plugin, e.getMessage(), e);
127         }
128 
129         ClassLoader oldClassLoader = Thread.currentThread().getContextClassLoader();
130         try {
131             Thread.currentThread().setContextClassLoader(pluginDescriptor.getClassRealm());
132 
133             return container.lookupMap(role);
134         } finally {
135             Thread.currentThread().setContextClassLoader(oldClassLoader);
136         }
137     }
138 
139     public Plugin getPluginDefinitionForPrefix(String prefix, MavenSession session, MavenProject project) {
140         PluginPrefixRequest request = new DefaultPluginPrefixRequest(prefix, session);
141         request.setPom(project.getModel());
142 
143         try {
144             PluginPrefixResult result = pluginPrefixResolver.resolve(request);
145 
146             Plugin plugin = new Plugin();
147             plugin.setGroupId(result.getGroupId());
148             plugin.setArtifactId(result.getArtifactId());
149 
150             return plugin;
151         } catch (NoPluginFoundForPrefixException e) {
152             return null;
153         }
154     }
155 
156     public PluginDescriptor getPluginDescriptorForPrefix(String prefix) {
157         MavenSession session = legacySupport.getSession();
158 
159         PluginPrefixRequest request = new DefaultPluginPrefixRequest(prefix, session);
160 
161         try {
162             PluginPrefixResult result = pluginPrefixResolver.resolve(request);
163 
164             Plugin plugin = new Plugin();
165             plugin.setGroupId(result.getGroupId());
166             plugin.setArtifactId(result.getArtifactId());
167 
168             return loadPluginDescriptor(plugin, session.getCurrentProject(), session);
169         } catch (Exception e) {
170             return null;
171         }
172     }
173 
174     public PluginDescriptor loadPluginDescriptor(Plugin plugin, MavenProject project, MavenSession session)
175             throws ArtifactResolutionException, PluginVersionResolutionException, ArtifactNotFoundException,
176                     InvalidVersionSpecificationException, InvalidPluginException, PluginManagerException,
177                     PluginNotFoundException, PluginVersionNotFoundException {
178         return verifyPlugin(plugin, project, session.getSettings(), session.getLocalRepository());
179     }
180 
181     public PluginDescriptor loadPluginFully(Plugin plugin, MavenProject project, MavenSession session)
182             throws ArtifactResolutionException, PluginVersionResolutionException, ArtifactNotFoundException,
183                     InvalidVersionSpecificationException, InvalidPluginException, PluginManagerException,
184                     PluginNotFoundException, PluginVersionNotFoundException {
185         PluginDescriptor pluginDescriptor = loadPluginDescriptor(plugin, project, session);
186 
187         try {
188             pluginManager.setupPluginRealm(pluginDescriptor, session, null, null, null);
189         } catch (PluginResolutionException e) {
190             throw new PluginManagerException(plugin, e.getMessage(), e);
191         }
192 
193         return pluginDescriptor;
194     }
195 
196     public PluginDescriptor verifyPlugin(
197             Plugin plugin, MavenProject project, Settings settings, ArtifactRepository localRepository)
198             throws ArtifactResolutionException, PluginVersionResolutionException, ArtifactNotFoundException,
199                     InvalidVersionSpecificationException, InvalidPluginException, PluginManagerException,
200                     PluginNotFoundException, PluginVersionNotFoundException {
201         MavenSession session = legacySupport.getSession();
202 
203         if (plugin.getVersion() == null) {
204             PluginVersionRequest versionRequest = new DefaultPluginVersionRequest(
205                     plugin, session.getRepositorySession(), project.getRemotePluginRepositories());
206             plugin.setVersion(pluginVersionResolver.resolve(versionRequest).getVersion());
207         }
208 
209         try {
210             return pluginManager.getPluginDescriptor(
211                     plugin, project.getRemotePluginRepositories(), session.getRepositorySession());
212         } catch (PluginResolutionException e) {
213             throw new PluginNotFoundException(plugin, project.getPluginArtifactRepositories());
214         } catch (PluginDescriptorParsingException | InvalidPluginDescriptorException e) {
215             throw new PluginManagerException(plugin, e.getMessage(), e);
216         }
217     }
218 }