1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.maven.repository.internal;
20
21 import java.io.InputStream;
22 import java.nio.file.Files;
23 import java.nio.file.Path;
24 import java.util.Collection;
25 import java.util.Collections;
26 import java.util.Date;
27 import java.util.Iterator;
28 import java.util.LinkedHashMap;
29 import java.util.Map;
30 import java.util.Objects;
31 import java.util.jar.JarFile;
32 import java.util.zip.ZipEntry;
33
34 import org.apache.maven.api.xml.XmlNode;
35 import org.apache.maven.internal.xml.XmlNodeBuilder;
36 import org.apache.maven.repository.internal.PluginsMetadata.PluginInfo;
37 import org.eclipse.aether.RepositorySystemSession;
38 import org.eclipse.aether.artifact.Artifact;
39 import org.eclipse.aether.deployment.DeployRequest;
40 import org.eclipse.aether.impl.MetadataGenerator;
41 import org.eclipse.aether.installation.InstallRequest;
42 import org.eclipse.aether.metadata.Metadata;
43 import org.eclipse.aether.util.ConfigUtils;
44 import org.slf4j.Logger;
45 import org.slf4j.LoggerFactory;
46
47
48
49
50
51
52 class PluginsMetadataGenerator implements MetadataGenerator {
53 private static final String PLUGIN_DESCRIPTOR_LOCATION = "META-INF/maven/plugin.xml";
54
55 private final Logger logger = LoggerFactory.getLogger(getClass());
56
57 private final Map<Object, PluginsMetadata> processedPlugins;
58
59 private final Date timestamp;
60
61 PluginsMetadataGenerator(RepositorySystemSession session, InstallRequest request) {
62 this(session, request.getMetadata());
63 }
64
65 PluginsMetadataGenerator(RepositorySystemSession session, DeployRequest request) {
66 this(session, request.getMetadata());
67 }
68
69 private PluginsMetadataGenerator(RepositorySystemSession session, Collection<? extends Metadata> metadatas) {
70 this.processedPlugins = new LinkedHashMap<>();
71 this.timestamp = (Date) ConfigUtils.getObject(session, new Date(), "maven.startTime");
72
73
74
75
76
77
78
79 for (Iterator<? extends Metadata> it = metadatas.iterator(); it.hasNext(); ) {
80 Metadata metadata = it.next();
81 if (metadata instanceof PluginsMetadata) {
82 it.remove();
83 PluginsMetadata pluginMetadata = (PluginsMetadata) metadata;
84 processedPlugins.put(pluginMetadata.getGroupId(), pluginMetadata);
85 }
86 }
87 }
88
89 @Override
90 public Collection<? extends Metadata> prepare(Collection<? extends Artifact> artifacts) {
91 return Collections.emptyList();
92 }
93
94 @Override
95 public Artifact transformArtifact(Artifact artifact) {
96 return artifact;
97 }
98
99 @Override
100 public Collection<? extends Metadata> finish(Collection<? extends Artifact> artifacts) {
101 LinkedHashMap<String, PluginsMetadata> plugins = new LinkedHashMap<>();
102 for (Artifact artifact : artifacts) {
103 PluginInfo pluginInfo = extractPluginInfo(artifact);
104 if (pluginInfo != null) {
105 String key = pluginInfo.groupId;
106 if (processedPlugins.get(key) == null) {
107 PluginsMetadata pluginMetadata = plugins.get(key);
108 if (pluginMetadata == null) {
109 pluginMetadata = new PluginsMetadata(pluginInfo, timestamp);
110 plugins.put(key, pluginMetadata);
111 }
112 }
113 }
114 }
115 return plugins.values();
116 }
117
118 private PluginInfo extractPluginInfo(Artifact artifact) {
119
120 if (artifact != null
121 && "jar".equals(artifact.getExtension())
122 && "".equals(artifact.getClassifier())
123 && artifact.getPath() != null) {
124 Path artifactPath = artifact.getPath();
125 if (Files.isRegularFile(artifactPath)) {
126 try (JarFile artifactJar = new JarFile(artifactPath.toFile(), false)) {
127 ZipEntry pluginDescriptorEntry = artifactJar.getEntry(PLUGIN_DESCRIPTOR_LOCATION);
128
129 if (pluginDescriptorEntry != null) {
130 try (InputStream is = artifactJar.getInputStream(pluginDescriptorEntry)) {
131
132
133
134
135
136 XmlNode root = XmlNodeBuilder.build(is, null);
137 String groupId = mayGetChild(root, "groupId");
138 String artifactId = mayGetChild(root, "artifactId");
139 String goalPrefix = mayGetChild(root, "goalPrefix");
140 String name = mayGetChild(root, "name");
141
142 if (Objects.equals(artifact.getGroupId(), groupId)
143 && Objects.equals(artifact.getArtifactId(), artifactId)) {
144
145 return new PluginInfo(groupId, artifactId, goalPrefix, name);
146 } else {
147 logger.warn(
148 "Artifact {}:{}"
149 + " JAR (about to be installed/deployed) contains Maven Plugin metadata for"
150 + " conflicting coordinates: {}:{}."
151 + " Your JAR contains rogue Maven Plugin metadata."
152 + " Possible causes may be: shaded into this JAR some Maven Plugin or some rogue resource.",
153 artifact.getGroupId(),
154 artifact.getArtifactId(),
155 groupId,
156 artifactId);
157 }
158 }
159 }
160 } catch (Exception e) {
161
162 }
163 }
164 }
165 return null;
166 }
167
168 private static String mayGetChild(XmlNode node, String child) {
169 XmlNode c = node.getChild(child);
170 if (c != null) {
171 return c.getValue();
172 }
173 return null;
174 }
175 }