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.ExtendedPluginDescriptor;
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 = null;
118 if (pluginDescriptor instanceof ExtendedPluginDescriptor) {
119 ExtendedPluginDescriptor extPluginDescriptor = (ExtendedPluginDescriptor) pluginDescriptor;
120 jdk = extPluginDescriptor.getRequiredJavaVersion();
121 }
122 if (jdk != null) {
123 return jdk;
124 }
125 Plugin compiler = getCompilerPlugin(project.getBuild());
126 if (compiler == null) {
127 compiler = getCompilerPlugin(project.getPluginManagement());
128 }
129
130 jdk = getPluginParameter(compiler, "release");
131 if (jdk == null) {
132 jdk = project.getProperties().getProperty("maven.compiler.release");
133 }
134
135 if (jdk == null) {
136 jdk = getPluginParameter(compiler, "target");
137 }
138
139 if (jdk == null) {
140
141 jdk = project.getProperties().getProperty("maven.compiler.target");
142 }
143
144 if (jdk == null) {
145 String version = (compiler == null) ? null : compiler.getVersion();
146
147 if (version != null) {
148 return "Default target for maven-compiler-plugin version " + version;
149 }
150 } else {
151 if (Arrays.asList("1.5", "1.6", "1.7", "1.8").contains(jdk)) {
152 jdk = jdk.substring(2);
153 }
154 }
155
156 return jdk;
157 }
158
159 private static Plugin getCompilerPlugin(PluginContainer container) {
160 if (container != null) {
161 Map<String, Plugin> pluginsAsMap = container.getPluginsAsMap();
162 return pluginsAsMap.get("org.apache.maven.plugins:maven-compiler-plugin");
163 }
164 return null;
165 }
166
167 private static String getPluginParameter(Plugin plugin, String parameter) {
168 if (plugin != null) {
169 Xpp3Dom pluginConf = (Xpp3Dom) plugin.getConfiguration();
170
171 if (pluginConf != null) {
172 Xpp3Dom target = pluginConf.getChild(parameter);
173
174 if (target != null) {
175 return target.getValue();
176 }
177 }
178 }
179
180 return null;
181 }
182
183 public boolean hasSameRequirements(RequirementsHistory other) {
184 return Objects.equals(this.maven, other.getMaven()) && Objects.equals(this.jdk, other.getJdk());
185 }
186 }