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   */
65  @Named
66  @Singleton
67  @Deprecated
68  public class DefaultPluginManager implements PluginManager {
69  
70      private final PlexusContainer container;
71      private final MavenPluginManager pluginManager;
72      private final PluginVersionResolver pluginVersionResolver;
73      private final PluginPrefixResolver pluginPrefixResolver;
74      private final LegacySupport legacySupport;
75  
76      @Inject
77      public DefaultPluginManager(
78              PlexusContainer container,
79              MavenPluginManager pluginManager,
80              PluginVersionResolver pluginVersionResolver,
81              PluginPrefixResolver pluginPrefixResolver,
82              LegacySupport legacySupport) {
83          this.container = container;
84          this.pluginManager = pluginManager;
85          this.pluginVersionResolver = pluginVersionResolver;
86          this.pluginPrefixResolver = pluginPrefixResolver;
87          this.legacySupport = legacySupport;
88      }
89  
90      @Override
91      public void executeMojo(MavenProject project, MojoExecution execution, MavenSession session)
92              throws MojoExecutionException, ArtifactResolutionException, MojoFailureException, ArtifactNotFoundException,
93                      InvalidDependencyVersionException, PluginManagerException, PluginConfigurationException {
94          throw new UnsupportedOperationException();
95      }
96  
97      @Override
98      public Object getPluginComponent(Plugin plugin, String role, String roleHint)
99              throws PluginManagerException, ComponentLookupException {
100         MavenSession session = legacySupport.getSession();
101 
102         PluginDescriptor pluginDescriptor;
103         try {
104             pluginDescriptor = pluginManager.getPluginDescriptor(
105                     plugin, session.getCurrentProject().getRemotePluginRepositories(), session.getRepositorySession());
106 
107             pluginManager.setupPluginRealm(pluginDescriptor, session, null, null, null);
108         } catch (Exception e) {
109             throw new PluginManagerException(plugin, e.getMessage(), e);
110         }
111 
112         ClassLoader oldClassLoader = Thread.currentThread().getContextClassLoader();
113         try {
114             Thread.currentThread().setContextClassLoader(pluginDescriptor.getClassRealm());
115 
116             return container.lookup(role, roleHint);
117         } finally {
118             Thread.currentThread().setContextClassLoader(oldClassLoader);
119         }
120     }
121 
122     @Override
123     public Map<String, Object> getPluginComponents(Plugin plugin, String role)
124             throws ComponentLookupException, PluginManagerException {
125         MavenSession session = legacySupport.getSession();
126 
127         PluginDescriptor pluginDescriptor;
128         try {
129             pluginDescriptor = pluginManager.getPluginDescriptor(
130                     plugin, session.getCurrentProject().getRemotePluginRepositories(), session.getRepositorySession());
131 
132             pluginManager.setupPluginRealm(pluginDescriptor, session, null, null, null);
133         } catch (Exception e) {
134             throw new PluginManagerException(plugin, e.getMessage(), e);
135         }
136 
137         ClassLoader oldClassLoader = Thread.currentThread().getContextClassLoader();
138         try {
139             Thread.currentThread().setContextClassLoader(pluginDescriptor.getClassRealm());
140 
141             return container.lookupMap(role);
142         } finally {
143             Thread.currentThread().setContextClassLoader(oldClassLoader);
144         }
145     }
146 
147     @Override
148     public Plugin getPluginDefinitionForPrefix(String prefix, MavenSession session, MavenProject project) {
149         PluginPrefixRequest request = new DefaultPluginPrefixRequest(prefix, session);
150         request.setPom(project.getModel());
151 
152         try {
153             PluginPrefixResult result = pluginPrefixResolver.resolve(request);
154 
155             Plugin plugin = new Plugin();
156             plugin.setGroupId(result.getGroupId());
157             plugin.setArtifactId(result.getArtifactId());
158 
159             return plugin;
160         } catch (NoPluginFoundForPrefixException e) {
161             return null;
162         }
163     }
164 
165     @Override
166     public PluginDescriptor getPluginDescriptorForPrefix(String prefix) {
167         MavenSession session = legacySupport.getSession();
168 
169         PluginPrefixRequest request = new DefaultPluginPrefixRequest(prefix, session);
170 
171         try {
172             PluginPrefixResult result = pluginPrefixResolver.resolve(request);
173 
174             Plugin plugin = new Plugin();
175             plugin.setGroupId(result.getGroupId());
176             plugin.setArtifactId(result.getArtifactId());
177 
178             return loadPluginDescriptor(plugin, session.getCurrentProject(), session);
179         } catch (Exception e) {
180             return null;
181         }
182     }
183 
184     @Override
185     public PluginDescriptor loadPluginDescriptor(Plugin plugin, MavenProject project, MavenSession session)
186             throws ArtifactResolutionException, PluginVersionResolutionException, ArtifactNotFoundException,
187                     InvalidVersionSpecificationException, InvalidPluginException, PluginManagerException,
188                     PluginNotFoundException, PluginVersionNotFoundException {
189         return verifyPlugin(plugin, project, session.getSettings(), session.getLocalRepository());
190     }
191 
192     @Override
193     public PluginDescriptor loadPluginFully(Plugin plugin, MavenProject project, MavenSession session)
194             throws ArtifactResolutionException, PluginVersionResolutionException, ArtifactNotFoundException,
195                     InvalidVersionSpecificationException, InvalidPluginException, PluginManagerException,
196                     PluginNotFoundException, PluginVersionNotFoundException {
197         PluginDescriptor pluginDescriptor = loadPluginDescriptor(plugin, project, session);
198 
199         try {
200             pluginManager.setupPluginRealm(pluginDescriptor, session, null, null, null);
201         } catch (PluginResolutionException e) {
202             throw new PluginManagerException(plugin, e.getMessage(), e);
203         }
204 
205         return pluginDescriptor;
206     }
207 
208     @Override
209     public PluginDescriptor verifyPlugin(
210             Plugin plugin, MavenProject project, Settings settings, ArtifactRepository localRepository)
211             throws ArtifactResolutionException, PluginVersionResolutionException, ArtifactNotFoundException,
212                     InvalidVersionSpecificationException, InvalidPluginException, PluginManagerException,
213                     PluginNotFoundException, PluginVersionNotFoundException {
214         MavenSession session = legacySupport.getSession();
215 
216         if (plugin.getVersion() == null) {
217             PluginVersionRequest versionRequest = new DefaultPluginVersionRequest(
218                     plugin, session.getRepositorySession(), project.getRemotePluginRepositories());
219             plugin.setVersion(pluginVersionResolver.resolve(versionRequest).getVersion());
220         }
221 
222         try {
223             return pluginManager.getPluginDescriptor(
224                     plugin, project.getRemotePluginRepositories(), session.getRepositorySession());
225         } catch (PluginResolutionException e) {
226             throw new PluginNotFoundException(plugin, project.getPluginArtifactRepositories());
227         } catch (PluginDescriptorParsingException | InvalidPluginDescriptorException e) {
228             throw new PluginManagerException(plugin, e.getMessage(), e);
229         }
230     }
231 }