1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.maven.cling.invoker.mvnup.goals;
20
21 import org.jdom2.Document;
22 import org.jdom2.Element;
23 import org.jdom2.Namespace;
24
25 import static org.apache.maven.cling.invoker.mvnup.goals.UpgradeConstants.ModelVersions.MODEL_VERSION_4_0_0;
26 import static org.apache.maven.cling.invoker.mvnup.goals.UpgradeConstants.ModelVersions.MODEL_VERSION_4_1_0;
27 import static org.apache.maven.cling.invoker.mvnup.goals.UpgradeConstants.ModelVersions.MODEL_VERSION_4_2_0;
28 import static org.apache.maven.cling.invoker.mvnup.goals.UpgradeConstants.Namespaces.MAVEN_4_0_0_NAMESPACE;
29 import static org.apache.maven.cling.invoker.mvnup.goals.UpgradeConstants.Namespaces.MAVEN_4_1_0_NAMESPACE;
30 import static org.apache.maven.cling.invoker.mvnup.goals.UpgradeConstants.Namespaces.MAVEN_4_2_0_NAMESPACE;
31 import static org.apache.maven.cling.invoker.mvnup.goals.UpgradeConstants.SchemaLocations.MAVEN_4_1_0_SCHEMA_LOCATION;
32 import static org.apache.maven.cling.invoker.mvnup.goals.UpgradeConstants.SchemaLocations.MAVEN_4_2_0_SCHEMA_LOCATION;
33 import static org.apache.maven.cling.invoker.mvnup.goals.UpgradeConstants.XmlElements.MODEL_VERSION;
34
35
36
37
38 public final class ModelVersionUtils {
39
40 private ModelVersionUtils() {
41
42 }
43
44
45
46
47
48
49
50
51 public static String detectModelVersion(Document pomDocument) {
52 Element root = pomDocument.getRootElement();
53 Namespace namespace = root.getNamespace();
54
55
56 Element modelVersionElement = root.getChild(MODEL_VERSION, namespace);
57 if (modelVersionElement != null) {
58 String modelVersion = modelVersionElement.getTextTrim();
59 if (!modelVersion.isEmpty()) {
60 return modelVersion;
61 }
62 }
63
64
65 String namespaceUri = namespace.getURI();
66 if (MAVEN_4_2_0_NAMESPACE.equals(namespaceUri)) {
67 return MODEL_VERSION_4_2_0;
68 } else if (MAVEN_4_1_0_NAMESPACE.equals(namespaceUri)) {
69 return MODEL_VERSION_4_1_0;
70 } else if (MAVEN_4_0_0_NAMESPACE.equals(namespaceUri)) {
71 return MODEL_VERSION_4_0_0;
72 }
73
74
75 return MODEL_VERSION_4_0_0;
76 }
77
78
79
80
81
82
83
84
85 public static boolean isValidModelVersion(String modelVersion) {
86 return MODEL_VERSION_4_0_0.equals(modelVersion)
87 || MODEL_VERSION_4_1_0.equals(modelVersion)
88 || MODEL_VERSION_4_2_0.equals(modelVersion);
89 }
90
91
92
93
94
95
96
97
98 public static boolean canUpgrade(String fromVersion, String toVersion) {
99 if (fromVersion == null || toVersion == null) {
100 return false;
101 }
102
103
104 if (MODEL_VERSION_4_0_0.equals(fromVersion)) {
105 return MODEL_VERSION_4_1_0.equals(toVersion) || MODEL_VERSION_4_2_0.equals(toVersion);
106 }
107 if (MODEL_VERSION_4_1_0.equals(fromVersion)) {
108 return MODEL_VERSION_4_2_0.equals(toVersion);
109 }
110
111 return false;
112 }
113
114
115
116
117
118
119
120
121 public static boolean isEligibleForInference(String modelVersion) {
122 return MODEL_VERSION_4_0_0.equals(modelVersion)
123 || MODEL_VERSION_4_1_0.equals(modelVersion)
124 || MODEL_VERSION_4_2_0.equals(modelVersion);
125 }
126
127
128
129
130
131
132
133 public static boolean isNewerThan410(String modelVersion) {
134 if (modelVersion == null) {
135 return false;
136 }
137
138
139
140 try {
141 String[] parts = modelVersion.split("\\.");
142 if (parts.length >= 2) {
143 int major = Integer.parseInt(parts[0]);
144 int minor = Integer.parseInt(parts[1]);
145
146 if (major > 4) {
147 return true;
148 }
149 if (major == 4 && minor > 1) {
150 return true;
151 }
152 if (major == 4 && minor == 1 && parts.length > 2) {
153 int patch = Integer.parseInt(parts[2]);
154 return patch > 0;
155 }
156 }
157 } catch (NumberFormatException e) {
158
159 return false;
160 }
161
162 return false;
163 }
164
165
166
167
168
169
170
171
172 public static boolean isVersionGreaterOrEqual(String modelVersion, String targetVersion) {
173 if (modelVersion == null || targetVersion == null) {
174 return false;
175 }
176
177
178 if (modelVersion.equals(targetVersion)) {
179 return true;
180 }
181
182
183 if (MODEL_VERSION_4_1_0.equals(targetVersion)) {
184 return MODEL_VERSION_4_1_0.equals(modelVersion) || isNewerThan410(modelVersion);
185 }
186
187
188 return false;
189 }
190
191
192
193
194
195
196
197 public static void updateModelVersion(Document pomDocument, String newVersion) {
198 Element root = pomDocument.getRootElement();
199 Namespace namespace = root.getNamespace();
200
201 Element modelVersionElement = root.getChild(MODEL_VERSION, namespace);
202 if (modelVersionElement != null) {
203 modelVersionElement.setText(newVersion);
204 } else {
205
206 Element newModelVersionElement = new Element(MODEL_VERSION, namespace);
207 newModelVersionElement.setText(newVersion);
208
209
210 root.addContent(0, newModelVersionElement);
211 }
212 }
213
214
215
216
217
218
219
220
221 public static boolean removeModelVersion(Document pomDocument) {
222 Element root = pomDocument.getRootElement();
223 Namespace namespace = root.getNamespace();
224
225 Element modelVersionElement = root.getChild(MODEL_VERSION, namespace);
226 if (modelVersionElement != null) {
227 return root.removeContent(modelVersionElement);
228 }
229 return false;
230 }
231
232
233
234
235
236
237
238 public static String getSchemaLocationForModelVersion(String modelVersion) {
239 if (MODEL_VERSION_4_2_0.equals(modelVersion)) {
240 return MAVEN_4_2_0_SCHEMA_LOCATION;
241 } else if (MODEL_VERSION_4_1_0.equals(modelVersion)) {
242 return MAVEN_4_1_0_SCHEMA_LOCATION;
243 } else if (isNewerThan410(modelVersion)) {
244
245 return MAVEN_4_2_0_SCHEMA_LOCATION;
246 }
247 return UpgradeConstants.SchemaLocations.MAVEN_4_0_0_SCHEMA_LOCATION;
248 }
249 }