1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.maven.plugin.plugin.report;
20
21 import java.util.Arrays;
22 import java.util.Map;
23 import java.util.Objects;
24 import java.util.Optional;
25
26 import org.apache.commons.lang3.StringUtils;
27 import org.apache.maven.model.Plugin;
28 import org.apache.maven.model.PluginContainer;
29 import org.apache.maven.model.Prerequisites;
30 import org.apache.maven.plugin.descriptor.PluginDescriptor;
31 import org.apache.maven.project.MavenProject;
32 import org.apache.maven.tools.plugin.PluginDescriptorHelper;
33 import org.codehaus.plexus.util.xml.Xpp3Dom;
34
35
36
37
38
39
40 public class RequirementsHistory {
41
42
43
44 private String version;
45
46
47
48
49 private String maven;
50
51
52
53
54 private String jdk;
55
56 public String getVersion() {
57 return version;
58 }
59
60 public String getMaven() {
61 return maven;
62 }
63
64 public String getJdk() {
65 return jdk;
66 }
67
68 @Override
69 public String toString() {
70 final StringBuilder sb = new StringBuilder("RequirementsHistory{");
71 sb.append("version='").append(version).append('\'');
72 sb.append(", maven='").append(maven).append('\'');
73 sb.append(", jdk='").append(jdk).append('\'');
74 sb.append('}');
75 return sb.toString();
76 }
77
78 public static RequirementsHistory discoverRequirements(MavenProject project) {
79 RequirementsHistory req = new RequirementsHistory();
80 req.version = project.getVersion();
81 req.jdk = discoverJdkRequirement(project, null);
82 req.maven = discoverMavenRequirement(project, null);
83 return req;
84 }
85
86
87
88
89
90
91
92
93 public static String discoverMavenRequirement(MavenProject project, PluginDescriptor pluginDescriptor) {
94 if (pluginDescriptor != null && StringUtils.isNotBlank(pluginDescriptor.getRequiredMavenVersion())) {
95 return pluginDescriptor.getRequiredMavenVersion();
96 }
97 return Optional.ofNullable(project.getPrerequisites())
98 .map(Prerequisites::getMaven)
99 .orElse(null);
100 }
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116 public static String discoverJdkRequirement(MavenProject project, PluginDescriptor pluginDescriptor) {
117 String jdk = PluginDescriptorHelper.getRequiredJavaVersion(pluginDescriptor);
118 if (jdk != null) {
119 return jdk;
120 }
121 Plugin compiler = getCompilerPlugin(project.getBuild());
122 if (compiler == null) {
123 compiler = getCompilerPlugin(project.getPluginManagement());
124 }
125
126 jdk = getPluginParameter(compiler, "release");
127 if (jdk == null) {
128 jdk = project.getProperties().getProperty("maven.compiler.release");
129 }
130
131 if (jdk == null) {
132 jdk = getPluginParameter(compiler, "target");
133 }
134
135 if (jdk == null) {
136
137 jdk = project.getProperties().getProperty("maven.compiler.target");
138 }
139
140 if (jdk == null) {
141 String version = (compiler == null) ? null : compiler.getVersion();
142
143 if (version != null) {
144 return "Default target for maven-compiler-plugin version " + version;
145 }
146 } else {
147 if (Arrays.asList("1.5", "1.6", "1.7", "1.8").contains(jdk)) {
148 jdk = jdk.substring(2);
149 }
150 }
151
152 return jdk;
153 }
154
155 private static Plugin getCompilerPlugin(PluginContainer container) {
156 if (container != null) {
157 Map<String, Plugin> pluginsAsMap = container.getPluginsAsMap();
158 return pluginsAsMap.get("org.apache.maven.plugins:maven-compiler-plugin");
159 }
160 return null;
161 }
162
163 private static String getPluginParameter(Plugin plugin, String parameter) {
164 if (plugin != null) {
165 Xpp3Dom pluginConf = (Xpp3Dom) plugin.getConfiguration();
166
167 if (pluginConf != null) {
168 Xpp3Dom target = pluginConf.getChild(parameter);
169
170 if (target != null) {
171 return target.getValue();
172 }
173 }
174 }
175
176 return null;
177 }
178
179 public boolean hasSameRequirements(RequirementsHistory other) {
180 return Objects.equals(this.maven, other.getMaven()) && Objects.equals(this.jdk, other.getJdk());
181 }
182 }