@@ -35,13 +35,24 @@ public class Reference {
3535  private  final  String  name ;
3636  private  final  String  tag ;
3737  private  final  String  digest ;
38+   private  final  String  platform ;
3839
3940  @ VisibleForTesting 
4041  Reference (String  domain , String  name , String  tag , String  digest ) {
4142    this .domain  = Require .nonNull ("Domain" , domain );
4243    this .name  = Require .nonNull ("Name" , name );
4344    this .tag  = tag ;
4445    this .digest  = digest ;
46+     this .platform  = getDefaultPlatform ();
47+   }
48+ 
49+   @ VisibleForTesting 
50+   Reference (String  domain , String  name , String  tag , String  digest , String  platform ) {
51+     this .domain  = Require .nonNull ("Domain" , domain );
52+     this .name  = Require .nonNull ("Name" , name );
53+     this .tag  = tag ;
54+     this .digest  = digest ;
55+     this .platform  = Require .nonNull ("Platform" , platform );
4556  }
4657
4758  // Logic taken from https://github.com/distribution/distribution/blob/main/reference/normalize.go 
@@ -53,15 +64,15 @@ public static Reference parse(String input) {
5364    String  remainder  = splitDockerDomain .get ("remainder" );
5465
5566    String  name ;
56-     String  digest  = null ;
67+     String  digest  =
68+         splitDockerDomain .get ("digest" ).isEmpty () ? null  : splitDockerDomain .get ("digest" );
69+     String  platform  = splitDockerDomain .get ("platform" );
5770    String  tag  = DEFAULT_TAG ;
5871
59-     int  digestSep  = remainder .indexOf ("@" );
6072    int  tagSep  = remainder .indexOf (":" );
61-     if  (digestSep  > -1  && tagSep  > -1 ) {
62-       digest  = remainder .substring (digestSep  + 1 );
63-       name  = remainder .substring (0 , digestSep );
73+     if  (digest  != null ) {
6474      tag  = null ;
75+       name  = remainder ;
6576    } else  if  (tagSep  > -1 ) {
6677      tag  = remainder .substring (tagSep  + 1 );
6778      name  = remainder .substring (0 , tagSep );
@@ -74,12 +85,27 @@ public static Reference parse(String input) {
7485          String .format ("Invalid reference format: repository name (%s) must be lowercase" , name ));
7586    }
7687
77-     return  new  Reference (domain , name , tag , digest );
88+     return  new  Reference (domain , name , tag , digest ,  platform );
7889  }
7990
8091  private  static  ImmutableMap <String , String > splitDockerDomain (String  name ) {
8192    String  domain ;
8293    String  remainder ;
94+     String  platform  = getDefaultPlatform ();
95+     String  digest  = "" ;
96+ 
97+     // Check if the name contains a platform part 
98+     int  platformSep  = name .lastIndexOf ("@" );
99+     if  (platformSep  > -1 ) {
100+       String [] parts  = name .substring (platformSep  + 1 ).split ("/" );
101+       if  (parts .length  == 2 ) {
102+         platform  = name .substring (platformSep  + 1 );
103+       } else  if  (parts [0 ].contains (":" )) {
104+         digest  = name .substring (platformSep  + 1 );
105+       }
106+       name  = name .substring (0 , platformSep );
107+     }
108+ 
83109    int  domSep  = name .indexOf ("/" );
84110    String  possibleDomain  = domSep  == -1  ? ""  : name .substring (0 , domSep );
85111    if  (domSep  == -1 
@@ -99,7 +125,8 @@ private static ImmutableMap<String, String> splitDockerDomain(String name) {
99125    if  (DEFAULT_DOMAIN .equals (domain ) && !remainder .contains ("/" )) {
100126      remainder  = String .format ("%s/%s" , DEFAULT_REPO , remainder );
101127    }
102-     return  ImmutableMap .of ("domain" , domain , "remainder" , remainder );
128+     return  ImmutableMap .of (
129+         "domain" , domain , "remainder" , remainder , "platform" , platform , "digest" , digest );
103130  }
104131
105132  public  String  getDomain () {
@@ -118,6 +145,10 @@ public String getDigest() {
118145    return  digest ;
119146  }
120147
148+   public  String  getPlatform () {
149+     return  platform ;
150+   }
151+ 
121152  public  String  getFamiliarName () {
122153    StringBuilder  familiar  = new  StringBuilder ();
123154
@@ -142,6 +173,16 @@ public String getFamiliarName() {
142173    return  familiar .toString ();
143174  }
144175
176+   private  static  String  getDefaultPlatform () {
177+     String  arch  = System .getProperty ("os.arch" ).toLowerCase ();
178+     if  (arch .contains ("amd64" ) || arch .contains ("x86_64" )) {
179+       arch  = "amd64" ;
180+     } else  if  (arch .contains ("arm64" ) || arch .contains ("aarch64" )) {
181+       arch  = "arm64" ;
182+     }
183+     return  "linux/"  + arch ;
184+   }
185+ 
145186  @ Override 
146187  public  String  toString () {
147188    return  "Reference{" 
@@ -157,6 +198,8 @@ public String toString() {
157198        + ", digest='" 
158199        + digest 
159200        + '\'' 
201+         + ", platform='" 
202+         + platform 
160203        + '}' ;
161204  }
162205
@@ -170,11 +213,12 @@ public boolean equals(Object o) {
170213    return  this .domain .equals (that .domain )
171214        && this .name .equals (that .name )
172215        && Objects .equals (tag , that .tag )
173-         && Objects .equals (digest , that .digest );
216+         && Objects .equals (digest , that .digest )
217+         && Objects .equals (platform , that .platform );
174218  }
175219
176220  @ Override 
177221  public  int  hashCode () {
178-     return  Objects .hash (domain , name , tag , digest );
222+     return  Objects .hash (domain , name , tag , digest ,  platform );
179223  }
180224}
0 commit comments