1010import java .io .File ;
1111import java .io .Serial ;
1212import java .io .Serializable ;
13- import java .util .Arrays ;
14- import java .util .EnumSet ;
1513import java .util .Locale ;
1614import java .util .Objects ;
1715import java .util .regex .Pattern ;
@@ -29,7 +27,8 @@ public class Artifact implements Comparable<Artifact>, Serializable {
2927 private final @ Nullable String version ;
3028 private final @ Nullable String classifier ;
3129 private final String ext ;
32- private final EnumSet <OS > os ;
30+ private final OS os ;
31+ private final Arch arch ;
3332
3433 // Cached after building the first time we're asked
3534 // Transient field so these aren't serialized
@@ -59,7 +58,7 @@ public static Artifact from(String descriptor) {
5958 * @return The created artifact
6059 */
6160 public static Artifact from (String group , String name , String version ) {
62- return new Artifact (group , name , version , null , null , OS .UNKNOWN );
61+ return new Artifact (group , name , version , null , null , OS .UNKNOWN , Arch . UNKNOWN );
6362 }
6463
6564 /**
@@ -72,7 +71,7 @@ public static Artifact from(String group, String name, String version) {
7271 * @return The created artifact
7372 */
7473 public static Artifact from (String group , String name , String version , @ Nullable String classifier ) {
75- return new Artifact (group , name , version , classifier , null , OS .UNKNOWN );
74+ return new Artifact (group , name , version , classifier , null , OS .UNKNOWN , Arch . UNKNOWN );
7675 }
7776
7877 /**
@@ -86,7 +85,7 @@ public static Artifact from(String group, String name, String version, @Nullable
8685 * @return The created artifact
8786 */
8887 public static Artifact from (String group , String name , String version , @ Nullable String classifier , @ Nullable String ext ) {
89- return new Artifact (group , name , version , classifier , ext , OS .UNKNOWN );
88+ return new Artifact (group , name , version , classifier , ext , OS .UNKNOWN , Arch . UNKNOWN );
9089 }
9190
9291 private Artifact (String descriptor ) {
@@ -107,24 +106,44 @@ private Artifact(String descriptor) {
107106
108107 this .version = pts .length > 2 ? pts [2 ] : null ;
109108 this .classifier = pts .length > 3 ? pts [3 ] : null ;
110- this .os = EnumSet .noneOf (OS .class );
109+ this .os = this .classifier != null ? findOS (this .classifier ) : OS .UNKNOWN ;
110+ this .arch = this .classifier != null ? findArch (this .classifier ) : Arch .UNKNOWN ;
111111 }
112112
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 ) {
113+ private Artifact (String group , String name , String version , @ Nullable String classifier , @ Nullable String ext , OS os , Arch arch ) {
122114 this .group = group ;
123115 this .name = name ;
124116 this .version = version ;
125117 this .classifier = classifier ;
126118 this .ext = Objects .requireNonNullElse (ext , "jar" );
127- this .os = os ;
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 ;
128147 }
129148
130149 /**
@@ -196,13 +215,18 @@ public String getExtension() {
196215 return ext ;
197216 }
198217
199- public EnumSet <OS > getOs () {
218+ /** @return The os of this artifact (defaults to {@link OS#UNKNOWN}) */
219+ public OS getOs () {
200220 return os ;
201221 }
202222
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 );
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 ;
206230 }
207231
208232 /** @return The file name of this artifact */
@@ -235,25 +259,23 @@ public boolean isSnapshot() {
235259 * @return The new artifact
236260 */
237261 public Artifact withVersion (String version ) {
238- return new Artifact (group , name , version , classifier , ext , os );
262+ return new Artifact (group , name , version , classifier , ext , os , arch );
239263 }
240264
241265 public Artifact withClassifier (String classifier ) {
242- return new Artifact (group , name , version , classifier , ext , os );
266+ return new Artifact (group , name , version , classifier , ext , os , arch );
243267 }
244268
245269 public Artifact withExtension (String ext ) {
246- return new Artifact (group , name , version , classifier , ext , os );
270+ return new Artifact (group , name , version , classifier , ext , os , arch );
247271 }
248272
249273 public Artifact withOS (OS os ) {
250- var osSet = EnumSet .copyOf (this .os );
251- osSet .add (os );
252- return new Artifact (group , name , version , classifier , ext , osSet );
274+ return new Artifact (group , name , version , classifier , ext , os , arch );
253275 }
254276
255- public Artifact withOS ( EnumSet < OS > os ) {
256- return new Artifact (group , name , version , classifier , ext , os );
277+ public Artifact withArch ( Arch arch ) {
278+ return new Artifact (group , name , version , classifier , ext , os , arch );
257279 }
258280
259281 @ Override
0 commit comments