1010import java .io .File ;
1111import java .io .Serial ;
1212import java .io .Serializable ;
13+ import java .util .Arrays ;
14+ import java .util .EnumSet ;
1315import java .util .Locale ;
1416import java .util .Objects ;
1517import java .util .regex .Pattern ;
@@ -27,8 +29,7 @@ public class Artifact implements Comparable<Artifact>, Serializable {
2729 private final @ Nullable String version ;
2830 private final @ Nullable String classifier ;
2931 private final String ext ;
30- private final OS os ;
31- private final Arch arch ;
32+ private final EnumSet <OS > os ;
3233
3334 // Cached after building the first time we're asked
3435 // Transient field so these aren't serialized
@@ -58,7 +59,7 @@ public static Artifact from(String descriptor) {
5859 * @return The created artifact
5960 */
6061 public static Artifact from (String group , String name , String version ) {
61- return new Artifact (group , name , version , null , null , OS .UNKNOWN , Arch . UNKNOWN );
62+ return new Artifact (group , name , version , null , null , OS .UNKNOWN );
6263 }
6364
6465 /**
@@ -71,7 +72,7 @@ public static Artifact from(String group, String name, String version) {
7172 * @return The created artifact
7273 */
7374 public static Artifact from (String group , String name , String version , @ Nullable String classifier ) {
74- return new Artifact (group , name , version , classifier , null , OS .UNKNOWN , Arch . UNKNOWN );
75+ return new Artifact (group , name , version , classifier , null , OS .UNKNOWN );
7576 }
7677
7778 /**
@@ -85,7 +86,7 @@ public static Artifact from(String group, String name, String version, @Nullable
8586 * @return The created artifact
8687 */
8788 public static Artifact from (String group , String name , String version , @ Nullable String classifier , @ Nullable String ext ) {
88- return new Artifact (group , name , version , classifier , ext , OS .UNKNOWN , Arch . UNKNOWN );
89+ return new Artifact (group , name , version , classifier , ext , OS .UNKNOWN );
8990 }
9091
9192 private Artifact (String descriptor ) {
@@ -106,44 +107,24 @@ private Artifact(String descriptor) {
106107
107108 this .version = pts .length > 2 ? pts [2 ] : null ;
108109 this .classifier = pts .length > 3 ? pts [3 ] : null ;
109- this .os = this .classifier != null ? findOS (this .classifier ) : OS .UNKNOWN ;
110- this .arch = this .classifier != null ? findArch (this .classifier ) : Arch .UNKNOWN ;
110+ this .os = EnumSet .noneOf (OS .class );
111111 }
112112
113- private Artifact (String group , String name , String version , @ Nullable String classifier , @ Nullable String ext , OS os , Arch arch ) {
113+ private Artifact (String group , String name , String version , @ Nullable String classifier , @ Nullable String ext , OS os ) {
114+ this (group , name , version , classifier , ext , os , new OS [0 ]);
115+ }
116+
117+ private Artifact (String group , String name , String version , @ Nullable String classifier , @ Nullable String ext , OS osFirst , OS ... osRest ) {
118+ this (group , name , version , classifier , ext , EnumSet .of (osFirst , osRest ));
119+ }
120+
121+ private Artifact (String group , String name , String version , @ Nullable String classifier , @ Nullable String ext , EnumSet <OS > os ) {
114122 this .group = group ;
115123 this .name = name ;
116124 this .version = version ;
117125 this .classifier = classifier ;
118126 this .ext = Objects .requireNonNullElse (ext , "jar" );
119- this .os = os == OS .UNKNOWN && classifier != null ? findOS (classifier ) : os ;
120- this .arch = arch == Arch .UNKNOWN && classifier != null ? findArch (classifier ) : arch ;
121- }
122-
123- private static OS findOS (String classifier ) {
124- for (var s : classifier .split ("-" )) {
125- if (s .isBlank ()) continue ;
126-
127- var osCandidate = OS .byName (s );
128- if (osCandidate != OS .UNKNOWN ) {
129- return osCandidate ;
130- }
131- }
132-
133- return OS .UNKNOWN ;
134- }
135-
136- private static Arch findArch (String classifier ) {
137- for (var s : classifier .split ("-" )) {
138- if (s .isBlank ()) continue ;
139-
140- var archCandidate = Arch .byName (s );
141- if (archCandidate != Arch .UNKNOWN ) {
142- return archCandidate ;
143- }
144- }
145-
146- return Arch .UNKNOWN ;
127+ this .os = os ;
147128 }
148129
149130 /**
@@ -215,18 +196,13 @@ public String getExtension() {
215196 return ext ;
216197 }
217198
218- /** @return The os of this artifact (defaults to {@link OS#UNKNOWN}) */
219- public OS getOs () {
199+ public EnumSet <OS > getOs () {
220200 return os ;
221201 }
222202
223- public boolean hasNoOs () {
224- return this .os == OS .UNKNOWN ;
225- }
226-
227- /** @return The arch of this artifact (defaults to {@link Arch#UNKNOWN}) */
228- public Arch getArch () {
229- return arch ;
203+ /** @return The os of this artifact (defaults to {@link OS#UNKNOWN}) */
204+ public boolean allowsOS (OS os ) {
205+ return this .os .isEmpty () || this .os .contains (os );
230206 }
231207
232208 /** @return The file name of this artifact */
@@ -259,23 +235,25 @@ public boolean isSnapshot() {
259235 * @return The new artifact
260236 */
261237 public Artifact withVersion (String version ) {
262- return new Artifact (group , name , version , classifier , ext , os , arch );
238+ return new Artifact (group , name , version , classifier , ext , os );
263239 }
264240
265241 public Artifact withClassifier (String classifier ) {
266- return new Artifact (group , name , version , classifier , ext , os , arch );
242+ return new Artifact (group , name , version , classifier , ext , os );
267243 }
268244
269245 public Artifact withExtension (String ext ) {
270- return new Artifact (group , name , version , classifier , ext , os , arch );
246+ return new Artifact (group , name , version , classifier , ext , os );
271247 }
272248
273249 public Artifact withOS (OS os ) {
274- return new Artifact (group , name , version , classifier , ext , os , arch );
250+ var osSet = EnumSet .copyOf (this .os );
251+ osSet .add (os );
252+ return new Artifact (group , name , version , classifier , ext , osSet );
275253 }
276254
277- public Artifact withArch ( Arch arch ) {
278- return new Artifact (group , name , version , classifier , ext , os , arch );
255+ public Artifact withOS ( EnumSet < OS > os ) {
256+ return new Artifact (group , name , version , classifier , ext , os );
279257 }
280258
281259 @ Override
0 commit comments