@@ -23,9 +23,8 @@ const MavenCentral = "https://repo.maven.apache.org/maven2"
23
23
var errAPIFailed = errors .New ("API query failed" )
24
24
25
25
type MavenRegistryAPIClient struct {
26
- defaultRegistry string // Base URL of the default registry that we are making requests
27
- // TODO: disable fetching snapshot if specified in pom.xml
28
- registries []string // URLs of the registries to fetch projects
26
+ defaultRegistry MavenRegistry // The default registry that we are making requests
27
+ registries []MavenRegistry // Additional registries specified to fetch projects
29
28
30
29
// Cache fields
31
30
mu * sync.Mutex
@@ -34,14 +33,29 @@ type MavenRegistryAPIClient struct {
34
33
metadata * RequestCache [string , maven.Metadata ]
35
34
}
36
35
37
- func NewMavenRegistryAPIClient (registry string ) (* MavenRegistryAPIClient , error ) {
38
- if registry == "" {
39
- registry = MavenCentral
40
- } else if _ , err := url .Parse (registry ); err != nil {
41
- return nil , fmt .Errorf ("invalid Maven registry %s: %w" , registry , err )
36
+ type MavenRegistry struct {
37
+ URL string
38
+ Parsed * url.URL
39
+
40
+ // Information from pom.xml
41
+ ID string
42
+ ReleasesEnabled bool
43
+ SnapshotsEnabled bool
44
+ }
45
+
46
+ func NewMavenRegistryAPIClient (registry MavenRegistry ) (* MavenRegistryAPIClient , error ) {
47
+ if registry .URL == "" {
48
+ registry .URL = MavenCentral
49
+ registry .ID = "central"
50
+ }
51
+ u , err := url .Parse (registry .URL )
52
+ if err != nil {
53
+ return nil , fmt .Errorf ("invalid Maven registry %s: %w" , registry .URL , err )
42
54
}
55
+ registry .Parsed = u
43
56
44
57
return & MavenRegistryAPIClient {
58
+ // We assume only downloading releases is allowed on the default registry.
45
59
defaultRegistry : registry ,
46
60
mu : & sync.Mutex {},
47
61
projects : NewRequestCache [string , maven.Project ](),
@@ -60,21 +74,26 @@ func (m *MavenRegistryAPIClient) WithoutRegistries() *MavenRegistryAPIClient {
60
74
}
61
75
}
62
76
63
- // Add adds the given registry to the list of registries if it has not been added.
64
- func (m * MavenRegistryAPIClient ) AddRegistry (registry string ) error {
65
- if slices .Contains (m .registries , registry ) {
66
- return nil
77
+ // AddRegistry adds the given registry to the list of registries if it has not been added.
78
+ func (m * MavenRegistryAPIClient ) AddRegistry (registry MavenRegistry ) error {
79
+ for _ , reg := range m .registries {
80
+ if reg .ID == registry .ID {
81
+ return nil
82
+ }
67
83
}
68
84
69
- if _ , err := url .Parse (registry ); err != nil {
85
+ u , err := url .Parse (registry .URL )
86
+ if err != nil {
70
87
return err
71
88
}
89
+
90
+ registry .Parsed = u
72
91
m .registries = append (m .registries , registry )
73
92
74
93
return nil
75
94
}
76
95
77
- func (m * MavenRegistryAPIClient ) GetRegistries () [] string {
96
+ func (m * MavenRegistryAPIClient ) GetRegistries () ( registries [] MavenRegistry ) {
78
97
return m .registries
79
98
}
80
99
@@ -86,7 +105,10 @@ func (m *MavenRegistryAPIClient) GetRegistries() []string {
86
105
func (m * MavenRegistryAPIClient ) GetProject (ctx context.Context , groupID , artifactID , version string ) (maven.Project , error ) {
87
106
if ! strings .HasSuffix (version , "-SNAPSHOT" ) {
88
107
for _ , registry := range append (m .registries , m .defaultRegistry ) {
89
- project , err := m .getProject (ctx , registry , groupID , artifactID , version , "" )
108
+ if ! registry .ReleasesEnabled {
109
+ continue
110
+ }
111
+ project , err := m .getProject (ctx , registry .Parsed , groupID , artifactID , version , "" )
90
112
if err == nil {
91
113
return project , nil
92
114
}
@@ -96,8 +118,11 @@ func (m *MavenRegistryAPIClient) GetProject(ctx context.Context, groupID, artifa
96
118
}
97
119
98
120
for _ , registry := range append (m .registries , m .defaultRegistry ) {
99
- // Fetch version metadata for snapshot versions.
100
- metadata , err := m .getVersionMetadata (ctx , registry , groupID , artifactID , version )
121
+ // Fetch version metadata for snapshot versions from the registries enabling that.
122
+ if ! registry .SnapshotsEnabled {
123
+ continue
124
+ }
125
+ metadata , err := m .getVersionMetadata (ctx , registry .Parsed , groupID , artifactID , version )
101
126
if err != nil {
102
127
continue
103
128
}
@@ -111,7 +136,7 @@ func (m *MavenRegistryAPIClient) GetProject(ctx context.Context, groupID, artifa
111
136
}
112
137
}
113
138
114
- project , err := m .getProject (ctx , registry , groupID , artifactID , version , snapshot )
139
+ project , err := m .getProject (ctx , registry . Parsed , groupID , artifactID , version , snapshot )
115
140
if err == nil {
116
141
return project , nil
117
142
}
@@ -125,7 +150,7 @@ func (m *MavenRegistryAPIClient) GetProject(ctx context.Context, groupID, artifa
125
150
func (m * MavenRegistryAPIClient ) GetVersions (ctx context.Context , groupID , artifactID string ) ([]maven.String , error ) {
126
151
var versions []maven.String
127
152
for _ , registry := range append (m .registries , m .defaultRegistry ) {
128
- metadata , err := m .getArtifactMetadata (ctx , registry , groupID , artifactID )
153
+ metadata , err := m .getArtifactMetadata (ctx , registry . Parsed , groupID , artifactID )
129
154
if err != nil {
130
155
continue
131
156
}
@@ -138,14 +163,11 @@ func (m *MavenRegistryAPIClient) GetVersions(ctx context.Context, groupID, artif
138
163
139
164
// getProject fetches a pom.xml specified by groupID, artifactID and version and parses it to maven.Project.
140
165
// For snapshot versions, the exact version value is specified by snapshot.
141
- func (m * MavenRegistryAPIClient ) getProject (ctx context.Context , registry , groupID , artifactID , version , snapshot string ) (maven.Project , error ) {
166
+ func (m * MavenRegistryAPIClient ) getProject (ctx context.Context , registry * url. URL , groupID , artifactID , version , snapshot string ) (maven.Project , error ) {
142
167
if snapshot == "" {
143
168
snapshot = version
144
169
}
145
- u , err := url .JoinPath (registry , strings .ReplaceAll (groupID , "." , "/" ), artifactID , version , fmt .Sprintf ("%s-%s.pom" , artifactID , snapshot ))
146
- if err != nil {
147
- return maven.Project {}, fmt .Errorf ("failed to join path: %w" , err )
148
- }
170
+ u := registry .JoinPath (strings .ReplaceAll (groupID , "." , "/" ), artifactID , version , fmt .Sprintf ("%s-%s.pom" , artifactID , snapshot )).String ()
149
171
150
172
return m .projects .Get (u , func () (maven.Project , error ) {
151
173
var proj maven.Project
@@ -158,11 +180,8 @@ func (m *MavenRegistryAPIClient) getProject(ctx context.Context, registry, group
158
180
}
159
181
160
182
// getVersionMetadata fetches a version level maven-metadata.xml and parses it to maven.Metadata.
161
- func (m * MavenRegistryAPIClient ) getVersionMetadata (ctx context.Context , registry , groupID , artifactID , version string ) (maven.Metadata , error ) {
162
- u , err := url .JoinPath (registry , strings .ReplaceAll (groupID , "." , "/" ), artifactID , version , "maven-metadata.xml" )
163
- if err != nil {
164
- return maven.Metadata {}, fmt .Errorf ("failed to join path: %w" , err )
165
- }
183
+ func (m * MavenRegistryAPIClient ) getVersionMetadata (ctx context.Context , registry * url.URL , groupID , artifactID , version string ) (maven.Metadata , error ) {
184
+ u := registry .JoinPath (strings .ReplaceAll (groupID , "." , "/" ), artifactID , version , "maven-metadata.xml" ).String ()
166
185
167
186
return m .metadata .Get (u , func () (maven.Metadata , error ) {
168
187
var metadata maven.Metadata
@@ -175,11 +194,8 @@ func (m *MavenRegistryAPIClient) getVersionMetadata(ctx context.Context, registr
175
194
}
176
195
177
196
// GetArtifactMetadata fetches an artifact level maven-metadata.xml and parses it to maven.Metadata.
178
- func (m * MavenRegistryAPIClient ) getArtifactMetadata (ctx context.Context , registry , groupID , artifactID string ) (maven.Metadata , error ) {
179
- u , err := url .JoinPath (registry , strings .ReplaceAll (groupID , "." , "/" ), artifactID , "maven-metadata.xml" )
180
- if err != nil {
181
- return maven.Metadata {}, fmt .Errorf ("failed to join path: %w" , err )
182
- }
197
+ func (m * MavenRegistryAPIClient ) getArtifactMetadata (ctx context.Context , registry * url.URL , groupID , artifactID string ) (maven.Metadata , error ) {
198
+ u := registry .JoinPath (strings .ReplaceAll (groupID , "." , "/" ), artifactID , "maven-metadata.xml" ).String ()
183
199
184
200
return m .metadata .Get (u , func () (maven.Metadata , error ) {
185
201
var metadata maven.Metadata
0 commit comments