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